diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..850f0e7b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: +patreon: +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: diff --git a/.gitignore b/.gitignore index 51b22932..6c82503b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,15 @@ dist/ +build/ .idea/ -_site/ +.tox/ *__pycache__* +*egg-info/ + +docs/.sass-cache/* +docs/_site/* +tests/logs + +Gemfile.lock + +/docs/.jekyll-metadata +/docs/djongocs/assets/* \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..dbf6e3ee --- /dev/null +++ b/.travis.yml @@ -0,0 +1,26 @@ +language: python + +python: + - 3.8 + +env: + matrix: + - MONGODB=4.2.6 + +install: + - wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add - + - echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list + - sudo apt-get update + - sudo apt-get install -y mongodb-org=${MONGODB} mongodb-org-server=${MONGODB} mongodb-org-shell=${MONGODB} mongodb-org-mongos=${MONGODB} mongodb-org-tools=${MONGODB} --allow-downgrades + - sudo service mongod start + - sudo service mongod status + - pip install tox + +before_script: + - mongod --version + +script: + - tox -e py38-django_stable + +after_script: + - pkill mongod \ No newline at end of file diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index b893dfad..4f305e96 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -1,14 +1,14 @@ - -#### One line description of the issue - -#### Python script - - - -```python - - -``` - -#### Traceback - + +#### One line description of the issue + +#### Python script + + + +```python + + +``` + +#### Traceback + diff --git a/LICENSE b/LICENSE index f9077d36..b54e9aa7 100644 --- a/LICENSE +++ b/LICENSE @@ -1,30 +1,661 @@ -BSD 3-Clause License + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 -Copyright (c) 2017, nesdis -All rights reserved. + Copyright (C) 2018, nesdis + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: + Preamble -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/MANIFEST b/MANIFEST index b3d1d755..f1161b12 100644 --- a/MANIFEST +++ b/MANIFEST @@ -8,7 +8,11 @@ djongo\cursor.py djongo\database.py djongo\features.py djongo\introspection.py -djongo\models.py djongo\operations.py djongo\schema.py -djongo\sql2mongo.py +djongo\models\__init__.py +djongo\models\fields.py +djongo\sql2mongo\__init__.py +djongo\sql2mongo\converters.py +djongo\sql2mongo\operators.py +djongo\sql2mongo\query.py diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..7f32d838 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,4 @@ +include djongo/dynamic_formsets/static/dynamic_formsets/images/*.* +include djongo/dynamic_formsets/static/dynamic_formsets/js/jquery/*.* +include djongo/dynamic_formsets/static/dynamic_formsets/js/jquery-formset/*.* +include djongo/dynamic_formsets/templates/admin/*.* diff --git a/Pipfile b/Pipfile new file mode 100644 index 00000000..71e4f7cb --- /dev/null +++ b/Pipfile @@ -0,0 +1,11 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] + +[requires] +python_version = "3.9" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 00000000..8aee7e8e --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,20 @@ +{ + "_meta": { + "hash": { + "sha256": "a36a5392bb1e8bbc06bfaa0761e52593cf2d83b486696bf54667ba8da616c839" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": {}, + "develop": {} +} diff --git a/README.md b/README.md index b2796b3e..6c676983 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,56 @@

djongo

-

Driver for allowing Django to use MongoDB as the database backend

-Use Mongodb as a backend database for your django project, without changing a single django model!!! +[![Build Status](https://travis-ci.com/nesdis/djongo.svg?branch=master)](https://travis-ci.com/nesdis/djongo) +[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) +PyPI version -

Usage:

+ ## The only connector that lets you use Django with MongoDB *without* changing the Django ORM + +Use MongoDB as a backend database for your Django project, without changing the Django ORM. +Use the Django Admin GUI to add and modify documents in MongoDB. + +## Usage:
    -
  1. pip install djongo
  2. -
  3. Into settings.py file of your project, add: +
  4. Install djongo: ``` +pip install djongo +``` +
  5. +
  6. Into settings.py file of your project, add: + +```python DATABASES = { 'default': { 'ENGINE': 'djongo', 'NAME': 'your-db-name', + 'CLIENT': { + 'host': 'your-db-host', + } } } ```
  7. -
  8. Run manage.py migrate (ONLY the first time to create collections in mongoDB)
  9. +
  10. Run manage.py makemigrations <app_name> followed by manage.py migrate (ONLY the first time to create collections in mongoDB)
  11. YOUR ARE SET! HAVE FUN!
-

Requirements:

- 1. djongo requires python 3.5 or above. +## Requirements: + 1. Python 3.6 or higher. + 2. MongoDB 3.4 or higher. + 3. If your models use nested queries or sub querysets like: + + ```python + inner_qs = Blog.objects.filter(name__contains='Ch').values('name') + entries = Entry.objects.filter(blog__name__in=inner_qs) + ``` + MongoDB 3.6 or higher is required. -

How it works:

+## How it works -djongo is a SQL to mongodb query compiler. It translates a SQL query string into a mongoDB query document. As a result, all Django features, models etc work as is. +djongo is a SQL to mongodb query compiler. It translates a SQL query string into a mongoDB query document. +As a result, all Django features, models etc. work as is. Django contrib modules:
  
@@ -38,27 +61,29 @@ djongo is a SQL to mongodb query compiler. It translates a SQL query string into
 
and others... fully supported. -## Top Star Contributors - -[Rudolfce](https://github.com/rudolfce) - -

Features:

+## Features - * Stop the immigrations. - * Embedded model. + * Use Django Admin GUI to access MongoDB. + * Embedded Model. * Embedded Array. * Embedded Form Fields. - Read the [full documentation](https://nesdis.github.io/djongo/) - -

Questions

- - Any questions, suggestions for improvements or issues regarding the usage. Please raise a git-hub issue ticket. - - ## Contribute - - If you think djongo is useful, **please share it** with the world! Your endorsements and online reviews will help get more support for this project. + Read the [full documentation](https://www.djongomapper.com/) - You can contribute to the source code or the documentation by creating a simple pull request! You may want to refer to the design documentation to get an idea on how [Django MongoDB connector](https://nesdis.github.io/djongo/django-mongodb-connector-design-document/) is implemented +## Contribute - Add a star, show some love :) +If you think djongo is useful, **please share it** with the world! + +You can contribute to the source code or the documentation by creating a simple pull request! +You may want to refer to the design documentation to get +an idea on how [Django MongoDB connector](https://www.djongomapper.com/djongo/django-mongodb-connector-design-document/) +is implemented. + +Add a star, show some love :) + +## Questions and Discussion + + * [Djongo groups](https://groups.google.com/d/forum/djongo) is where you can watch for new release announcements, suggest improvements, and discuss topics pertaining to Django and MongoDB. + * Issues, where things are not working as expected, please raise a git-hub issue ticket. + * For questions and clarifications regarding usage, please put it up on stackoverflow instead. + diff --git a/djongo/__init__.py b/djongo/__init__.py index e69de29b..55c7586e 100644 --- a/djongo/__init__.py +++ b/djongo/__init__.py @@ -0,0 +1,10 @@ +# This version of Djongo was made possible by +# the generous contributions from: +# +# * Zachary Sizemore +# * Wayne Van Son +# * Norman Niemer +# * Renz Ladia +# * thestick613 + +__version__ = '1.3.6' diff --git a/djongo/admin.py b/djongo/admin.py new file mode 100644 index 00000000..91cdf7c3 --- /dev/null +++ b/djongo/admin.py @@ -0,0 +1,27 @@ +import copy + +from django.contrib import admin +from djongo.models import fields + + +class ModelAdmin(admin.ModelAdmin): + DJONGO_FIELDS = ( + fields.ArrayField, + fields.EmbeddedField, + ) + + def formfield_for_dbfield(self, db_field, request, **kwargs): + if not isinstance(db_field, self.DJONGO_FIELDS): + return admin.ModelAdmin.formfield_for_dbfield( + self, db_field, request, **kwargs) + + admin_instance = ModelAdmin(db_field.model_container, admin.site) + kwargs.setdefault('admin', admin_instance) + kwargs.setdefault('request', request) + + for klass in db_field.__class__.mro(): + if klass in self.formfield_overrides: + kwargs = dict(copy.deepcopy( + self.formfield_overrides[klass]), **kwargs) + + return db_field.formfield(**kwargs) diff --git a/djongo/base.py b/djongo/base.py index b9357805..ba6766d7 100644 --- a/djongo/base.py +++ b/djongo/base.py @@ -1,120 +1,222 @@ -from collections import OrderedDict - -from django.db.backends.base.base import BaseDatabaseWrapper -from django.db.backends.base.client import BaseDatabaseClient -from django.db.backends.base.creation import BaseDatabaseCreation -from django.db.backends.base.schema import BaseDatabaseSchemaEditor -from django.db.utils import Error -from .introspection import DatabaseIntrospection - -from .operations import DatabaseOperations -from .cursor import Cursor -from .features import DatabaseFeatures -from . import database as Database - - -class DatabaseWrapper(BaseDatabaseWrapper): - - data_types = { - 'AutoField': 'integer', - 'BigAutoField': 'integer', - 'BinaryField': 'integer', - 'BooleanField': 'bool', - 'CharField': 'char', - 'CommaSeparatedIntegerField': 'char', - 'DateField': 'date', - 'DateTimeField': 'datetime', - 'DecimalField': 'float', - 'DurationField': 'integer', - 'FileField': 'char', - 'FilePathField': 'char', - 'FloatField': 'float', - 'IntegerField': 'integer', - 'BigIntegerField': 'bigint', - 'IPAddressField': 'char', - 'GenericIPAddressField': 'char', - 'NullBooleanField': 'bool', - 'OneToOneField': 'integer', - 'PositiveIntegerField': 'integer', - 'PositiveSmallIntegerField': 'integer', - 'SlugField': 'char', - 'SmallIntegerField': 'integer', - 'TextField': 'char', - 'TimeField': 'time', - 'UUIDField': 'char', - } - - data_types_suffix = { - 'AutoField': 'AUTOINCREMENT', - 'BigAutoField': 'AUTOINCREMENT', - } - - operators = { - 'exact': '= %s', - 'iexact': 'LIKE %s', - 'contains': 'LIKE BINARY %s', - 'icontains': 'LIKE %s', - 'regex': 'REGEXP BINARY %s', - 'iregex': 'REGEXP %s', - 'gt': '> %s', - 'gte': '>= %s', - 'lt': '< %s', - 'lte': '<= %s', - 'startswith': 'LIKE BINARY %s', - 'endswith': 'LIKE BINARY %s', - 'istartswith': 'LIKE %s', - 'iendswith': 'LIKE %s', - } - - vendor = 'djongo' - SchemaEditorClass = BaseDatabaseSchemaEditor - Database = Database - - client_class = BaseDatabaseClient - creation_class = BaseDatabaseCreation - features_class = DatabaseFeatures - introspection_class = DatabaseIntrospection - ops_class = DatabaseOperations - - def is_usable(self): - if self.connection is not None: - return True - return False - - def get_connection_params(self): - connection_params = { - 'name': self.settings_dict.get('NAME', 'djongo_test'), - 'host': self.settings_dict['HOST'] or None, - 'port': self.settings_dict['PORT'] or None - } - - return connection_params - - def get_new_connection(self, settings_dict): - """ - This needs to be made more generic to accept - other MongoClient parameters. - """ - name = settings_dict.pop('name') - settings_dict['document_class'] = OrderedDict - return Database.connect(name=name, **settings_dict) - - def _set_autocommit(self, autocommit): - pass - - def init_connection_state(self): - pass - - def create_cursor(self, name=None): - return Cursor(self.connection) - - def _close(self): - if self.connection: - with self.wrap_database_errors: - self.connection.client.close() - - def _rollback(self): - raise Error - - def _commit(self): - pass +""" +MongoDB database backend for Django +""" +from collections import OrderedDict +from logging import getLogger +from django.db.backends.base.base import BaseDatabaseWrapper +from django.db.backends.base.client import BaseDatabaseClient +from logging.config import dictConfig +from django.db.utils import Error +from .creation import DatabaseCreation +from . import database as Database +from .cursor import Cursor +from .features import DatabaseFeatures +from .introspection import DatabaseIntrospection +from .operations import DatabaseOperations +from .schema import DatabaseSchemaEditor + +logger = getLogger(__name__) + + +class CachedCollections(set): + + def __init__(self, database): + self.db = database + super().__init__() + + def __contains__(self, item): + ans = super().__contains__(item) + if ans: + return ans + self.update(self.db.list_collection_names()) + return super().__contains__(item) + + +class DjongoClient: + + def __init__(self, database, enforce_schema=True): + self.enforce_schema = enforce_schema + self.cached_collections = CachedCollections(database) + + +class DatabaseWrapper(BaseDatabaseWrapper): + """ + DatabaseWrapper for MongoDB using SQL replacements. + """ + + # This dictionary will map Django model field types to appropriate data + # types to be used in the database. + data_types = { + 'AutoField': 'int', + 'BigAutoField': 'long', + 'BinaryField': 'binData', + 'BooleanField': 'bool', + 'CharField': 'string', + 'CommaSeparatedIntegerField': 'string', + 'DateField': 'date', + 'DateTimeField': 'date', + 'DecimalField': 'decimal', + 'DurationField': 'long', + 'FileField': 'string', + 'FilePathField': 'string', + 'FloatField': 'double', + 'IntegerField': 'int', + 'BigIntegerField': 'long', + 'IPAddressField': 'string', + 'GenericIPAddressField': 'string', + 'NullBooleanField': 'bool', + 'OneToOneField': 'int', + 'PositiveIntegerField': 'long', + 'PositiveSmallIntegerField': 'int', + 'SlugField': 'string', + 'SmallIntegerField': 'int', + 'TextField': 'string', + 'TimeField': 'date', + 'UUIDField': 'string', + 'GenericObjectIdField': 'objectId', + 'ObjectIdField': 'objectId', + 'EmbeddedField': 'object', + 'ArrayField': 'array' + } + + data_types_suffix = { + 'AutoField': 'AUTOINCREMENT', + 'BigAutoField': 'AUTOINCREMENT', + 'ObjectIdField': 'AUTOINCREMENT' + } + + operators = { + 'exact': '= %s', + 'iexact': 'iLIKE %s', + 'contains': 'LIKE %s', + 'icontains': 'iLIKE %s', + 'regex': 'REGEXP BINARY %s', + 'iregex': 'REGEXP %s', + 'gt': '> %s', + 'gte': '>= %s', + 'lt': '< %s', + 'lte': '<= %s', + 'startswith': 'LIKE %s', + 'endswith': 'LIKE %s', + 'istartswith': 'iLIKE %s', + 'iendswith': 'iLIKE %s', + } + + vendor = 'djongo' + SchemaEditorClass = DatabaseSchemaEditor + Database = Database + + client_class = BaseDatabaseClient + creation_class = DatabaseCreation + features_class = DatabaseFeatures + introspection_class = DatabaseIntrospection + ops_class = DatabaseOperations + + def __init__(self, *args, **kwargs): + self.client_connection = None + self.djongo_connection = None + super().__init__(*args, **kwargs) + + def is_usable(self): + if self.connection is not None: + return True + return False + + def get_connection_params(self): + """ + Default method to acquire database connection parameters. + + Sets connection parameters to match settings.py, and sets + default values to blank fields. + """ + valid_settings = { + 'NAME': 'name', + 'ENFORCE_SCHEMA': 'enforce_schema', + } + connection_params = { + 'name': 'djongo_test', + 'enforce_schema': False + } + for setting_name, kwarg in valid_settings.items(): + try: + setting = self.settings_dict[setting_name] + except KeyError: + continue + + if setting or setting is False: + connection_params[kwarg] = setting + try: + connection_params.update(self.settings_dict['CLIENT']) + except KeyError: + pass + + return connection_params + + def get_new_connection(self, connection_params): + """ + Receives a dictionary connection_params to setup + a connection to the database. + + Dictionary correct setup is made through the + get_connection_params method. + """ + + name = connection_params.pop('name') + es = connection_params.pop('enforce_schema') + + connection_params['document_class'] = OrderedDict + # connection_params['tz_aware'] = True + # To prevent leaving unclosed connections behind, + # client_conn must be closed before a new connection + # is created. + if self.client_connection is not None: + self.client_connection.close() + logger.debug('Existing MongoClient connection closed') + + self.client_connection = Database.connect(db=name, **connection_params) + logger.debug('New Database connection') + + database = self.client_connection[name] + self.djongo_connection = DjongoClient(database, es) + return self.client_connection[name] + + def _set_autocommit(self, autocommit): + """ + Default method must be overridden, eventhough not used. + + TODO: For future reference, setting two phase commits and rollbacks + might require populating this method. + """ + pass + + def init_connection_state(self): + try: + dictConfig(self.settings_dict['LOGGING']) + except KeyError: + pass + + def create_cursor(self, name=None): + """ + Returns an active connection cursor to the database. + """ + return Cursor(self.client_connection, self.connection, self.djongo_connection) + + def _close(self): + """ + Closes the client connection to the database. + """ + if self.connection is not None: + with self.wrap_database_errors: + self.connection.client.close() + logger.debug('MongoClient connection closed') + + def _rollback(self): + raise Error + + def _commit(self): + """ + Commit routine + + TODO: two phase commits are not supported yet. + """ + pass diff --git a/djongo/compiler.py b/djongo/compiler.py index 1ee97b64..26fe963d 100644 --- a/djongo/compiler.py +++ b/djongo/compiler.py @@ -1,6 +1,6 @@ -class SQLCompiler: - - def __init__(self, query, connection, using): - self.query = query - self.connection = connection - self.using = using +class SQLCompiler: + + def __init__(self, query, connection, using): + self.query = query + self.connection = connection + self.using = using diff --git a/djongo/creation.py b/djongo/creation.py new file mode 100644 index 00000000..f8b6dbf8 --- /dev/null +++ b/djongo/creation.py @@ -0,0 +1,43 @@ +import subprocess +import shutil + +from django.db.backends.base.creation import BaseDatabaseCreation + + +class DatabaseCreation(BaseDatabaseCreation): + + def _clone_test_db(self, suffix, verbosity, keepdb=False): + source_database_name = self.connection.settings_dict['NAME'] + target_database_name = self.get_test_db_clone_settings(suffix)['NAME'] + try: + host = self.connection.settings_dict['CLIENT']['host'] + except KeyError: + host = None + client = self.connection.client_connection + if not keepdb: + self._destroy_test_db(target_database_name, verbosity) + args = [ + 'mongodump', + '--quiet', + '--db', + source_database_name + ] + if host is not None: + args += ['--host', host] + + subprocess.run(args) + args = [ + 'mongorestore', + f'dump/{source_database_name}', + '--quiet', + '--db', + target_database_name + ] + if host is not None: + args += ['--host', host] + + subprocess.run(args) + shutil.rmtree('dump') + + print('Closing cloned connection') + client.close() diff --git a/djongo/cursor.py b/djongo/cursor.py index 8b2ceea7..f5a4f4b8 100644 --- a/djongo/cursor.py +++ b/djongo/cursor.py @@ -1,21 +1,28 @@ from logging import getLogger -from .sql2mongo import Parse + +from .database import DatabaseError +from .sql2mongo.query import Query logger = getLogger(__name__) class Cursor: - def __init__(self, mongo_conn): - self.mongo_conn = mongo_conn + def __init__(self, + client_conn, + db_conn, + connection_properties): + self.db_conn = db_conn + self.client_conn = client_conn + self.connection_properties = connection_properties self.result = None - self.parse = None def __exit__(self, exc_type, exc_val, exc_tb): self.close() def close(self): - self.result.close() + if self.result is not None: + self.result.close() def __getattr__(self, name): try: @@ -24,7 +31,7 @@ def __getattr__(self, name): pass try: - return getattr(self.mongo_conn, name) + return getattr(self.db_conn, name) except AttributeError: raise @@ -37,11 +44,19 @@ def rowcount(self): @property def lastrowid(self): - return self.parse.last_row_id + return self.result.last_row_id def execute(self, sql, params=None): - self.parse = Parse(self.mongo_conn, sql, params) - self.result = self.parse.result() + try: + self.result = Query( + self.client_conn, + self.db_conn, + self.connection_properties, + sql, + params) + except Exception as e: + db_exe = DatabaseError() + raise db_exe from e def fetchmany(self, size=1): ret = [] @@ -50,6 +65,9 @@ def fetchmany(self, size=1): ret.append(self.result.next()) except StopIteration: break + except Exception as e: + db_exe = DatabaseError() + raise db_exe from e return ret @@ -57,7 +75,10 @@ def fetchone(self): try: return self.result.next() except StopIteration: - return [] + return None + except Exception as e: + db_exe = DatabaseError() + raise db_exe from e def fetchall(self): return list(self.result) diff --git a/djongo/database.py b/djongo/database.py index ece3dd4b..86ad27de 100644 --- a/djongo/database.py +++ b/djongo/database.py @@ -1,40 +1,54 @@ -from pymongo import MongoClient - -def connect(name, **kwargs): - return MongoClient(**kwargs)[name] - - -class Error(Exception): # NOQA: StandardError undefined on PY3 - pass - - -class InterfaceError(Error): - pass - - -class DatabaseError(Error): - pass - - -class DataError(DatabaseError): - pass - - -class OperationalError(DatabaseError): - pass - - -class IntegrityError(DatabaseError): - pass - - -class InternalError(DatabaseError): - pass - - -class ProgrammingError(DatabaseError): - pass - - -class NotSupportedError(DatabaseError): - pass +from logging import getLogger +from pymongo import MongoClient + +logger = getLogger(__name__) +clients = {} + + +def connect(db, **kwargs): + try: + return clients[db] + except KeyError: + logger.debug('New MongoClient connection') + clients[db] = MongoClient(**kwargs, connect=False) + return clients[db] + + +class Error(Exception): # NOQA: StandardError undefined on PY3 + pass + + +class InterfaceError(Error): + pass + + +class DatabaseError(Error): + pass + + +class DataError(DatabaseError): + pass + + +class OperationalError(DatabaseError): + pass + + +class IntegrityError(DatabaseError): + pass + + +class InternalError(DatabaseError): + pass + + +class ProgrammingError(DatabaseError): + pass + + +class NotSupportedError(DatabaseError): + pass + + +def Binary(value): + return value diff --git a/djongo/exceptions.py b/djongo/exceptions.py new file mode 100644 index 00000000..a859958b --- /dev/null +++ b/djongo/exceptions.py @@ -0,0 +1,44 @@ +from dataclasses import dataclass +from typing import Sequence, Any + +djongo_access_url = 'https://nesdis.github.io/djongo/support/' +_printed_features = set() + + +@dataclass(repr=False) +class SQLDecodeError(ValueError): + err_key: Any = None + err_sub_sql: Any = None + err_sql: Any = None + params: Sequence = None + version: str = None + + def __repr__(self): + return (f'\n\n\tKeyword: {self.err_key}\n' + f'\tSub SQL: {self.err_sub_sql}\n' + f'\tFAILED SQL: {self.err_sql}\n' + f'\tParams: {self.params}\n' + f'\tVersion: {self.version}') + + def __str__(self): + return repr(self) + + +class NotSupportedError(ValueError): + + def __init__(self, keyword=None): + self.keyword = keyword + + +class MigrationError(Exception): + + def __init__(self, field): + self.field = field + + +def print_warn(feature=None, message=None): + if feature not in _printed_features: + message = ((message or f'This version of djongo does not support "{feature}" fully. ') + + f'Visit {djongo_access_url}') + print(message) + _printed_features.add(feature) \ No newline at end of file diff --git a/djongo/features.py b/djongo/features.py index be2e7a88..acfee1e3 100644 --- a/djongo/features.py +++ b/djongo/features.py @@ -1,5 +1,14 @@ -from django.db.backends.base.features import BaseDatabaseFeatures - - -class DatabaseFeatures(BaseDatabaseFeatures): - supports_transactions = False +from django.db.backends.base.features import BaseDatabaseFeatures + + +class DatabaseFeatures(BaseDatabaseFeatures): + supports_transactions = False + # djongo doesn't seem to support this currently + has_bulk_insert = True + has_native_uuid_field = True + supports_timezones = False + uses_savepoints = False + can_clone_databases = True + test_db_allows_multiple_connections = False + supports_unspecified_pk = True + diff --git a/djongo/introspection.py b/djongo/introspection.py index a67d40a5..3921a4bc 100644 --- a/djongo/introspection.py +++ b/djongo/introspection.py @@ -1,9 +1,110 @@ -from django.db.backends.base.introspection import BaseDatabaseIntrospection, TableInfo - - -class DatabaseIntrospection(BaseDatabaseIntrospection): - # def table_names(self, cursor=None, include_views=False): - # return sorted(cursor.m_cli_connection.collection_names(False)) - - def get_table_list(self, cursor): - return [TableInfo(c,'t') for c in cursor.mongo_conn.collection_names(False)] +import collections +import datetime + +import bson +from django.db.backends.base.introspection import BaseDatabaseIntrospection, FieldInfo, TableInfo +from django.db.models import Index + + +class DatabaseIntrospection(BaseDatabaseIntrospection): + SAMPLE_SIZE = 10000 + TYPE_MAPPING = { + int: bson.int64.Int64, + } + + data_types_reverse = { + bson.int64.Int64: 'BigIntegerField', + bson.objectid.ObjectId: 'ObjectIdField', + collections.OrderedDict: 'JSONField', + datetime.date: 'DateField', + datetime.datetime: 'DateTimeField', + bool: 'BooleanField', + dict: 'JSONField', + float: 'FloatField', + int: 'IntegerField', + list: 'JSONField', + str: 'CharField', + 'text': 'TextField', + 'int64': 'BigIntegerField', + 'int32': 'IntegerField', + 'number': 'DecimalField', + 'string': 'CharField', + 'boolean': 'BooleanField', + 'object': 'djongo.models.DictField', + 'array': 'djongo.models.ListField', + 'oid': 'djongo.models.ObjectIdField', + 'date': 'DateTimeField' + + } + + # def table_names(self, cursor=None, include_views=False): + # return sorted(cursor.m_cli_connection.collection_names(False)) + + def get_table_list(self, cursor): + + return [ + TableInfo(c, 't') + for c in cursor.db_conn.list_collection_names() + if c != '__schema__' + ] + + def get_constraints(self, cursor, table_name): + constraint = {} + + indexes = cursor.db_conn[table_name].index_information() + for name, info in indexes.items(): + if name == '_id_': + continue + + columns = [field[0] for field in info['key']] + orders = ['ASC' if field[1] == 1 else 'DESC' + for field in info['key']] + constraint[name] = { + 'columns': columns, + 'primary_key': name == '__primary_key__', + 'unique': info.get('unique', False), + 'index': True, + 'orders': orders, + "foreign_key": False, + "check": False, + 'type': Index.suffix + } + return constraint + + def get_key_columns(self, cursor, table_name): + return [] + + def get_indexes(self, cursor, table_name): + return self.get_constraints(cursor, table_name) + + def get_relations(self, cursor, table_name): + return [] + + def get_sequences(self, cursor, table_name, table_fields=()): + pk_col = self.get_primary_key_column(cursor, table_name) + return [{'table': table_name, 'column': pk_col}] + + def get_table_description(self, cursor, table_name): + colspecs = collections.defaultdict(lambda: dict( + types=collections.Counter(), + specs=collections.defaultdict(int), + )) + fields = cursor.db_conn['__schema__'].find_one( + {'name': table_name}, + {'fields': True} + )['fields'] + columns = [] + for name, properties in fields.items(): + columns.append( + FieldInfo( + name=name, + type_code=properties['type_code'], + display_size=None, + internal_size=None, + precision=None, + scale=None, + null_ok=None, + default=None + ) + ) + return columns \ No newline at end of file diff --git a/djongo/models.py b/djongo/models.py deleted file mode 100644 index 9d195dda..00000000 --- a/djongo/models.py +++ /dev/null @@ -1,358 +0,0 @@ -from django.db.models import * -from django import forms -from django.core.exceptions import ValidationError -from django.db import connection -import typing - -def make_mdl(mdl, mdl_dict): - for field_name in mdl_dict: - field = mdl._meta.get_field(field_name) - mdl_dict[field_name] = field.to_python(mdl_dict[field_name]) - - return mdl(**mdl_dict) - - -def useful_field(field): - return field.concrete and not (field.is_relation - or isinstance(field, (AutoField, BigAutoField))) - - -class DjongoManager(Manager): - def __getattr__(self, name): - try: - return super().__getattr__(name) - - except AttributeError: - if not name.startswith('mongo_'): - raise AttributeError - name = name.strip('mongo_') - m_cli = connection.cursor().mongo_conn[self.model._meta.db_table] - return getattr(m_cli, name) - - -class ArrayModelField(Field): - - def __init__(self, - model_container: typing.Type[Model], - model_form: typing.Type[forms.ModelForm]=None, - model_form_kwargs_l: dict=None, - *args, **kwargs): - super().__init__(*args, **kwargs) - self.model_container = model_container - self.model_form = model_form - - if model_form_kwargs_l is None: - model_form_kwargs_l = {} - self.model_form_kwargs_l = model_form_kwargs_l - - def deconstruct(self): - name, path, args, kwargs = super().deconstruct() - kwargs['model_container'] = self.model_container - - if self.model_form is not None: - kwargs['model_form'] = self.model_form - - if self.model_form_kwargs_l: - kwargs['model_form_kwargs_l'] = self.model_form_kwargs_l - - return name, path, args, kwargs - - def get_db_prep_value(self, value, connection, prepared): - if prepared: - return value - - if not isinstance(value, list): - raise TypeError('Object must be of type list') - - ret = [] - for a_mdl in value: - mdl_ob = {} - if not isinstance(a_mdl, Model): - raise TypeError('Array items must be of type Model') - for fld in a_mdl._meta.get_fields(): - if not useful_field(fld): - continue - fld_value = getattr(a_mdl, fld.attname) - mdl_ob[fld.attname] = fld.get_db_prep_value(fld_value, connection, prepared) - ret.append(mdl_ob) - - return ret - - def from_db_value(self, value, expression, connection, context): - return self.to_python(value) - - def to_python(self, value): - if value is None: - return value - - assert isinstance(value, list) - ret = [] - for mdl_dict in value: - if isinstance(mdl_dict, self.model_container): - ret.append(mdl_dict) - continue - mdl = make_mdl(self.model_container, mdl_dict) - ret.append(mdl) - - return ret - - def formfield(self, **kwargs): - defaults = { - 'form_class': ArrayFormField, - 'mdl_form': self.model_form, - 'name': self.attname, - 'mdl_form_kw_l': self.model_form_kwargs_l - - } - defaults.update(kwargs) - return super().formfield(**defaults) - - def validate(self, value, model_instance): - super().validate(value, model_instance) - errors = [] - for mdl in value: - try: - mdl.full_clean() - except ValidationError as e: - errors.append(e) - if errors: - raise ValidationError(errors) - - -class ArrayFormField(forms.Field): - def __init__(self, name, mdl_form, mdl_form_kw_l, *args, **kwargs): - self.name = name - self.mdl_form = mdl_form - self.mdl_form_kw_l = mdl_form_kw_l - - widget = ArrayFormWidget(mdl_form._meta.fields[0]) - error_messages = { - 'incomplete': 'Enter all required fields.', - } - - self.ArrayFormSet = forms.formset_factory(self.mdl_form, can_delete=True) - super().__init__(error_messages=error_messages, - widget=widget, *args, **kwargs) - - def clean(self, value): - if not value: - return [] - - form_set = self.ArrayFormSet(value, prefix=self.name) - if form_set.is_valid(): - ret = [] - for itm in form_set.cleaned_data: - if itm.get('DELETE', False): - continue - itm.pop('DELETE') - ret.append(self.mdl_form._meta.model(**itm)) - return ret - - else: - raise ValidationError(form_set.errors + form_set.non_form_errors()) - - def has_changed(self, initial, data): - form_set = self.ArrayFormSet(data, initial=initial, prefix=self.name) - return form_set.has_changed() - - def get_bound_field(self, form, field_name): - return ArrayFormBoundField(form, self, field_name) - - -class ArrayFormBoundField(forms.BoundField): - def __init__(self, form, field, name): - super().__init__(form, field, name) - ArrayFormSet = forms.formset_factory(field.mdl_form, can_delete=True) - - data = self.data if form.is_bound else None - initial = [] - if self.initial is not None: - for ini in self.initial: - if isinstance(ini, Model): - initial.append( - forms.model_to_dict( - ini, - fields=field.mdl_form._meta.fields, - exclude=field.mdl_form._meta.exclude - )) - - self.form_set = ArrayFormSet(data, initial=initial, - prefix=name) - - def __getitem__(self, idx): - if not isinstance(idx, int): - raise TypeError - return self.form_set[idx] - - def __iter__(self): - for form in self.form_set: - yield form - - def __str__(self): - return '\n{}\n
'.format(str(self.form_set)) - - def __len__(self): - return len(self.form_set) - - -class ArrayFormWidget(forms.Widget): - def __init__(self, first_field_id, attrs=None): - self.first_field_id = first_field_id - super().__init__(attrs) - - def render(self, name, value, attrs=None, renderer=None): - assert False - - def id_for_label(self, id_): - return '{}-0-{}'.format(id_, self.first_field_id) - - def value_from_datadict(self, data, files, name): - ret = {key: data[key] for key in data if key.startswith(name)} - return ret - - def value_omitted_from_data(self, data, files, name): - for key in data: - if key.startswith(name): - return False - return True - - -class EmbeddedModelField(Field): - def __init__(self, - model_container: typing.Type[Model], - model_form: typing.Type[forms.ModelForm]=None, - model_form_kwargs: dict=None, - *args, **kwargs): - super().__init__(*args, **kwargs) - self.model_container = model_container - self.model_form = model_form - - if model_form_kwargs is None: - model_form_kwargs = {} - self.model_form_kwargs = model_form_kwargs - - def deconstruct(self): - name, path, args, kwargs = super().deconstruct() - kwargs['model_container'] = self.model_container - if self.model_form is not None: - kwargs['model_form'] = self.model_form - return name, path, args, kwargs - - def get_db_prep_value(self, value, connection=None, prepared=False): - if not isinstance(value, Model): - raise TypeError('Object must be of type Model') - - mdl_ob = {} - for fld in value._meta.get_fields(): - if not useful_field(fld): - continue - fld_value = getattr(value, fld.attname) - mdl_ob[fld.attname] = fld.get_db_prep_value(fld_value, connection, prepared) - - return mdl_ob - - def from_db_value(self, value, expression, connection, context): - return self.to_python(value) - - def to_python(self, value): - if value is None or isinstance(value, self.model_container): - return value - assert isinstance(value, dict) - return make_mdl(self.model_container, value) - - def formfield(self, **kwargs): - if not self.model_form: - raise ValidationError('Implementing model form class needed to create field') - - defaults = { - 'form_class': EmbeddedFormField, - 'mdl_form': self.model_form, - 'mdl_form_kw': self.model_form_kwargs, - 'name': self.attname - } - - defaults.update(kwargs) - return super().formfield(**defaults) - - -class EmbeddedFormField(forms.MultiValueField): - def __init__(self, name, mdl_form, mdl_form_kw, *args, **kwargs): - form_fields = [] - mdl_form_field_names = [] - widgets = [] - - try: - mdl_form_kw['prefix'] = '{}-{}'.format(mdl_form_kw['prefix'], name) - except KeyError: - mdl_form_kw['prefix'] = name - - mdl_form = mdl_form(**mdl_form_kw) - self.mdl_form = mdl_form - - error_messages = { - 'incomplete': 'Enter all required fields.', - } - - for fld_name, fld in mdl_form.fields.items(): - if isinstance(fld, (forms.ModelChoiceField, forms.ModelMultipleChoiceField)): - continue - form_fields.append(fld) - mdl_form_field_names.append(fld_name) - widgets.append(fld.widget) - - widget = EmbeddedFormWidget(mdl_form_field_names, widgets) - super().__init__(error_messages=error_messages, fields=form_fields, - widget=widget, require_all_fields=False, *args, **kwargs) - - def compress(self, clean_data_vals): - mdl_fi = dict(zip(self.mdl_form.fields.keys(), clean_data_vals)) - return self.mdl_form.model(**mdl_fi) - - def get_bound_field(self, form, field_name): - if form.prefix: - self.mdl_form.prefix = '{}-{}'.format(form.prefix, self.mdl_form.prefix) - return EmbeddedFormBoundField(form, self, field_name) - - -class EmbeddedFormBoundField(forms.BoundField): - def __getitem__(self, name): - return self.field.mdl_form[name] - - def __getattr__(self, name): - return getattr(self.field.mdl_form, name) - - def __str__(self): - return self.field.mdl_form.as_table() - - -class EmbeddedFormWidget(forms.MultiWidget): - def __init__(self, field_names, *args, **kwargs): - self.field_names = field_names - super().__init__(*args, **kwargs) - - def decompress(self, value): - if value is None: - return [] - elif isinstance(value, list): - return value - elif isinstance(value, Model): - return [getattr(f_n, value) for f_n in self.field_names] - else: - raise forms.ValidationError('Expected model-form') - - def value_from_datadict(self, data, files, name): - ret = [] - for i, wid in enumerate(self.widgets): - f_n = '{}-{}'.format(name, self.field_names[i]) - ret.append(wid.value_from_datadict( - data, files, f_n - )) - return ret - - def value_omitted_from_data(self, data, files, name): - return all( - widget.value_omitted_from_data( - data, files, '{}-{}'.format(name, self.field_names[i]) - ) - for i, widget in enumerate(self.widgets) - ) diff --git a/djongo/models/__init__.py b/djongo/models/__init__.py new file mode 100644 index 00000000..b939929f --- /dev/null +++ b/djongo/models/__init__.py @@ -0,0 +1,14 @@ +from django.db.models import __all__ as django_models +from django.db.models import * + +from .fields import ( + ArrayField, DjongoManager, + EmbeddedField, ArrayReferenceField, ObjectIdField, + GenericObjectIdField, JSONField +) + +__all__ = django_models + [ + 'DjongoManager', 'ArrayField', + 'EmbeddedField', 'ArrayReferenceField', 'ObjectIdField', + 'GenericObjectIdField', 'JSONField' +] diff --git a/djongo/models/fields.py b/djongo/models/fields.py new file mode 100644 index 00000000..f9a7847f --- /dev/null +++ b/djongo/models/fields.py @@ -0,0 +1,1200 @@ +""" +The standard way of using djongo is to import models.py +in place of Django's standard models module. + +Djongo Fields is where custom fields for working with +MongoDB is defined. + + - EmbeddedField + - ArrayField + - ArrayReferenceField + - GenericReferenceField + +These are the main fields for working with MongoDB. +""" + +# THIS FILE WAS CHANGED ON - 28 Mar 2022 + +import functools +import json +import typing + +from bson import ObjectId +from django import forms +from django.core.exceptions import ValidationError +from django.db import connections as pymongo_connections +from django.db import router, connections, transaction +from django.db.models import ( + Manager, Model, Field, AutoField, + ForeignKey, BigAutoField) +from django.utils import version +from django.db.models.fields.related import RelatedField +from django.forms import modelform_factory +from django.utils.functional import cached_property +from django.utils.html import format_html_join, format_html +from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ +from djongo.exceptions import NotSupportedError, print_warn +from django.db.models import DateField,DateTimeField +from django.db.models.fields import NOT_PROVIDED +from django.utils import timezone + +django_major = int(version.get_version().split('.')[0]) + +if django_major >= 3: + from django.db.models.fields import AutoFieldMixin, AutoFieldMeta + + +def make_mdl(model, model_dict): + """ + Builds an instance of model from the model_dict. + """ + for field_name in model_dict: + field = model._meta.get_field(field_name) + model_dict[field_name] = field.to_python(model_dict[field_name]) + + return model(**model_dict) + + +def useful_field(field): + return field.concrete and not isinstance(field, (AutoField, BigAutoField)) + + +class DjongoManager(Manager): + """ + This modified manager allows to issue Mongo functions by prefixing + them with 'mongo_'. + + This module allows methods to be passed directly to pymongo. + """ + + def __getattr__(self, name): + if name.startswith('mongo'): + name = name[6:] + return getattr(self._client, name) + else: + return super().__getattr__(name) + + @property + def _client(self): + return (pymongo_connections[self.db] + .cursor() + .db_conn[self.model._meta.db_table]) + + +class MongoField(Field): + empty_strings_allowed = False + + +class JSONField(MongoField): + def get_prep_value(self, value): + if not isinstance(value, (dict, list)): + raise ValueError( + f'Value: {value} must be of type dict/list' + ) + return value + + def to_python(self, value): + if not isinstance(value, (dict, list)): + raise ValueError( + f'Value: {value} stored in DB must be of type dict/list' + 'Did you miss any Migrations?' + ) + return value + + +class ModelField(MongoField): + """ + Allows for the inclusion of an instance of an abstract model as + a field inside a document. + """ + base_type = dict + + def __init__(self, + model_container: typing.Type[Model], + *args, **kwargs): + self.model_container = model_container + self.model_container._meta.abstract = False + self._validate_container() + super().__init__(*args, **kwargs) + + def _validate_container(self): + for field in self.model_container._meta._get_fields(reverse=False): + if isinstance(field, (AutoField, + BigAutoField, + RelatedField)): + raise ValidationError( + f'Field "{field}" of model container:"{self.model_container}" ' + f'cannot be of type "{type(field)}"') + + if field.attname != field.column: + raise ValidationError( + f'Field "{field}" of model container:"{self.model_container}" ' + f'cannot be named as "{field.attname}", different from ' + f'column name "{field.column}"') + + if field.db_index: + print_warn('Embedded field index') + raise NotSupportedError( + f'This version of djongo does not support indexes on embedded fields' + ) + + def _value_thru_fields(self, + func_name: str, + value: dict, + *other_args): + processed_value = {} + for field in self.model_container._meta.get_fields(): + try: + field_value = value[field.attname] + except KeyError: + continue + processed_value[field.attname] = getattr(field, func_name)(field_value, *other_args) + return processed_value + + def _save_value_thru_fields(self, + func_name: str, + value: dict, + *other_args): + processed_value = {} + errors = {} + for field in self.model_container._meta.get_fields(): + try: + try: + field_value = value[field.attname] + except KeyError: + raise ValidationError(f'Value for field "{field}" not supplied') + processed_value[field.attname] = getattr(field, func_name)(field_value, *other_args) + except ValidationError as e: + errors[field.name] = e.error_list + + if errors: + e = ValidationError(errors) + raise ValidationError(str(e)) + + return processed_value + + def _obj_thru_fields(self, + func_name: str, + obj: Model, + *other_args): + processed_value = {} + for field in self.model_container._meta.get_fields(): + processed_value[field.attname] = getattr(field, func_name)(obj, *other_args) + return processed_value + + def _value_thru_container(self, value): + processed_value = {} + inst = self.model_container(**value) + for field in self.model_container._meta.get_fields(): + processed_value[field.attname] = getattr(inst, field.attname) + return processed_value + + def validate(self, value, model_instance, validate_parent=True): + if validate_parent: + super().validate(value, model_instance) + + if value is None: + super().validate(value, model_instance) + return + + container_instance = self.model_container(**value) + self._value_thru_fields('validate', value, container_instance) + + def value_to_string(self, obj): + value = self.value_from_object(obj) + if value is None: + raise TypeError(f'Type: {type(value)} cannot be serialized') + + container_obj = self.model_container(**value) + processed_value = self._obj_thru_fields('value_to_string', container_obj) + return json.dumps(processed_value) + + def value_from_object(self, obj): + value = super().value_from_object(obj) + if value is None: + return None + + container_obj = self.model_container(**value) + processed_value = self._obj_thru_fields('value_from_object', container_obj) + return processed_value + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + kwargs['model_container'] = self.model_container + return name, path, args, kwargs + + def get_db_prep_save(self, value, connection): + if value is None: + return None + + if not isinstance(value, self.base_type): + raise ValueError( + f'Value: {value} must be an instance of {self.base_type}') + + processed_value = self._save_value_thru_fields('get_db_prep_save', + value, + connection) + return processed_value + + def get_prep_value(self, value): + if (value is None or + not isinstance(value, self.base_type)): + return value + + processed_value = self._value_thru_fields('get_prep_value', + value) + return processed_value + + def from_db_value(self, value, *args): + return self.to_python(value) + + def to_python(self, value): + """ + Overrides Django's default to_python to allow correct + translation to instance. + """ + if value is None: + return None + + if isinstance(value, str): + value = json.loads(value) + + if not isinstance(value, self.base_type): + raise ValidationError( + f'Value: {value} must be an instance of {self.base_type}') + + value = self._value_thru_container(value) + processed_value = self._value_thru_fields('to_python', value) + return processed_value + + +class FormedField(ModelField): + + def __init__(self, + model_container: typing.Type[Model], + model_form_class: typing.Type[forms.ModelForm] = None, + model_form_kwargs: dict = None, + *args, **kwargs): + super().__init__(model_container, *args, **kwargs) + self.model_form_class = model_form_class + + if model_form_kwargs is None: + model_form_kwargs = {} + self.model_form_kwargs = model_form_kwargs + + def deconstruct(self): + name, path, args, kwargs = super().deconstruct() + if self.model_form_class is not None: + kwargs['model_form_class'] = self.model_form_class + if self.model_form_kwargs: + kwargs['model_form_kwargs'] = self.model_form_kwargs + return name, path, args, kwargs + + def formfield(self, **kwargs): + defaults = { + 'form_class': EmbeddedFormField, + 'model_container': self.model_container, + 'model_form_class': self.model_form_class, + 'model_form_kw': self.model_form_kwargs, + 'name': self.attname + } + + defaults.update(kwargs) + return super().formfield(**defaults) + + +class ArrayField(FormedField): + """ + Implements an array of objects inside the document. + + The allowed object type is defined on model declaration. The + declared instance will accept a python list of instances of the + given model as its contents. + + The model of the container must be declared as abstract, thus should + not be treated as a collection of its own. + """ + empty_strings_allowed = False + base_type = list + + def _value_thru_container(self, value): + post_value = [] + for _dict in value: + post_value.append(super()._value_thru_container(_dict)) + return post_value + + def _value_thru_fields(self, + func_name: str, + value: typing.Union[list, dict], + *other_args): + if isinstance(value, dict): + return super()._value_thru_fields(func_name, + value, + *other_args) + + processed_value = [] + for pre_dict in value: + post_dict = super()._value_thru_fields(func_name, + pre_dict, + *other_args) + processed_value.append(post_dict) + return processed_value + + def _save_value_thru_fields(self, + func_name: str, + value: typing.Union[list, dict], + *other_args): + processed_value = [] + for pre_dict in value: + post_dict = super()._save_value_thru_fields(func_name, + pre_dict, + *other_args) + processed_value.append(post_dict) + return processed_value + + def value_to_string(self, obj): + value = self.value_from_object(obj) + processed_value = [] + for _dict in value: + container_obj = self.model_container(**_dict) + post_dict = self._obj_thru_fields('value_to_string', container_obj) + processed_value.append(post_dict) + return json.dumps(processed_value) + + def value_from_object(self, obj): + value = getattr(obj, self.attname) + processed_value = [] + for _dict in value: + container_obj = self.model_container(**_dict) + post_dict = self._obj_thru_fields('value_from_object', container_obj) + processed_value.append(post_dict) + return processed_value + + def validate(self, value, model_instance, validate_parent=True): + super(ModelField, self).validate(value, model_instance) + for _dict in value: + super().validate(_dict, model_instance, validate_parent=False) + + +def _get_model_form_class(model_form_class, model_container, admin, request): + if not model_form_class: + form_kwargs = dict( + form=forms.ModelForm, + fields=forms.ALL_FIELDS, + ) + + if admin and request: + form_kwargs['formfield_callback'] = functools.partial( + admin.formfield_for_dbfield, request=request) + + model_form_class = modelform_factory(model_container, **form_kwargs) + + return model_form_class + + +class NestedFormSet(forms.formsets.BaseFormSet): + def add_fields(self, form, index): + for name, field in form.fields.items(): + if isinstance(field, ArrayFormField): + field.name = '%s-%s' % (form.prefix, name) + super(NestedFormSet, self).add_fields(form, index) + + +class ArrayFormField(forms.Field): + def __init__(self, name, model_form_class, model_container, mdl_form_kw_l, + widget=None, admin=None, request=None, *args, **kwargs): + + self.name = name + self.model_container = model_container + self.model_form_class = _get_model_form_class( + model_form_class, model_container, admin, request) + self.mdl_form_kw_l = mdl_form_kw_l + self.admin = admin + self.request = request + + if not widget: + widget = ArrayFormWidget(self.model_form_class.__name__) + + error_messages = { + 'incomplete': 'Enter all required fields.', + } + + self.ArrayFormSet = forms.formset_factory( + self.model_form_class, formset=NestedFormSet, can_delete=True) + super().__init__(error_messages=error_messages, + widget=widget, *args, **kwargs) + + def clean(self, value): + if not value: + return [] + + form_set = self.ArrayFormSet(value, prefix=self.name) + if form_set.is_valid(): + ret = [] + for itm in form_set.cleaned_data: + if itm.get('DELETE', True): + continue + itm.pop('DELETE') + ret.append(self.model_form_class._meta.model(**itm)) + return ret + + else: + raise ValidationError(form_set.errors + form_set.non_form_errors()) + + def has_changed(self, initial, data): + form_set_initial = [] + for init in initial or []: + form_set_initial.append( + forms.model_to_dict( + init, + fields=self.model_form_class._meta.fields, + exclude=self.model_form_class._meta.exclude + ) + ) + form_set = self.ArrayFormSet(data, initial=form_set_initial, prefix=self.name) + return form_set.has_changed() + + def get_bound_field(self, form, field_name): + return ArrayFormBoundField(form, self, field_name) + + +class ArrayFormBoundField(forms.BoundField): + def __init__(self, form, field, name): + super().__init__(form, field, name) + + data = self.data if form.is_bound else None + initial = [] + if self.initial is not None: + for ini in self.initial: + if isinstance(ini, Model): + initial.append( + forms.model_to_dict( + ini, + fields=field.model_form_class._meta.fields, + exclude=field.model_form_class._meta.exclude + )) + + self.form_set = field.ArrayFormSet(data, initial=initial, prefix=self.html_name) + + def __getitem__(self, idx): + if not isinstance(idx, (int, slice)): + raise TypeError + return self.form_set[idx] + + def __iter__(self): + for form in self.form_set: + yield form + + def __str__(self): + table = format_html_join( + '\n', '{}', + ((form.as_table(),) + for form in self.form_set)) + table = format_html( + '\n' + '\n{}' + '\n
', + self.name, + table) + return format_html('{}\n{}', table, self.form_set.management_form) + + def __len__(self): + return len(self.form_set) + + +class ArrayFormWidget(forms.Widget): + def __init__(self, first_field_id, attrs=None): + self.first_field_id = first_field_id + super().__init__(attrs) + + def render(self, name, value, attrs=None, renderer=None): + assert False + + def id_for_label(self, id_): + return '{}-0-{}'.format(id_, self.first_field_id) + + def value_from_datadict(self, data, files, name): + ret = {key: data[key] for key in data if key.startswith(name)} + return ret + + def value_omitted_from_data(self, data, files, name): + for key in data: + if key.startswith(name): + return False + return True + + +class EmbeddedField(FormedField): + pass + + +class EmbeddedFormField(forms.MultiValueField): + def __init__(self, name, model_form_class, model_form_kw, model_container, + admin=None, request=None, *args, **kwargs): + form_fields = [] + mdl_form_field_names = [] + widgets = [] + model_form_kwargs = model_form_kw.copy() + + try: + model_form_kwargs['prefix'] = model_form_kwargs['prefix'] + '-' + name + except KeyError: + model_form_kwargs['prefix'] = name + + initial = kwargs.pop('initial', None) + if initial: + model_form_kwargs['initial'] = initial + + self.model_form_class = _get_model_form_class( + model_form_class, model_container, admin, request) + self.model_form_kwargs = model_form_kwargs + self.admin = admin + self.request = request + + error_messages = { + 'incomplete': 'Enter all required fields.', + } + + self.model_form = self.model_form_class(**model_form_kwargs) + for field_name, field in self.model_form.fields.items(): + if isinstance(field, (forms.ModelChoiceField, forms.ModelMultipleChoiceField)): + continue + elif isinstance(field, ArrayFormField): + field.name = '%s-%s' % (self.model_form.prefix, field_name) + form_fields.append(field) + mdl_form_field_names.append(field_name) + widgets.append(field.widget) + + widget = EmbeddedFormWidget(mdl_form_field_names, widgets) + super().__init__(error_messages=error_messages, fields=form_fields, + widget=widget, require_all_fields=False, *args, **kwargs) + + def compress(self, clean_data_vals): + model_field = dict(zip(self.model_form.fields.keys(), clean_data_vals)) + return self.model_form._meta.model(**model_field) + + def get_bound_field(self, form, field_name): + if form.prefix: + self.model_form.prefix = '{}-{}'.format(form.prefix, self.model_form.prefix) + return EmbeddedFormBoundField(form, self, field_name) + + def bound_data(self, data, initial): + if self.disabled: + return initial + return self.compress(data) + + +class EmbeddedFormBoundField(forms.BoundField): + # def __getitem__(self, name): + # return self.field.model_form[name] + # + # def __getattr__(self, name): + # return getattr(self.field.model_form, name) + + def __str__(self): + instance = self.value() + model_form = self.field.model_form_class(instance=instance, **self.field.model_form_kwargs) + + return mark_safe(f'\n{ model_form.as_table() }\n
') + + +class EmbeddedFormWidget(forms.MultiWidget): + def __init__(self, field_names, *args, **kwargs): + self.field_names = field_names + super().__init__(*args, **kwargs) + + def decompress(self, value): + if value is None: + return [] + elif isinstance(value, list): + return value + elif isinstance(value, Model): + return [getattr(value, f_n) for f_n in self.field_names] + else: + raise forms.ValidationError('Expected model-form') + + def value_from_datadict(self, data, files, name): + ret = [] + for i, wid in enumerate(self.widgets): + f_n = '{}-{}'.format(name, self.field_names[i]) + ret.append(wid.value_from_datadict( + data, files, f_n + )) + return ret + + def value_omitted_from_data(self, data, files, name): + return all( + widget.value_omitted_from_data( + data, files, '{}-{}'.format(name, self.field_names[i]) + ) + for i, widget in enumerate(self.widgets) + ) + + +class ObjectIdFieldMixin: + description = _("ObjectId") + empty_strings_allowed = False + + def get_db_prep_value(self, value, connection, prepared=False): + return self.to_python(value) + + def to_python(self, value): + if isinstance(value, str): + return ObjectId(value) + return value + + def get_internal_type(self): + return "ObjectIdField" + + def rel_db_type(self, connection): + return self.db_type(connection) + + def get_prep_value(self, value): + return value + + +class GenericObjectIdField(ObjectIdFieldMixin, Field): + pass + + +if django_major >= 3: + class _ObjectIdField(AutoFieldMixin, GenericObjectIdField, metaclass=AutoFieldMeta): + pass +else: + class _ObjectIdField(ObjectIdFieldMixin, AutoField): + pass + + +class ObjectIdField(_ObjectIdField): + """ + For every document inserted into a collection MongoDB internally creates an field. + The field can be referenced from within the Model as _id. + """ + + def __init__(self, *args, **kwargs): + id_field_args = { + 'primary_key': True, + 'auto_created': True + } + id_field_args.update(kwargs) + super().__init__(*args, **id_field_args) + + +class ArrayReferenceManagerMixin: + + def _apply_rel_filters(self, queryset): + """ + Filter the queryset for the instance this manager is bound to. + """ + queryset._add_hints(instance=self.instance) + if self._db: + queryset = queryset.using(self._db) + queryset = queryset.filter(**self.core_filters) + + return queryset + + def get_queryset(self): + try: + return self.instance._prefetched_objects_cache[self.field.related_query_name()] + except (AttributeError, KeyError): + queryset = super().get_queryset() + return self._apply_rel_filters(queryset) + + def update_or_create(self, **kwargs): + db = router.db_for_write(self.instance.__class__, instance=self.instance) + obj, created = super(ArrayReferenceManagerMixin, self.db_manager(db)).update_or_create(**kwargs) + # We only need to add() if created because if we got an object back + # from get() then the relationship already exists. + if created: + self.add(obj) + return obj, created + + update_or_create.alters_data = True + + def get_or_create(self, **kwargs): + db = router.db_for_write(self.instance.__class__, instance=self.instance) + obj, created = super(ArrayReferenceManagerMixin, self.db_manager(db)).get_or_create(**kwargs) + # We only need to add() if created because if we got an object back + # from get() then the relationship already exists. + if created: + self.add(obj) + return obj, created + + get_or_create.alters_data = True + + def create(self, **kwargs): + db = router.db_for_write(self.instance.__class__, instance=self.instance) + new_obj = super(ArrayReferenceManagerMixin, self.db_manager(db)).create(**kwargs) + self.add(new_obj) + return new_obj + + create.alters_data = True + + +def create_reverse_array_reference_manager(superclass, rel): + if issubclass(superclass, DjongoManager): + baseclass = superclass + else: + baseclass = type('baseclass', (DjongoManager, superclass), {}) + + class ReverseArrayReferenceManager(ArrayReferenceManagerMixin, baseclass): + def __init__(self, instance): + super().__init__() + self.instance = instance + self.model = rel.related_model + self.field = rel.remote_field + + name = rel.remote_field.name + self.core_filters = {name: instance} + + def __call__(self, *, manager): + manager = getattr(self.model, manager) + manager_class = create_reverse_array_reference_manager(manager.__class__, rel) + return manager_class(instance=self.instance) + + do_not_call_in_templates = True + + def _apply_rel_filters(self, queryset): + queryset = super()._apply_rel_filters(queryset) + db = self._db or router.db_for_read(self.model, instance=self.instance) + empty_strings_as_null = connections[db].features.interprets_empty_strings_as_nulls + + for field in self.field.foreign_related_fields: + val = getattr(self.instance, field.attname) + if val is None or (val == '' and empty_strings_as_null): + return queryset.none() + return queryset + + def _make_filter(self, *objs): + ids = set(obj.pk for obj in objs) + return { + self.model._meta.pk.name: { + '$in': list(ids) + } + } + + def add(self, *objs): + _filter = self._make_filter(*objs) + lh_field, rh_field = self.field.related_fields[0] + self.mongo_update( + _filter, + { + '$addToSet': { + lh_field.get_attname(): + getattr(self.instance, rh_field.get_attname()) + } + } + ) + for obj in objs: + fk_field = getattr(obj, lh_field.get_attname()) + fk_field.add(getattr(self.instance, rh_field.get_attname())) + + add.alters_data = True + + def remove(self, *objs): + pass + + remove.alters_data = True + + def clear(self): + pass + + clear.alters_data = True + + def set(self, objs, *, clear=False): + pass + + set.alters_data = True + + def create(self, **kwargs): + pass + + create.alters_data = True + + return ReverseArrayReferenceManager + + +def create_forward_array_reference_manager(superclass, rel): + if issubclass(superclass, DjongoManager): + baseclass = superclass + else: + baseclass = type('baseclass', (DjongoManager, superclass), {}) + + class ArrayReferenceManager(ArrayReferenceManagerMixin, baseclass): + + def __init__(self, instance): + super().__init__() + + self.instance = instance + self.model = rel.model + self.field = rel.remote_field + self.instance_manager = DjongoManager() + self.instance_manager.model = instance + name = self.field.related_fields[0][1].attname + ids = getattr(instance, self.field.attname) or [] + + self.core_filters = {f'{name}__in': ids} + + def __call__(self, *, manager): + manager = getattr(self.model, manager) + manager_class = create_forward_array_reference_manager(manager.__class__, rel) + return manager_class(instance=self.instance) + + do_not_call_in_templates = True + + def _apply_rel_filters(self, queryset): + queryset = super()._apply_rel_filters(queryset) + if not getattr(self.instance, self.field.attname): + return queryset.none() + return queryset + + def get_queryset(self): + try: + return self.instance._prefetched_objects_cache[self.field.related_query_name()] + except (AttributeError, KeyError): + queryset = super().get_queryset() + return self._apply_rel_filters(queryset) + + def _make_filter(self): + return {self.instance._meta.pk.name: self.instance.pk} + + def add(self, *objs): + fks = getattr(self.instance, self.field.get_attname()) + if fks is None: + fks = set() + setattr(self.instance, self.field.get_attname(), fks) + + new_fks = set() + rh_field = self.field.foreign_related_fields[0] + for obj in objs: + new_fks.add(getattr(obj, rh_field.get_attname())) + fks.update(new_fks) + + db = router.db_for_write(self.instance.__class__, instance=self.instance) + self.instance_manager.db_manager(db).mongo_update( + self._make_filter(), + { + '$addToSet': { + self.field.attname: { + '$each': list(new_fks) + } + } + } + ) + + add.alters_data = True + + def remove(self, *objs): + to_del = set( + getattr(obj, self.field.foreign_related_fields[0].attname) + for obj in objs + ) + self._remove(to_del) + + remove.alters_data = True + + def _remove(self, to_del): + fks = getattr(self.instance, self.field.attname) + fks.difference_update(to_del) + db = self._db or router.db_for_write(self.instance.__class__, instance=self.instance) + self.instance_manager.db_manager(db).mongo_update( + self._make_filter(), + { + '$pull': { + self.field.attname: { + '$in': list(to_del) + } + } + } + ) + + def clear(self): + db = router.db_for_write(self.instance.__class__, instance=self.instance) + self.instance_manager.db_manager(db).mongo_update( + self._make_filter(), + { + '$set': { + self.field.attname: [] + } + } + ) + setattr(self.instance, self.field.attname, set()) + + clear.alters_data = True + + def set(self, objs, *, clear=False): + objs = tuple(objs) + + db = router.db_for_write(self.instance.__class__, instance=self.instance) + with transaction.atomic(using=db, savepoint=False): + if clear: + self.clear() + self.add(*objs) + else: + fks = getattr(self.instance, self.field.attname) + rh_field = self.field.foreign_related_fields[0] + new_fks = set(getattr(obj, rh_field.get_attname()) for obj in objs) + to_del = fks - new_fks + self._remove(to_del) + fks = getattr(self.instance, self.field.attname) + to_add = [] + for obj in objs: + if getattr(obj, rh_field.get_attname()) not in fks: + to_add.append(obj) + self.add(to_add) + + set.alters_data = True + + return ArrayReferenceManager + + +class ArrayReferenceDescriptor: + + def __init__(self, field_with_rel): + self.field = field_with_rel + + @cached_property + def related_manager_cls(self): + related_model = self.field.related_model + + return create_forward_array_reference_manager( + related_model._default_manager.__class__, + self.field.remote_field, + ) + + def __get__(self, instance, cls=None): + """ + Get the related objects through the reverse relation. + + With the example above, when getting ``parent.children``: + + - ``self`` is the descriptor managing the ``children`` attribute + - ``instance`` is the ``parent`` instance + - ``cls`` is the ``Parent`` class (unused) + """ + if instance is None: + return self + + return self.related_manager_cls(instance) + + +class ReverseArrayReferenceDescriptor: + + def __init__(self, related): + self.rel = related + + @cached_property + def related_manager_cls(self): + related_model = self.rel.related_model + + return create_reverse_array_reference_manager( + related_model._default_manager.__class__, + self.rel, + ) + + def __get__(self, instance, cls=None): + """ + Get the related objects through the relation. + + With the example above, when getting ``parent.children``: + + - ``self`` is the descriptor managing the ``children`` attribute + - ``instance`` is the ``parent`` instance + - ``cls`` is the ``Parent`` class (unused) + """ + if instance is None: + return self + + return self.related_manager_cls(instance) + + +# class ArrayManyToManyField(ManyToManyField): +# +# def contribute_to_class(self, cls, name, **kwargs): +# super().contribute_to_class(cls, name, **kwargs) +# setattr(cls, self.name, ArrayManyToManyDescriptor(self.remote_field, reverse=False)) + + +class ArrayReferenceField(ForeignKey): + """ + When the entry gets saved, only a reference to the primary_key of the model is saved in the array. + For all practical aspects, the ArrayReferenceField behaves like a Django ManyToManyField. + """ + + many_to_many = False + many_to_one = True + one_to_many = False + one_to_one = False + # rel_class = ManyToManyRel + related_accessor_class = ReverseArrayReferenceDescriptor + forward_related_accessor_class = ArrayReferenceDescriptor + + def __init__(self, to, on_delete=None, related_name=None, related_query_name=None, + limit_choices_to=None, parent_link=False, to_field=None, + db_constraint=True, **kwargs): + + on_delete = on_delete or self._on_delete + super().__init__(to, on_delete=on_delete, related_name=related_name, + related_query_name=related_query_name, + limit_choices_to=limit_choices_to, + parent_link=parent_link, to_field=to_field, + db_constraint=db_constraint, **kwargs) + + self.concrete = False + + @staticmethod + def _on_delete(collector, field, sub_objs, using): + for model, instances in collector.data.items(): + for obj in sub_objs: + getattr(obj, field.name).db_manager(using).remove(*instances) + + def from_db_value(self, value, expression, connection, context=None): + return self.to_python(value) + + def to_python(self, value): + if value is None: + return set() + return set(value) + + def get_db_prep_value(self, value, connection, prepared=False): + if value is None: + return [] + elif isinstance(value, set): + return list(value) + return value + # return super().get_db_prep_value(value, connection, prepared) + + def get_db_prep_save(self, value, connection): + return self.get_db_prep_value(value, connection) + # if value is None: + # return [] + # return list(value) + + def validate(self, value, model_instance): + pass + # super().validate(list(value), model_instance) + + def save_form_data(self, instance, data): + getattr(instance, self.name).set(list(data), clear=True) + + def formfield(self, *, using=None, **kwargs): + defaults = { + 'form_class': forms.ModelMultipleChoiceField, + 'queryset': self.remote_field.model._default_manager.using(using), + **kwargs, + } + # If initial is passed in, it's a list of related objects, but the + # MultipleChoiceField takes a list of IDs. + if defaults.get('initial') is not None: + initial = defaults['initial'] + if callable(initial): + initial = initial() + defaults['initial'] = [i.pk for i in initial] + return super().formfield(**defaults) + +class FlexiEmbeddedField(FormedField): + """ + This type of model field would give you the functionalty of dynamic object saving for a concrete model.In concrete modeling if there are any field + which might not contain values always, By this type of field you can skip the field. Though this will only work for embeded field only. + + """ + def __init__(self, + model_container, + model_form_class=None, + model_form_kwargs: dict = None, + *args, **kwargs): + super().__init__(model_container, *args, **kwargs) + + def _save_value_thru_fields(self, func_name: str, value: dict, *other_args): + # override the method to save the fields in db which does not have any null value + processed_value = {} + errors = {} + + for field in self.model_container._meta.get_fields(): + try: + field_value = None + try: + field_value = value[field.attname] + + if field_value is None or field_value == "": + # if field contains a "default value" then any null or blank values are not allowed. + if not isinstance(field.default, type): + if field.blank is False and field.null is False: + raise ValidationError( + f'"{field}" has a default value as "{field.default}".It can\'t be changed to null or "" ') + + if field.blank is False or field.null is False: + # raise ValidationError(f'Value for field "{field}" not supported as it is not allowed empty values') + field_value = None + + # null values or "" or both are allowed to the field, keep the value as it is. By defualt django model doesnot allow both to true + if field.null is True and field_value is None: + processed_value[field.attname] = getattr(field, func_name)(field_value, *other_args) + elif field.blank is True and field_value == "": + processed_value[field.attname] = getattr(field, func_name)(field_value, *other_args) + elif field.blank is True and field.null is True: + processed_value[field.attname] = getattr(field, func_name)(field_value, *other_args) + else: + raise ValidationError( + f'Value for field "{field}" not supported as it is not allowed "{field_value}" values') + + except KeyError: + # if no value is passed from the frontend and if field contain a default value the set it to default val + if field.blank is False and field.null is False: + if not isinstance(field.default, type): + # having a default value and we didnot pass any value regarding this field + processed_value[field.attname] = getattr(field, func_name)(field.default, *other_args) + else: + # did not pass any value from frontend + field_value = None + + # setting DateTimeField or DateField value. It gets fired when user did't provide any value for these fields. + # auto_now_add - editable=False - fire at only iintial instance creation + if isinstance(field, DateTimeField) or isinstance(field, DateField) or isinstance(field, TimeField): + current_time = timezone.now() + formatted_value = field.to_python(current_time) + if field.auto_now_add is True: + field.editable = False + elif field.auto_now is True: + field.editable = True + try: + field._check_fix_default_value() + processed_value[field.attname] = getattr(field, func_name)(formatted_value, *other_args) + except Warning as w: + errors[field.name] = w.with_traceback() + + # print(f'fields are called for "{field}" and defualt value for fields "{field.default}"') + + # can not set the custom values for date and datetime fields if auto_now or auto now_add true. + if (isinstance(field, DateTimeField) or isinstance(field, DateField) or isinstance(field, TimeField)) \ + and (field.auto_now is True or field.auto_now_add is True): + field_value = None + + if field_value is not None and not isinstance(field.default, NOT_PROVIDED): + processed_value[field.attname] = getattr(field, func_name)(field_value, *other_args) + + + except ValidationError as e: + errors[field.name] = e.error_list + + if errors: + e = ValidationError(errors) + raise ValidationError(str(e)) + + return processed_value + + def _value_thru_fields(self, func_name: str, value: dict, *other_args): + # override the method to fetch the fields from db which does not have any null value + processed_value = {} + for field in self.model_container._meta.get_fields(): + try: + field_value = value[field.attname] + except KeyError: + continue + if (field.blank is False and field_value == "") or (field.null is True and field_value == None): + field_value = None + if field_value is not None: + # print(f'field value for "{field}": "{field_value==""}"') + processed_value[field.attname] = getattr(field, func_name)(field_value, *other_args) + return processed_value \ No newline at end of file diff --git a/djongo/models/indexes.py b/djongo/models/indexes.py new file mode 100644 index 00000000..dfc56645 --- /dev/null +++ b/djongo/models/indexes.py @@ -0,0 +1 @@ +# This version of djongo does not support indexes diff --git a/djongo/models/json.py b/djongo/models/json.py new file mode 100644 index 00000000..aa2cdf3b --- /dev/null +++ b/djongo/models/json.py @@ -0,0 +1,20 @@ +import warnings + +try: + from jsoneditor.fields.django_jsonfield import JSONField as JSONFieldBase +except ImportError: + from django.db import models + + class JSONFieldBase(models.TextField): + + def __init__(self, *args, **kwargs): + warnings.warn( + '"jsoneditor" module not available, to enable json mode ' + 'please run: "pip install djongo[json]"', stacklevel=2) + models.TextField.__init__(self, *args, **kwargs) + + +class JSONField(JSONFieldBase): + + def get_prep_value(self, value): + return value diff --git a/djongo/operations.py b/djongo/operations.py index 57ddaa4c..d28bf53a 100644 --- a/djongo/operations.py +++ b/djongo/operations.py @@ -1,52 +1,120 @@ -from django.db.backends.base.operations import BaseDatabaseOperations -from django.utils import six -import datetime, calendar - - -class DatabaseOperations(BaseDatabaseOperations): - - def quote_name(self, name): - if name.startswith('"') and name.endswith('"'): - return name - return '"{}"'.format(name) - - def adapt_datefield_value(self, value): - if value is None: - return None - return datetime.datetime.utcfromtimestamp(calendar.timegm(value.timetuple())) - - def adapt_datetimefield_value(self, value): - return value - - def adapt_timefield_value(self, value): - if value is None: - return None - - if isinstance(value, six.string_types): - return datetime.datetime.strptime(value, '%H:%M:%S') - - return datetime.datetime(1900, 1, 1, value.hour, value.minute, \ - value.second, value.microsecond) - - def convert_datefield_value(self, value, expression, connection, context): - if isinstance(value, datetime.datetime): - value = value.date() - return value - - def convert_timefield_value(self, value, expression, connection, context): - if isinstance(value, datetime.datetime): - value = value.time() - return value - - def get_db_converters(self, expression): - converters = super(DatabaseOperations, self).get_db_converters(expression) - internal_type = expression.output_field.get_internal_type() - if internal_type == 'DateField': - converters.append(self.convert_datefield_value) - elif internal_type == 'TimeField': - converters.append(self.convert_timefield_value) - return converters - - def sql_flush(self, style, tables, sequences, allow_cascade=False): - # TODO: Need to implement this fully - return ['ALTER TABLE'] +import pytz +from django.conf import settings +from django.db.backends.base.operations import BaseDatabaseOperations +from django.utils import timezone +import bson +import datetime +import calendar + + +class DatabaseOperations(BaseDatabaseOperations): + + def quote_name(self, name): + if name.startswith('"') and name.endswith('"'): + return name + return '"{}"'.format(name) + + def adapt_datefield_value(self, value): + if value is None: + return None + + if isinstance(value, datetime.datetime) and timezone.is_aware(value): + raise ValueError( + "Djongo backend does not support timezone-aware dates.") + + x = calendar.timegm(value.timetuple()) + # this is presuming that UTC info is needed; anything after 'replace' + # can be deleted for 'dt' if not. + dt = datetime.datetime(1970, 1, 1).replace( + tzinfo=datetime.timezone.utc) + if x < 0: + return dt + datetime.timedelta(seconds=x) + else: + return datetime.datetime.utcfromtimestamp(calendar.timegm( + value.timetuple())) + + def adapt_datetimefield_value(self, value): + if value is None: + return None + + if isinstance(value, datetime.datetime) and timezone.is_aware(value): + if settings.USE_TZ: + value = timezone.make_naive(value, self.connection.timezone) + else: + raise ValueError( + "Djongo backend does not support timezone-aware datetimes when USE_TZ is False.") + return value + + def adapt_timefield_value(self, value): + if value is None: + return None + + if isinstance(value, str): + return datetime.datetime.strptime(value, '%H:%M:%S') + + if timezone.is_aware(value): + raise ValueError( + "Djongo backend does not support timezone-aware times.") + + return datetime.datetime(1900, 1, 1, value.hour, value.minute, + value.second, value.microsecond) + + def adapt_decimalfield_value(self, value, max_digits=None, decimal_places=None): + if value is None: + return None + return bson.Decimal128(super().adapt_decimalfield_value(value, max_digits, decimal_places)) + + def convert_datefield_value(self, value, expression, connection): + if isinstance(value, datetime.datetime): + if settings.USE_TZ: + value = timezone.make_aware(value, self.connection.timezone) + value = value.date() + return value + + def convert_timefield_value(self, value, expression, connection): + if isinstance(value, datetime.datetime): + if settings.USE_TZ: + value = timezone.make_aware(value, self.connection.timezone) + value = value.time() + return value + + def convert_datetimefield_value(self, value, expression, connection): + if isinstance(value, datetime.datetime): + if settings.USE_TZ: + value = timezone.make_aware(value, self.connection.timezone) + return value + + def get_db_converters(self, expression): + converters = super(DatabaseOperations, + self).get_db_converters(expression) + internal_type = expression.output_field.get_internal_type() + if internal_type == 'DateField': + converters.append(self.convert_datefield_value) + elif internal_type == 'TimeField': + converters.append(self.convert_timefield_value) + elif internal_type == 'DateTimeField': + converters.append(self.convert_datetimefield_value) + return converters + + def sql_flush(self, style, tables, reset_sequences, allow_cascade=False): + # TODO: Need to implement this fully + return [f'ALTER TABLE "{table}" FLUSH' + for table in tables] + + def max_name_length(self): + return 60 + + def no_limit_value(self): + return None + + def bulk_insert_sql(self, fields, placeholder_rows): + return ' '.join( + 'VALUES (%s)' % ', '.join(row) + for row in placeholder_rows + ) + + def date_extract_sql(self, lookup_type, field_name): + return "EXTRACT('%s' FROM %s)" % (lookup_type, field_name) + + def date_trunc_sql(self, lookup_type, field_name): + return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name) diff --git a/djongo/schema.py b/djongo/schema.py index 4b3c96d9..7788a6fd 100644 --- a/djongo/schema.py +++ b/djongo/schema.py @@ -1,24 +1,18 @@ -from django.db.backends.base.schema import BaseDatabaseSchemaEditor -from logging import getLogger - -logger = getLogger(__name__) - -class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): - pass - # def create_model(self, model): - # db_con = self.connection.connection - # db_con.create_collection(model._meta.db_table) - # logger.debug('Created table {}'.format(model._meta.db_table)) - # - # for field in model._meta.local_fields: - # if field.get_internal_type() in ("AutoField", "BigAutoField"): - # db_con['__schema__'].\ - # insert_one( - # { - # 'name': model._meta.db_table, - # 'auto': { - # 'field_name': field.column, - # 'seq': 0 - # } - # } - # ) +from django.db.backends.base.schema import BaseDatabaseSchemaEditor +from logging import getLogger + +logger = getLogger(__name__) + + +class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): + + sql_create_index = "ALTER TABLE %(table)s ADD CONSTRAINT %(name)s INDEX (%(columns)s)%(extra)s" + sql_delete_index = "ALTER TABLE %(table)s DROP CONSTRAINT %(name)s INDEX" + sql_create_unique_index = "ALTER TABLE %(table)s ADD CONSTRAINT %(name)s UNIQUE (%(columns)s)(%(condition)s)" + + def quote_value(self, value): + return value + + def prepare_default(self, value): + raise NotImplementedError() + diff --git a/djongo/sql2mongo.py b/djongo/sql2mongo.py deleted file mode 100644 index 1710283b..00000000 --- a/djongo/sql2mongo.py +++ /dev/null @@ -1,947 +0,0 @@ -from itertools import chain - -from pymongo.cursor import Cursor as PymongoCursor -from pymongo.database import Database -from logging import getLogger -import re -import typing -from pymongo import ReturnDocument, ASCENDING, DESCENDING -from sqlparse import parse as sql_parse -from sqlparse import tokens -from sqlparse.sql import ( - IdentifierList, Identifier, Parenthesis, - Where, Comparison, Function, Token -) -from collections import OrderedDict - -logger = getLogger(__name__) - -OPERATOR_MAP = { - '=': '$eq', - '>': '$gt', - '<': '$lt', - '>=': '$gte', - '<=': '$lte', -} - -OPERATOR_PRECEDENCE = { - 'IN': 5, - 'NOT IN': 4, - 'NOT': 3, - 'AND': 2, - 'OR': 1, - 'generic': 0 -} - -ORDER_BY_MAP = { - 'ASC': ASCENDING, - 'DESC': DESCENDING -} - - -class SQLDecodeError(ValueError): - pass - - -class CollField(typing.NamedTuple): - coll: str - field: str - - -class SortOrder(typing.NamedTuple): - coll_field: CollField - ord: int - - -def re_index(value: str): - match = re.match(r'%\(([0-9]+)\)s', value, flags=re.IGNORECASE) - if match: - index = int(match.group(1)) - else: - match = re.match(r'NULL', value, flags=re.IGNORECASE) - if not match: - raise SQLDecodeError - index = None - return index - - -class Join: - - def __init__(self): - self.left_table: str = None - self.right_table: str = None - self.local_field: str = None - self.foreign_field: str = None - - -class InnerJoin(Join): - pass - - -class OuterJoin(Join): - pass - - -class Projection: - - def __init__(self): - self.return_const: typing.Any = None - self.return_count = False - self.no_id = True - self.coll_fields: typing.List[CollField] = [] - - -class Parse: - - def __init__(self, - connection: Database, - sql: str, - params: typing.Optional[list]): - logger.debug('params: {}'.format(params)) - - self._params = params - self._p_index_count = -1 - self._sql = re.sub(r'%s', self._param_index, sql) - self.db = connection - self.left_tbl: str = None - - self.last_row_id = None - - self.proj = Projection() - self.filter: dict = None - self.sort: typing.List[SortOrder] = [] - self.limit: int = None - self.joins: typing.List[typing.Union[InnerJoin, OuterJoin]] = [] - - self._parse() - - def result(self): - return Result(self) - - def _param_index(self, _): - self._p_index_count += 1 - return '%({})s'.format(self._p_index_count) - - def _parse(self): - logger.debug('\n mongo_cur: {}'.format(self._sql)) - statement = sql_parse(self._sql) - - if len(statement) > 1: - raise SQLDecodeError('Sql: {}'.format(self._sql)) - - statement = statement[0] - sm_type = statement.get_type() - - # Some of these commands can be ignored, some need to be implemented. - if sm_type in ('ALTER', 'DROP'): - logger.debug('Not supported {}'.format(statement)) - return None - - try: - return self.FUNC_MAP[sm_type](self, statement) - except KeyError: - logger.debug('\n Not implemented {} {}'.format(sm_type, statement)) - raise NotImplementedError('{} command not implemented for SQL {}'.format(sm_type, self._sql)) - - def _create(self, sm): - next_id, next_tok = sm.token_next(0) - if next_tok.match(tokens.Keyword, 'TABLE'): - next_id, next_tok = sm.token_next(next_id) - table = next(SQLToken.iter_tokens(next_tok)).field - self.db.create_collection(table) - logger.debug('Created table {}'.format(table)) - - next_id, next_tok = sm.token_next(next_id) - if isinstance(next_tok, Parenthesis): - for col in next_tok.value.strip('()').split(','): - if col.find('AUTOINCREMENT') != -1: - field = col[col.find('"')+1: col.rfind('"')] - self.db['__schema__'].insert_one({ - 'name': table, - 'auto': { - 'field_name': field, - 'seq': 0 - } - }) - else: - logger.debug('Not supported {}'.format(sm)) - - def _update(self, sm): - db_con = self.db - kw = {} - next_id, next_tok = sm.token_next(0) - sql_token = next(SQLToken.iter_tokens(next_tok)) - self.left_tbl = collection = sql_token.field - - next_id, next_tok = sm.token_next(next_id) - - if not next_tok.match(tokens.Keyword, 'SET'): - raise SQLDecodeError('statement:{}'.format(sm)) - - upd = {} - next_id, next_tok = sm.token_next(next_id) - for cmp_ob in SQLToken.iter_tokens(next_tok): - if cmp_ob.param_index is not None: - upd[cmp_ob.field] = self._params[cmp_ob.param_index] - else: - upd[cmp_ob.field] = None - - kw['update'] = {'$set': upd} - - next_id, next_tok = sm.token_next(next_id) - - while next_id: - if isinstance(next_tok, Where): - where_op = WhereOp(0, next_tok, left_tbl=self.left_tbl, params=self._params) - kw['filter'] = where_op.to_mongo() - next_id, next_tok = sm.token_next(next_id) - - result = db_con[collection].update_many(**kw) - logger.debug('update_many:{} matched:{}'.format(result.modified_count, result.matched_count)) - return None - - def _delete(self, sm): - db_con = self.db - kw = {} - next_id, next_tok = sm.token_next(2) - sql_token = next(SQLToken.iter_tokens(next_tok)) - collection = sql_token.field - self.left_tbl = sql_token.field - next_id, next_tok = sm.token_next(next_id) - while next_id: - if isinstance(next_tok, Where): - where_op = WhereOp(0, next_tok, left_tbl=self.left_tbl, params=self._params) - kw['filter'] = where_op.to_mongo() - next_id, next_tok = sm.token_next(next_id) - - result = db_con[collection].delete_many(**kw) - logger.debug('delete_many: {}'.format(result.deleted_count)) - - def _insert(self, sm): - db_con = self.db - insert = {} - nextid, nexttok = sm.token_next(2) - if isinstance(nexttok, Identifier): - collection = nexttok.get_name() - auto = db_con['__schema__'].find_one_and_update( - {'name': collection}, - {'$inc': {'auto.seq': 1}}, - return_document=ReturnDocument.AFTER - ) - - if auto: - auto_field_name = auto['auto']['field_name'] - auto_field_id = auto['auto']['seq'] - insert[auto_field_name] = auto_field_id - else: - auto_field_id = None - else: - raise SQLDecodeError('statement: {}'.format(sm)) - - nextid, nexttok = sm.token_next(nextid) - - for sql_ob in SQLToken.iter_tokens(nexttok): - insert[sql_ob.field] = self._params.pop(0) - - if self._params: - raise SQLDecodeError('unexpected params {}'.format(self._params)) - - result = db_con[collection].insert_one(insert) - if not auto_field_id: - auto_field_id = str(result.inserted_id) - - self.last_row_id = auto_field_id - logger.debug('insert id {}'.format(result.inserted_id)) - return None - - def _find(self, sm): - - next_id, next_tok = sm.token_next(0) - if next_tok.value == '*': - self.proj.no_id = True - - elif isinstance(next_tok, Identifier) and isinstance(next_tok.tokens[0], Parenthesis): - self.proj.return_const = int(next_tok.tokens[0].tokens[1].value) - - elif (isinstance(next_tok, Identifier) - and isinstance(next_tok.tokens[0], Function) - and next_tok.tokens[0].token_first().value == 'COUNT'): - self.proj.return_count = True - - else: - for sql in SQLToken.iter_tokens(next_tok): - self.proj.coll_fields.append(CollField(sql.coll, sql.field)) - - next_id, next_tok = sm.token_next(next_id) - - if not next_tok.match(tokens.Keyword, 'FROM'): - raise SQLDecodeError('statement: {}'.format(sm)) - - next_id, next_tok = sm.token_next(next_id) - sql = next(SQLToken.iter_tokens(next_tok)) - - self.left_tbl = sql.field - - next_id, next_tok = sm.token_next(next_id) - - while next_id: - if isinstance(next_tok, Where): - where_op = WhereOp( - token_id=0, - token=next_tok, - left_tbl=self.left_tbl, - params=self._params - ) - self.filter = where_op.to_mongo() - - elif next_tok.match(tokens.Keyword, 'LIMIT'): - next_id, next_tok = sm.token_next(next_id) - self.limit = int(next_tok.value) - - elif (next_tok.match(tokens.Keyword, 'INNER JOIN') - or next_tok.match(tokens.Keyword, 'LEFT OUTER JOIN')): - if next_tok.match(tokens.Keyword, 'INNER JOIN'): - join = InnerJoin() - else: - join = OuterJoin() - - next_id, next_tok = sm.token_next(next_id) - sql = next(SQLToken.iter_tokens(next_tok)) - right_tb = join.right_table = sql.field - - next_id, next_tok = sm.token_next(next_id) - if not next_tok.match(tokens.Keyword, 'ON'): - raise SQLDecodeError('statement: {}'.format(sm)) - - next_id, next_tok = sm.token_next(next_id) - join_token = next(SQLToken.iter_tokens(next_tok)) - if right_tb == join_token.other_coll: - join.local_field = join_token.field - join.foreign_field = join_token.other_field - join.left_table = join_token.coll - else: - join.local_field = join_token.other_field - join.foreign_field = join_token.field - join.left_table = join_token.other_coll - - self.joins.append(join) - - elif next_tok.match(tokens.Keyword, 'ORDER'): - next_id, next_tok = sm.token_next(next_id) - if not next_tok.match(tokens.Keyword, 'BY'): - raise SQLDecodeError('statement: {}'.format(sm)) - - next_id, next_tok = sm.token_next(next_id) - for order, sql in SQLToken.iter_tokens(next_tok): - self.sort.append( - SortOrder(CollField(sql.coll, sql.field), - ORDER_BY_MAP[order])) - - else: - raise SQLDecodeError('statement: {}'.format(sm)) - - next_id, next_tok = sm.token_next(next_id) - - FUNC_MAP = { - 'SELECT': _find, - 'UPDATE': _update, - 'INSERT': _insert, - 'DELETE': _delete, - 'CREATE': _create - } - - -class Result: - - def __init__(self, parsed_sql: Parse): - self._parsed_sql = parsed_sql - self._cursor = None - self._returned_count = 0 - self._count_returned = False - self._count: int = None - - def _get_cursor(self): - p_sql = self._parsed_sql - if p_sql.joins: - # Do aggregation lookup - pipeline = [] - for i, join in enumerate(p_sql.joins): - if join.left_table == p_sql.left_tbl: - local_field = join.local_field - else: - local_field = '{}.{}'.format(join.left_table, join.local_field) - - lookup = { - '$lookup': { - 'from': join.right_table, - 'localField': local_field, - 'foreignField': join.foreign_field, - 'as': join.right_table - } - } - - if isinstance(join, InnerJoin): - if i == 0: - if join.left_table != p_sql.left_tbl: - raise SQLDecodeError - - pipeline.append({ - '$match': { - join.local_field: { - '$ne': None, - '$exists': True - } - } - }) - - pipeline.extend([ - lookup, - { - '$unwind': '$'+join.right_table - } - ]) - else: - if i == 0: - if join.left_table != p_sql.left_tbl: - raise SQLDecodeError - - pipeline.extend([ - lookup, - { - '$unwind': { - 'path': '$'+join.right_table, - 'preserveNullAndEmptyArrays': True - } - } - ]) - - if p_sql.sort: - sort = OrderedDict() - for s in p_sql.sort: - if s.coll_field.coll == p_sql.left_tbl: - sort[s.coll_field.field] = s.ord - else: - sort[s.coll_field.coll + '.' + s.coll_field.field] = s.ord - - pipeline.append({ - '$sort': sort - }) - - if p_sql.filter: - pipeline.append({ - '$match': p_sql.filter - }) - - if p_sql.limit: - pipeline.append({ - '$limit': p_sql.limit - }) - - if p_sql.proj.coll_fields: - proj = {} - for fld in p_sql.proj.coll_fields: - if fld.coll == p_sql.left_tbl: - proj[fld.field] = True - else: - proj[fld.coll + '.' + fld.field] = True - - pipeline.append({'$project': proj}) - - return p_sql.db[p_sql.left_tbl].aggregate(pipeline) - - else: - query_args = {} - if p_sql.proj.coll_fields: - query_args['projection'] = [f.field for f in p_sql.proj.coll_fields] - - if p_sql.filter: - query_args['filter'] = p_sql.filter - - if p_sql.limit is not None: - query_args['limit'] = p_sql.limit - - if p_sql.sort: - query_args['sort'] = [(s.coll_field.field, s.ord) for s in p_sql.sort] - - return p_sql.db[p_sql.left_tbl].find(**query_args) - - def count(self): - if self._count is not None: - return self._count - - if self._cursor is None: - self._cursor = self._get_cursor() - - if isinstance(self._cursor, PymongoCursor): - self._count = self._cursor.count() - else: - self._count = len(list(self._cursor)) - - return self._count - - def __iter__(self): - return self - - def next(self): - p_sql = self._parsed_sql - if p_sql.proj.return_const is not None: - if self._returned_count < self.count(): - self._returned_count += 1 - return p_sql.proj.return_const, - else: - raise StopIteration - - if p_sql.proj.return_count: - if not self._count_returned: - self._count_returned = True - return self.count(), - else: - raise StopIteration - - if self._cursor is None: - self._cursor = self._get_cursor() - - cur = self._cursor - doc = cur.next() - if isinstance(cur, PymongoCursor): - doc.pop('_id') - return tuple(doc.values()) - else: - ret = [] - for coll_field in p_sql.proj.coll_fields: - if coll_field.coll == p_sql.left_tbl: - ret.append(doc[coll_field.field]) - else: - ret.append(doc[coll_field.coll][coll_field.field]) - return ret - - __next__ = next - - def close(self): - if self._cursor: - self._cursor.close() - - -class SQLToken: - def __init__(self, field, coll=None): - self.field = field - self.coll = coll - - @classmethod - def iter_tokens(cls, token): - if isinstance(token, Identifier): - tok_first = token.token_first() - if isinstance(tok_first, Identifier): - yield token.get_ordering(), cls(tok_first.get_name(), tok_first.get_parent_name()) - else: - yield cls(token.get_name(), token.get_parent_name()) - - elif isinstance(token, IdentifierList): - for iden in token.get_identifiers(): - yield from SQLToken.iter_tokens(iden) - - elif isinstance(token, Comparison): - lhs = next(SQLToken.iter_tokens(token.left)) - if isinstance(token.right, Identifier): - rhs = next(SQLToken.iter_tokens(token.right)) - yield JoinToken( - other_field=rhs.field, - other_coll=rhs.coll, - field=lhs.field, - coll=lhs.coll) - - else: - if token.token_next(0)[1].value != '=': - raise SQLDecodeError - - yield EqToken(**vars(lhs), param_index=re_index(token.right.value)) - - elif isinstance(token, Parenthesis): - next_id, next_tok = token.token_next(0) - while next_tok.value != ')': - yield from SQLToken.iter_tokens(next_tok) - next_id, next_tok = token.token_next(next_id) - - elif token.match(tokens.Name.Placeholder, '.*', regex=True): - index = int(re.match(r'%\(([0-9]+)\)s', token.value, flags=re.IGNORECASE).group(1)) - yield index - - elif token.match(tokens.Keyword, 'NULL'): - yield None - else: - raise SQLDecodeError - - def to_mongo(self): - raise SQLDecodeError - - -class EqToken(SQLToken): - def __init__(self, param_index, *args, **kwargs): - super().__init__(*args, **kwargs) - self.param_index = param_index - - -class JoinToken(SQLToken): - def __init__(self, other_field, other_coll, *args, **kwargs): - super().__init__(*args, **kwargs) - self.other_field = other_field - self.other_coll = other_coll - - -class _Op: - params: tuple - left_tbl: str - - def __init__( - self, - token_id: int, - token: Token, - left_tbl: str=None, - params: tuple=None, - name='generic'): - self.lhs: typing.Optional[_Op] = None - self.rhs: typing.Optional[_Op] = None - self._token_id = token_id - - if params is not None: - _Op.params = params - if left_tbl is not None: - _Op.left_tbl = left_tbl - - self.token = token - self.is_negated = False - self._name = name - self.precedence = OPERATOR_PRECEDENCE[name] - - def negate(self): - raise NotImplementedError - - def evaluate(self): - pass - - def to_mongo(self): - raise NotImplementedError - - -class _UnaryOp(_Op): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._op = None - - def negate(self): - raise NotImplementedError - - def evaluate(self): - self.rhs.evaluate() - - def to_mongo(self): - return self.rhs.to_mongo() - - -class _InNotInOp(_Op): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - identifier = next(SQLToken.iter_tokens(self.token.token_prev(self._token_id)[1])) - if identifier.coll: - if identifier.coll == self.left_tbl: - self._field = identifier.field - else: - self._field = '{}.{}'.format(identifier.coll, identifier.field) - else: - self._field = identifier.field - - def _fill_in(self, token): - self._in = [] - for index in SQLToken.iter_tokens(token): - if index is not None: - self._in.append(self.params[index]) - else: - self._in.append(None) - - def negate(self): - raise SQLDecodeError('Negating IN/NOT IN not supported') - - def to_mongo(self): - raise NotImplementedError - - -class NotInOp(_InNotInOp): - - def __init__(self, *args, **kwargs): - super().__init__(name='NOT IN', *args, **kwargs) - idx, tok = self.token.token_next(self._token_id) - if not tok.match(tokens.Keyword, 'IN'): - raise SQLDecodeError - self._fill_in(self.token.token_next(idx)[1]) - - def to_mongo(self): - op = '$nin' - return {self._field: {op: self._in}} - - -class InOp(_InNotInOp): - - def __init__(self, *args, **kwargs): - super().__init__(name='IN', *args, **kwargs) - self._fill_in(self.token.token_next(self._token_id)[1]) - - def to_mongo(self): - op = '$in' - return {self._field: {op: self._in}} - - -# TODO: Need to do this -class NotOp(_UnaryOp): - def __init__(self, *args, **kwargs): - super().__init__(name='NOT', *args, **kwargs) - - def negate(self): - raise SQLDecodeError - - def evaluate(self): - self.rhs.negate() - if isinstance(self.rhs, ParenthesisOp): - self.rhs.evaluate() - if self.lhs is not None: - self.lhs.rhs = self.rhs - - -class _AndOrOp(_Op): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._acc = [] - - def negate(self): - self.is_negated = True - - def op_type(self): - raise NotImplementedError - - def evaluate(self): - if not (self.lhs and self.rhs): - raise SQLDecodeError - - if isinstance(self.lhs, _AndOrOp): - if self.op_type() == self.lhs.op_type(): - self._acc = self.lhs._acc + self._acc - else: - self._acc.insert(0, self.lhs) - - elif isinstance(self.lhs, ParenthesisOp): - self.lhs.evaluate() - self._acc.append(self.lhs) - - elif isinstance(self.lhs, _Op): - self._acc.append(self.lhs) - - else: - raise SQLDecodeError - - if isinstance(self.rhs, _AndOrOp): - if self.op_type() == self.rhs.op_type(): - self._acc.extend(self.rhs._acc) - else: - self._acc.append(self.rhs) - - elif isinstance(self.rhs, ParenthesisOp): - self.rhs.evaluate() - self._acc.append(self.rhs) - - elif isinstance(self.rhs, _Op): - self._acc.append(self.rhs) - - else: - raise SQLDecodeError - - if self.lhs.lhs is not None: - self.lhs.lhs.rhs = self - if self.rhs.rhs is not None: - self.rhs.rhs.lhs = self - - def to_mongo(self): - if self.op_type() == AndOp: - oper = '$and' - else: - oper = '$or' - - docs = [itm.to_mongo() for itm in self._acc] - return {oper: docs} - - -class AndOp(_AndOrOp): - - def __init__(self, *args, **kwargs): - super().__init__(name='AND', *args, **kwargs) - - def op_type(self): - if not self.is_negated: - return AndOp - else: - return OrOp - - -class OrOp(_AndOrOp): - - def __init__(self, *args, **kwargs): - super().__init__(name='OR', *args, **kwargs) - - def op_type(self): - if not self.is_negated: - return OrOp - else: - return AndOp - - -class WhereOp(_Op): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - if not isinstance(self.token[2], Parenthesis): - op = ParenthesisOp(0, sql_parse('('+self.token.value[6:]+')')[0][0]) - else: - op = ParenthesisOp(0, self.token[2]) - op.evaluate() - self._op = op - - def negate(self): - raise NotImplementedError - - def to_mongo(self): - return self._op.to_mongo() - - -class ParenthesisOp(_Op): - - def to_mongo(self): - return self._op.to_mongo() - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - def link_op(): - if prev_op is not None: - prev_op.rhs = op - op.lhs = prev_op - - token = self.token - self._ops: typing.List[_Op] = [] - self._cmp_ops: typing.List[_Op] = [] - self._op = None - - next_id, next_tok = token.token_next(0) - prev_op: _Op = None - op: _Op = None - while next_id: - kw = {'token': token, 'token_id': next_id} - if next_tok.match(tokens.Keyword, 'AND'): - op = AndOp(**kw) - link_op() - self._op_precedence(op) - - elif next_tok.match(tokens.Keyword, 'OR'): - op = OrOp(**kw) - link_op() - self._op_precedence(op) - - elif next_tok.match(tokens.Keyword, 'IN'): - op = InOp(**kw) - link_op() - self._op_precedence(op) - - elif next_tok.match(tokens.Keyword, 'NOT'): - _, nxt = token.token_next(next_id) - if nxt.match(tokens.Keyword, 'IN'): - op = NotInOp(**kw) - next_id, next_tok = token.token_next(next_id) - else: - op = NotOp(**kw) - link_op() - self._op_precedence(op) - - elif isinstance(next_tok, Comparison): - op = CmpOp(0, next_tok) - self._cmp_ops.append(op) - link_op() - - elif isinstance(next_tok, Parenthesis): - if next_tok[1].match(tokens.Name.Placeholder, '.*', regex=True): - pass - elif next_tok[1].match(tokens.Keyword, 'Null'): - pass - elif isinstance(next_tok[1], IdentifierList): - pass - else: - op = ParenthesisOp(0, next_tok) - link_op() - - elif next_tok.match(tokens.Punctuation, ')'): - if op.lhs is None: - if isinstance(op, CmpOp): - self._ops.append(op) - break - - next_id, next_tok = token.token_next(next_id) - prev_op = op - - def _op_precedence(self, operator: _Op): - ops = self._ops - if not ops: - ops.append(operator) - return - - for i in range(len(ops)): - if operator.precedence > ops[i].precedence: - ops.insert(i, operator) - break - else: - ops.append(operator) - - def evaluate(self): - if self._op is not None: - return - - if not self._ops: - raise SQLDecodeError - - op = None - while self._ops: - op = self._ops.pop(0) - op.evaluate() - self._op = op - - def negate(self): - for op in chain(self._ops, self._cmp_ops): - op.negate() - - -class CmpOp(_Op): - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - self._identifier = next(SQLToken.iter_tokens(self.token.left)) - - if isinstance(self.token.right, Identifier): - raise SQLDecodeError('Join using WHERE not supported') - - self._operator = OPERATOR_MAP[self.token.token_next(0)[1].value] - index = re_index(self.token.right.value) - - self._constant = self.params[index] if index is not None else None - - def negate(self): - self.is_negated = True - - def to_mongo(self): - if self._identifier.coll == self.left_tbl: - field = self._identifier.field - else: - field = '{}.{}'.format(self._identifier.coll, self._identifier.field) - - if not self.is_negated: - return {field: {self._operator: self._constant}} - else: - return {field: {'$not': {self._operator: self._constant}}} \ No newline at end of file diff --git a/tests/__init__.py b/djongo/sql2mongo/__init__.py similarity index 100% rename from tests/__init__.py rename to djongo/sql2mongo/__init__.py diff --git a/djongo/sql2mongo/aggregation.py b/djongo/sql2mongo/aggregation.py new file mode 100644 index 00000000..677d6bec --- /dev/null +++ b/djongo/sql2mongo/aggregation.py @@ -0,0 +1,4 @@ +from djongo.exceptions import NotSupportedError, print_warn + +print_warn('aggregation') + diff --git a/djongo/sql2mongo/constraints.py b/djongo/sql2mongo/constraints.py new file mode 100644 index 00000000..236890a5 --- /dev/null +++ b/djongo/sql2mongo/constraints.py @@ -0,0 +1,5 @@ +from djongo.exceptions import NotSupportedError +from djongo import djongo_access_url + +print(f'This version of djongo does not support constraints. Visit {djongo_access_url}') +raise NotSupportedError('constraints') diff --git a/djongo/sql2mongo/converters.py b/djongo/sql2mongo/converters.py new file mode 100644 index 00000000..a0d72371 --- /dev/null +++ b/djongo/sql2mongo/converters.py @@ -0,0 +1,486 @@ +# THIS FILE WAS CHANGED ON - 14 Apr 2022 + +import abc +from collections import OrderedDict +from sqlparse import tokens, parse as sqlparse +from sqlparse.sql import Parenthesis +from typing import Union as U, List, Optional as O +from . import query as query_module +from .sql_tokens import SQLIdentifier, SQLConstIdentifier, SQLComparison +from .functions import SQLFunc, CountFuncAll +from .operators import WhereOp +from ..exceptions import SQLDecodeError +from .sql_tokens import SQLToken, SQLStatement + + +class Converter: + + @abc.abstractmethod + def __init__( + self, + query: U['query_module.SelectQuery', + 'query_module.BaseQuery'], + statement: SQLStatement + ): + self.query = query + self.statement = statement + self.end_id = None + self.parse() + + def parse(self): + raise NotImplementedError + + def to_mongo(self): + raise NotImplementedError + + +class ColumnSelectConverter(Converter): + def __init__(self, query, statement): + self.select_all = False + self.num_columns = 0 + + self.sql_tokens: List[ + U[SQLIdentifier, SQLFunc] + ] = [] + super().__init__(query, statement) + + def parse(self): + tok = self.statement.next() + + if tok.match(tokens.Keyword, 'DISTINCT'): + self.query.distinct = DistinctConverter(self.query, self.statement) + + else: + for sql_token in SQLToken.tokens2sql(tok, self.query): + self.sql_tokens.append(sql_token) + + def to_mongo(self): + doc = [selected.column for selected in self.sql_tokens] + return {'projection': doc} + + +class AggColumnSelectConverter(ColumnSelectConverter): + + def to_mongo(self): + project = {} + + if any(isinstance(tok, SQLFunc) for tok in self.sql_tokens): + # A SELECT func without groupby clause still needs a groupby + # in MongoDB + return self._using_group_by() + + elif isinstance(self.sql_tokens[0], SQLConstIdentifier): + project[self.sql_tokens[0].alias] = self.sql_tokens[0].to_mongo() + else: + for selected in self.sql_tokens: + project[selected.field] = True + + return [{'$project': project}] + + def _using_group_by(self): + group = { + '_id': None + } + project = { + '_id': False + } + for selected in self.sql_tokens: + if isinstance(selected, SQLFunc): + group[selected.alias] = selected.to_mongo() + project[selected.alias] = True + else: + project[selected.field] = True + + pipeline = [ + { + '$group': group + }, + { + '$project': project + } + ] + + return pipeline + + +class FromConverter(Converter): + + def parse(self): + tok = self.statement.next() + sql = SQLToken.token2sql(tok, self.query) + self.query.left_table = sql.table + + +class WhereConverter(Converter): + nested_op: 'WhereOp' = None + op: 'WhereOp' = None + + def parse(self): + tok = self.statement.current_token + self.op = WhereOp( + statement=SQLStatement(tok), + query=self.query, + params=self.query.params + ) + + def to_mongo(self): + return {'filter': self.op.to_mongo()} + + +class AggWhereConverter(WhereConverter): + + def to_mongo(self): + return {'$match': self.op.to_mongo()} + + +class JoinConverter(Converter): + + @abc.abstractmethod + def __init__(self, *args): + self.left_table: O[str] = None + self.right_table: O[str] = None + self.left_column: O[str] = None + self.right_column: O[str] = None + super().__init__(*args) + + def parse(self): + tok = self.statement.next() + sql = SQLToken.token2sql(tok, self.query) + right_table = self.right_table = sql.table + + tok = self.statement.next() + if not tok.match(tokens.Keyword, 'ON'): + raise SQLDecodeError + + tok = self.statement.next() + if isinstance(tok, Parenthesis): + tok = tok[1] + + sql = SQLToken.token2sql(tok, self.query) + if right_table == sql.right_table: + self.left_table = sql.left_table + self.left_column = sql.left_column + self.right_column = sql.right_column + else: + self.left_table = sql.right_table + self.left_column = sql.right_column + self.right_column = sql.left_column + + def _lookup(self): + if self.left_table == self.query.left_table: + local_field = self.left_column + else: + local_field = f'{self.left_table}.{self.left_column}' + + lookup = { + '$lookup': { + 'from': self.right_table, + 'localField': local_field, + 'foreignField': self.right_column, + 'as': self.right_table + } + } + + return lookup + + +class InnerJoinConverter(JoinConverter): + + def __init__(self, *args): + super().__init__(*args) + + def to_mongo(self): + if self.left_table == self.query.left_table: + match_field = self.left_column + else: + match_field = f'{self.left_table}.{self.left_column}' + + lookup = self._lookup() + pipeline = [ + { + '$match': { + match_field: { + '$ne': None, + '$exists': True + } + } + }, + lookup, + { + '$unwind': '$' + self.right_table + } + ] + + return pipeline + + +class OuterJoinConverter(JoinConverter): + + def __init__(self, *args): + super().__init__(*args) + + def _null_fields(self, table): + toks = self.query.selected_columns.sql_tokens + fields = {} + for tok in toks: + if not isinstance(tok, CountFuncAll) and tok.table == table: + fields[tok.column] = None + return fields + + def to_mongo(self): + lookup = self._lookup() + null_fields = self._null_fields(self.right_table) + + pipeline = [ + lookup, + { + '$unwind': { + 'path': '$' + self.right_table, + 'preserveNullAndEmptyArrays': True + } + }, + { + '$addFields': { + self.right_table: { + '$ifNull': ['$' + self.right_table, null_fields] + } + } + } + ] + + return pipeline + + +class LimitConverter(Converter): + def __init__(self, *args): + self.limit: O[int] = None + super().__init__(*args) + + def parse(self): + tok = self.statement.next() + self.limit = int(tok.value) + + def to_mongo(self): + return {'limit': self.limit} + + +class AggLimitConverter(LimitConverter): + + def to_mongo(self): + return {'$limit': self.limit} + + +class OrderConverter(Converter): + def __init__(self, *args): + self.columns: List[SQLIdentifier] = [] + super().__init__(*args) + + def parse(self): + tok = self.statement.next() + self.columns.extend(SQLToken.tokens2sql(tok, self.query)) + + def to_mongo(self): + sort = [(tok.column, tok.order) for tok in self.columns] + return {'sort': sort} + + +class SetConverter(Converter): + + def __init__(self, *args): + self.sql_tokens: List[SQLComparison] = [] + super().__init__(*args) + + def parse(self): + tok = self.statement.next() + self.sql_tokens.extend(SQLToken.tokens2sql(tok, self.query)) + + def to_mongo(self): + return { + 'update': { + '$set': { + sql.left_column: self.query.params[sql.rhs_indexes] + if sql.rhs_indexes is not None else None + for sql in self.sql_tokens} + } + } + + +class AggOrderConverter(OrderConverter): + + def to_mongo(self): + sort = OrderedDict() + for tok in self.columns: + sort[tok.field] = tok.order + + return {'$sort': sort} + + +class _Tokens2Id: + sql_tokens: List[ + U[SQLIdentifier, SQLFunc] + ] + query: U['query_module.SelectQuery', + 'query_module.BaseQuery'] + + def to_id(self): + _id = {} + for iden in self.sql_tokens: + if iden.column == iden.field: + _id[iden.field] = f'${iden.field}' + else: + try: + _id[iden.table][iden.column] = f'${iden.field}' + except KeyError: + _id[iden.table] = {iden.column: f'${iden.field}'} + # if iden.table == self.query.left_table: + # _id[iden.column] = f'${iden.column}' + # else: + # mongo_field = f'${iden.table}.{iden.column}' + # try: + # _id[iden.table][iden.column] = mongo_field + # except KeyError: + # _id[iden.table] = {iden.column: mongo_field} + + return _id + + +class DistinctConverter(ColumnSelectConverter, _Tokens2Id): + def __init__(self, *args): + super().__init__(*args) + + def to_mongo(self): + _id = self.to_id() + + return [ + { + '$group': { + '_id': _id + } + }, + { + '$replaceRoot': { + 'newRoot': '$_id' + } + } + ] + + +class NestedInQueryConverter(Converter): + + def __init__(self, token, *args): + self._token = token + self._in_query: O['query_module.SelectQuery'] = None + super().__init__(*args) + + def parse(self): + from .query import SelectQuery + + self._in_query = SelectQuery( + self.query.db, + self.query.connection_properties, + sqlparse(self._token.value[1:-1])[0], + self.query.params + ) + + def to_mongo(self): + pipeline = [ + { + '$lookup': { + 'from': self._in_query.left_table, + 'pipeline': self._in_query._make_pipeline(), + 'as': '_nested_in' + } + }, + { + '$addFields': { + '_nested_in': { + '$map': { + 'input': '$_nested_in', + 'as': 'lookup_result', + 'in': '$$lookup_result.' + self._in_query.selected_columns.sql_tokens[0].column + } + } + } + } + ] + return pipeline + + +class HavingConverter(Converter): + nested_op: 'WhereOp' = None + op: 'WhereOp' = None + + def __init__(self, + query: U['query_module.SelectQuery', + 'query_module.BaseQuery'], + statement: SQLStatement): + super().__init__(query, statement) + + def parse(self): + tok = self.statement[:3] + self.op = WhereOp( + statement=tok, + query=self.query, + params=self.query.params + ) + self.statement.skip(2) + + def to_mongo(self): + return {'$match': self.op.to_mongo()} + + +class GroupbyConverter(Converter, _Tokens2Id): + + def __init__(self, *args): + self.sql_tokens: List[SQLToken] = [] + super().__init__(*args) + + def parse(self): + tok = self.statement.next() + self.sql_tokens.extend(SQLToken.tokens2sql(tok, self.query)) + + def to_mongo(self): + _id = self.to_id() + + group = { + '_id': _id + } + project = { + '_id': False + } + for selected in self.query.selected_columns.sql_tokens: + if isinstance(selected, SQLIdentifier): + project[selected.field] = f'$_id.{selected.field}' + else: + project[selected.alias] = True + group[selected.alias] = selected.to_mongo() + + pipeline = [ + { + '$group': group + }, + { + '$project': project + } + ] + + return pipeline + + +class OffsetConverter(Converter): + def __init__(self, *args): + self.offset: int = None + super().__init__(*args) + + def parse(self): + tok = self.statement.next() + self.offset = int(tok.value) + + def to_mongo(self): + return {'skip': self.offset} + + +class AggOffsetConverter(OffsetConverter): + + def to_mongo(self): + return {'$skip': self.offset} diff --git a/djongo/sql2mongo/functions.py b/djongo/sql2mongo/functions.py new file mode 100644 index 00000000..76c551ea --- /dev/null +++ b/djongo/sql2mongo/functions.py @@ -0,0 +1,125 @@ +import abc + +from sqlparse.sql import Token + +from ..exceptions import SQLDecodeError +from .sql_tokens import AliasableToken, SQLToken +from . import query as query_module +from typing import Union as U + + +class SQLFunc(AliasableToken): + + @abc.abstractmethod + def __init__(self, *args): + super().__init__(*args) + + @staticmethod + def token2sql(token: Token, + query: 'query_module.BaseQuery' + ) -> U['CountFunc', + 'SimpleFunc']: + func = token[0].get_name() + if func == 'COUNT': + return CountFunc.token2sql(token, query) + else: + return SimpleFunc(token, query) + + @property + def alias(self) -> str: + return self._token.get_alias() + + @property + def func(self) -> str: + return self._token[0].get_name() + + @abc.abstractmethod + def to_mongo(self) -> dict: + raise NotImplementedError + + +class SingleParamFunc(SQLFunc): + def __init__(self, *args): + super().__init__(*args) + if self.alias: + param = self._token[0].get_parameters()[0] + else: + param = self._token.get_parameters()[0] + self.iden = SQLToken.token2sql(param, self.query) + + @property + def table(self): + return self.iden.table + + @property + def column(self): + return self.iden.column + + @property + def field(self): + if self.alias: + return self.alias + alias = self.query.token_alias.token2alias[self] + return alias + + @abc.abstractmethod + def to_mongo(self) -> dict: + raise NotImplementedError + + +class CountFunc(SQLFunc): + + @staticmethod + def token2sql(token: Token, + query: 'query_module.BaseQuery' + ) -> U['CountFuncAll', + 'CountFuncSingle']: + try: + token[0].get_parameters()[0] + except IndexError: + return CountFuncAll(token, query) + else: + return CountFuncSingle(token, query) + + @abc.abstractmethod + def to_mongo(self): + raise NotImplementedError + + +class CountFuncAll(CountFunc): + + def __init__(self, *args): + super().__init__(*args) + + def to_mongo(self): + return {'$sum': 1} + + +class CountFuncSingle(CountFunc, SingleParamFunc): + + def to_mongo(self): + field = f'${self.iden.field}' + return { + '$sum': { + '$cond': { + 'if': { + '$gt': [field, None] + }, + 'then': 1, + 'else': 0 + } + } + } + + +class SimpleFunc(SingleParamFunc): + + def to_mongo(self): + field = f'${self.iden.field}' + if self.func in ('MIN', 'MAX', 'SUM', + 'AVG'): + return {f'${self.func.lower()}': field} + else: + raise SQLDecodeError(f'Unsupported func: {self.func}') + + diff --git a/djongo/sql2mongo/operators.py b/djongo/sql2mongo/operators.py new file mode 100644 index 00000000..bb3bc422 --- /dev/null +++ b/djongo/sql2mongo/operators.py @@ -0,0 +1,594 @@ +# THIS FILE WAS CHANGED ON - 09 May 2022 + +import re +import typing +import json +from itertools import chain + +from sqlparse import tokens +from sqlparse.sql import Token, Parenthesis, Comparison, IdentifierList, Identifier + +from ..exceptions import SQLDecodeError +from .sql_tokens import SQLToken, SQLStatement +from . import query + + +def re_index(value: str): + match = list(re.finditer(r'%\(([0-9]+)\)s', value, flags=re.IGNORECASE)) + + if match: + if len(match) == 1: + index = int(match[0].group(1)) + else: + index = [int(x.group(1)) for x in match] + else: + match = re.match(r'NULL|true', value, flags=re.IGNORECASE) + if not match: + raise SQLDecodeError + index = None + return index + + +class _Op: + + def __init__( + self, + statement: SQLStatement, + query: 'query.SelectQuery', + params: tuple = None, + name='generic'): + super().__init__() + self.lhs: typing.Optional[_Op] = None + self.rhs: typing.Optional[_Op] = None + + if params is not None: + self.params = params + else: + self.params = query.params + self.query = query + self.left_table = query.left_table + + self.statement = statement + self.is_negated = False + self._name = name + self.precedence = OPERATOR_PRECEDENCE[name] + + def negate(self): + raise NotImplementedError + + def to_mongo(self): + raise NotImplementedError + + +class _UnaryOp(_Op): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._op = None + + def negate(self): + raise NotImplementedError + + def evaluate(self): + self.rhs.evaluate() + + def to_mongo(self): + return self.rhs.to_mongo() + + +class _BinaryOp(_Op): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + identifier = SQLToken.token2sql(self.statement.prev_token, self.query) + self._field = identifier.field + + def negate(self): + raise SQLDecodeError('Negating IN/NOT IN not supported') + + def to_mongo(self): + raise NotImplementedError + + def evaluate(self): + pass + +class _InNotInOp(_BinaryOp): + + def _fill_in(self, token): + self._in = [] + + # Check for nested + if token[1].ttype == tokens.DML: + from .converters import NestedInQueryConverter + + self.query.nested_query = NestedInQueryConverter(token, self.query, 0) + return + + for index in SQLToken.token2sql(token, self.query): + if index is not None: + self._in.append(self.params[index]) + else: + self._in.append(None) + + def negate(self): + raise SQLDecodeError('Negating IN/NOT IN not supported') + + def to_mongo(self): + raise NotImplementedError + + def _to_mongo(self, op): + if self.query.nested_query is not None: + return { + '$expr': { + op: ['$' + self._field, '$_nested_in'] + } + } + + else: + return {self._field: {op: self._in}} + + +class NotInOp(_InNotInOp): + + def __init__(self, *args, **kwargs): + super().__init__(name='NOT IN', *args, **kwargs) + tok = self.statement.next() + if not tok.match(tokens.Keyword, 'IN'): + raise SQLDecodeError + self._fill_in(self.statement.next()) + + def to_mongo(self): + op = '$nin' if not self.is_negated else '$in' + return self._to_mongo(op) + + def negate(self): + self.is_negated = True + + +class InOp(_InNotInOp): + + def __init__(self, *args, **kwargs): + super().__init__(name='IN', *args, **kwargs) + self._fill_in(self.statement.next()) + + def to_mongo(self): + op = '$in' if not self.is_negated else '$nin' + return self._to_mongo(op) + + def negate(self): + self.is_negated = True + + +class LikeOp(_BinaryOp): + + def __init__(self, *args, **kwargs): + super().__init__(name='LIKE', *args, **kwargs) + self._regex = None + self._make_regex(self.statement.next()) + + def check_embedded(self, to_match): + try: + check_dict = to_match + replace_chars = "\\%'" + for c in replace_chars: + if c == "'": + check_dict = check_dict.replace("'", '"') + else: + check_dict = check_dict.replace(c, "") + check_dict = json.loads(check_dict) + if isinstance(check_dict, dict): + return check_dict + else: + return to_match + except Exception as e: + return to_match + + def _make_regex(self, token): + index = SQLToken.placeholder_index(token) + + to_match = self.params[index] + to_match = self.check_embedded(to_match) + if isinstance(to_match, str): + to_match = to_match.replace('%', '.*') + self._regex = '^' + to_match + '$' + elif isinstance(to_match, dict): + field_ext, to_match = next(iter(to_match.items())) + self._field += '.' + field_ext + self._regex = to_match + else: + raise SQLDecodeError + + def to_mongo(self): + return {self._field: {'$regex': self._regex}} + + +class iLikeOp(LikeOp): + def to_mongo(self): + return {self._field: { + '$regex': self._regex, + '$options': 'im' + }} + + +class IsOp(_BinaryOp): + + def __init__(self, *args, **kwargs): + super().__init__(name='IS', *args, **kwargs) + token = self.statement + key = token.next() + if key.match(tokens.Keyword, 'Null'): + self._is_null = True + elif key.match(tokens.Keyword, 'Not null'): + self._is_null = False + else: + raise SQLDecodeError + + def negate(self): + self.is_negated = True + + def to_mongo(self): + is_null = not self._is_null if self.is_negated else self._is_null + return { + self._field: None if is_null else {'$ne': None} + } + + +class BetweenOp(_BinaryOp): + + def __init__(self, *args, **kwargs): + super().__init__(name='BETWEEN', *args, **kwargs) + token = self.statement + + lower = token.next() + lower = SQLToken.placeholder_index(lower) + self._lower = self.params[lower] + + _and = token.next() + if not _and.match(tokens.Keyword, 'AND'): + raise SQLDecodeError + + upper = token.next() + upper = SQLToken.placeholder_index(upper) + self._upper = self.params[upper] + + def negate(self): + self.is_negated = True + + def to_mongo(self): + if not self.is_negated: + return { + self._field: { + '$gte': self._lower, + '$lte': self._upper + } + } + else: + return { + self._field: { + '$not': { + '$gte': self._lower, + '$lte': self._upper + } + } + } + + +class NotOp(_UnaryOp): + def __init__(self, *args, **kwargs): + super().__init__(name='NOT', *args, **kwargs) + + def negate(self): + raise SQLDecodeError + + def evaluate(self): + self.rhs.negate() + if isinstance(self.rhs, ParenthesisOp): + self.rhs.evaluate() + if self.lhs is not None: + self.lhs.rhs = self.rhs + + +class _AndOrOp(_Op): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._acc = [] + + def negate(self): + self.is_negated = True + + def op_type(self): + raise NotImplementedError + + def evaluate(self): + if not (self.lhs and self.rhs): + raise SQLDecodeError + + if isinstance(self.lhs, _AndOrOp): + if self.op_type() == self.lhs.op_type(): + self._acc = self.lhs._acc + self._acc + else: + self._acc.insert(0, self.lhs) + + elif isinstance(self.lhs, ParenthesisOp): + self.lhs.evaluate() + self._acc.append(self.lhs) + + elif isinstance(self.lhs, _Op): + self._acc.append(self.lhs) + + else: + raise SQLDecodeError + + if isinstance(self.rhs, _AndOrOp): + if self.op_type() == self.rhs.op_type(): + self._acc.extend(self.rhs._acc) + else: + self._acc.append(self.rhs) + + elif isinstance(self.rhs, ParenthesisOp): + self.rhs.evaluate() + self._acc.append(self.rhs) + + elif isinstance(self.rhs, _Op): + self._acc.append(self.rhs) + + else: + raise SQLDecodeError + + if self.lhs.lhs is not None: + self.lhs.lhs.rhs = self + if self.rhs.rhs is not None: + self.rhs.rhs.lhs = self + + def to_mongo(self): + if self.op_type() == AndOp: + oper = '$and' + else: + oper = '$or' + + docs = [itm.to_mongo() for itm in self._acc] + return {oper: docs} + + +class AndOp(_AndOrOp): + + def __init__(self, *args, **kwargs): + super().__init__(name='AND', *args, **kwargs) + + def op_type(self): + if not self.is_negated: + return AndOp + else: + return OrOp + + +class OrOp(_AndOrOp): + + def __init__(self, *args, **kwargs): + super().__init__(name='OR', *args, **kwargs) + + def op_type(self): + if not self.is_negated: + return OrOp + else: + return AndOp + + +class _StatementParser: + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._ops: typing.List[_Op] = [] + self._cmp_ops: typing.List[_Op] = [] + self._op = None + + def _token2op(self, + tok: Token, + statement: SQLStatement) -> '_Op': + op = None + kw = {'statement': statement, 'query': self.query} + if tok.match(tokens.Keyword, 'AND'): + op = AndOp(**kw) + + elif tok.match(tokens.Keyword, 'OR'): + op = OrOp(**kw) + + elif tok.match(tokens.Keyword, 'IN'): + op = InOp(**kw) + + elif tok.match(tokens.Keyword, 'NOT'): + if statement.next_token.match(tokens.Keyword, 'IN'): + op = NotInOp(**kw) + statement.skip(1) + else: + op = NotOp(**kw) + + elif tok.match(tokens.Keyword, 'LIKE'): + op = LikeOp(**kw) + + elif tok.match(tokens.Keyword, 'iLIKE'): + op = iLikeOp(**kw) + + elif tok.match(tokens.Keyword, 'BETWEEN'): + op = BetweenOp(**kw) + statement.skip(3) + + elif tok.match(tokens.Keyword, 'IS'): + op = IsOp(**kw) + + elif isinstance(tok, Comparison): + op = CmpOp(tok, self.query) + + elif isinstance(tok, Parenthesis): + if (tok[1].match(tokens.Name.Placeholder, '.*', regex=True) + or tok[1].match(tokens.Keyword, 'Null') + or isinstance(tok[1], IdentifierList) + or tok[1].ttype == tokens.DML + ): + pass + else: + op = ParenthesisOp(SQLStatement(tok), self.query) + + elif tok.match(tokens.Punctuation, (')', '(')): + pass + + elif isinstance(tok, Identifier): + pass + else: + raise SQLDecodeError + + return op + + def _statement2ops(self): + def link_op(): + if prev_op is not None: + prev_op.rhs = op + op.lhs = prev_op + + statement = self.statement + + prev_op = None + op = None + for tok in statement: + op = self._token2op(tok, statement) + if not op: + continue + link_op() + if isinstance(op, CmpOp): + self._cmp_ops.append(op) + if not isinstance(op, (CmpOp, ParenthesisOp)): + self._op_precedence(op) + prev_op = op + + if prev_op.lhs is None: + if isinstance(prev_op, (CmpOp, ParenthesisOp)): + self._ops.append(prev_op) + + def _op_precedence(self, operator: _Op): + ops = self._ops + if not ops: + ops.append(operator) + return + + for i in range(len(ops)): + if operator.precedence > ops[i].precedence: + ops.insert(i, operator) + break + else: + ops.append(operator) + + def evaluate(self): + if self._op is not None: + return + + if not self._ops: + raise SQLDecodeError + + op = None + while self._ops: + op = self._ops.pop(0) + op.evaluate() + self._op = op + + +class WhereOp(_Op, _StatementParser): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.statement.skip(2) + self._statement2ops() + self.evaluate() + + def negate(self): + raise NotImplementedError + + def to_mongo(self): + return self._op.to_mongo() + + +class ParenthesisOp(_Op, _StatementParser): + + def to_mongo(self): + return self._op.to_mongo() + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self._statement2ops() + + def negate(self): + for op in chain(self._ops, self._cmp_ops): + op.negate() + + +class CmpOp(_Op): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._identifier = SQLToken.token2sql(self.statement.left, self.query) + + if isinstance(self.statement.right, Identifier): + raise SQLDecodeError('Join using WHERE not supported') + + self._operator = OPERATOR_MAP[self.statement.token_next(0)[1].value] + index = re_index(self.statement.right.value) + + if self._operator in NEW_OPERATORS: + index = index if isinstance(index, list) else [index] + self._constant = [self.params[i] for i in index] + else: + self._constant = self.params[index] if index is not None else MAP_INDEX_NONE[self.statement.right.value] + + if isinstance(self._constant, dict): + self._field_ext, self._constant = next(iter(self._constant.items())) + else: + self._field_ext = None + + def negate(self): + self.is_negated = True + + def evaluate(self): + pass + + def to_mongo(self): + field = self._identifier.field + if self._field_ext: + field += '.' + self._field_ext + + if not self.is_negated: + return {field: {self._operator: self._constant}} + else: + return {field: {'$not': {self._operator: self._constant}}} + + +OPERATOR_MAP = { + '=': '$eq', + '>': '$gt', + '<': '$lt', + '>=': '$gte', + '<=': '$lte', + 'IN': '$in', + 'NOT IN': '$nin' +} +OPERATOR_PRECEDENCE = { + 'IS': 8, + 'BETWEEN': 7, + 'LIKE': 6, + 'IN': 5, + 'NOT IN': 4, + 'NOT': 3, + 'AND': 2, + 'OR': 1, + 'generic': 0 +} + +MAP_INDEX_NONE = { + 'NULL': None, + 'True': True +} + +NEW_OPERATORS = ['$in', '$nin'] + +AND_OR_NOT_SEPARATOR = 3 diff --git a/djongo/sql2mongo/query.py b/djongo/sql2mongo/query.py new file mode 100644 index 00000000..9672005f --- /dev/null +++ b/djongo/sql2mongo/query.py @@ -0,0 +1,1015 @@ +""" +Module with constants and mappings to build MongoDB queries from +SQL constructors. +""" + +# THIS FILE WAS CHANGED ON - 19 Apr 2022 + +import abc +import re +from logging import getLogger +from typing import Optional, Dict, List, Union as U, Sequence, Set +from dataclasses import dataclass, field as dataclass_field +from pymongo import MongoClient +from pymongo import ReturnDocument +from pymongo.command_cursor import CommandCursor +from pymongo.cursor import Cursor as BasicCursor +from pymongo.database import Database +from pymongo.errors import OperationFailure, CollectionInvalid +from sqlparse import parse as sqlparse +from sqlparse import tokens +from sqlparse.sql import ( + Identifier, Parenthesis, + Where, + Statement, Comparison, Token, TokenList, Values) +from sqlparse.tokens import Keyword, Operator, Literal, Punctuation, Whitespace, Generic + +from .operators import OPERATOR_PRECEDENCE, AND_OR_NOT_SEPARATOR +from ..exceptions import SQLDecodeError, MigrationError, print_warn +from .functions import SQLFunc +from .sql_tokens import (SQLToken, SQLStatement, SQLIdentifier, + AliasableToken, SQLConstIdentifier, SQLColumnDef, SQLColumnConstraint) +from .converters import ( + ColumnSelectConverter, AggColumnSelectConverter, FromConverter, WhereConverter, + AggWhereConverter, InnerJoinConverter, OuterJoinConverter, LimitConverter, AggLimitConverter, OrderConverter, + SetConverter, AggOrderConverter, DistinctConverter, NestedInQueryConverter, GroupbyConverter, OffsetConverter, + AggOffsetConverter, HavingConverter) + +from djongo import base +logger = getLogger(__name__) + + +@dataclass +class TokenAlias: + alias2token: Dict[str, U[AliasableToken, + SQLFunc, + SQLIdentifier]] = dataclass_field(default_factory=dict) + token2alias: Dict[U[AliasableToken, + SQLFunc, + SQLIdentifier], str] = dataclass_field(default_factory=dict) + aliased_names: Set[str] = dataclass_field(default_factory=set) + + +class BaseQuery(abc.ABC): + def __init__(self, + db: Database, + connection_properties: 'base.DjongoClient', + statement: Statement, + params: Sequence): + self.statement = statement + self.db = db + self.connection_properties = connection_properties + self.params = params + self.token_alias = TokenAlias() + self.nested_query: Optional[NestedInQueryConverter] = None + self.left_table: Optional[str] = None + self._cursor = None + self.parse() + + def __iter__(self): + return + yield + + @abc.abstractmethod + def parse(self): + raise NotImplementedError + + @abc.abstractmethod + def execute(self): + raise NotImplementedError + + +DMLQuery = BaseQuery + + +class DDLQuery(BaseQuery): + + @abc.abstractmethod + def __init__(self, *args): + super().__init__(*args) + + def execute(self): + return + + +class DQLQuery(BaseQuery): + + def execute(self): + return + + @abc.abstractmethod + def count(self): + raise NotImplementedError + + +class SelectQuery(DQLQuery): + + def __init__(self, *args): + self.selected_columns: Optional[ColumnSelectConverter] = None + self.where: Optional[WhereConverter] = None + self.joins: List[ + U[InnerJoinConverter, OuterJoinConverter] + ] = [] + self.order: Optional[OrderConverter] = None + self.offset: Optional[OffsetConverter] = None + self.limit: Optional[LimitConverter] = None + self.distinct: Optional[DistinctConverter] = None + self.groupby: Optional[GroupbyConverter] = None + self.having: Optional[HavingConverter] = None + + self._cursor: Optional[U[BasicCursor, CommandCursor]] = None + super().__init__(*args) + + def parse(self): + statement = SQLStatement(self.statement) + + for tok in statement: + if tok.match(tokens.DML, 'SELECT'): + self.selected_columns = ColumnSelectConverter(self, statement) + + elif tok.match(tokens.Keyword, 'FROM'): + FromConverter(self, statement) + + elif tok.match(tokens.Keyword, 'LIMIT'): + self.limit = LimitConverter(self, statement) + + elif tok.match(tokens.Keyword, 'ORDER BY'): + self.order = OrderConverter(self, statement) + + elif tok.match(tokens.Keyword, 'OFFSET'): + self.offset = OffsetConverter(self, statement) + + elif tok.match(tokens.Keyword, 'INNER JOIN'): + converter = InnerJoinConverter(self, statement) + self.joins.append(converter) + + elif tok.match(tokens.Keyword, 'LEFT OUTER JOIN'): + converter = OuterJoinConverter(self, statement) + self.joins.append(converter) + + elif tok.match(tokens.Keyword, 'GROUP BY'): + self.groupby = GroupbyConverter(self, statement) + + elif tok.match(tokens.Keyword, 'HAVING'): + self.having = HavingConverter(self, statement) + + elif isinstance(tok, Where): + self.where = WhereConverter(self, statement) + + else: + raise SQLDecodeError(f'Unknown keyword: {tok}') + + def __iter__(self): + + if self._cursor is None: + self._cursor = self._get_cursor() + + cursor = self._cursor + if not cursor.alive: + return + + for doc in cursor: + yield self._align_results(doc) + return + + def count(self): + + if self._cursor is None: + self._cursor = self._get_cursor() + return len(list(self._cursor)) + # if isinstance(self._cursor, BasicCursor): + # return self._cursor.count() + # else: + # return len(list(self._cursor)) + + def _needs_aggregation(self): + if (self.nested_query + or self.joins + or self.distinct + or self.groupby): + return True + if any(isinstance(sql_token, (SQLFunc, SQLConstIdentifier)) + for sql_token in self.selected_columns.sql_tokens): + return True + return False + + def _make_pipeline(self): + pipeline = [] + for join in self.joins: + pipeline.extend(join.to_mongo()) + + if self.nested_query: + pipeline.extend(self.nested_query.to_mongo()) + + if self.where: + self.where.__class__ = AggWhereConverter + pipeline.append(self.where.to_mongo()) + + if self.groupby: + pipeline.extend(self.groupby.to_mongo()) + + if self.having: + pipeline.append(self.having.to_mongo()) + + if self.distinct: + pipeline.extend(self.distinct.to_mongo()) + + if self.order: + self.order.__class__ = AggOrderConverter + pipeline.append(self.order.to_mongo()) + + if self.offset: + self.offset.__class__ = AggOffsetConverter + pipeline.append(self.offset.to_mongo()) + + if self.limit: + self.limit.__class__ = AggLimitConverter + pipeline.append(self.limit.to_mongo()) + + if self._needs_column_selection(): + self.selected_columns.__class__ = AggColumnSelectConverter + pipeline.extend(self.selected_columns.to_mongo()) + + return pipeline + + def _needs_column_selection(self): + return not(self.distinct or self.groupby) and self.selected_columns + + def _get_cursor(self): + if self._needs_aggregation(): + pipeline = self._make_pipeline() + cur = self.db[self.left_table].aggregate(pipeline) + logger.debug(f'Aggregation query: {pipeline}') + else: + kwargs = {} + if self.where: + kwargs.update(self.where.to_mongo()) + + if self.selected_columns: + kwargs.update(self.selected_columns.to_mongo()) + + if self.limit: + kwargs.update(self.limit.to_mongo()) + + if self.order: + kwargs.update(self.order.to_mongo()) + + if self.offset: + kwargs.update(self.offset.to_mongo()) + + cur = self.db[self.left_table].find(**kwargs) + logger.debug(f'Find query: {kwargs}') + + return cur + + def _align_results(self, doc): + ret = [] + if self.distinct: + sql_tokens = self.distinct.sql_tokens + else: + sql_tokens = self.selected_columns.sql_tokens + + for selected in sql_tokens: + if isinstance(selected, SQLIdentifier): + if selected.table == self.left_table: + try: + ret.append(doc[selected.column]) + except KeyError: + if self.connection_properties.enforce_schema: + raise MigrationError(selected.column) + ret.append(None) + else: + try: + ret.append(doc[selected.table][selected.column]) + except KeyError: + if self.connection_properties.enforce_schema: + raise MigrationError(selected.column) + ret.append(None) + else: + ret.append(doc[selected.alias]) + + return tuple(ret) + + +class UpdateQuery(DMLQuery): + + def __init__(self, *args): + self.selected_table: Optional[ColumnSelectConverter] = None + self.set_columns: Optional[SetConverter] = None + self.where: Optional[WhereConverter] = None + self.result = None + self.kwargs = None + super().__init__(*args) + + def count(self): + return self.result.matched_count + + def parse(self): + + statement = SQLStatement(self.statement) + + for tok in statement: + if tok.match(tokens.DML, 'UPDATE'): + c = ColumnSelectConverter(self, statement) + self.left_table = c.sql_tokens[0].table + + elif tok.match(tokens.Keyword, 'SET'): + c = self.set_columns = SetConverter(self, statement) + + elif isinstance(tok, Where): + c = self.where = WhereConverter(self, statement) + + else: + raise SQLDecodeError + + self.kwargs = {} + if self.where: + self.kwargs.update(self.where.to_mongo()) + + self.kwargs.update(self.set_columns.to_mongo()) + + def execute(self): + db = self.db + self.result = db[self.left_table].update_many(**self.kwargs) + logger.debug(f'update_many: {self.result.modified_count}, matched: {self.result.matched_count}') + + +class InsertQuery(DMLQuery): + + def __init__(self, + result_ref: 'Query', + *args): + self._result_ref = result_ref + self._cols = None + self._values = [] + super().__init__(*args) + + def _table(self, statement: SQLStatement): + tok = statement.next() + collection = tok.get_name() + if collection not in self.connection_properties.cached_collections: + if self.connection_properties.enforce_schema: + raise MigrationError(f'Table {collection} does not exist in database') + self.connection_properties.cached_collections.add(collection) + + self.left_table = collection + + def _columns(self, statement: SQLStatement): + tok = statement.next() + self._cols = [token.column for token in SQLToken.tokens2sql(tok[1], self)] + + def _fill_values(self, statement: SQLStatement): + for tok in statement: + if isinstance(tok, Parenthesis): + placeholder = SQLToken.token2sql(tok, self) + values = [] + for index in placeholder: + if isinstance(index, int): + values.append(self.params[index]) + else: + values.append(index) + self._values.append(values) + elif isinstance(tok, Values): + self._fill_values(statement=tok.tokens) + elif tok.ttype in [Whitespace]: + continue + elif not tok.match(tokens.Keyword, 'VALUES'): + raise SQLDecodeError + + def execute(self): + docs = [] + num = len(self._values) + + auto = self.db['__schema__'].find_one_and_update( + { + 'name': self.left_table, + 'auto': { + '$exists': True + } + }, + {'$inc': {'auto.seq': num}}, + return_document=ReturnDocument.AFTER + ) + + for i, val in enumerate(self._values): + ins = {} + if auto: + for name in auto['auto']['field_names']: + ins[name] = auto['auto']['seq'] - num + i + 1 + for _field, value in zip(self._cols, val): + if (auto and _field in auto['auto']['field_names'] + and value == 'DEFAULT'): + continue + ins[_field] = value + docs.append(ins) + + res = self.db[self.left_table].insert_many(docs, ordered=False) + if auto: + self._result_ref.last_row_id = auto['auto']['seq'] + else: + self._result_ref.last_row_id = res.inserted_ids[-1] + logger.debug('inserted ids {}'.format(res.inserted_ids)) + + def parse(self): + statement = SQLStatement(self.statement) + # Skip to table name + statement.skip(4) + self._table(statement) + self._columns(statement) + self._fill_values(statement) + + +class AlterQuery(DDLQuery): + + def __init__(self, *args): + self._iden_name = None + self._old_name = None + self._new_name = None + self._new_name = None + self._default = None + self._type_code = None + self._cascade = None + self._null = None + + super().__init__(*args) + + def parse(self): + statement = SQLStatement(self.statement) + statement.skip(2) + + for tok in statement: + if tok.match(tokens.Keyword, 'TABLE'): + self._table(statement) + elif tok.match(tokens.Keyword, 'ADD'): + self._add(statement) + elif tok.match(tokens.Keyword, 'FLUSH'): + self.execute = self._flush + elif tok.match(tokens.Keyword.DDL, 'DROP'): + self._drop(statement) + elif tok.match(tokens.Keyword.DDL, 'ALTER'): + self._alter(statement) + elif tok.match(tokens.Keyword, 'RENAME'): + self._rename(statement) + else: + raise SQLDecodeError(f'Unknown token {tok}') + + def _rename(self, statement: SQLStatement): + column = False + to = False + for tok in statement: + if tok.match(tokens.Keyword, 'COLUMN'): + self.execute = self._rename_column + column = True + if tok.match(tokens.Keyword, 'TO'): + to = True + elif isinstance(tok, Identifier): + if not to: + self._old_name = tok.get_real_name() + else: + self._new_name = tok.get_real_name() + + if not column: + # Rename table + self.execute = self._rename_collection + + def _rename_column(self): + self.db[self.left_table].update( + {}, + { + '$rename': { + self._old_name: self._new_name + } + }, + multi=True + ) + + def _rename_collection(self): + self.db[self.left_table].rename(self._new_name) + + def _alter(self, statement: SQLStatement): + self.execute = lambda: None + feature = '' + + for tok in statement: + if isinstance(tok, Identifier): + pass + elif tok.ttype == tokens.Name.Placeholder: + pass + elif tok.match(tokens.Keyword, ( + 'NOT NULL', 'NULL', 'COLUMN', + )): + feature += str(tok) + ' ' + elif tok.match(tokens.Keyword.DDL, 'DROP'): + feature += 'DROP ' + elif tok.match(tokens.Keyword, 'DEFAULT'): + feature += 'DEFAULT ' + elif tok.match(tokens.Keyword, 'SET'): + feature += 'SET ' + else: + raise SQLDecodeError(f'Unknown token: {tok}') + + print_warn(feature) + + def _flush(self): + self.db[self.left_table].delete_many({}) + + def _table(self, statement: SQLStatement): + tok = statement.next() + if not tok: + raise SQLDecodeError + self.left_table = SQLToken.token2sql(tok, self).table + + def _drop(self, statement: SQLStatement): + + for tok in statement: + if tok.match(tokens.Keyword, 'CASCADE'): + print_warn('DROP CASCADE') + elif isinstance(tok, Identifier): + self._iden_name = tok.get_real_name() + elif tok.match(tokens.Keyword, 'INDEX'): + self.execute = self._drop_index + elif tok.match(tokens.Keyword, 'CONSTRAINT'): + pass + elif tok.match(tokens.Keyword, 'COLUMN'): + self.execute = self._drop_column + else: + raise SQLDecodeError + + def _drop_index(self): + self.db[self.left_table].drop_index(self._iden_name) + + def _drop_column(self): + self.db[self.left_table].update( + {}, + { + '$unset': { + self._iden_name: '' + } + }, + multi=True + ) + self.db['__schema__'].update( + {'name': self.left_table}, + { + '$unset': { + f'fields.{self._iden_name}': '' + } + } + ) + + def _add(self, statement: SQLStatement): + for tok in statement: + if tok.match(tokens.Keyword, ( + 'CONSTRAINT', 'KEY', 'REFERENCES', + 'NOT NULL', 'NULL' + )): + print_warn(f'schema validation using {tok}') + + elif tok.match(tokens.Name.Builtin, '.*', regex=True): + print_warn('column type validation') + self._type_code = str(tok) + + elif tok.match(tokens.Keyword, 'double'): + print_warn('column type validation') + self._type_code = str(tok) + + elif isinstance(tok, Identifier): + self._iden_name = tok.get_real_name() + + elif isinstance(tok, Parenthesis): + self.field_dir = [ + (field.strip(' "'), 1) + for field in tok.value.strip('()').split(',') + ] + + elif tok.match(tokens.Keyword, 'DEFAULT'): + tok = statement.next() + i = SQLToken.placeholder_index(tok) + self._default = self.params[i] + + elif tok.match(tokens.Keyword, 'UNIQUE'): + if self.execute == self._add_column: + self.field_dir = [(self._iden_name, 1)] + self.execute = self._unique + + elif tok.match(tokens.Keyword, 'INDEX'): + self.execute = self._index + + elif tok.match(tokens.Keyword, 'FOREIGN'): + self.execute = self._fk + + elif tok.match(tokens.Keyword, 'COLUMN'): + self.execute = self._add_column + + elif isinstance(tok, Where): + print_warn('partial indexes') + + else: + raise SQLDecodeError(err_key=tok.value, + err_sub_sql=statement) + + def _add_column(self): + self.db[self.left_table].update( + { + '$or': [ + {self._iden_name: {'$exists': False}}, + {self._iden_name: None} + ] + }, + { + '$set': { + self._iden_name: self._default + } + }, + multi=True + ) + self.db['__schema__'].update( + {'name': self.left_table}, + { + '$set': { + f'fields.{self._iden_name}': { + 'type_code': self._type_code + } + } + } + ) + + def _index(self): + self.db[self.left_table].create_index( + self.field_dir, + name=self._iden_name) + + def _unique(self): + self.db[self.left_table].create_index( + self.field_dir, + unique=True, + name=self._iden_name) + + def _fk(self): + pass + + +class CreateQuery(DDLQuery): + + def __init__(self, *args): + super().__init__(*args) + + def _create_table(self, statement): + if '__schema__' not in self.connection_properties.cached_collections: + self.db.create_collection('__schema__') + self.connection_properties.cached_collections.add('__schema__') + self.db['__schema__'].create_index('name', unique=True) + self.db['__schema__'].create_index('auto') + + tok = statement.next() + table = SQLToken.token2sql(tok, self).table + try: + self.db.create_collection(table) + except CollectionInvalid: + if self.connection_properties.enforce_schema: + raise + else: + return + + logger.debug('Created table: {}'.format(table)) + + tok = statement.next() + if not isinstance(tok, Parenthesis): + raise SQLDecodeError(f'Unexpected sql syntax' + f' for column definition: {statement}') + + if statement.next(): + raise SQLDecodeError(f'Unexpected sql syntax' + f' for column definition: {statement}') + + _filter = { + 'name': table + } + _set = {} + push = {} + update = {} + + for col in SQLColumnDef.sql2col_defs(tok.value): + if isinstance(col, SQLColumnConstraint): + print_warn('column CONSTRAINTS') + else: + field = col.name + if field == '_id': + continue + + _set[f'fields.{field}'] = { + 'type_code': col.data_type + } + + if SQLColumnDef.autoincrement in col.col_constraints: + try: + push['auto.field_names']['$each'].append(field) + except KeyError: + push['auto.field_names'] = { + '$each': [field] + } + _set['auto.seq'] = 0 + + if SQLColumnDef.primarykey in col.col_constraints: + self.db[table].create_index(field, unique=True, name='__primary_key__') + + if SQLColumnDef.unique in col.col_constraints: + self.db[table].create_index(field, unique=True) + + if (SQLColumnDef.not_null in col.col_constraints or + SQLColumnDef.null in col.col_constraints): + print_warn('NULL, NOT NULL column validation check') + + if _set: + update['$set'] = _set + if push: + update['$push'] = push + if update: + self.db['__schema__'].update_one( + filter=_filter, + update=update, + upsert=True + ) + + def parse(self): + statement = SQLStatement(self.statement) + statement.skip(2) + tok = statement.next() + if tok.match(tokens.Keyword, 'TABLE'): + self._create_table(statement) + elif tok.match(tokens.Keyword, 'DATABASE'): + pass + else: + logger.debug('Not supported {}'.format(self.statement)) + raise SQLDecodeError + + +class DeleteQuery(DMLQuery): + + def __init__(self, *args): + self.result = None + self.kw = None + super().__init__(*args) + + def parse(self): + statement = SQLStatement(self.statement) + self.kw = kw = {'filter': {}} + statement.skip(4) + sql_token = SQLToken.token2sql(statement.next(), self) + self.left_table = sql_token.table + + tok = statement.next() + if isinstance(tok, Where): + where = WhereConverter(self, statement) + kw.update(where.to_mongo()) + + def execute(self): + db_con = self.db + self.result = db_con[self.left_table].delete_many(**self.kw) + logger.debug('delete_many: {}'.format(self.result.deleted_count)) + + def count(self): + return self.result.deleted_count + + +class Query: + + def __init__(self, + client_connection: MongoClient, + db_connection: Database, + connection_properties: 'base.DjongoClient', + sql: str, + params: Optional[Sequence]): + + self._params = params + self.db = db_connection + self.cli_con = client_connection + self.connection_properties = connection_properties + self._params_index_count = -1 + self._sql = re.sub(r'%s', self._param_index, sql) + + self.last_row_id = None + self._result_generator = None + + self.skip = False + self.skipped = 0 + self.is_where = False + + self._query = self.parse() + + def count(self): + return self._query.count() + + def close(self): + if self._query and self._query._cursor: + self._query._cursor.close() + + def __next__(self): + if self._result_generator is None: + self._result_generator = iter(self) + + result = next(self._result_generator) + logger.debug(f'Result: {result}') + return result + + next = __next__ + + def __iter__(self): + if self._query is None: + return + + try: + yield from iter(self._query) + + except MigrationError: + raise + + except OperationFailure as e: + import djongo + exe = SQLDecodeError( + f'FAILED SQL: {self._sql}\n' + f'Params: {self._params}\n' + f'Pymongo error: {e.details}\n' + f'Version: {djongo.__version__}' + ) + raise exe from e + + except Exception as e: + import djongo + exe = SQLDecodeError( + f'FAILED SQL: {self._sql}\n' + f'Params: {self._params}\n' + f'Version: {djongo.__version__}' + ) + raise exe from e + + def _param_index(self, _): + self._params_index_count += 1 + return '%({})s'.format(self._params_index_count) + + def parse(self): + logger.debug( + f'sql_command: {self._sql}\n' + f'params: {self._params}' + ) + + def check_conditions(item): + if not getattr(self, 'is_where', False): + self.is_where = getattr(item, 'value', None) == 'WHERE' and getattr(item, 'ttype', None) == Keyword + if getattr(item, 'value', None) in Where.M_CLOSE[1] and getattr(item, 'ttype', None) == Where.M_CLOSE[0]: + self.is_where = False + + parent: TokenList = getattr(item, 'parent', None) + index_of_precedence = parent.token_index(item) + next_token = parent.token_next(index_of_precedence, skip_ws=True, skip_cm=True)[1] + next_token_value = getattr(next_token, 'value', False) + + if OPERATOR_PRECEDENCE.get(next_token_value, 0) > AND_OR_NOT_SEPARATOR: + self.skip = True + else: + self.skip = False + + return self.is_where and not self.skip + + def parse_where(where_item): + identifier_token_list = [ + Token(ttype=Literal.String.Symbol, value=value) for value in where_item.value.split('.') + ] + for identifier_token_list_index in range(1, len(identifier_token_list), 2): + identifier_token_list.insert(identifier_token_list_index, Token(ttype=Punctuation, value='.')) + return Comparison([ + Identifier(identifier_token_list), + Token(ttype=Operator.Comparison, value='='), + Token(ttype=Generic, value=True) + ]) + + def from_part(token, token_list): + if check_conditions(token) and isinstance(token, Identifier) and not isinstance(token.parent, Comparison): + token = parse_where(token) + elif self.skip: + return token + if hasattr(token, 'tokens'): + to_append_token_list = [] + for new_token in getattr(token, 'tokens', []): + to_append_token_list.append(from_part(new_token, token_list)) + token = token.__class__(to_append_token_list) + + return token + + def from_statement(_statement): + _statement = _statement[0] + statement_tokens = [] + + for token_index, token in enumerate(_statement.tokens): + statement_tokens.append(from_part(token, [])) + + return Statement(statement_tokens) + + statement = [] + sql = sqlparse(self._sql) + statement.append(from_statement(sql)) + + if len(statement) > 1: + raise SQLDecodeError(self._sql) + + statement = statement[0] + sm_type = statement.get_type() + + try: + handler = self.FUNC_MAP[sm_type] + except KeyError: + logger.debug('\n Not implemented {} {}'.format(sm_type, statement)) + raise SQLDecodeError(f'{sm_type} command not implemented for SQL {self._sql}') + + else: + try: + return handler(self, statement) + + except MigrationError: + raise + + except OperationFailure as e: + import djongo + exe = SQLDecodeError( + err_sql=self._sql, + params=self._params, + version=djongo.__version__ + ) + raise exe from e + + except SQLDecodeError as e: + import djongo + e.err_sql = self._sql, + e.params = self._params, + e.version = djongo.__version__ + raise e + + except Exception as e: + import djongo + exe = SQLDecodeError( + err_sql=self._sql, + params=self._params, + version=djongo.__version__ + ) + raise exe from e + + def _alter(self, sm): + try: + query = AlterQuery(self.db, self.connection_properties, sm, self._params) + except SQLDecodeError: + logger.warning('Not implemented alter command for SQL {}'.format(self._sql)) + raise + else: + query.execute() + return query + + def _create(self, sm): + query = CreateQuery(self.db, self.connection_properties, sm, self._params) + query.execute() + return query + + def _drop(self, sm): + statement = SQLStatement(sm) + statement.skip(2) + tok = statement.next() + if tok.match(tokens.Keyword, 'DATABASE'): + tok = statement.next() + db_name = tok.get_name() + self.cli_con.drop_database(db_name) + elif tok.match(tokens.Keyword, 'TABLE'): + tok = statement.next() + table_name = tok.get_name() + self.db.drop_collection(table_name) + else: + raise SQLDecodeError('statement:{}'.format(sm)) + + def _update(self, sm): + query = UpdateQuery(self.db, self.connection_properties, sm, self._params) + query.execute() + return query + + def _delete(self, sm): + query = DeleteQuery(self.db, self.connection_properties, sm, self._params) + query.execute() + return query + + def _insert(self, sm): + query = InsertQuery(self, self.db, self.connection_properties, sm, self._params) + query.execute() + return query + + def _select(self, sm): + return SelectQuery(self.db, self.connection_properties, sm, self._params) + + FUNC_MAP = { + 'SELECT': _select, + 'UPDATE': _update, + 'INSERT': _insert, + 'DELETE': _delete, + 'CREATE': _create, + 'DROP': _drop, + 'ALTER': _alter + } + + + diff --git a/djongo/sql2mongo/sql_tokens.py b/djongo/sql2mongo/sql_tokens.py new file mode 100644 index 00000000..81d92e9f --- /dev/null +++ b/djongo/sql2mongo/sql_tokens.py @@ -0,0 +1,413 @@ +import abc +import re +from typing import Union as U, Iterator, Optional as O +from pymongo import ASCENDING, DESCENDING +from sqlparse import tokens, parse as sqlparse +from sqlparse.sql import Token, Identifier, Function, Comparison, Parenthesis, IdentifierList, Statement +from . import query as query_module +from ..exceptions import SQLDecodeError, NotSupportedError + +all_token_types = U['SQLConstIdentifier', + 'djongo.sql2mongo.functions.CountFunc', + 'djongo.sql2mongo.functions.SimpleFunc', + 'SQLIdentifier', + 'SQLComparison', + 'SQLPlaceholder'] + + +class SQLToken: + + @abc.abstractmethod + def __init__(self, + token: Token, + query: 'query_module.BaseQuery'): + self._token = token + self.query = query + + def __repr__(self): + return f'{self._token}' + + @staticmethod + def tokens2sql(token: Token, + query: 'query_module.BaseQuery' + ) -> Iterator[all_token_types]: + from .functions import SQLFunc + if isinstance(token, Identifier): + # Bug fix for sql parse + if isinstance(token[0], Parenthesis): + try: + int(token[0][1].value) + except ValueError: + yield SQLIdentifier(token[0][1], query) + else: + yield SQLConstIdentifier(token, query) + elif isinstance(token[0], Function): + yield SQLFunc.token2sql(token, query) + else: + yield SQLIdentifier(token, query) + elif isinstance(token, Function): + yield SQLFunc.token2sql(token, query) + elif isinstance(token, Comparison): + yield SQLComparison(token, query) + elif isinstance(token, IdentifierList): + for tok in token.get_identifiers(): + yield from SQLToken.tokens2sql(tok, query) + elif isinstance(token, Parenthesis): + yield SQLPlaceholder(token, query) + else: + raise SQLDecodeError(f'Unsupported: {token.value}') + + @staticmethod + def token2sql(token: Token, + query: 'query_module.BaseQuery' + ) -> all_token_types: + return next(SQLToken.tokens2sql(token, query)) + + @staticmethod + def placeholder_index(token) -> int: + return int(re.match(r'%\(([0-9]+)\)s', token.value, flags=re.IGNORECASE).group(1)) + + +class AliasableToken(SQLToken): + + @abc.abstractmethod + def __init__(self, *args): + super().__init__(*args) + self.token_alias: 'query_module.TokenAlias' = self.query.token_alias + + if self.alias: + self.token_alias.alias2token[self.alias] = self + self.token_alias.token2alias[self] = self.alias + if self.is_explicit_alias(): + self.token_alias.aliased_names.add(self.alias) + + def __hash__(self): + if self.is_explicit_alias(): + return hash(self._token[0].value) + return hash(self._token.value) + + def __eq__(self, other): + return hash(self) == hash(other) + + def is_explicit_alias(self): + return len(self._token.tokens) == 5 and self._token[2].match(tokens.Keyword, 'AS') + + @property + def alias(self) -> str: + # bug fix sql parse + if not self._token.get_ordering(): + return self._token.get_alias() + + +class SQLIdentifier(AliasableToken): + + def __init__(self, *args): + super().__init__(*args) + self._ord = None + if self._token.get_ordering(): + # Bug fix for sql parse + self._ord = self._token.get_ordering() + self._token = self._token[0] + + @property + def order(self): + if self._ord is None: + raise SQLDecodeError + return ORDER_BY_MAP[self._ord] + + @property + def field(self) -> str: + if self.given_table in self.query.token_alias.aliased_names: + return self.given_table + + if self.table == self.query.left_table: + return self.column + else: + return f'{self.table}.{self.column}' + + @property + def table(self) -> str: + name = self.given_table + alias2token = self.token_alias.alias2token + try: + return alias2token[name].table + except KeyError: + return name + + @property + def given_table(self) -> str: + name = self._token.get_parent_name() + if name is None: + name = self._token.get_real_name() + + if name is None: + raise SQLDecodeError + return name + + @property + def column(self) -> str: + name = self._token.get_real_name() + if name is None: + raise SQLDecodeError + return name + + +class SQLConstIdentifier(AliasableToken): + + def __init__(self, *args): + super().__init__(*args) + + @property + def value(self) -> int: + return int(self._token[0][1].value) + + def to_mongo(self) -> dict: + return {'$literal': self.value} + + +class SQLComparison(SQLToken): + + @property + def left_table(self): + lhs = SQLIdentifier(self._token.left, self.query) + return lhs.table + + @property + def left_column(self): + lhs = SQLIdentifier(self._token.left, self.query) + return lhs.column + + @property + def right_table(self): + rhs = SQLIdentifier(self._token.right, self.query) + return rhs.table + + @property + def right_column(self): + rhs = SQLIdentifier(self._token.right, self.query) + return rhs.column + + @property + def rhs_indexes(self): + if not self._token.right.ttype == tokens.Name.Placeholder: + if self._token.right.match(tokens.Keyword, 'NULL'): + return None + raise SQLDecodeError + + index = self.placeholder_index(self._token.right) + return index + + +class SQLPlaceholder(SQLToken): + def __iter__(self): + tok = self._token[1:-1][0] + if isinstance(tok, IdentifierList): + for aid in tok.get_identifiers(): + yield self.get_value(aid) + + else: + yield self.get_value(tok) + + def __init__(self, token: Token, query: 'query_module.BaseQuery'): + super().__init__(token, query) + + def get_value(self, tok: Token): + if tok.ttype == tokens.Name.Placeholder: + return self.placeholder_index(tok) + elif tok.match(tokens.Keyword, 'NULL'): + return None + elif tok.match(tokens.Keyword, 'DEFAULT'): + return 'DEFAULT' + else: + raise SQLDecodeError + + +class SQLStatement: + + @property + def current_token(self) -> Token: + return self._statement[self._tok_id] + + def __init__(self, statement: U[Statement, Token]): + self._statement = statement + self._tok_id = 0 + self._gen_inst = self._generator() + + def __getattr__(self, item): + return getattr(self._statement, item) + + def __iter__(self) -> Token: + yield from self._gen_inst + + def __repr__(self): + return str(self._statement) + + def __getitem__(self, item: slice): + start = (item.start or 0) + self._tok_id + stop = item.stop and self._tok_id + item.stop + sql = ''.join(str(tok) for tok in self._statement[start:stop]) + sql = sqlparse(sql)[0] + return SQLStatement(sql) + + def next(self) -> O[Token]: + # self._tok_id, token = self._statement.token_next(self._tok_id) + try: + return next(self._gen_inst) + except StopIteration: + return None + + def skip(self, num): + self._tok_id += num + + @property + def prev_token(self) -> Token: + return self._statement.token_prev(self._tok_id)[1] + + @property + def next_token(self) -> Token: + return self._statement.token_next(self._tok_id)[1] + + def _generator(self): + token = self._statement[self._tok_id] + while self._tok_id is not None: + yield token + self._tok_id, token = self._statement.token_next(self._tok_id) + + +class SQLColumnDef: + + not_null = object() + unique = object() + autoincrement = object() + primarykey = object() + null = object() + _map = { + 'UNIQUE': unique, + 'AUTOINCREMENT': autoincrement, + 'PRIMARY KEY': primarykey, + 'NOT NULL': not_null, + 'NULL': null + } + supported_data_types = None + + def __init__(self, + name: str = None, + data_type: str = None, + col_constraints: set = None): + self.name = name + self.data_type = data_type + self.col_constraints = col_constraints + + @staticmethod + def _get_constraints(others: str): + while others: + try: + name, others = others.split(' ', 1) + except ValueError: + name = others + others = None + try: + yield SQLColumnDef._map[name] + except KeyError: + if others: + try: + part2, others = others.split(' ', 1) + except ValueError: + part2 = others + others = None + + name = f'{name} {part2}' + try: + yield SQLColumnDef._map[name] + except KeyError: + raise SQLDecodeError(f'Unknown column constraint: {name}') + else: + raise SQLDecodeError(f'Unknown column constraint: {name}') + + @staticmethod + def sql2col_defs(sql: str): + sql = sql[1:-1] + while sql: + if sql[0] == '"': + try: + def_str, sql = sql.split(',', 1) + except ValueError: + def_str = sql + sql = None + else: + sql = sql.strip() + yield SQLColumnDef.def_str2col_def(def_str) + elif sql.startswith('CONSTRAINT'): + # Temporary hack + indexes = [None] + i = 0 + for i, c in enumerate(sql): + if c == '(': + if indexes[0] is None: + indexes.pop() + indexes.append(i) + elif c == ')': + indexes.pop() + if not indexes: + break + if len(sql[i:]) > 1: + sql = sql[i+3:] + else: + sql = None + yield SQLColumnConstraint() + else: + raise SQLDecodeError(f'Syntax Error: {sql}') + + @classmethod + def def_str2col_def(cls, def_str: str): + if not cls.supported_data_types: + from djongo.base import DatabaseWrapper + cls.supported_data_types = set(DatabaseWrapper.data_types.values()) + + name, other = def_str[1:].split('"', 1) + other = other.strip() + + data_type, constraint_sql = other.split(' ', 1) + if data_type not in cls.supported_data_types: + raise NotSupportedError(f'Data of type: {data_type}') + + col_constraints = set(SQLColumnDef._get_constraints(constraint_sql)) + return SQLColumnDef(name=name, + data_type=data_type, + col_constraints=col_constraints) + + @classmethod + def statement2col_defs(cls, token: Token): + from djongo.base import DatabaseWrapper + supported_data_types = set(DatabaseWrapper.data_types.values()) + + defs = token.value.strip('()').split(',') + for col in defs: + col = col.strip() + name, other = col.split(' ', 1) + if name == 'CONSTRAINT': + yield SQLColumnConstraint() + else: + if col[0] != '"': + raise SQLDecodeError('Column identifier not quoted') + name, other = col[1:].split('"', 1) + other = other.strip() + + data_type, constraint_sql = other.split(' ', 1) + if data_type not in supported_data_types: + raise NotSupportedError(f'Data of type: {data_type}') + + col_constraints = set(SQLColumnDef._get_constraints(constraint_sql)) + yield SQLColumnDef(name=name, + data_type=data_type, + col_constraints=col_constraints) + + +class SQLColumnConstraint(SQLColumnDef): + pass + + +ORDER_BY_MAP = { + 'ASC': ASCENDING, + 'DESC': DESCENDING +} diff --git a/djongo/sql2mongo/validation.py b/djongo/sql2mongo/validation.py new file mode 100644 index 00000000..d5eab724 --- /dev/null +++ b/djongo/sql2mongo/validation.py @@ -0,0 +1,8 @@ +from djongo.exceptions import NotSupportedError, print_warn + +print_warn('validation') + +class CollectionSchema: + + def __init__(self): + raise NotSupportedError('Collection Schema') diff --git a/djongo/storage.py b/djongo/storage.py new file mode 100644 index 00000000..a721ef91 --- /dev/null +++ b/djongo/storage.py @@ -0,0 +1,180 @@ +import os +from urllib.parse import urljoin + +from bson import ObjectId +from bson.errors import InvalidId +from django.core.exceptions import ImproperlyConfigured +from django.core.files.storage import Storage +from django.utils.deconstruct import deconstructible +from django.utils.encoding import filepath_to_uri + +from gridfs import GridFS, NoFile + + +def _get_subcollections(collection): + """ + Returns all sub-collections of `collection`. + """ + # XXX: Use the MongoDB API for this once it exists. + for name in collection.database.collection_names(): + cleaned = name[:name.rfind('.')] + if cleaned != collection.name and cleaned.startswith(collection.name): + yield cleaned + + +@deconstructible +class GridFSStorage(Storage): + """ + GridFS Storage backend for Django. + Based on https://github.com/django-nonrel/mongodb-engine/blob/master/django_mongodb_engine/storage.py + + This backend aims to add a GridFS storage to upload files to + using Django's file fields. + + For performance, the file hierarchy is represented as a tree of + MongoDB sub-collections. + + (One could use a flat list, but to list a directory '/this/path/' + we would have to execute a search over the whole collection and + then filter the results to exclude those not starting by + '/this/path' using that model.) + + :param location: + (optional) Name of the top-level node that holds the files. This + value of `location` is prepended to all file paths, so it works + like the `location` setting for Django's built-in + :class:`~django.core.files.storage.FileSystemStorage`. + :param collection: + Name of the collection the file tree shall be stored in. + Defaults to 'storage'. + :param database: + Alias of the Django database to use. Defaults to 'default' (the + default Django database). + :param base_url: + URL that serves the files in GridFS (for instance, through + nginx-gridfs). + Defaults to None (file not accessible through a URL). + """ + + def __init__(self, location='', collection='storage', database='default', + base_url=None): + self.location = location.strip(os.sep) + self.collection = collection + self.database = database + self.base_url = base_url + + if not self.collection: + raise ImproperlyConfigured("'collection' may not be empty.") + + if self.base_url and not self.base_url.endswith('/'): + raise ImproperlyConfigured("If set, 'base_url' must end with a " + "slash.") + + def _open(self, path, mode='rb'): + """ + Returns a :class:`~gridfs.GridOut` file opened in `mode`, or + raises :exc:`~gridfs.errors.NoFile` if the requested file + doesn't exist and mode is not 'w'. + """ + gridfs, filename = self._get_gridfs(path) + try: + return gridfs.get_last_version(filename) + except NoFile: + if 'w' in mode: + return gridfs.new_file(filename=filename) + else: + raise + + def _save(self, path, content): + """ + Saves `content` into the file at `path`. + """ + gridfs, filename = self._get_gridfs(path) + gridfs.put(content, filename=filename, contentType=content.content_type) + return path + + def delete(self, path): + """ + Deletes the file at `path` if it exists. + """ + gridfs, filename = self._get_gridfs(path) + try: + gridfs.delete(gridfs.get_last_version(filename=filename).__getattribute__('_id')) + except NoFile: + pass + + def exists(self, path): + """ + Returns `True` if the file at `path` exists in GridFS. + """ + gridfs, filename = self._get_gridfs(path) + return gridfs.exists(filename=filename) + + def listdir(self, path): + """ + Returns a tuple (folders, lists) that are contained in the + folder `path`. + """ + gridfs, filename = self._get_gridfs(path) + assert not filename + subcollections = _get_subcollections(gridfs.__getattribute__('__collection')) + return set(c.split('.')[-1] for c in subcollections), gridfs.list() + + def size(self, path): + """ + Returns the size of the file at `path`. + """ + gridfs, filename = self._get_gridfs(path) + return gridfs.get_last_version(filename=filename).length + + def url(self, name): + if self.base_url is None: + raise ValueError("This file is not accessible via a URL.") + gridfs, filename = self._get_gridfs(name) + try: + file_oid = gridfs.get_last_version(filename=filename).__getattr__('_id') + except NoFile: + # In case not found by filename + try: + # Check is a valid ObjectId + file_oid = ObjectId(name) + except (InvalidId, TypeError, ValueError): + return None + # Check if exist a file with that ObjectId + if not gridfs.exists(file_oid): + return None + return urljoin(self.base_url, filepath_to_uri(str(file_oid))) + + def created_time(self, path): + """ + Returns the datetime the file at `path` was created. + """ + gridfs, filename = self._get_gridfs(path) + return gridfs.get_last_version(filename=filename).upload_date + + def _get_gridfs(self, path): + """ + Returns a :class:`~gridfs.GridFS` using the sub-collection for + `path`. + """ + path, filename = os.path.split(path) + path = os.path.join(self.collection, self.location, path.strip(os.sep)) + collection_name = path.replace(os.sep, '.').strip('.') + + if not hasattr(self, '_db'): + from django.db import connections + self._db = connections[self.database].connection + + return GridFS(self._db, collection_name), filename + + def get_accessed_time(self, name): + pass + + def get_created_time(self, name): + pass + + def get_modified_time(self, name): + pass + + def path(self, name): + pass diff --git a/djongo/transaction.py b/djongo/transaction.py new file mode 100644 index 00000000..0ce03de5 --- /dev/null +++ b/djongo/transaction.py @@ -0,0 +1,5 @@ +from djongo.exceptions import NotSupportedError +from djongo import djongo_access_url + +print(f'This version of djongo does not support transactions. Visit {djongo_access_url}') +raise NotSupportedError('transactions') diff --git a/docs/404.html b/docs/404.html new file mode 100644 index 00000000..5ff368a1 --- /dev/null +++ b/docs/404.html @@ -0,0 +1,50 @@ + + + DjongoFE + + + + + + + +
+
+
+ +
+
+
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/docs/CNAME b/docs/CNAME new file mode 100644 index 00000000..84d83f3d --- /dev/null +++ b/docs/CNAME @@ -0,0 +1 @@ +www.djongomapper.com \ No newline at end of file diff --git a/docs/Gemfile b/docs/Gemfile new file mode 100644 index 00000000..a07c9c51 --- /dev/null +++ b/docs/Gemfile @@ -0,0 +1,11 @@ +source 'https://rubygems.org' + +# gem stripe +# run locally + gem 'github-pages', group: :jekyll_plugins + gem "jekyll-include-cache" + +# run server +# gem "minimal-mistakes-jekyll" +# gem "jekyll", "~> 3.5" +# gem 'wdm' diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index f543a8d1..00000000 --- a/docs/README.md +++ /dev/null @@ -1,265 +0,0 @@ -# Django and MongoDB database connector -Use Mongodb as a backend database for your django project, without changing a single django model!!! - -## Usage - -1. pip install djongo -2. Into settings.py file of your project, add: - - ```python - DATABASES = { - 'default': { - 'ENGINE': 'djongo', - 'NAME': 'your-db-name', - } - } - ``` - -3. Run `manage.py migrate` (ONLY the first time to create collections in mongoDB) -4. YOUR ARE SET! HAVE FUN! - -## Requirements - - 1. djongo requires python 3.5 or above. - - -## How it works - -djongo is a SQL to MongoDB query compiler. It translates a SQL query string into a [mongoDB query document](https://docs.mongodb.com/manual/tutorial/query-documents/). As a result, all Django features, models, etc., work as is. - -Django contrib modules: - -```python -'django.contrib.admin', -'django.contrib.auth', -'django.contrib.sessions', -``` -and others... fully supported. - -## Usage with Django - -Djongo connector for MongoDB ensures that you: - - * Reuse Django Models/ORM - * Work with the original Django variant - * Future proof your code - * Stop the immigrations - * Atomic SQL JOIN operations - -For a more detailed discussion on usage with Django check out [Integrating Django with MongoDB](/djongo/integrating-django-with-mongodb/) - -## Utilize MongoDB to the max - -### The Embedded Model - -SQL prevents the usage of embedded objects in your models without serialization. Not anymore. With mongoDB as your django backend, embed any other model into your parent model and save it as an [embedded document](https://docs.mongodb.com/manual/core/data-model-design/#data-modeling-embedding) into mongoDB - -Define the model to embed into parent model, like any Django model: - -```python -from djongo import models - -class BlogContent(models.Model): - comment = models.CharField(max_length=100) - author = models.CharField(max_length=100) - class Meta: - abstract = True -``` - -In case you dont plan on using your embedded model as a standalone model (which means it will always be embedded inside a parent model) you should add the `class Meta` and `abstract = True` as shown above. This way Djongo will never register this model as an [actual model](https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes). - -It is always a good practice to **make embedded models as abstract models** and this is **strongly recommended**. - -#### EmbeddedModelField - -Embed the above model inside the parent model by creating an `EmbeddedModelField`. The `EmbeddedModelField` is similar to other Django Fields (like the `CharField`.) - -```python -class EmbeddedModelField(Field): - def __init__(self, - model_container: typing.Type[Model], - model_form: typing.Optional[Type[forms.ModelForm]]=None, - model_form_kwargs: typing.Optional[dict]=None, - *args, **kwargs): -``` - -##### Parameters - - * `model_container: Type[models.Model]` The child model class type (not instance) that this embedded field will contain. - * `model_form: Optional[Type[models.forms.ModelForm]]` The child model form class type of the embedded model. - * `model_form_kwargs: Optional[dict]` The kwargs (if any) that must be passed to the embedded model form while instantiating it. - -##### Example - -```python -class BlogContentForm(forms.ModelForm): - class Meta: - model = BlogContent - fields = ( - 'comment', 'author' - ) - - -class BlogContent(models.Model): - comment = models.CharField(max_length=100) - author = models.CharField(max_length=100) - class Meta: - abstract = True - - -class BlogPost(models.Model): - h1 = models.CharField(max_length=100) - content = models.EmbeddedModelField( - model_container=BlogContent, - model_form=BlogContentForm - ) - - objects = models.DjongoManager() -``` - -### Embedded Array - -With MongoDB there can be an [array](https://docs.mongodb.com/manual/core/document/#arrays) of embedded documents inside the parent document. You can create an **embed array/list of models inside the parent model** and store it directly into MongoDB. - -Define the model to embed into parent model, like any Django model: - -```python -from djongo import models - -class BlogContent(models.Model): - comment = models.CharField(max_length=100) - author = models.CharField(max_length=100) - class Meta: - abstract = True -``` - -#### ArrayModelField -Create an array of the above child model inside the parent model by creating an `ArrayModelField`. The `ArrayModelField` is similar to other Django Fields (like the `CharField`.) - -```python -class ArrayModelField(Field): - def __init__(self, - model_container: typing.Type[Model], - model_form: typing.Type[forms.ModelForm]=None, - model_form_kwargs_l: dict=None, - *args, **kwargs): -``` - -##### Parameters - - * `model_container: Type[models.Model]` The child model class type (not instance) that this array field will contain. - * `model_form: Optional[Type[models.forms.ModelForm]]` The child model form class type of the array model. All child models inside the array must be of the same type. Mixing different types of child models inside the embedded array is not supported. - * `model_form_kwargs: Optional[dict]` The kwargs (if any) that must be passed to the embedded model form while instantiating it. - -##### Example - -```python -class BlogContentForm(forms.ModelForm): - class Meta: - model = BlogContent - fields = ( - 'comment', 'author' - ) - - -class BlogContent(models.Model): - comment = models.CharField(max_length=100) - author = models.CharField(max_length=100) - class Meta: - abstract = True - - -class BlogPost(models.Model): - h1 = models.CharField(max_length=100) - content = models.ArrayModelField( - model_container=BlogContent, - model_form=BlogContentForm - ) - - objects = models.DjongoManager() -``` - -### Embedded Form - -Embed multiple sub-forms, inside the parent form. Directly translate it into an embedded model and `.save()` it into mongoDB. No foreign key lookups necessary! - -

-Name:
-Address:
-    No:
-    Street:
-Phone:
-    Landline:
-    Mobile:
-
-
- -While creating a Form from a Model [the ModelForm](https://docs.djangoproject.com/en/dev/topics/forms/modelforms/) the embedded form **gets automatically generated** if the Model contains an embedded model inside it. - -Multiple embedded forms get automatically generated when the Model contains an array of embedded models. - -## Djongo Manager - The Djongo Manager extends the functionality of the usual [Django Manager](https://docs.djangoproject.com/en/dev/topics/db/managers/). Define your manager as Djongo Manager in the model. - - ```python -class BlogPost(models.Model): - h1 = models.CharField(max_length=100) - objects = models.DjongoManager() -``` - -Use it like the usual Django manager: - -```python -post = BlogPost.objects.get(pk=p_key) -``` - -Will [get a model object](https://docs.djangoproject.com/en/dev/topics/db/queries/#retrieving-a-single-object-with-get) having primary key `p_key`. - -### Direct pymongo access - -MongoDB has powerful query syntax and `DjongoManager` lets you exploit it fully. - -```python -class BlogView(DetailView): - - def get_object(self, queryset=None): - index = [i for i in BlogPost.objects.mongo_aggregate([ - { - '$match': { - 'title': self.kwargs['path'] - } - }, - { - '$project': { - '_id': 0, - } - } - ])] - - return index - -``` - -You can directly *access any [pymongo](https://api.mongodb.com/python/current/) command* by prefixing `mongo_` to the command name. Eg. to perform `aggregate` on the BlogPage collection (BlogPage is stored as a table in SQL or a collection in MongoDB) the function name becomes `mongo_aggregate`. To directly insert a document (instead of `.save()` a model) use `mongo_insert_one()` - -## Questions - -Any questions, suggestions for improvements, issues regarding the usage or to contribute to the package, please raise a git-hub issue ticket. - -## Contribute - -If you think djongo is useful, **please share it** with the world! Your endorsements and online reviews will help get more support for this project. - -You can contribute to the source code or the documentation by creating a simple pull request! You may want to refer to the design documentation to get an idea on how [Django MongoDB connector](https://nesdis.github.io/djongo/django-mongodb-connector-design-document/) is implemented. - - - diff --git a/docs/_config.yml b/docs/_config.yml index b8497135..0997924f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1,178 @@ -theme: jekyll-theme-leap-day \ No newline at end of file +remote_theme: "mmistakes/minimal-mistakes" + +#theme: minimal-mistakes-jekyll + +minimal_mistakes_skin : "default" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" + +# Site Settings +locale : "en-US" +title_separator : "-" +name : "Doableware AB" +title : "Djongo" +subtitle : "" +description : "Djongo is a smarter approach to database querying. It maps python objects to MongoDB documents. + It is popularly referred to as an Object Document Mapper or ODM. It is an extension to the traditional + Django object relational modeling framework. Use Django Admin to directly add and modify + documents stored in MongoDB. Use other contrib modules such as Auth and Sessions without any changes." +url : "https://www.djongomapper.com" +baseurl : "" +repository : "nesdis/djongo" +teaser : # path of fallback teaser image, e.g. "/assets/images/500x300.png" +# breadcrumbs : false # true, false (default) +logo : "/assets/images/djongo-symbol-small.png" +words_per_minute : 200 +comments: + provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "staticman_v2" "custom" + disqus: + shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname- + discourse: + server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org + facebook: + # https://developers.facebook.com/docs/plugins/comments + appid : + num_posts : # 5 (default) + colorscheme : # "light" (default), "dark" + +#footer: +# links: +# - label: By continuing to use this site, you consent to our use of cookies for tracking site usage. +# url: "/privacy-policy" + +# SEO Related +google_site_verification : "tFNu7Nc9hzKF9v7f6kYaoMbBCNyGREchcKMVdxJuyJo" +bing_site_verification : +yandex_site_verification : +naver_site_verification : + +# Analytics +analytics: + provider : "google-universal" # false (default), "google", "google-universal", "custom" + google: + tracking_id : "UA-75159067-1" + +#footer_scripts: +# - /assets/js/jquery.easing.min.js +# - /assets/js/jquery.touchSwipe.min.js +# - /assets/js/jquery.liquid-slider.min.js - "https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js" + +head_scripts: + - "https://js.stripe.com/v3/" + - "https://code.jquery.com/jquery-3.5.1.slim.min.js" + - "https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js" +# - "/assets/js/cookie-consent.js" + +# Reading Files +include: [_static, _sources] + +exclude: + - "*.sublime-project" + - "*.sublime-workspace" + - vendor + - .asset-cache + - .bundle + - .jekyll-assets-cache + - .sass-cache + - assets/js/plugins + - assets/js/_main.js + - assets/js/vendor + - Capfile + - CHANGELOG + - config + - Gemfile + - Gruntfile.js + - gulpfile.js + - LICENSE + - log + - node_modules + - package.json + - Rakefile + - README + - tmp + +keep_files: + - .git + - .svn + + +encoding: "utf-8" +markdown_ext: "markdown,mkdown,mkdn,mkd,md" + + +# Conversion +markdown: kramdown +highlighter: rouge +lsi: false +excerpt_separator: "\n\n" +incremental: false + + +# Markdown Processing +kramdown: + input: GFM + hard_wrap: false + auto_ids: true + footnote_nr: 1 + entity_output: as_char + toc_levels: 1..6 + smart_quotes: lsquo,rsquo,ldquo,rdquo + enable_coderay: false + + +# Sass/SCSS +sass: + sass_dir: _sass + style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style + + +# Outputting +#permalink: /:categories/:title/ +#paginate_path: /blog/page:num/ +#paginate: 5 # amount of posts to show +timezone: # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones + + +# Plugins (previously gems:) +plugins: +# - jekyll-paginate + - jekyll-sitemap + - jekyll-gist + - jemoji + - jekyll-include-cache + - jekyll-redirect-from + +# mimic GitHub Pages with --safe +whitelist: +# - jekyll-paginate + - jekyll-sitemap + - jekyll-gist + - jemoji + + +# HTML Compression +# - http://jch.penibelst.de/ +compress_html: + clippings: all + ignore: + envs: development + +# Defaults +defaults: + - scope: + path: "docs" + type: pages + values: + notice: + not_ready: "Parts of this feature are still under development.\n{: .notice--warning}" + _support: "If you are an enterprise that uses Djongo in your products, contact us for long term support and [licensing options](/support/).\n{: .notice--danger}" + not_standard: "Features under development in this section come preinstalled on DjongoCS. Visit the [support page](/support/) for more information.\n{: .notice--danger}" + layout: single + read_time: false + author_profile: false + share: false + comments: false + toc: true + toc_sticky: false + debug: false + sidebar: + nav: "docs" + diff --git a/docs/_data/home.yml b/docs/_data/home.yml new file mode 100644 index 00000000..f92cada1 --- /dev/null +++ b/docs/_data/home.yml @@ -0,0 +1,87 @@ +punchline: + - excerpt: Django App Hosting for MongoDB and SQL Databases + +first_row: + + - image_path: /assets/images/home/query-green-own.png + alt: "Simplify Query Creation" + title: "Simplify Query Creation" + excerpt: "Writing query documents can get out of control. Djongo does the heavy lifting of creating query documents for you." + url: "#query-creation" + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-query" + + - image_path: /assets/images/home/noSql.png + alt: "SQL <> No SQL" + title: "SQL <=> No SQL" + excerpt: "Switch between MongoDB and other SQL databases. Limit the impact to your Models and business logic." + url: "/integrating-django-with-mongodb/#how-it-works" + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-no-sql" + + - image_path: /assets/images/home/security-green.png + alt: "Security" + title: "Security" + excerpt: "Directly saving raw `JSON` into the database is scary. Djongo secures and validates the `JSON` document before saving." + url: "#security-and-integrity-checks" + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-security" + + - image_path: /assets/images/home/support-new.png + alt: "Support" + title: "Support" + excerpt: "Phone, Chat and Email support. Including commercial licensing for enterprises." + url: /support/ + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-support" + + - image_path: /assets/images/home/rapid.png + alt: "Rapid Prototyping" + title: "Rapid Prototyping" + excerpt: "Speed up app development and execution with schema free models. Enforce levels of + schema protection with data evolution." + url: "#rapid-prototyping" + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-rapid-prototyping" + + - image_path: /assets/images/home/webpage.png + alt: "Web Interface" + title: "Web Interface" + excerpt: "Access and modify MongoDB through the web browser." + url: /integrating-django-with-mongodb/#use-django-admin-to-add-documents + btn_label: "More" + btn_class: "btn--primary" + btn_id: "btn-webpage" + + - image_path: /assets/images/home/third-party-thin.png + alt: "Admin MongoDB" + title: "Third Party Packages" + excerpt: "Modules that help interface your MongoDB data with other popular packages." + hidden: true + +djongonxt_row: + - image_path: /assets/images/home/djongo-Nxt-v1.png + alt: "Djongo Next" + title: "Djongo Next" + excerpt: "The advanced modeling framework. Ships with extra features for professional usage." + url: /support/ + btn_label: "Learn More" + btn_class: "btn--primary" + + +advert_row: + - image_path: /assets/images/home/e2e.png + alt: "Admin MongoDB" + image_link: http://www.e2eprojects.com/ + + - image_path: /assets/images/white.jpg + alt: "Admin MongoDB" + + - image_path: /assets/images/home/sumeru.png + alt: "Admin MongoDB" + image_link: https://www.sumerusolutions.com/ diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml new file mode 100644 index 00000000..d7424a66 --- /dev/null +++ b/docs/_data/navigation.yml @@ -0,0 +1,67 @@ +# main links +main: + - title: "Create Account" + url: /djongocs/create-account/ + id: 'nav-create-account' + - title: "DjongoCS" + url: /djongocs/login/ + id: 'nav-login' + - title: "Docs" + url: /get-started/ + id: 'nav-docs' + +# - title: "Source" +# url: https://github.com/doableware/djongo + +docs: + - title: "Djongo" + children: + - title: "Get Started" + url: /get-started/ + - title: "Django with MongoDB" + url: /integrating-django-with-mongodb/ + - title: "Embedded Field" + url: /using-django-with-mongodb-data-fields/ + - title: "Array Field" + url: /using-django-with-mongodb-array-field/ + - title: "Array Reference Field" + url: /using-django-with-mongodb-array-reference-field/ + - title: "Other fields" + url: /using-django-with-other-fields/ + + - title: "DjongoCS" +# url: /djongonxt/ + children: + - title: "Indexes" + url: /indexes/ + - title: "Model Query" + url: /model-query/ + - title: "Model Creation" + url: /model-creation/ + - title: "Model Update" + url: /model-update/ + - title: "Database Transactions" + url: /database-transactions/ +# - title: "Aggregation" +# url: /djongonxt-aggregation/ +# - title: "Contact" +# url: /djongonxt-more-info/ + + - title: "Side stuff" + children: + - title: "Djongo vs Others" + url: /djongo-comparison/ + - title: "Djongo Design" + url: /django-mongodb-connector-design-document/ +# - title: "Roadmap" +# url: /roadmap/ + +# - title: "Donate" +# url: /donate/ +# thumbnail: /assets/images/heart.png + +server: + - title: "Info" + url: /djongocs/ + - title: "Control" + url: /djongocs/control \ No newline at end of file diff --git a/docs/_data/server.yml b/docs/_data/server.yml new file mode 100644 index 00000000..5282f46c --- /dev/null +++ b/docs/_data/server.yml @@ -0,0 +1,31 @@ +forms: + login: + subject: server-login + next: "/support/request-success" + classes: + - form--splash + fields: + - type: input + label: "User Name" + attr: + type: text + name: userName + required: '' + autocomplete: username + title: 'Only alphanumeric characters' + pattern: '[a-z0-9]{4,8}' + + - type: input + label: "Password" + attr: + type: password + name: password + required: '' + autocomplete: current-password + + - type: input + attr: + type: submit + value: Login + class: "btn btn--primary btn--large" + diff --git a/docs/_data/support/forms.yaml b/docs/_data/support/forms.yaml new file mode 100644 index 00000000..05889983 --- /dev/null +++ b/docs/_data/support/forms.yaml @@ -0,0 +1,143 @@ +# contact form is not used +webserver: + fields: + - type: input + label: "User Name" + attr: + type: text + name: userName + required: '' + autocomplete: username + title: 'Alphanumeric characters: min 4, max 8' + pattern: '[a-z0-9]{4,8}' + + - type: input + label: "Password" + attr: + type: password + name: password + required: '' + autocomplete: new-password + + - type: input + label: "Confirm Password" + attr: + type: password + name: confirmPassword + required: '' + autocomplete: new-password + + - type: input + label: "Email" + attr: + type: email + name: email + placeholder: "name@org.com" + required: '' + autocomplete: email + + - type: input + attr: + type: submit + value: Create Account + class: "btn btn--primary btn--large" + +contact: + subject: support-page + next: "/support/request-success" + classes: + - form--splash + fields: + - type: select + label: "Subject:" + name: Subject + options: + - Commercial License + - Cancel Subscription + + - type: input + label: "Name or Organization:" + attr: + type: text + name: Name + + - type: input + label: "Email:" + attr: + type: email + name: Email + placeholder: "name@org.com" + required: '' + + - type: input + attr: + type: submit + value: Send + class: "btn btn--primary btn--large" + +enterprise: + subject: Enterprise + next: "/support/request-success" + classes: + - fx-form + fields: + - type: input + label: "Full Name:" + attr: + type: text + name: Name + required: '' + + - type: input + label: "Organization:" + attr: + type: text + name: Organization + required: '' + + - type: input + label: "Email:" + attr: + type: email + name: Email + placeholder: "name@org.com" + required: '' + + - type: input + attr: + type: submit + value: Enquire + class: "btn btn--primary btn--large" + +discuss: + subject: "Message" + next: "/support/request-success" + classes: + - fx-form + fields: + - type: input + label: "Full Name:" + attr: + type: text + name: Name + required: '' + + - type: input + label: "Email:" + attr: + type: email + name: Email + placeholder: "name@org.com" + required: '' + + - type: textarea + label: "Message:" + name: Message + required: true + + - type: input + attr: + type: submit + value: Send + class: "btn btn--primary btn--large" + diff --git a/docs/_data/support/tire_column.yml b/docs/_data/support/tire_column.yml new file mode 100644 index 00000000..00960ff3 --- /dev/null +++ b/docs/_data/support/tire_column.yml @@ -0,0 +1,88 @@ +form: + classes: + - tire-item__form + subject: Enterprise + next: "/support/request-success" + fields: + - type: submit + value: Enquire + + - type: text + name: Name + label: "Organization:" + required: true + + - type: email + name: Email + label: "Email:" + placeholder: "name@org.com" + required: true + +tires: + - title: DjongoCS + price: 15 + url: /djongocs/create-account/ + benefits: + - Full featured DjongoCS package. + - Preconfigured virtual machine instance. + - Public endpoint over Https. + - Upgradeable instance. + - Email support. + - Cancel anytime. + + - title: Basic Support + price: 59 + url: /support/contact/discord-support/ + benefits: + - Includes DjongoCS + - Access to the *priority discussion board* on Discord. + - Resolution time within 2 - 4 weeks. + + - title: Premium Support + price: 149 + per_hour: true + url: /support/contact/book-a-debug/ + benefits: + - Includes DjongoCS + - Issue resolved within the next day. + - Email support. + + - title: A Sweet Tip + price: 4 + btn_id: price_4 + price_id: price_1HIKi6LbyDBUaJVj7FvgB3gx + benefits: + - You use Djongo and you LOVE IT. + - You want to tip the project! Thanks! + invisible: true + + - title: Q&A + price: 4 + btn_id: price_4 + price_id: price_1HIKi6LbyDBUaJVj7FvgB3gx + benefits: + - Your questions are answered as soon as possible. + - You support the long term sustainability of the project. + invisible: true + + - title: A Sweet Tip + price: 3 + btn_id: price_3 + price_id: price_1HIKfSLbyDBUaJVjuc3i3YEW + benefits: + - You use Djongo and you LOVE IT. + - You want to tip the project! Thanks! + invisible: true + + - title: Advertise on Djongo + price: 50 + btn_id: price_50 + price_id: price_1HHwbOLbyDBUaJVjYnDESotB + benefits: + - Your name or company logo will be displayed on the home page. + - Your feature requests and support queries to be given top priority. + invisible: true + +disclaimer: + - Subscriptions are not binding and can be canceled any time. + - Upon successful checkout you requested to submit additional details required to deliver your benefits. diff --git a/docs/_data/support/tire_form.yml b/docs/_data/support/tire_form.yml new file mode 100644 index 00000000..8b2c31af --- /dev/null +++ b/docs/_data/support/tire_form.yml @@ -0,0 +1,43 @@ +default: + fields: + - type: input + label: "First Name:" + attr: + type: text + name: firstName + required: '' + + - type: input + label: "Last Name:" + attr: + type: text + name: lastName + required: '' + + - type: input + label: "Email:" + attr: + type: email + name: email + placeholder: "name@org.com" + required: '' + + - type: input + label: "GitHub User Name:" + attr: + type: text + name: githubUserName + required: '' + + - type: input + label: "Organization:" + attr: + type: text + name: organization + required: '' + + - type: input + attr: + type: submit + value: Apply + class: "btn btn--primary btn--large" diff --git a/docs/_data/ui-text.yml b/docs/_data/ui-text.yml new file mode 100644 index 00000000..d6932ced --- /dev/null +++ b/docs/_data/ui-text.yml @@ -0,0 +1,983 @@ +# User interface text and labels + +# English (default) +# ----------------- +en: &DEFAULT_EN + page : "Page" + pagination_previous : "Previous" + pagination_next : "Next" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Toggle Menu" + toc_label : "On This Page" + ext_link_label : "Direct Link" + less_than : "less than" + minute_read : "minute read" + share_on_label : "Share on" + meta_label : + tags_label : "Tags:" + categories_label : "Categories:" + date_label : "Updated:" + comments_label : "Leave a Comment" + comments_title : "Comments" + more_label : "Learn More" + related_label : "You May Also Enjoy" +# follow_label : "Follow:" +# feed_label : "" + powered_by : "Powered by" + website_label : "Website" + email_label : "Email" + recent_posts : "Recent Posts" + undefined_wpm : "Undefined parameter words_per_minute at _config.yml" + comment_form_info : "Your email address will not be published. Required fields are marked" + comment_form_comment_label : "Comment" + comment_form_md_info : "Markdown is supported." + comment_form_name_label : "Name" + comment_form_email_label : "Email address" + comment_form_website_label : "Website (optional)" + comment_btn_submit : "Submit Comment" + comment_btn_submitted : "Submitted" + comment_success_msg : "Thanks for your comment! It will show on the site once it has been approved." + comment_error_msg : "Sorry, there was an error with your submission. Please make sure all required fields have been completed and try again." + loading_label : "Loading..." + search_placeholder_text : "Enter your search term..." + results_found : "Result(s) found" +en-US: + <<: *DEFAULT_EN +en-CA: + <<: *DEFAULT_EN +en-GB: + <<: *DEFAULT_EN +en-AU: + <<: *DEFAULT_EN + +# Spanish +# -------------- +es: &DEFAULT_ES + page : "Página" + pagination_previous : "Anterior" + pagination_next : "Siguiente" + breadcrumb_home_label : "Inicio" + breadcrumb_separator : "/" + menu_label : + toc_label : "Contenidos" + ext_link_label : "Enlace" + less_than : "menos de" + minute_read : "minuto de lectura" + share_on_label : "Compartir" + meta_label : + tags_label : "Etiquetas:" + categories_label : "Categorías:" + date_label : "Actualizado:" + comments_label : "Comentar" + comments_title : + more_label : "Ver más" + related_label : "Podrías ver también" + follow_label : "Seguir:" + feed_label : "Feed" + powered_by : "Powered by" + website_label : "Sitio web" + email_label : "Email" + recent_posts : "Entradas recientes" + undefined_wpm : "Parametro words_per_minute (Palabras por minuto) no definido en _config.yml" + comment_form_info : "Su dirección de correo no será publicada. Se han resaltado los campos requeridos" + comment_form_comment_label : "Comentario" + comment_form_md_info : "Markdown está soportado." + comment_form_name_label : "Nombre" + comment_form_email_label : "Dirección de E-mail" + comment_form_website_label : "Sitio web (opcional)" + comment_btn_submit : "Enviar Commentario" + comment_btn_submitted : "Enviado" + comment_success_msg : "Gracias por su comentario!, Este se visualizará en el sitio una vez haya sido aprobado" + comment_error_msg : "Lo sentimos, ha ocurrido un error al enviar su comentario. Por favor asegurese que todos los campos han sido diligenciados e intente de nuevo" + loading_label : "Cargando..." +es-ES: + <<: *DEFAULT_ES +es-CO: + <<: *DEFAULT_ES + +# French +# ----------------- +fr: &DEFAULT_FR + page : "Page" + pagination_previous : "Précédent" + pagination_next : "Suivant" + breadcrumb_home_label : "Accueil" + breadcrumb_separator : "/" + menu_label : + toc_label : "Sur cette page" + ext_link_label : "Lien direct" + less_than : "moins de" + minute_read : "minute de lecture" + share_on_label : "Partager sur" + meta_label : + tags_label : "Tags :" + categories_label : "Catégories :" + date_label : "Mis à jour :" + comments_label : "Laisser un commentaire" + comments_title : + more_label : "Lire plus" + related_label : "Vous pourriez aimer aussi" + follow_label : "Contact" + feed_label : "Flux" + powered_by : "Propulsé par" + website_label : "Site" + email_label : "Email" + recent_posts : "Posts récents" + undefined_wpm : "Le paramètre words_per_minute n'est pas défini dans _config.yml" + comments_title : "Commentaires" + comment_form_info : "Votre adresse email ne sera pas visible. Les champs obligatoires sont marqués" + comment_form_comment_label : "Commentaire" + comment_form_md_info : "Markdown est supporté." + comment_form_name_label : "Nom" + comment_form_email_label : "Adresse mail" + comment_form_website_label : "Site web (optionnel)" + comment_btn_submit : "Envoyer" + comment_btn_submitted : "Envoyé" + comment_success_msg : "Merci pour votre commentaire, il sera visible sur le site une fois approuvé." + comment_error_msg : "Désolé, une erreur est survenue lors de la soumission. Vérifiez que les champs obligatoires ont été remplis et réessayez." + loading_label : "Chargement..." +fr-FR: + <<: *DEFAULT_FR +fr-BE: + <<: *DEFAULT_FR +fr-CH: + <<: *DEFAULT_FR + +# Turkish +# ----------------- +tr: &DEFAULT_TR + page : "Sayfa" + pagination_previous : "Önceki" + pagination_next : "Sonraki" + breadcrumb_home_label : "Ana Sayfa" + breadcrumb_separator : "/" + menu_label : + toc_label : "İçindekiler" + ext_link_label : "DoÄŸrudan BaÄŸlantı" + less_than : "Åžu süreden az: " + minute_read : "dakika tahmini okuma süresi" + share_on_label : "PaylaÅŸ" + meta_label : + tags_label : "Etiketler:" + categories_label : "Kategoriler:" + date_label : "Güncelleme tarihi:" + comments_label : "Yorum yapın" + comments_title : "Yorumlar" + more_label : "Daha fazlasını öğrenin" + related_label : "Bunlar ilginizi çekebilir:" + follow_label : "Takip et:" + feed_label : "RSS" + powered_by : "EmeÄŸi geçenler: " + website_label : "Web sayfası" + email_label : "E-posta" + recent_posts : "Son yazılar" + undefined_wpm : "_config.yml dosyasında tanımlanmamış words_per_minute parametresi" + comment_form_info : "Email adresiniz gösterilmeyecektir. Zorunlu alanlar iÅŸaretlenmiÅŸtir" + comment_form_comment_label : "Yorumunuz" + comment_form_md_info : "Markdown desteklenmektedir." + comment_form_name_label : "Adınız" + comment_form_email_label : "Email adresiniz" + comment_form_website_label : "Websiteniz (opsiyonel)" + comment_btn_submit : "Yorum Yap" + comment_btn_submitted : "Gönderildi" + comment_success_msg : "Yorumunuz için teÅŸekkürler! Yorumunuz onaylandıktan sonra sitede gösterilecektir." + comment_error_msg : "Maalesef bir hata oluÅŸtu. Lütfen zorunlu olan tüm alanları doldurduÄŸunuzdan emin olun ve sonrasında tekrar deneyin." + loading_label : "Yükleniyor..." +tr-TR: + <<: *DEFAULT_TR + +# Portuguese +pt: &DEFAULT_PT + page : "Página" + pagination_previous : "Anterior" + pagination_next : "Seguinte" + breadcrumb_home_label : "Início" + breadcrumb_separator : "/" + menu_label : + toc_label : "Nesta Página" + ext_link_label : "Link Direto" + less_than : "menos de" + minute_read : "minutos de leitura" + share_on_label : "Partilhar no" + meta_label : + tags_label : "Etiquetas:" + categories_label : "Categorias:" + date_label : "Atualizado:" + comments_label : "Deixe um Comentário" + comments_title : "Comentários" + more_label : "Saber mais" + related_label : "Também pode gostar de" + follow_label : "Siga:" + feed_label : "Feed" + powered_by : "Feito com" + website_label : "Site" + email_label : "Email" + recent_posts : "Artigos Recentes" + undefined_wpm : "Parâmetro words_per_minute não definido em _config.yml" + comment_form_info : "O seu endereço email não será publicado. Os campos obrigatórios estão assinalados" + comment_form_comment_label : "Comentário" + comment_form_md_info : "Markdown é suportado." + comment_form_name_label : "Nome" + comment_form_email_label : "Endereço Email" + comment_form_website_label : "Site (opcional)" + comment_btn_submit : "Sumbeter Comentário" + comment_btn_submitted : "Submetido" + comment_success_msg : "Obrigado pelo seu comentário! Será visível no site logo que aprovado." + comment_error_msg : "Lamento, ocorreu um erro na sua submissão. Por favor verifique se todos os campos obrigatórios estão corretamente preenchidos e tente novamente." + loading_label : "A carregar..." +pt-PT: + <<: *DEFAULT_PT + +# Brazilian Portuguese +pt-BR: + page : "Página" + pagination_previous : "Anterior" + pagination_next : "Próxima" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : + toc_label : "Nesta página" + ext_link_label : "Link direto" + less_than : "menos que" + minute_read : "minuto(s) de leitura" + share_on_label : "Compartilhe em" + meta_label : + tags_label : "Tags:" + categories_label : "Categorias:" + date_label : "Atualizado em:" + comments_label : "Deixe um comentário" + comments_title : + more_label : "Aprenda mais" + related_label : "Talvez você goste também" + follow_label : "Acompanhe em" + feed_label : "Feed" + powered_by : "Feito com" + website_label : "Site" + email_label : "Email" + recent_posts : "Postagens recentes" + undefined_wpm : "Parâmetro indefinido em words_per_minute no _config.yml" + comment_form_info : "Seu email não será publicado. Os campos obrigatórios estão marcados" + comment_form_comment_label : "Comentário" + comment_form_md_info : "Markdown é suportado." + comment_form_name_label : "Nome" + comment_form_email_label : "Email" + comment_form_website_label : "Site (opcional)" + comment_btn_submit : "Enviar Comentário" + comment_btn_submitted : "Enviado" + comment_success_msg : "Obrigado pelo seu comentário! Ele aparecerá no site assim que for aprovado." + comment_error_msg : "Desculpe, ocorreu um erro no envio. Por favor verifique se todos os campos obrigatórios foram preenchidos e tente novamente." + loading_label : "Carregando..." + +# Italian +# ----------------- +it: &DEFAULT_IT + page : "Pagina" + pagination_previous : "Precedente" + pagination_next : "Prossima" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : + toc_label : "Indice della pagina" + ext_link_label : "Link" + less_than : "meno di" + minute_read : "minuto/i di lettura" + share_on_label : "Condividi" + meta_label : + tags_label : "Tags:" + categories_label : "Categorie:" + date_label : "Aggiornato:" + comments_label : "Scrivi un commento" + comments_title : + more_label : "Scopri di più" + related_label : "Potrebbe Piacerti Anche" + follow_label : "Segui:" + feed_label : "Feed" + powered_by : "Powered by" + website_label : "Website" + email_label : "Email" + recent_posts : "Articoli Recenti" + undefined_wpm : "Parametro words_per_minute non definito in _config.yml" + comment_form_info : "Il tuo indirizzo email non sarà pubblicato. Sono segnati i campi obbligatori" + comment_form_comment_label : "Commenta" + comment_form_md_info : "Il linguaggio Markdown è supportato" + comment_form_name_label : "Nome" + comment_form_email_label : "Indirizzo email" + comment_form_website_label : "Sito Web (opzionale)" + comment_btn_submit : "Invia commento" + comment_btn_submitted : "Inviato" + comment_success_msg : "Grazie per il tuo commento! Verrà visualizzato nel sito una volta che sarà approvato." + comment_error_msg : "C'è stato un errore con il tuo invio. Assicurati che tutti i campi richiesti siano stati completati e riprova." + loading_label : "Caricamento..." +it-IT: + <<: *DEFAULT_IT + +# Chinese (zh-CN Chinese - China) +# ----------------- +zh: &DEFAULT_ZH_HANS + page : "页é¢" + pagination_previous : "å‘å‰" + pagination_next : "å‘åŽ" + breadcrumb_home_label : "首页" + breadcrumb_separator : "/" + menu_label : "切æ¢èœå•" + toc_label : "在本页上" + ext_link_label : "直接链接" + less_than : "少于" + minute_read : "分钟读完" + share_on_label : "分享" + meta_label : + tags_label : "标签:" + categories_label : "分类:" + date_label : "æ›´æ–°æ—¶é—´:" + comments_label : "留下评论" + comments_title : "评论" + more_label : "了解更多" + related_label : "猜您还喜欢" + follow_label : "关注:" + feed_label : "Feed" + powered_by : "技术æ¥è‡ªäºŽ" + website_label : "网站" + email_label : "电å­é‚®ç®±" + recent_posts : "最新文章" + undefined_wpm : "_config.ymlé…置中words_per_minute字段未定义" + comment_form_info : "您的电å­é‚®ç®±åœ°å€å¹¶ä¸ä¼šè¢«å±•示。请填写标记为必须的字段。" + comment_form_comment_label : "评论" + comment_form_md_info : "Markdown语法已支æŒã€‚" + comment_form_name_label : "å§“å" + comment_form_email_label : "电å­é‚®ç®±" + comment_form_website_label : "网站(å¯é€‰ï¼‰" + comment_btn_submit : "æäº¤è¯„论" + comment_btn_submitted : "å·²æäº¤" + comment_success_msg : "感谢您的评论ï¼è¢«æ‰¹å‡†åŽå®ƒä¼šç«‹å³åœ¨æ­¤ç«™ç‚¹å±•示。" + comment_error_msg : "很抱歉,您的æäº¤å­˜åœ¨é”™è¯¯ã€‚è¯·ç¡®ä¿æ‰€æœ‰å¿…填字段都已填写正确,然åŽå†è¯•一次。" + loading_label : "正在加载..." +zh-CN: + <<: *DEFAULT_ZH_HANS +zh-SG: + <<: *DEFAULT_ZH_HANS +# Taiwan (Traditional Chinese) +zh-TW: &DEFAULT_ZH_HANT + page : "é é¢" + pagination_previous : "較舊" + pagination_next : "較新" + breadcrumb_home_label : "首é " + breadcrumb_separator : "/" + menu_label : "切æ›é¸å–®" + toc_label : "本é " + ext_link_label : "外部連çµ" + less_than : "å°‘æ–¼" + minute_read : "分é˜é–±è®€" + share_on_label : "分享到" + meta_label : + tags_label : "標籤:" + categories_label : "分類:" + date_label : "更新時間:" + comments_label : "留言" + comments_title : "留言內容" + more_label : "了解更多" + related_label : "猜您有與趣" + follow_label : "追蹤:" + feed_label : "RSS Feed" + powered_by : "Powered by" + website_label : "網站" + email_label : "é›»å­ä¿¡ç®±" + recent_posts : "最新文章" + undefined_wpm : "_config.yml 中未定義 words_per_minute" + comment_form_info : "您的電å­ä¿¡ç®±ä¸æœƒè¢«å…¬é–‹. 必填部份已標記" + comment_form_comment_label : "留言內容" + comment_form_md_info : "支æ´Markdown語法。" + comment_form_name_label : "åå­—" + comment_form_email_label : "é›»å­ä¿¡ç®±å¸³è™Ÿ" + comment_form_website_label : "ç¶²é  (å¯é¸å¡«)" + comment_btn_submit : "é€å‡ºç•™è¨€" + comment_btn_submitted : "å·²é€å‡º" + comment_success_msg : "æ„Ÿè¬æ‚¨çš„ç•™è¨€ï¼ å¯©æ ¸å¾Œå°‡æœƒé¡¯ç¤ºåœ¨ç«™ä¸Šã€‚" + comment_error_msg : "抱歉,部份資料輸入有å•題。請確èªè³‡æ–™å¡«å¯«æ­£ç¢ºå¾Œå†è©¦ä¸€æ¬¡ã€‚" + loading_label : "載入中..." +zh-HK: + <<: *DEFAULT_ZH_HANT +# German / Deutsch +# ----------------- +de: &DEFAULT_DE + page : "Seite" + pagination_previous : "Vorherige" + pagination_next : "Nächste" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : + toc_label : "Auf dieser Seite" + ext_link_label : "Direkter Link" + less_than : "weniger als" + minute_read : "Minuten zum lesen" + share_on_label : "Teilen auf" + meta_label : + tags_label : "Tags:" + categories_label : "Kategorien:" + date_label : "Aktualisiert:" + comments_label : "Hinterlassen sie einen Kommentar" + comments_title : "Kommentare" + more_label : "Mehr anzeigen" + related_label : "Ihnen gefällt vielleicht auch" + follow_label : "Folgen:" + feed_label : "Feed" + powered_by : "Powered by" + website_label : "Webseite" + email_label : "E-Mail" + recent_posts : "Aktuelle Beiträge" + undefined_wpm : "Undefinierter Parameter words_per_minute in _config.yml" + comment_form_info : "Ihre E-Mail Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert" + comment_form_comment_label : "Kommentar" + comment_form_md_info : "Markdown wird unterstützt." + comment_form_name_label : "Name" + comment_form_email_label : "E-Mail Addresse" + comment_form_website_label : "Webseite (optional)" + comment_btn_submit : "Kommentar absenden" + comment_btn_submitted : "Versendet" + comment_success_msg : "Danke für ihren Kommentar! Er wird auf der Seite angezeigt, nachdem er geprüft wurde." + comment_error_msg : "Entschuldigung, es gab einen Fehler. Bitte füllen sie alle benötigten Felder aus und versuchen sie es erneut." + loading_label : "Lade..." +de-DE: + <<: *DEFAULT_DE +de-AT: + <<: *DEFAULT_DE +de-CH: + <<: *DEFAULT_DE +de-BE: + <<: *DEFAULT_DE +de-LI: + <<: *DEFAULT_DE +de-LU: + <<: *DEFAULT_DE + +# Nepali (Nepal) +# ----------------- +ne: &DEFAULT_NE + page : "पृषà¥â€à¤ " + pagination_previous : "अघिलà¥à¤²à¥‹" + pagination_next : "अरà¥à¤•ो" + breadcrumb_home_label : "गृह" + breadcrumb_separator : "/" + menu_label : "टगल मेनà¥" + toc_label : "यो पृषà¥â€à¤ à¤®à¤¾" + ext_link_label : "सिधा समà¥à¤ªà¤°à¥à¤•" + less_than : "कमà¥à¤¤à¤¿à¤®à¤¾" + minute_read : "मिनेट पढà¥à¤¨à¥à¤¹à¥‹à¤¸à¥" + share_on_label : "शेयर गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥" + meta_label : + tags_label : "टà¥à¤¯à¤¾à¤—हरू:" + categories_label : "वरà¥à¤—हरà¥:" + date_label : "अदà¥à¤¯à¤¾à¤µà¤§à¤¿à¤•:" + comments_label : "टिपà¥à¤ªà¤£à¥€ दिनà¥à¤¹à¥‹à¤¸à¥" + comments_title : "टिपà¥à¤ªà¤£à¥€à¤¹à¤°à¥‚" + more_label : "अà¤à¥ˆ सिकà¥à¤¨à¥à¤¹à¥‹à¤¸à¥" + related_label : "तपाईं रà¥à¤šà¤¾à¤‰à¤¨ सकà¥à¤¨à¥à¤¹à¥à¤¨à¥à¤› " + follow_label : "पछà¥à¤¯à¤¾à¤‰à¤¨à¥à¤¹à¥‹à¤¸à¥:" + feed_label : "फिड" + powered_by : "Powered by" + website_label : "वेबसाइट" + email_label : "इमेल" + recent_posts : "ताजा लेखहरà¥" + undefined_wpm : "अपरिभाषित पà¥à¤¯à¤¾à¤°à¤¾à¤®à¤¿à¤Ÿà¤° शबà¥à¤¦à¤¹à¤°à¥‚_पà¥à¤°à¤¤à¤¿_मिनेट at _config.yml" + comment_form_info : "तपाइà¤à¤•ो इमेल ठेगाना पà¥à¤°à¤•ाशित गरिने छैन।आवशà¥à¤¯à¤• जानकारीहरà¥à¤®à¤¾ चिनà¥à¤¹ लगाइको छ" + comment_form_comment_label : "टिपà¥à¤ªà¤£à¥€" + comment_form_md_info : "मारà¥à¤•डाउन समरà¥à¤¥à¤¿à¤¤ छ।" + comment_form_name_label : "नाम" + comment_form_email_label : "इमेल ठेगाना" + comment_form_website_label : "वेबसाइट (वैकलà¥à¤ªà¤¿à¤•)" + comment_btn_submit : "टिपà¥à¤ªà¤£à¥€ दिनà¥à¤¹à¥‹à¤¸à¥ " + comment_btn_submitted : "टिपà¥à¤ªà¤£à¥€ भयो" + comment_success_msg : "तपाईंको टिपà¥à¤ªà¤£à¥€à¤•ो लागि धनà¥à¤¯à¤µà¤¾à¤¦! à¤à¤• पटक यो अनà¥à¤®à¥‹à¤¦à¤¨ गरेपछी यो साइटमा देखाउनेछ।" + comment_error_msg : "माफ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥, तपाईंको टिपà¥à¤ªà¤£à¥€ तà¥à¤°à¥à¤Ÿà¤¿ थियो।सबै आवशà¥à¤¯à¤• जानकारीहरॠपूरा गरिà¤à¤•ो छ भने निशà¥à¤šà¤¿à¤¤ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥ र फेरि पà¥à¤°à¤¯à¤¾à¤¸ गरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤" + loading_label : "लोड हà¥à¤à¤¦à¥ˆà¤› ..." +ne-NP: + <<: *DEFAULT_NE + +# Korean +# -------------- +ko: &DEFAULT_KO + page : "페ì´ì§€" + pagination_previous : "ì´ì „" + pagination_next : "다ìŒ" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "토글 메뉴" + toc_label : "On This Page" + ext_link_label : "ì§ì ‘ ë§í¬" + less_than : "최대" + minute_read : "ë¶„ 소요" + share_on_label : "공유하기" + meta_label : + tags_label : "태그:" + categories_label : "카테고리:" + date_label : "ì—…ë°ì´íЏ:" + comments_label : "댓글남기기" + comments_title : "댓글" + more_label : "ë” ë³´ê¸°" + related_label : "참고" + follow_label : "팔로우:" + feed_label : "피드" + powered_by : "Powered by" + website_label : "웹사ì´íЏ" + email_label : "ì´ë©”ì¼" + recent_posts : "최근 í¬ìŠ¤íŠ¸" + undefined_wpm : "Undefined parameter words_per_minute at _config.yml" + comment_form_info : "ì´ë©”ì¼ì€ 공개ë˜ì§€ 않습니다. 작성 í•„ìš” 필드:" + comment_form_comment_label : "댓글" + comment_form_md_info : "마í¬ë‹¤ìš´ì„ ì§€ì›í•©ë‹ˆë‹¤." + comment_form_name_label : "ì´ë¦„" + comment_form_email_label : "ì´ë©”ì¼" + comment_form_website_label : "웹사ì´íЏ(ì„ íƒì‚¬í•­)" + comment_btn_submit : "댓글 등ë¡" + comment_btn_submitted : "등ë¡ë¨" + comment_success_msg : "ê°ì‚¬í•©ë‹ˆë‹¤! ëŒ“ê¸€ì´ ë¨¸ì§€ëœ í›„ 확ì¸í•˜ì‹¤ 수 있습니다." + comment_error_msg : "댓글 등ë¡ì— 문제가 있습니다. í•„ìš” 필드를 작성했는지 확ì¸í•˜ê³  다시 시ë„하세요." + loading_label : "로딩중..." +ko-KR: + <<: *DEFAULT_KO + +# Russian / РуÑÑкий +# ----------------- +ru: &DEFAULT_RU + page : "Страница" + pagination_previous : "ПредыдущаÑ" + pagination_next : "СледующаÑ" + breadcrumb_home_label : "ГлавнаÑ" + breadcrumb_separator : "/" + menu_label : "Выпадающее меню" + toc_label : "Содержание" + ext_link_label : "ПрÑÐ¼Ð°Ñ ÑÑылка" + less_than : "менее" + minute_read : "мин на чтение" + share_on_label : "ПоделитьÑÑ" + meta_label : + tags_label : "Метки:" + categories_label : "Разделы:" + date_label : "Дата изменениÑ:" + comments_label : "ОÑтавить комментарий" + comments_title : "Комментарии" + more_label : "Читать далее" + related_label : "Вам также может понравитьÑÑ" + follow_label : "СвÑзатьÑÑ Ñо мной:" + feed_label : "RSS-лента" + powered_by : "Сайт работает на" + website_label : "Сайт" + email_label : "Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°" + recent_posts : "Свежие запиÑи" + undefined_wpm : "Ðе определён параметр words_per_minute в _config.yml" + comment_form_info : "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты не будет опубликован. ОбÑзательные Ð¿Ð¾Ð»Ñ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½Ñ‹" + comment_form_comment_label : "Комментарий" + comment_form_md_info : "ПоддерживаетÑÑ ÑинтакÑÐ¸Ñ Markdown." + comment_form_name_label : "ИмÑ" + comment_form_email_label : "Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°" + comment_form_website_label : "СÑылка на Ñайт (необÑзательно)" + comment_btn_submit : "ОÑтавить комментарий" + comment_btn_submitted : "Отправлено" + comment_success_msg : "СпаÑибо за Ваш комментарий! Он будет опубликован на Ñайте поÑле проверки." + comment_error_msg : "К Ñожалению, произошла ошибка Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¾Ð¹ комментариÑ. ПожалуйÑта, убедитеÑÑŒ, что вÑе обÑзательные Ð¿Ð¾Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ñ‹ и попытайтеÑÑŒ Ñнова." + loading_label : "Отправка..." + search_placeholder_text : "Введите поиÑковый запроÑ..." + results_found : "Ðайдено" +ru-RU: + <<: *DEFAULT_RU + +# Lithuanian / LietuviÅ¡kai +# ----------------- +lt: &DEFAULT_LT + page : "Puslapis" + pagination_previous : "Ankstesnis" + pagination_next : "Sekantis" + breadcrumb_home_label : "Pagrindinis" + breadcrumb_separator : "/" + menu_label : "Meniu rodymas" + toc_label : "Turinys" + ext_link_label : "TiesioginÄ— nuoroda" + less_than : "mažiau nei" + minute_read : "min. skaitymo" + share_on_label : "Pasidalinti" + meta_label : + tags_label : "ŽymÄ—s:" + categories_label : "Kategorijos:" + date_label : "Atnaujinta:" + comments_label : "Palikti komentarÄ…" + comments_title : "Komentaras" + more_label : "Skaityti daugiau" + related_label : "Taip pat turÄ—tų patikti" + follow_label : "Sekti:" + feed_label : "Å altinis" + powered_by : "Sukurta su" + website_label : "Tinklapis" + email_label : "El. paÅ¡tas" + recent_posts : "Naujausi įraÅ¡ai" + undefined_wpm : "Nedeklaruotas parametras words_per_minute faile _config.yml" + comment_form_info : "El. paÅ¡to adresas nebus vieÅ¡inamas. BÅ«tini laukai pažymÄ—ti." + comment_form_comment_label : "Komentaras" + comment_form_md_info : "Markdown palaikomas." + comment_form_name_label : "Vardas" + comment_form_email_label : "El. paÅ¡tas" + comment_form_website_label : "Tinklapis (nebÅ«tina)" + comment_btn_submit : "Komentuoti" + comment_btn_submitted : "Ä®raÅ¡ytas" + comment_success_msg : "AÄiÅ« už komentarÄ…! Jis bus parodytas kai bus patvirtintas." + comment_error_msg : "Atleiskite, įvyko netikÄ—ta klaida įraÅ¡ant komentarÄ…. Pasitikrinkite ar užpildÄ—te visus bÅ«tinus laukus ir pamÄ—ginkite dar kartÄ…." + loading_label : "Kraunama..." +lt-LT: + <<: *DEFAULT_LT + +# Greek +# -------------- +gr: &DEFAULT_GR + page : "Σελίδα" + pagination_previous : "ΠÏοηγοÏμενo" + pagination_next : "Επόμενo" + breadcrumb_home_label : "ΑÏχική" + breadcrumb_separator : "/" + menu_label : "ΜενοÏ" + toc_label : "ΠεÏιεχόμενα" + ext_link_label : "ΕξωτεÏικός ΣÏνδεσμος" + less_than : "ΛιγότεÏο από" + minute_read : "λεπτά ανάγνωσης" + share_on_label : "ΜοιÏαστείτε το" + meta_label : + tags_label : "Ετικέτες:" + categories_label : "ΚατηγοÏίες:" + date_label : "ΕνημεÏώθηκε:" + comments_label : "Αφήστε ένα σχόλιο" + comments_title : "Σχόλια" + more_label : "Διάβαστε πεÏισσότεÏα" + related_label : "Σχετικές αναÏτήσεις" + follow_label : "Ακολουθήστε:" + feed_label : "RSS Feed" + powered_by : "ΔημιουÏγήθηκε με" + website_label : "Ιστοσελίδα" + email_label : "Email" + recent_posts : "Τελευταίες αναÏτήσεις" + undefined_wpm : "Δεν έχει οÏιστεί η παÏάμετÏος words_per_minute στο αÏχείο _config.yml" + comment_form_info : "Η διεÏθυνση email σας δεν θα δημοσιευθεί. Τα απαιτοÏμενα πεδία εμφανίζονται με αστεÏίσκο" + comment_form_comment_label : "Σχόλιο" + comment_form_md_info : "Το πεδίο υποστηÏίζει Markdown." + comment_form_name_label : "Όνομα" + comment_form_email_label : "ΔιεÏθυνση email" + comment_form_website_label : "Ιστοσελίδα (Ï€ÏοαιÏετικό)" + comment_btn_submit : "Υπόβαλε ένα σχόλιο" + comment_btn_submitted : "Έχει υποβληθεί" + comment_success_msg : "ΕυχαÏιστοÏμε για το σχόλιό σας! Θα εμφανιστεί στην ιστοσελίδα Î±Ï†Î¿Ï ÎµÎ³ÎºÏιθεί." + comment_error_msg : "ΛυποÏμαστε, παÏουσιάστηκε σφάλμα με την υποβολή σας. ΠαÏακαλοÏμε βεβαιωθείτε ότι έχετε όλα τα απαιτοÏμενα πεδία συμπληÏωμένα και δοκιμάστε ξανά." + loading_label : "ΦόÏτωση..." + search_placeholder_text : "Εισάγετε ÏŒÏο αναζήτησης..." + results_found : "Αποτελέσματα" +gr-GR: + <<: *DEFAULT_GR + +# Swedish +# ----------------- +sv: &DEFAULT_SV + page : "Sidan" + pagination_previous : "FöregÃ¥ende" + pagination_next : "Nästa" + breadcrumb_home_label : "Hem" + breadcrumb_separator : "/" + menu_label : "Meny ridÃ¥" + toc_label : "PÃ¥ denna sida" + ext_link_label : "Direkt länk" + less_than : "mindre än" + minute_read : "minut läsning" + share_on_label : "Dela pÃ¥" + meta_label : + tags_label : "Taggar:" + categories_label : "Kategorier:" + date_label : "Uppdaterades:" + comments_label : "Lämna en kommentar" + comments_title : "Kommentarer" + more_label : "Lär dig mer" + related_label : "Du kanske vill även läsa:" + follow_label : "Följ:" + feed_label : "Flöde" + powered_by : "Framställd med" + website_label : "Webbsida" + email_label : "E-post" + recent_posts : "Senaste inlägg" + undefined_wpm : "Odefinerade parametrar words_per_minute i _config.yml" + comment_form_info : "Din e-post adress kommer inte att publiceras. Obligatoriska fält är markerade." + comment_form_comment_label : "Kommentar" + comment_form_md_info : "Använd Markdown för text-formateringen." + comment_form_name_label : "Namn" + comment_form_email_label : "E-post adress" + comment_form_website_label : "Webdsida (valfritt)" + comment_btn_submit : "Skicka en kommentar" + comment_btn_submitted : "Kommentaren har tagits emot" + comment_success_msg : "Tack för din kommentar! Den kommer att visas pÃ¥ sidan sÃ¥ fort den har godkännts." + comment_error_msg : "Tyvärr det har blivit nÃ¥got fel i en av fälten, se till att du fyller i alla rutor och försök igen." + loading_label : "Laddar..." +sv-SE: + <<: *DEFAULT_SV +sv-FI: + <<: *DEFAULT_SV + +# Dutch +# ----------------- +nl: &DEFAULT_NL + page : "Pagina" + pagination_previous : "Vorige" + pagination_next : "Volgende" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Wissel Menu" + toc_label : "Op deze pagina" + ext_link_label : "Directe Link" + less_than : "minder dan" + minute_read : "minuut gelezen" + share_on_label : "Deel op" + meta_label : + tags_label : "Labels:" + categories_label : "Categorieën:" + date_label : "Bijgewerkt:" + comments_label : "Laat een reactie achter" + comments_title : "Commentaren" + more_label : "Meer informatie" + related_label : "Bekijk ook eens" + follow_label : "Volg:" + feed_label : "Feed" + powered_by : "Aangedreven door" + website_label : "Website" + email_label : "Email" + recent_posts : "Recente berichten" + undefined_wpm : "Niet gedefinieerde parameter words_per_minute bij _config.yml" + comment_form_info : "Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd" + comment_form_comment_label : "Commentaar" + comment_form_md_info : "Markdown wordt ondersteund." + comment_form_name_label : "Naam" + comment_form_email_label : "E-mailadres" + comment_form_website_label : "Website (optioneel)" + comment_btn_submit : "Commentaar toevoegen" + comment_btn_submitted : "Toegevoegd" + comment_success_msg : "Bedankt voor uw reactie! Het zal op de site worden weergegeven zodra het is goedgekeurd." + comment_error_msg : "Sorry, er is een fout opgetreden bij uw inzending. Zorg ervoor dat alle vereiste velden zijn voltooid en probeer het opnieuw." + loading_label : "Laden..." +nl-BE: + <<: *DEFAULT_NL +nl-NL: + <<: *DEFAULT_NL + +# Indonesian +# ----------------- +id: &DEFAULT_ID + page : "Halaman" + pagination_previous : "Kembali" + pagination_next : "Maju" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Menu Toggle" + toc_label : "Pada Halaman Ini" + ext_link_label : "Link langsung" + less_than : "Kurang dari" + minute_read : "Waktu baca" + share_on_label : "Berbagi di" + meta_label : + tags_label : "Golongan:" + categories_label : "Kategori:" + date_label : "Diupdate:" + comments_label : "Tinggalkan komentar" + comments_title : "Komentar" + more_label : "Pelajari lagi" + related_label : "Anda juga akan suka" + follow_label : "Ikuti:" + feed_label : "Feed" + powered_by : "Didukung oleh" + website_label : "Website" + email_label : "Email" + recent_posts : "Posting terbaru" + undefined_wpm : "Parameter terdeskripsi words_per_minute di _config.yml" + comment_form_info : "Email Anda tidak akan dipublish. Kolom yang diperlukan ditandai" + comment_form_comment_label : "Komentar" + comment_form_md_info : "Markdown disupport." + comment_form_name_label : "Nama" + comment_form_email_label : "Alamat email" + comment_form_website_label : "Website (opsional)" + comment_btn_submit : "Submit Komentar" + comment_btn_submitted : "Telah disubmit" + comment_success_msg : "Terimakasih atas komentar Anda! Komentar ini akan tampil setelah disetujui." + comment_error_msg : "Maaf, ada kesalahan pada submisi Anda. Pastikan seluruh kolom sudah dilengkapi dan coba kembali." + loading_label : "Sedang meload..." +id-ID: + <<: *DEFAULT_ID + +# Vietnamese +# ----------------- +vi: &DEFAULT_VI + page : "Trang" + pagination_previous : "Trước" + pagination_next : "Sau" + breadcrumb_home_label : "Trang chá»§" + breadcrumb_separator : "/" + menu_label : "Menu" + toc_label : "Tại trang này" + ext_link_label : "ÄÆ°á»ng dẫn trá»±c tiếp" + less_than : "nhá» hÆ¡n" + minute_read : "phút Ä‘á»c" + share_on_label : "Chia sẻ tại" + meta_label : + tags_label : "Nhãn:" + categories_label : "Chá»§ Ä‘á»:" + date_label : "Cập nhật:" + comments_label : "Äể lại bình luận" + comments_title : "Bình luận" + more_label : "Mở rá»™ng" + related_label : "Có thể bạn cÅ©ng thích" + follow_label : "Theo dõi:" + feed_label : "Feed" + powered_by : "ÄÆ°á»£c há»— trợ bởi" + website_label : "Website" + email_label : "Email" + recent_posts : "Bài viết má»›i" + undefined_wpm : "Chưa định nghÄ©a thông số words_per_minute tại _config.yml" + comment_form_info : "Email cá»§a bạn sẽ được giữ bí mật. Các phần bắt buá»™c được đánh dấu." + comment_form_comment_label : "Bình luận" + comment_form_md_info : "Há»— trợ Markdown." + comment_form_name_label : "Tên" + comment_form_email_label : "Äịa chỉ email" + comment_form_website_label : "Website (không bắt buá»™c)" + comment_btn_submit : "Gá»­i bình luận" + comment_btn_submitted : "Äã được gá»­i" + comment_success_msg : "Cảm Æ¡n bạn đã bình luận! Bình luận sẽ xuất hiện sau khi được duyệt." + comment_error_msg : "Rất tiếc, có lá»—i trong việc gá»­i bình luận. Hãy đảm bảo toàn bá»™ các phần bắt buá»™c đã được Ä‘iá»n đầy đủ và thá»­ lại." + loading_label : "Äang tải..." +vi-VN: + <<: *DEFAULT_VI + +# Danish +# ------ +da: &DEFAULT_DA + page : "Side" + pagination_previous : "Forrige" + pagination_next : "Næste" + breadcrumb_home_label : "Home" + breadcrumb_separator : "/" + menu_label : "Vis/skjul menu" + toc_label : "PÃ¥ denne side" + ext_link_label : "Direkte link" + less_than : "mindre end" + minute_read : "minutters læsning" + share_on_label : "Del pÃ¥" + meta_label : + tags_label : "Nøgleord:" + categories_label : "Kategorier:" + date_label : "Opdateret:" + comments_label : "Skriv en kommentar" + comments_title : "Kommentarer" + more_label : "Lær mere" + related_label : "MÃ¥ske kan du ogsÃ¥ lide" + follow_label : "Følg:" + feed_label : "Feed" + powered_by : "Drives af" + website_label : "Website" + email_label : "E-mail" + recent_posts : "Seneste indlæg" + undefined_wpm : "Parameteren words_per_minute er ikke defineret i _config.yml" + comment_form_info : "Din e-mail bliver ikke offentliggjort. Obligatoriske felter er markeret" + comment_form_comment_label : "Kommentar" + comment_form_md_info : "Markdown er understøttet." + comment_form_name_label : "Navn" + comment_form_email_label : "E-mail" + comment_form_website_label : "Website (frivillig)" + comment_btn_submit : "Send kommentar" + comment_btn_submitted : "Sendt" + comment_success_msg : "Tak for din kommentar! Den bliver vist pÃ¥ siden, sÃ¥ snart den er godkendt." + comment_error_msg : "Desværre skete der en fejl. Prøv igen, mens du sørger for at alle obligatoriske felter er udfyldt." + loading_label : "Indlæser..." + search_placeholder_text : "Hvad leder du efter..." + results_found : "Resultat(er) fundet" +da-DK: + <<: *DEFAULT_DA + +# Polish +# ------ +pl: &DEFAULT_PL + page : "Strona" + pagination_previous : "Poprzednia" + pagination_next : "NastÄ™pna" + breadcrumb_home_label : "Strona główna" + breadcrumb_separator : "/" + menu_label : "Przełącz menu" + toc_label : "Spis treÅ›ci" + ext_link_label : "Link bezpoÅ›redni" + less_than : "mniej niż" + minute_read : "minut(y)" + share_on_label : "UdostÄ™pnij" + meta_label : + tags_label : "Tagi:" + categories_label : "Kategorie:" + date_label : "Ostatnia aktualizacja:" + comments_label : "Zostaw komentarz" + comments_title : "Komentarze" + more_label : "Dowiedz siÄ™ wiÄ™cej" + related_label : "Także może Ci siÄ™ spodobać" + follow_label : "Åšledź:" + feed_label : "Feed" + powered_by : "PowstaÅ‚o dziÄ™ki" + website_label : "Strona" + email_label : "Email" + recent_posts : "Najnowsze wpisy" + undefined_wpm : "Parametr words_per_minute nie zostaÅ‚ zdefiniowany w _config.yml." + comment_form_info : "Twój adres email nie bÄ™dzie udostÄ™piony. Wymagane pola sÄ… oznaczone." + comment_form_comment_label : "Skomentuj" + comment_form_md_info : "Markdown jest wspierany" + comment_form_name_label : "ImiÄ™" + comment_form_email_label : "Adres email" + comment_form_website_label : "Strona www (opcjonalna)" + comment_btn_submit : "Skomentuj" + comment_btn_submitted : "Komentarz dodany" + comment_success_msg : "DziÄ™kujÄ™ za Twój komentarz! Zostanie dodany po akceptacji." + comment_error_msg : "Niestety wystÄ…piÅ‚ błąd. ProszÄ™ upewnij siÄ™, że wszystkie wymagane pola zostaÅ‚y wypeÅ‚nione i spróbuj ponownie." + loading_label : "Trwa Å‚adowanie strony..." +da-PL: + <<: *DEFAULT_PL + +# Japanese +# ----------------- +ja: &DEFAULT_JA + page : "ページ" + pagination_previous : "å‰ã¸" + pagination_next : "次ã¸" + breadcrumb_home_label : "ホーム" + breadcrumb_separator : "/" + menu_label : "メニュー" + toc_label : "目次" + ext_link_label : "リンク" + less_than : + minute_read : + share_on_label : "共有" + meta_label : + tags_label : "ã‚¿ã‚°:" + categories_label : "カテゴリー:" + date_label : "更新日時:" + comments_label : "コメントã™ã‚‹" + comments_title : "コメント" + more_label : "ã•らã«è©³ã—ã" + related_label : "関連記事" + follow_label : "フォロー" + feed_label : + powered_by : + website_label : + email_label : + recent_posts : "æœ€è¿‘ã®æŠ•ç¨¿" + undefined_wpm : "パラメータ words_per_minute ㌠_config.yml ã§å®šç¾©ã•れã¦ã„ã¾ã›ã‚“" + comment_form_info : "メールアドレスãŒå…¬é–‹ã•れるã“ã¨ã¯ã‚りã¾ã›ã‚“。次ã®å°ã®ã‚ã‚‹é …ç›®ã¯å¿…ãšå…¥åŠ›ã—ã¦ãã ã•ã„:" + comment_form_comment_label : "コメント" + comment_form_md_info : "Markdown を使用ã§ãã¾ã™" + comment_form_name_label : "åå‰" + comment_form_email_label : "メールアドレス" + comment_form_website_label : "URL (ä»»æ„)" + comment_btn_submit : "コメントをé€ä¿¡ã™ã‚‹" + comment_btn_submitted : "é€ä¿¡ã—ã¾ã—ãŸ" + comment_success_msg : "コメントã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ï¼ã€€ã‚³ãƒ¡ãƒ³ãƒˆã¯æ‰¿èªã•れるã¨ãƒšãƒ¼ã‚¸ã«è¡¨ç¤ºã•れã¾ã™ã€‚" + comment_error_msg : "é€ä¿¡ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚必須項目ãŒã™ã¹ã¦å…¥åŠ›ã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦å†é€ä¿¡ã—ã¦ãã ã•ã„。" + loading_label : "読ã¿è¾¼ã¿ä¸­..." + search_placeholder_text : "検索キーワードを入力ã—ã¦ãã ã•ã„..." + results_found : "ä»¶" +ja-JP: + <<: *DEFAULT_JA + +# Another locale +# -------------- +# diff --git a/docs/todo.txt b/docs/_drafts/todo.txt similarity index 100% rename from docs/todo.txt rename to docs/_drafts/todo.txt diff --git a/docs/_includes/advert_row b/docs/_includes/advert_row new file mode 100644 index 00000000..ded5193b --- /dev/null +++ b/docs/_includes/advert_row @@ -0,0 +1,27 @@ + +
+ + {% for f in page.advert_row %} +
+
+ {% if f.image_path %} +
+ {% if f.image_link %} + + {% if f.alt %}{{ f.alt }}{% endif %} + + {% else %} + {% if f.alt %}{{ f.alt }}{% endif %} + {% endif %} + {% if f.image_caption %} + {{ f.image_caption | markdownify | remove: "

" | remove: "

" }}
+ {% endif %} +
+ {% endif %} +
+
+ {% endfor %} + +
diff --git a/docs/_includes/feature_id_row b/docs/_includes/feature_id_row new file mode 100644 index 00000000..407a8a05 --- /dev/null +++ b/docs/_includes/feature_id_row @@ -0,0 +1,43 @@ + +{% assign feature_row = include.row %} + +
+ + {% for f in feature_row %} + {% unless f.hidden %} +
+
+ {% if f.image_path %} +
+ {% if f.alt %}{{ f.alt }}{% endif %} + {% if f.image_caption %} + {{ f.image_caption | markdownify | remove: "

" | remove: "

" }}
+ {% endif %} +
+ {% endif %} + +
+ {% if f.title %} +

{{ f.title }}

+ {% endif %} + + {% if f.excerpt %} +
+ {{ f.excerpt | markdownify }} +
+ {% endif %} + + {% if f.url %} +

+ {{ f.btn_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}

+ {% endif %} +
+
+
+ {% endunless %} + {% endfor %} + +
diff --git a/docs/_includes/feature_page/features.html b/docs/_includes/feature_page/features.html new file mode 100644 index 00000000..90874d5c --- /dev/null +++ b/docs/_includes/feature_page/features.html @@ -0,0 +1,22 @@ +{% if include.head %} +
+ {{ include.head }} +
+{% endif %} + +{% if include.card %} +
+ {% include feature_id_row row=include.card.punchline type="center" %} + {% include feature_id_row row=include.card.first_row %} +
+{% endif %} + +{% assign sections = include.content | split: '::' %} + +{% for section in sections %} +
+
+ {{ section | markdownify }} +
+
+{% endfor %} diff --git a/docs/_includes/feature_page/flex.html b/docs/_includes/feature_page/flex.html new file mode 100644 index 00000000..d03f6607 --- /dev/null +++ b/docs/_includes/feature_page/flex.html @@ -0,0 +1,6 @@ +{% assign items = include.content | split: '::' %} +
+ {% for flex in items %} +
{{ flex | markdownify }}
+ {% endfor %} +
\ No newline at end of file diff --git a/docs/_includes/feature_page/home/float.html b/docs/_includes/feature_page/home/float.html new file mode 100644 index 00000000..8ad9b707 --- /dev/null +++ b/docs/_includes/feature_page/home/float.html @@ -0,0 +1,10 @@ +{% if include.left %} +
+ {{ include.left | markdownify | remove: '

' | remove: '

' }} +
+{% endif %} +{% if include.right %} +
+ {{ include.right | markdownify | remove: '

' | remove: '

' }} +
+{% endif %} \ No newline at end of file diff --git a/docs/_includes/feature_page/home/query.html b/docs/_includes/feature_page/home/query.html new file mode 100644 index 00000000..380e39f4 --- /dev/null +++ b/docs/_includes/feature_page/home/query.html @@ -0,0 +1,14 @@ +
+
+

PyMongo

+
+ {{ include.pymongo | markdownify }} +
+
+
+

Djongo

+
+ {{ include.djongo | markdownify }} +
+
+
\ No newline at end of file diff --git a/docs/_includes/feature_page/support/payment.html b/docs/_includes/feature_page/support/payment.html new file mode 100644 index 00000000..b13d72e5 --- /dev/null +++ b/docs/_includes/feature_page/support/payment.html @@ -0,0 +1,8 @@ +

Great! We have the information required to help you

+

+ + {% comment %} + Pay on Patreon + {% endcomment %} +

+{% include vendors/stripe.html btn_id="button" price_id=include.price_id %} \ No newline at end of file diff --git a/docs/_includes/feature_page/support/support.html b/docs/_includes/feature_page/support/support.html new file mode 100644 index 00000000..329c9725 --- /dev/null +++ b/docs/_includes/feature_page/support/support.html @@ -0,0 +1,49 @@ + +
+

Support

+
+ {% for tire in site.data.support.tire_column.tires %} + {% if tire.invisible != true %} +
+
{{ tire.title }}
+
${{ tire.price }}
+
+ {% if tire.per_hour %} + PER HOUR + {% else %} + PER MONTH + {% endif %} +
+ Apply +
+
    + {% for b in tire.benefits %} +
  • {{ b | markdownify | remove: "

    " | remove: "

    " }}
  • + {% endfor %} +
+
+
+ {% endif %} + {% endfor %} +
+
+
+

Enterprise

+
+
+ {{ include.enterprise | markdownify }} +
+ {% include form.html form=site.data.support.enterprise_form %} +
+
+ +
+ {{ include.discuss | markdownify }} +
+
+

Get In Touch

+ {% include form.html form=site.data.support.contact_form %} +
+ + + diff --git a/docs/_includes/feature_page/support/tire.html b/docs/_includes/feature_page/support/tire.html new file mode 100644 index 00000000..95c91ec0 --- /dev/null +++ b/docs/_includes/feature_page/support/tire.html @@ -0,0 +1,32 @@ + +
+
+ {% for tire in site.data.support.tire_column.tires %} + {% if tire.invisible != true %} +
+
{{ tire.title }}
+
${{ tire.price }}
+
+ {% if tire.per_hour %} + PER HOUR + {% else %} + PER MONTH + {% endif %} +
+ Apply +
+
    + {% for b in tire.benefits %} +
  • {{ b | markdownify | remove: "

    " | remove: "

    " }}
  • + {% endfor %} +
+
+
+ {% endif %} + {% endfor %} +
+
+ + + + diff --git a/docs/_includes/feedback.html b/docs/_includes/feedback.html new file mode 100644 index 00000000..aef922f6 --- /dev/null +++ b/docs/_includes/feedback.html @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html new file mode 100644 index 00000000..ac9b0671 --- /dev/null +++ b/docs/_includes/footer.html @@ -0,0 +1,20 @@ + + + diff --git a/docs/_includes/footer/cookie-notice.html b/docs/_includes/footer/cookie-notice.html new file mode 100644 index 00000000..fef7d746 --- /dev/null +++ b/docs/_includes/footer/cookie-notice.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/docs/_includes/footer/custom.html b/docs/_includes/footer/custom.html new file mode 100644 index 00000000..e36434cd --- /dev/null +++ b/docs/_includes/footer/custom.html @@ -0,0 +1,3 @@ + +{% include footer/cookie-notice.html %} + \ No newline at end of file diff --git a/docs/_includes/form.html b/docs/_includes/form.html new file mode 100644 index 00000000..5d38e183 --- /dev/null +++ b/docs/_includes/form.html @@ -0,0 +1,49 @@ +{% if include.subject %} + {% assign subject = include.subject %} +{% else %} + {% assign subject = include.form.subject %} +{% endif %} + +{% if include.next %} + {% assign next = include.next %} +{% else %} + {% assign next = include.form.next %} +{% endif %} + +
+ {% for field in include.form.fields %} + {% if field.type == 'select' %} + + + {% elsif field.type == 'textarea' %} + + + {% elsif field.type == 'input' %} + {% if field.label %}{% endif %} + {% endif %} + {% endfor %} + + +
\ No newline at end of file diff --git a/docs/_includes/head/custom.html b/docs/_includes/head/custom.html new file mode 100644 index 00000000..b36f8fc1 --- /dev/null +++ b/docs/_includes/head/custom.html @@ -0,0 +1,7 @@ + + + +{% include vendors/google-tag-manager.html %} +{% include vendors/hotjar.html %} + + \ No newline at end of file diff --git a/docs/_includes/links b/docs/_includes/links new file mode 100644 index 00000000..d3105f2d --- /dev/null +++ b/docs/_includes/links @@ -0,0 +1,2 @@ +[support_page]: https://www.djongomapper.com/support/ + diff --git a/docs/_includes/pizza.html b/docs/_includes/pizza.html new file mode 100644 index 00000000..363a9fab --- /dev/null +++ b/docs/_includes/pizza.html @@ -0,0 +1,6 @@ +{% if page.pizza %} + +{% endif %} \ No newline at end of file diff --git a/docs/_includes/vendors/google-tag-manager.html b/docs/_includes/vendors/google-tag-manager.html new file mode 100644 index 00000000..2caea24e --- /dev/null +++ b/docs/_includes/vendors/google-tag-manager.html @@ -0,0 +1,7 @@ + + + diff --git a/docs/_includes/vendors/hotjar.html b/docs/_includes/vendors/hotjar.html new file mode 100644 index 00000000..531a5fa9 --- /dev/null +++ b/docs/_includes/vendors/hotjar.html @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/docs/_includes/vendors/stripe.html b/docs/_includes/vendors/stripe.html new file mode 100644 index 00000000..037aaa53 --- /dev/null +++ b/docs/_includes/vendors/stripe.html @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/docs/_layouts/docs.html b/docs/_layouts/docs.html new file mode 100644 index 00000000..0243db37 --- /dev/null +++ b/docs/_layouts/docs.html @@ -0,0 +1,8 @@ +--- +layout: single +classes: + - l-docs +--- + +{{ content }} + diff --git a/docs/_layouts/server.html b/docs/_layouts/server.html new file mode 100644 index 00000000..18e02de1 --- /dev/null +++ b/docs/_layouts/server.html @@ -0,0 +1,8 @@ +--- +layout: docs +--- + +{{ page.notice.not_standard | markdownify }} + +{{ content }} + diff --git a/docs/_layouts/support-contact.html b/docs/_layouts/support-contact.html new file mode 100644 index 00000000..2d3f8f4b --- /dev/null +++ b/docs/_layouts/support-contact.html @@ -0,0 +1,11 @@ +--- +title: Djongo Support +layout: splash +classes: + - empty-banner + - l-splash +--- + +

Help us with some information

+ +{{ content }} \ No newline at end of file diff --git a/docs/_sass/_const.scss b/docs/_sass/_const.scss new file mode 100644 index 00000000..ff63e05c --- /dev/null +++ b/docs/_sass/_const.scss @@ -0,0 +1,10 @@ +$base-font-size-px: 20px; +$container-box-padding-px: 2 * $base-font-size-px; + +$x-small: 600px; +$small: 768px; +$medium: 900px; +$large: 1024px; +$x-large: 1280px; +$max-width: $x-large; + diff --git a/docs/_sass/_home.scss b/docs/_sass/_home.scss new file mode 100644 index 00000000..ad5fbee5 --- /dev/null +++ b/docs/_sass/_home.scss @@ -0,0 +1,341 @@ + +$title-font-size: 2.44em; +$title-font-size-small: 1.95em; +$overlay-padding: 3em; + +$banner-max-height: $overlay-padding*2 + $title-font-size; +//$banner-max-height: 140px; +$banner-max-height-small: $overlay-padding*2 + $title-font-size-small; +$banner-aspect-ratio: 2.48; +$banner-max-width: $banner-max-height * $banner-aspect-ratio/2.44; +$banner-max-width-small: $banner-max-height-small * $banner-aspect-ratio/2.0; + +$media-side-margin: 1.5em; + +$mm-line-height: 1.5; +$mm-h2-padding-bottom: 0.5em; +$mm-h2-font-size: 1.25em; + +$feature-margin-top: 2em; +$feature-margin-bottom: 1em; + +@mixin banner--symbol { + .page__hero--overlay { + background-position: right bottom; + background-color: #092d1f; + background-size: auto $banner-max-height; + padding: 3.5em 0; + + @include break-max(600px) { + background-size: auto $banner-max-height-small; + } + } + + .page__title, .page__lead { + max-width: calc(100% - #{$banner-max-width}); + + @include break-max(600px) { + max-width: calc(100% - #{$banner-max-width-small}); + } + } +} + +@mixin banner--map-flex { + .page__hero--overlay { + background-position: center; + //min-height: 15em; + } + + //mm override + .wrapper { + margin-left: 1em; + display: flex; + flex-direction: column; + align-items: flex-start; + width: max-content; + background-color: rgba(9, 65, 31, 0.38); + + @include break(small) { + margin-left: auto; + display: block; + } + + p { + margin-top: 0; + } + } +} + +@mixin banner--map { + //mm override + .wrapper { + padding: 3em; + width: max-content; + margin-left: 0; + background-image: linear-gradient(to left, rgba(255,255,255,0) 0em, rgba(9, 65, 31,1) 2.5em, + rgba(9, 65, 31,1) calc(100% - 2.5em), rgba(255,255,255,0)); + + @include break-min(80em) { + margin-left: calc((100% - #{$x-large})/2); + } + + @include break(medium) { + width: 100%; + } + } +} + +.banner-page { + @include banner--map; +} + +.page__hero--overlay { + padding: 0; +} + +.feature-page { + + .feature__wrapper { + margin-bottom: 3em; + + // Reset mm + border-bottom: none; + } + + h2 { + margin-bottom: $feature-margin-bottom; + } +} + + +.feature { + padding-top: 1em; + padding-bottom: 1em; + + &:nth-of-type(even) { + background-color: #f2f3f3; + } + + &::after { + content: ""; + display: block; + clear: both; + } +} + +.feature-content { + max-width: $max-width; + margin: auto; + padding-left: 1em; + padding-right: 1em; + + h2 { + margin: $feature-margin-top 0 $feature-margin-bottom; + border: none; + } +} + +.feature-head { + @extend .feature-content; + margin: 2.5em auto; + + &.no-punchline { + margin-top: 4.5em; + } +} + +.feature-query { + h3 { + text-align: center; + margin-top: 1em; + + @include break(small) { + text-align: left; + margin-top: 2em; + + } + } + + &::after { + content: ""; + display: block; + clear: both; + } +} + +.float { + display: block; +} + +.float-left { + @extend .float; + float: left; + + @include break(x-small) { + float: none; + } +} + +.float-right { + @extend .float; + float: right; + + @include break(x-small) { + float: none; + } +} + +.top-align { + //Works only on floats + //Align floats to paragraph top. + margin-top: #{(($mm-line-height - 1)/2)}em; +} + +.pos-right { + margin-left: $media-side-margin; + + @include break(x-small) { + margin-left: 0; + } +} + +.pos-left { + margin-right: $media-side-margin; + + @include break(x-small) { + margin-right: 0; + } +} + +.fp-left { + @extend .float-left; + @extend .pos-left +} + +.fp-right { + @extend .float-right; + @extend .pos-right +} + +.pos-twice { + &.pos-left { + margin-right: $media-side-margin / 2; + + @include break(x-small) { + margin-right: 0; + } + } + &.pos-right { + margin-left: $media-side-margin / 2; + + @include break(x-small) { + margin-left: 0; + } + } +} + +.sz-sm { + max-width: 31.3%; + + @include break(x-small) { + max-width: 100%; + } +} + +.sz-hf { + width: calc(50% - #{$media-side-margin / 2}); + + @include break(small) { + width: 100%; + } +} + +.sz-short { + overflow: auto; + height: 15em; +} + +.sz-short.reset { + @include break(small) { + height: auto; + } +} + +.img { + margin-bottom: 1em; + + @include break(x-small) { + margin-bottom: 2em; + } +} + +.img-right { + @extend .img; + @extend .fp-right; +} + +.img-left { + @extend .img; + @extend .fp-left; +} + +.code { + margin-bottom: 0; + + @include break(x-small) { + margin-bottom: 1em; + } +} + +.code-right { + @extend .code; + @extend .fp-right; +} + +.code-left { + @extend .code; + @extend .fp-left; +} + +.form-right { + @extend .fp-right; + @extend .sz-sm; + + // Reset mm form padding + padding: 0; + margin-left: 2.5em; +} + +.flex { + display: flex; + justify-content: space-between; + + > div { + margin: 0 1em 0; + } + + @include break(x-small) { + flex-direction: column; + } +} + +.fx-form { + margin-top: ($feature-margin-top + + $feature-margin-bottom + + $mm-h2-padding-bottom + + $mm-h2-font-size); + width: 15em; + + @include break(x-small) { + margin-top: 1em; + min-width: 0; + } +} + +.is-hidden { + display: none; +} + +h2.reset-border { + border-bottom: none; +} \ No newline at end of file diff --git a/docs/_sass/_layout.scss b/docs/_sass/_layout.scss new file mode 100644 index 00000000..4a88f90f --- /dev/null +++ b/docs/_sass/_layout.scss @@ -0,0 +1,118 @@ + +.l-tire { + display: flex; + justify-content: left; + flex-direction: row; + flex-wrap: wrap; +} + +.l-splash { + .page__content { + section { + border-bottom: 1px solid #f2f3f3; + padding-bottom: 3em; + margin-bottom: 4.5em; + + &:last-of-type { + border-bottom-style: none; + } + } + + h1 { + margin: 1.5em 0 1em; + + @include break(x-small) { + text-align: left; + } + } + + h2 { + margin-bottom: 1em; + } + + h1, h2, h3, h4, h5, h6 { + text-align: center; + } + } + + form { + width: 50%; + margin: 0 auto 5px auto; + + @include break(x-small) { + margin: 0; + width: 100%; + } + } +} + +.l-docs { + #main { + max-width: 1880px; + } +} + +.l-splash-full { + #main { + max-width: 100%; + padding: 0; + } +} + +.l-enterprise { + display: flex; + flex-direction: row; + flex-wrap: wrap; + + form { + width: 15em; + margin-left: 1em; + + @include break(x-small) { + margin: 0; + width: 100%; + } + } + + .text-box { + width: calc(100% - 16em); + + @include break(x-small) { + margin: 0; + width: 100%; + } + } +} + +.empty-banner { + .masthead { + margin-bottom: 3em; + } +} + +.cookie-notice { + position: fixed; + bottom: 0; + left: 0; + color: #646769; + background-color: #f2f3f3; + width: 100%; + + p { + margin: 1.3em auto; + text-align: center; + } + + button { + margin-left: 0.5em; + } +} + + + +.center-box { + display: block; + margin-left: auto; + margin-right: auto; +} + diff --git a/docs/_sass/module/_item.scss b/docs/_sass/module/_item.scss new file mode 100644 index 00000000..cfa11b07 --- /dev/null +++ b/docs/_sass/module/_item.scss @@ -0,0 +1,92 @@ +$box-min-width: 16em; +$box-side-margin: 1em; +$box-bottom-margin: 2em; +$container-padding: 2em; + +$item-content-min-width: 25em; +$item-side-margin: 1em; +$item-min-width: $item-content-min-width + 2*$item-side-margin; + + +@mixin item-width($columns) { + @if $columns > 1 { + width: calc(#{100% / $columns} - (#{$box-side-margin} * 2)); + + @for $i from $columns - 1 through 1 { + $total-width: ($i * $item-min-width) + $container-padding; + @include break(max, $total-width) { + width: calc(#{100% / $i} - (#{$box-side-margin} * 2)); + } + } + } @else { + width: calc(100% - #{$box-side-margin}); + margin-left: 0; + margin-right: 0; + } +} + +.item { + //padding: 1em 0 1em; + margin: 0 $box-side-margin $box-bottom-margin; + text-align: center; + + ul { + text-align: left; + } + + form { + text-align: left; + + input[type=submit] { + text-align: center; + margin: 0 auto 1.75em auto; + display: block; + } + width: 100%; + } +} + +.item-3-col { + @extend .item; + @include item-width(3); +} + +.item-2-col { + @extend .item; + @include item-width(2); +} + +.item-distinct { + border: 1px solid gainsboro; + border-radius: 4px; + padding: 1em; +} + +.item-title { + font-weight: bold; + margin-bottom: 1.5em; +} + +.item-switcher { + display: flex; + align-items: center; + justify-content: center; +} + +.switcher-title { + font-weight: bold; + margin-left: 10px; + margin-right: 10px; + font-size: 1.5em; +} + +.item-price { + font-weight: bold; + font-size: 2.5em; +} + +.item-period { + font-size: 0.9em; + font-weight: lighter; + margin-bottom: 1em; +} diff --git a/docs/_sass/style.scss b/docs/_sass/style.scss new file mode 100644 index 00000000..e6d667d3 --- /dev/null +++ b/docs/_sass/style.scss @@ -0,0 +1,5 @@ +@import "const"; +@import "utils/breakpoint"; +@import "layout"; +@import "home"; +@import "module/item"; diff --git a/docs/_sass/utils/_breakpoint.scss b/docs/_sass/utils/_breakpoint.scss new file mode 100644 index 00000000..d63ae7a6 --- /dev/null +++ b/docs/_sass/utils/_breakpoint.scss @@ -0,0 +1,40 @@ + +@mixin break ($size, $value: 0) { + @if($size == large) { + @media (max-width: $large) { + @content + } + } + @else if($size == medium) { + @media (max-width: $medium) { + @content + } + } + @else if($size == small) { + @media (max-width: $small) { + @content + } + } + @else if($size == x-small) { + @media (max-width: $x-small) { + @content + } + } + @else if($size == max) { + @media (max-width: $value) { + @content + } + } +} + +@mixin break-max($size) { + @media (max-width: $size) { + @content + } +} + +@mixin break-min($size) { + @media (min-width: $size) { + @content + } +} \ No newline at end of file diff --git a/docs/assets/css/custom.css b/docs/assets/css/custom.css new file mode 100644 index 00000000..e7a0441d --- /dev/null +++ b/docs/assets/css/custom.css @@ -0,0 +1 @@ +.banner{padding:0;clear:both;background-size:cover;background-repeat:no-repeat;background-position:center;-webkit-animation:intro .3s both;animation:intro .3s both;-webkit-animation-delay:.25s;animation-delay:.25s}.banner.banner-dark{margin-bottom:0}.banner-text{padding:3em 3em 3em 1em;color:#fff;margin-left:calc((100% - 1280px)/2);max-width:980px}@media(max-width: 80em){.banner-text{margin-left:0;width:900px}}@media(max-width: 900px){.banner-text{width:100%}}.banner-text h1{margin-top:0;font-size:2.441em}@media(max-width: 37.5em){.banner-text h1{font-size:1.953em}}.banner-text-dark{color:#000}.banner-text-dark .btn{color:#fff;background-color:#000;border:1px solid #000}.banner-text-dark .btn:hover{background-color:rgba(0,0,0,0);color:#000}.banner-text-hero{background-image:linear-gradient(to left, rgba(255, 255, 255, 0) 0em, rgb(9, 65, 31) 2.5em, rgb(9, 65, 31) calc(100% - 2.5em), rgba(255, 255, 255, 0))}.banner-text-hero .btn{background-color:#fff;color:#09411f;border:1px solid #fff}.banner-text-hero .btn:hover{background-color:rgba(0,0,0,0);color:#fff}.banner-lead{font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Helvetica Neue","Lucida Grande",Arial,sans-serif;font-size:1.25em;max-width:768px}.l-tire{display:flex;justify-content:left;flex-direction:row;flex-wrap:wrap}.tire-content,.tire-2-col,.tire-3-col{margin:0 .5em 2em;text-align:center}.tire-content ul,.tire-2-col ul,.tire-3-col ul{text-align:left}.tire-content form,.tire-2-col form,.tire-3-col form{text-align:left;width:100%}.tire-content form input[type=submit],.tire-2-col form input[type=submit],.tire-3-col form input[type=submit]{text-align:center;margin:0 auto 1.75em auto;display:block}.tire-3-col{width:calc(33.3333333333% - (1em))}@media(max-width: 56em){.tire-3-col{width:calc(50% - (1em))}}@media(max-width: 29em){.tire-3-col{width:calc(100% - (1em))}}.tire-2-col{width:calc(50% - (1em))}@media(max-width: 29em){.tire-2-col{width:calc(100% - (1em))}}.tire-distinct{border:1px solid #dcdcdc;border-radius:4px;padding:1em}.tire-title{font-weight:bold;margin-bottom:1.5em}.tire-price{font-weight:bold;font-size:2.5em}.tire-period{font-size:.9em;font-weight:lighter;margin-bottom:1em}.l-tire-switcher{display:flex;align-items:stretch;justify-content:space-around}.l-tire-switcher svg:hover{cursor:pointer}.l-tire-switcher .svg-box{display:flex;align-items:center}.switcher-title{font-weight:bold;margin-left:10px;margin-right:10px;font-size:1.5em}.l-tiles{display:grid;grid-template-columns:repeat(3, 1fr);gap:1rem;padding:5.318rem 0}.l-tiles>div{box-shadow:0 5px 15px rgba(0,0,0,.35);font-size:.8em;padding:1.5em;border-radius:5px;display:flex;flex-direction:column;align-items:flex-start}.l-tiles img{height:5em;display:block;margin:0 auto 1.3rem}.l-tiles .cta{margin-top:auto}@media(max-width: 900px){.l-tiles{grid-template-columns:repeat(2, 1fr)}}@media(max-width: 600px){.l-tiles{grid-template-columns:1fr}}a.cta{text-decoration:none;color:#09411f;position:relative}a.cta:before{content:"";position:absolute;background:#09411f;bottom:0;height:2px;left:0;transform:scaleX(0) translate3d(0, 0, 0);transition:all .2s ease-in-out;width:100%}a.cta:after{content:"→"}a.cta:hover:before{transform:scaleX(1)}.pc,.pc-img-right{display:flex;gap:2rem}.pc>img,.pc-img-right>img,.pc div,.pc-img-right div{flex:50%}@media(max-width: 900px){.pc,.pc-img-right{flex-direction:column;align-items:center}}.pc-img-right{flex-direction:row-reverse}@media(max-width: 768px){.pc-img-right{flex-direction:column-reverse}}.pc-title.pc-subtitle h2{margin-bottom:1.3rem}.pc-title.pc-subtitle h3{margin-bottom:2.7rem}.l-splash-full #main{max-width:100%;padding:0}.l-splash-full #main p{margin-top:0}.l-fixed-notice{position:fixed;bottom:0;left:0;color:#646769;background-color:#f2f3f3;width:100%}.l-fixed-notice p{margin:1.3em auto;text-align:center}.l-fixed-notice button{margin-left:.5em}.l-docs #main{max-width:1880px}.empty-banner .masthead{margin-bottom:3em}.seamless{border-bottom:none}.masthead{position:sticky;top:0;background-color:#fff}.masthead__inner-wrap{padding:.5em}.masthead__menu-item:first-of-type a{margin-right:1rem;padding:.5em 1em;font-family:-apple-system,BlinkMacSystemFont,"Roboto","Segoe UI","Helvetica Neue","Lucida Grande",Arial,sans-serif;font-size:.75em;font-weight:bold;text-align:center;text-decoration:none;border-width:0;border-radius:4px;background-color:#ee5f5b;color:#fff}.masthead__menu-item:first-of-type a:before{background:none}.masthead__menu-item:first-of-type a:visited{background-color:#ee5f5b}.masthead__menu-item:first-of-type a:hover{background-color:#be4c49}.visible-links{align-items:baseline}.l-fixed-content,.fp-right .pitch-content,.form-right .pitch-content,.code-right .pitch-content,.img-right .pitch-content{max-width:1280px;margin:auto;padding-left:1em;padding-right:1em}.l-fixed-content p,.fp-right .pitch-content p,.form-right .pitch-content p,.code-right .pitch-content p,.img-right .pitch-content p{margin-bottom:1.3rem}.pitch>section,.pitch-white>section,.pitch-grey>section{padding:5.318rem 0}.pitch>section::after,.pitch-white>section::after,.pitch-grey>section::after{content:"";display:block;clear:both}.pitch h3,.pitch-white h3,.pitch-grey h3{font-size:.84em;font-weight:normal}.pitch h2,.pitch-white h2,.pitch-grey h2,.pitch h3,.pitch-white h3,.pitch-grey h3,.pitch h4,.pitch-white h4,.pitch-grey h4{margin:0 0 2.7rem;text-align:center}.pitch-grey>section:nth-child(odd){background-color:#f2f3f3}.pitch-white>section:nth-child(even){background-color:#f2f3f3}.sz-short{overflow:auto;min-height:0}.btn--theme{color:#fff;background-color:#09411f}.btn--theme:visited{background-color:#09411f}.float,.float-right,.fp-right,.form-right,.code-right,.img-right,.float-left,.fp-left,.code-left,.img-left{display:block}.float-left,.fp-left,.code-left,.img-left{float:left}@media(max-width: 600px){.float-left,.fp-left,.code-left,.img-left{float:none}}.float-right,.fp-right,.form-right,.code-right,.img-right{float:right}@media(max-width: 600px){.float-right,.fp-right,.form-right,.code-right,.img-right{float:none}}.top-align{margin-top:0.25em}.pos-right,.fp-right,.form-right,.code-right,.img-right{margin-left:2rem}@media(max-width: 600px){.pos-right,.fp-right,.form-right,.code-right,.img-right{margin-left:0}}.pos-left,.fp-left,.code-left,.img-left{margin-right:2rem}@media(max-width: 600px){.pos-left,.fp-left,.code-left,.img-left{margin-right:0}}.pos-twice.pos-left,.pos-twice.fp-left,.pos-twice.code-left,.pos-twice.img-left{margin-right:1rem}@media(max-width: 600px){.pos-twice.pos-left,.pos-twice.fp-left,.pos-twice.code-left,.pos-twice.img-left{margin-right:0}}.pos-twice.pos-right,.pos-twice.fp-right,.pos-twice.form-right,.pos-twice.code-right,.pos-twice.img-right{margin-left:1rem}@media(max-width: 600px){.pos-twice.pos-right,.pos-twice.fp-right,.pos-twice.form-right,.pos-twice.code-right,.pos-twice.img-right{margin-left:0}}.sz-sm,.form-right{max-width:31.3%}@media(max-width: 600px){.sz-sm,.form-right{max-width:100%}}.sz-hf{width:calc(50% - 1rem)}@media(max-width: 768px){.sz-hf{width:100%}}@media(max-width: 768px){.sz-short.reset{height:auto}}.img,.img-left,.img-right{margin-bottom:1em}@media(max-width: 600px){.img,.img-left,.img-right{margin-bottom:2em}}.code,.code-left,.code-right{margin-bottom:0}@media(max-width: 600px){.code,.code-left,.code-right{margin-bottom:1em}}.form-right{padding:0;margin-left:2.5em}.flex{display:flex;justify-content:space-between}.flex>div{margin:0 1em 0}@media(max-width: 600px){.flex{flex-direction:column}}.is-hidden{display:none}h2.reset-border{border-bottom:none}.query{display:flex;flex-flow:row wrap;gap:2rem}.query>div:nth-child(1){flex:0 1 min-content;overflow:scroll;width:min-content;max-height:13.5em}.query>div:nth-child(2){flex:1 1 min-content}.query .highlighter-rouge{margin-bottom:0}.query .btn{margin-bottom:0}.query .btn:hover{cursor:default}@media(max-width: 900px){.query{flex-flow:column wrap}}.query-right-box{display:grid;grid-template-columns:min-content 10px min-content auto;grid-template-rows:min-content 2rem min-content 1.3rem min-content}.query-right-box>div:nth-child(1){grid-area:1/1/2/5;width:min-content}.query-right-box>div:nth-child(2){grid-area:3/1/4/2}.query-right-box>div:nth-child(3){grid-area:3/3/4/4}.query-right-box>div:nth-child(4){grid-area:5/1/6/5}@media(max-width: 900px){.query-right-box>div:nth-child(1){grid-area:3/1/4/5;max-width:90vw;overflow:scroll}.query-right-box>div:nth-child(2){grid-area:1/1/2/2}.query-right-box>div:nth-child(3){grid-area:1/3/2/4}}.chart{display:grid;grid-template-columns:auto auto;grid-template-rows:auto auto auto}.chart p{margin-bottom:0}.x-axis{transform:rotate(-90deg);align-self:center;grid-area:1/1/2/2}.y-axis{margin:1em 0 2.4rem;text-align:center;grid-area:2/2/3/3}.chart>.cta{grid-area:3/2/4/3}.chart-grid{grid-area:1/2/2/3;display:grid;grid-template-columns:2rem auto 2rem auto 2rem auto;grid-template-rows:min-content min-content min-content max-content 2rem;border-bottom:1px solid #000;border-left:1px solid #000}@media(max-width: 900px){.chart-grid{grid-template-columns:10px auto 10px;grid-template-rows:min-content min-content 2rem min-content min-content 2rem min-content min-content 2rem}}.c1-title,.c2-title,.c3-title{border-bottom:2px solid #b6b6b6;border-radius:5px 5px 0 0;padding:.6em 1.2em}.c1-content,.c2-content,.c3-content{border-radius:0 0 5px 5px;padding:1.2em}.c1-title,.c2-title,.c3-title,.c1-content,.c2-content,.c3-content{background-color:#fff}.c1-title{grid-area:3/2/4/3}@media(max-width: 900px){.c1-title{grid-area:7/2/8/3}}.c1-content{grid-area:4/2/5/3}@media(max-width: 900px){.c1-content{grid-area:8/2/9/3}}.c2-title{grid-area:2/4/3/5}@media(max-width: 900px){.c2-title{grid-area:4/2/5/3}}.c2-content{grid-area:3/4/5/5}@media(max-width: 900px){.c2-content{grid-area:5/2/6/3}}.c3-title{grid-area:1/6/2/7}@media(max-width: 900px){.c3-title{grid-area:1/2/2/3}}.c3-content{grid-area:2/6/5/7}@media(max-width: 900px){.c3-content{grid-area:2/2/3/3}}table.products{font-size:1em;display:table}@media(max-width: 768px){table.products{overflow:scroll;max-width:90vw;display:block}}table.products th:first-child{background-color:#fff}table.products td:first-child{background-color:#f2f3f3}table.products th:first-child,table.products td:first-child{width:49%;padding:.7em 1em}table.products th:nth-child(n+2),table.products td:nth-child(n+2){width:17%;text-align:center}table.products td,table.products th{padding:.7em .5em}table.products th:nth-child(3){border-left:4px solid #ee5f5b;border-top:4px solid #ee5f5b;border-right:4px solid #ee5f5b;border-top-left-radius:5px;border-top-right-radius:5px}table.products td:nth-child(3){border-left:4px solid #ee5f5b;border-right:4px solid #ee5f5b}table.products tr:last-child td:nth-child(3){border-bottom:4px solid #ee5f5b}table.products .btn{margin-bottom:0}table.products img{max-height:1em} diff --git a/docs/assets/images/admin.png b/docs/assets/images/admin.png new file mode 100644 index 00000000..2a0f3d33 Binary files /dev/null and b/docs/assets/images/admin.png differ diff --git a/docs/assets/images/array-model-field.png b/docs/assets/images/array-model-field.png new file mode 100644 index 00000000..f02dc155 Binary files /dev/null and b/docs/assets/images/array-model-field.png differ diff --git a/docs/assets/images/bug.jpg b/docs/assets/images/bug.jpg new file mode 100644 index 00000000..e5aaa8dc Binary files /dev/null and b/docs/assets/images/bug.jpg differ diff --git a/docs/assets/images/django.jpg b/docs/assets/images/django.jpg new file mode 100755 index 00000000..13a778c4 Binary files /dev/null and b/docs/assets/images/django.jpg differ diff --git a/docs/assets/images/djongo-logo-new.png b/docs/assets/images/djongo-logo-new.png new file mode 100755 index 00000000..bd579a12 Binary files /dev/null and b/docs/assets/images/djongo-logo-new.png differ diff --git a/docs/assets/images/djongo-logo.png b/docs/assets/images/djongo-logo.png new file mode 100755 index 00000000..d3fa1c4c Binary files /dev/null and b/docs/assets/images/djongo-logo.png differ diff --git a/docs/assets/images/djongo-symbol-small.png b/docs/assets/images/djongo-symbol-small.png new file mode 100755 index 00000000..c2d6fe5e Binary files /dev/null and b/docs/assets/images/djongo-symbol-small.png differ diff --git a/docs/assets/images/embedded-admin.png b/docs/assets/images/embedded-admin.png new file mode 100644 index 00000000..a75b56a6 Binary files /dev/null and b/docs/assets/images/embedded-admin.png differ diff --git a/docs/assets/images/embedded-nested.png b/docs/assets/images/embedded-nested.png new file mode 100644 index 00000000..1e296325 Binary files /dev/null and b/docs/assets/images/embedded-nested.png differ diff --git a/docs/assets/images/favicon.ico b/docs/assets/images/favicon.ico new file mode 100755 index 00000000..16b405f1 Binary files /dev/null and b/docs/assets/images/favicon.ico differ diff --git a/docs/assets/images/heart.png b/docs/assets/images/heart.png new file mode 100644 index 00000000..47a866c9 Binary files /dev/null and b/docs/assets/images/heart.png differ diff --git a/docs/assets/images/home/banner-cloud.png b/docs/assets/images/home/banner-cloud.png new file mode 100755 index 00000000..13e36140 Binary files /dev/null and b/docs/assets/images/home/banner-cloud.png differ diff --git a/docs/assets/images/home/banner-map-dark.svg b/docs/assets/images/home/banner-map-dark.svg new file mode 100755 index 00000000..08162bb8 --- /dev/null +++ b/docs/assets/images/home/banner-map-dark.svg @@ -0,0 +1,10370 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + MongoDB Document Mapper + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + + + + + + + { + } + + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + { + } + + + + + + + + + + + + { + } + + + + + + + { + } + + + + + + + { + } + + ] + [ + + + + + + + + + + + + + { + } + + + + + + + + + + + + + + + + + + + + + + + { + } + + } + { + + + + + + + + + + { + + + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + } + + [ + + + + + ] + + : + + + + + + + + + + + + { + } + + + + + + + + + + [ + + + + + ] + + : + + + + + diff --git a/docs/assets/images/home/banner-rand-dark-many6.png b/docs/assets/images/home/banner-rand-dark-many6.png new file mode 100755 index 00000000..8da56763 Binary files /dev/null and b/docs/assets/images/home/banner-rand-dark-many6.png differ diff --git a/docs/assets/images/home/banner-rand-dark-many7.png b/docs/assets/images/home/banner-rand-dark-many7.png new file mode 100755 index 00000000..fee0fe48 Binary files /dev/null and b/docs/assets/images/home/banner-rand-dark-many7.png differ diff --git a/docs/assets/images/home/cloud-tiles.png b/docs/assets/images/home/cloud-tiles.png new file mode 100755 index 00000000..df786c41 Binary files /dev/null and b/docs/assets/images/home/cloud-tiles.png differ diff --git a/docs/assets/images/home/cloud.png b/docs/assets/images/home/cloud.png new file mode 100755 index 00000000..72730edf Binary files /dev/null and b/docs/assets/images/home/cloud.png differ diff --git a/docs/assets/images/home/containers.svg b/docs/assets/images/home/containers.svg new file mode 100755 index 00000000..3940f785 --- /dev/null +++ b/docs/assets/images/home/containers.svg @@ -0,0 +1,412 @@ + +image/svg+xmlContainersDeploy frustration free Djongo containers on Google Cloud PlatformCreate and deploy a preset Ubuntu, Apache, MongoDB, PostgreSQL and Djongo instance on GCP. Choose between shared and dedicated VM instances. +Create AccountFocus on developing the models.py and views.py. Let djongo cloud services automate the rest. Manage access keys, modify subscription plans, and request support using the dashboard.Create AccountDjongoCSSourceDjongo5.4/20 GB370/500 MBConfigValueURLOSConnectionsStorageMemorySSH Keyhttps://api.djongomapper.com/usernameUbuntu 20.04; Apache 2.4.50MongoDB 5.0.8; PostgreSQL 14.4Upload diff --git a/docs/assets/images/home/cross.svg b/docs/assets/images/home/cross.svg new file mode 100755 index 00000000..ff7c4b8a --- /dev/null +++ b/docs/assets/images/home/cross.svg @@ -0,0 +1,228 @@ + +image/svg+xmlProductsDjango MongoDB connectorVirtualized containersCommercial licenseDjongoDjongoCSEnterpriseCreate AccountEnquire diff --git a/docs/assets/images/home/djongo-Nxt-v1.png b/docs/assets/images/home/djongo-Nxt-v1.png new file mode 100644 index 00000000..445a5d79 Binary files /dev/null and b/docs/assets/images/home/djongo-Nxt-v1.png differ diff --git a/docs/assets/images/home/djongo-name-logo.png b/docs/assets/images/home/djongo-name-logo.png new file mode 100755 index 00000000..07f9880c Binary files /dev/null and b/docs/assets/images/home/djongo-name-logo.png differ diff --git a/docs/assets/images/home/e2e.png b/docs/assets/images/home/e2e.png new file mode 100644 index 00000000..c6fcf051 Binary files /dev/null and b/docs/assets/images/home/e2e.png differ diff --git a/tests/dummy_app/__init__.py b/docs/assets/images/home/landing-banner-center.jpg similarity index 100% rename from tests/dummy_app/__init__.py rename to docs/assets/images/home/landing-banner-center.jpg diff --git a/docs/assets/images/home/landing-banner-narrow-2.png b/docs/assets/images/home/landing-banner-narrow-2.png new file mode 100755 index 00000000..d104b528 Binary files /dev/null and b/docs/assets/images/home/landing-banner-narrow-2.png differ diff --git a/docs/assets/images/home/landing-banner-narrow.jpg b/docs/assets/images/home/landing-banner-narrow.jpg new file mode 100644 index 00000000..bc7d4382 Binary files /dev/null and b/docs/assets/images/home/landing-banner-narrow.jpg differ diff --git a/docs/assets/images/home/mongo.jpg b/docs/assets/images/home/mongo.jpg new file mode 100755 index 00000000..db7fae66 Binary files /dev/null and b/docs/assets/images/home/mongo.jpg differ diff --git a/docs/assets/images/home/noSql.png b/docs/assets/images/home/noSql.png new file mode 100755 index 00000000..4f3b428c Binary files /dev/null and b/docs/assets/images/home/noSql.png differ diff --git a/docs/assets/images/home/query-green-own.png b/docs/assets/images/home/query-green-own.png new file mode 100755 index 00000000..16258661 Binary files /dev/null and b/docs/assets/images/home/query-green-own.png differ diff --git a/docs/assets/images/home/query-green.png b/docs/assets/images/home/query-green.png new file mode 100755 index 00000000..e501976b Binary files /dev/null and b/docs/assets/images/home/query-green.png differ diff --git a/docs/assets/images/home/rapid-levels.png b/docs/assets/images/home/rapid-levels.png new file mode 100755 index 00000000..9c5c30e9 Binary files /dev/null and b/docs/assets/images/home/rapid-levels.png differ diff --git a/docs/assets/images/home/rapid.png b/docs/assets/images/home/rapid.png new file mode 100755 index 00000000..ff8d42a3 Binary files /dev/null and b/docs/assets/images/home/rapid.png differ diff --git a/docs/assets/images/home/security-green.png b/docs/assets/images/home/security-green.png new file mode 100755 index 00000000..ff0330ec Binary files /dev/null and b/docs/assets/images/home/security-green.png differ diff --git a/docs/assets/images/home/security.png b/docs/assets/images/home/security.png new file mode 100755 index 00000000..522bb916 Binary files /dev/null and b/docs/assets/images/home/security.png differ diff --git a/docs/assets/images/home/sumeru.png b/docs/assets/images/home/sumeru.png new file mode 100644 index 00000000..f84e4745 Binary files /dev/null and b/docs/assets/images/home/sumeru.png differ diff --git a/docs/assets/images/home/support-new.png b/docs/assets/images/home/support-new.png new file mode 100755 index 00000000..7ffa2d6a Binary files /dev/null and b/docs/assets/images/home/support-new.png differ diff --git a/docs/assets/images/home/support.png b/docs/assets/images/home/support.png new file mode 100644 index 00000000..5d8e8ef4 Binary files /dev/null and b/docs/assets/images/home/support.png differ diff --git a/docs/assets/images/home/third-party-thin.png b/docs/assets/images/home/third-party-thin.png new file mode 100755 index 00000000..9c9bc314 Binary files /dev/null and b/docs/assets/images/home/third-party-thin.png differ diff --git a/docs/assets/images/home/third-party.png b/docs/assets/images/home/third-party.png new file mode 100755 index 00000000..16790fe4 Binary files /dev/null and b/docs/assets/images/home/third-party.png differ diff --git a/docs/assets/images/home/tick.svg b/docs/assets/images/home/tick.svg new file mode 100755 index 00000000..e743be8b --- /dev/null +++ b/docs/assets/images/home/tick.svg @@ -0,0 +1,228 @@ + +image/svg+xmlProductsDjango MongoDB connectorVirtualized containersCommercial licenseDjongoDjongoCSEnterpriseCreate AccountEnquire diff --git a/docs/assets/images/home/webpage.png b/docs/assets/images/home/webpage.png new file mode 100755 index 00000000..42ed09c7 Binary files /dev/null and b/docs/assets/images/home/webpage.png differ diff --git a/docs/assets/images/layers.png b/docs/assets/images/layers.png new file mode 100644 index 00000000..3db2e131 Binary files /dev/null and b/docs/assets/images/layers.png differ diff --git a/docs/assets/images/migration.png b/docs/assets/images/migration.png new file mode 100644 index 00000000..40f21c99 Binary files /dev/null and b/docs/assets/images/migration.png differ diff --git a/docs/assets/images/optimization2.png b/docs/assets/images/optimization2.png new file mode 100644 index 00000000..377ec6df Binary files /dev/null and b/docs/assets/images/optimization2.png differ diff --git a/docs/assets/images/orm2odm.png b/docs/assets/images/orm2odm.png new file mode 100644 index 00000000..988a148c Binary files /dev/null and b/docs/assets/images/orm2odm.png differ diff --git a/docs/assets/images/pizza.jpg b/docs/assets/images/pizza.jpg new file mode 100644 index 00000000..41cc63de Binary files /dev/null and b/docs/assets/images/pizza.jpg differ diff --git a/docs/assets/images/sql2mongodb.png b/docs/assets/images/sql2mongodb.png new file mode 100644 index 00000000..5fd515e6 Binary files /dev/null and b/docs/assets/images/sql2mongodb.png differ diff --git a/docs/assets/images/white.jpg b/docs/assets/images/white.jpg new file mode 100644 index 00000000..099f1799 Binary files /dev/null and b/docs/assets/images/white.jpg differ diff --git a/docs/assets/js/cookie-consent.js b/docs/assets/js/cookie-consent.js new file mode 100644 index 00000000..1a8007f3 --- /dev/null +++ b/docs/assets/js/cookie-consent.js @@ -0,0 +1,14 @@ +// A $( document ).ready() block. +$( document ).ready(function() { + const cookieName = 'user-cookie-consent'; + let hasConsented = Cookies.get(cookieName); + + if(hasConsented === 'true') { + $(".cookie-notice").css('display', 'none'); + } + + $("#cookie-accept").click(function () { + $(".cookie-notice").css('display', 'none'); + Cookies.set(cookieName, 'true'); + }) +}); \ No newline at end of file diff --git a/docs/assets/js/create-account.js b/docs/assets/js/create-account.js new file mode 100644 index 00000000..0139b37f --- /dev/null +++ b/docs/assets/js/create-account.js @@ -0,0 +1,17 @@ +import {API_BASE} from "./utils.js"; +import {CreateAccountPage} from "./create-account.page.js"; + +(() => { + const form = document.querySelector("form"); + const page = new CreateAccountPage(); + page.form.addEventListener( + 'submit', + evt => { + evt.preventDefault(); + document.querySelector('input[type="submit"]').disabled = true; + page.show('loader'); + page.sendToBackend(API_BASE); + }, + false) + +})() diff --git a/docs/assets/js/create-account.page.js b/docs/assets/js/create-account.page.js new file mode 100644 index 00000000..aa99a114 --- /dev/null +++ b/docs/assets/js/create-account.page.js @@ -0,0 +1,34 @@ +import {API_BASE, Page} from "./utils.js"; + +class CreateAccountPage extends Page { + constructor() { + let els = { + ok: document.getElementById('ok'), + userExists: document.getElementById('user-exists'), + loader: document.getElementById('loader') + } + super(els); + this.form = document.querySelector("form"); + } + + sendToBackend(API_BASE) { + let data = new FormData(this.form); + fetch(API_BASE + 'create-account/', + { method: 'POST', + body: data, + mode: 'cors' + }).then(resp => { + resp.json().then(result => { + this.hide('loader'); + if (result.status === 'OK') { + this.show('ok'); + } + else if (result.status === 'USER_EXISTS') { + this.show('userExists'); + } + }); + }) + } +} + +export {CreateAccountPage} diff --git a/docs/assets/js/dashboard.js b/docs/assets/js/dashboard.js new file mode 100644 index 00000000..40c5fb2f --- /dev/null +++ b/docs/assets/js/dashboard.js @@ -0,0 +1,21 @@ +import {Cookie, API_BASE} from "./utils.js"; + +(() => { + const loginRedirect = '/djongocs/login/' + + if (!Cookie.has('UserId')) { + window.location.href = loginRedirect; + return; + } + fetch(API_BASE + 'user-info/').then(resp => { + resp.json().then(user => { + if (user['status'] === "LOGIN_REQUIRED") { + window.location.href = loginRedirect; + } else if (user['status'] === 'OK') { + + } + }) + }, reason => { + //No error handling + }) +})() \ No newline at end of file diff --git a/docs/assets/js/dashboard.page.js b/docs/assets/js/dashboard.page.js new file mode 100644 index 00000000..40c5fb2f --- /dev/null +++ b/docs/assets/js/dashboard.page.js @@ -0,0 +1,21 @@ +import {Cookie, API_BASE} from "./utils.js"; + +(() => { + const loginRedirect = '/djongocs/login/' + + if (!Cookie.has('UserId')) { + window.location.href = loginRedirect; + return; + } + fetch(API_BASE + 'user-info/').then(resp => { + resp.json().then(user => { + if (user['status'] === "LOGIN_REQUIRED") { + window.location.href = loginRedirect; + } else if (user['status'] === 'OK') { + + } + }) + }, reason => { + //No error handling + }) +})() \ No newline at end of file diff --git a/tests/dummy_app/dummy/__init__.py b/docs/assets/js/login.js similarity index 100% rename from tests/dummy_app/dummy/__init__.py rename to docs/assets/js/login.js diff --git a/docs/assets/js/stripe-elements.js b/docs/assets/js/stripe-elements.js new file mode 100644 index 00000000..7a322547 --- /dev/null +++ b/docs/assets/js/stripe-elements.js @@ -0,0 +1,2 @@ +var stripe = Stripe('pk_test_XXXXXXXXXXXXXXXXX'); // use your test publishable key +var elements = stripe.elements(); diff --git a/docs/assets/js/test/create-account.js b/docs/assets/js/test/create-account.js new file mode 100644 index 00000000..b19c6c98 --- /dev/null +++ b/docs/assets/js/test/create-account.js @@ -0,0 +1,17 @@ +import {CreateAccountPage} from "../create-account.page.js"; +const API_BASE = 'http://127.0.0.1:8000/'; + +(() => { + const page = new CreateAccountPage(); + const form = document.querySelector("form"); + page.show('ok'); + + page.form.addEventListener( + 'submit', + evt => { + evt.preventDefault(); + document.querySelector('input[type="submit"]').disabled = true; + page.show('ok'); + }, false + ) +})() diff --git a/docs/assets/js/test/test.js b/docs/assets/js/test/test.js new file mode 100644 index 00000000..72887686 --- /dev/null +++ b/docs/assets/js/test/test.js @@ -0,0 +1 @@ +const TEST_API_BASE = 'http://127.0.0.1:8000/'; diff --git a/docs/assets/js/utils.js b/docs/assets/js/utils.js new file mode 100644 index 00000000..1472eb91 --- /dev/null +++ b/docs/assets/js/utils.js @@ -0,0 +1,55 @@ +const API_BASE = 'https://api.djongomapper.com/mapper/'; + +class Cookie { + constructor() { + } + + static has(key) { + return document.cookie.split(';'). + some(itm => itm.trim().startsWith(key + '=')) + } + + static get(key) { + let cookie = document.cookie.split(';'). + find(itm => itm.trim().startsWith(key + '=')); + if(cookie) { + return cookie.trim().split('=')[1]; + } + } + + static set(key, val) { + document.cookie = key + '=' + val + ';' + 'Secure'; + } +} + +class Page { + constructor(els) { + this.els = els; + } + + show(name) { + this.els[name].classList.remove('is-hidden'); + } + + hide(name) { + this.els[name].classList.add('is-hidden'); + } + + hideAll() { + for (const name in this.els){ + this.hide(name); + } + } + + showAll() { + for (const name in this.els){ + this.show(name); + } + } +} + +export { + Cookie, + API_BASE, + Page +} \ No newline at end of file diff --git a/docs/djongocs/3rdpartylicenses.txt b/docs/djongocs/3rdpartylicenses.txt new file mode 100644 index 00000000..2e68c7e1 --- /dev/null +++ b/docs/djongocs/3rdpartylicenses.txt @@ -0,0 +1,244 @@ +@angular/common +MIT + +@angular/core +MIT + +@angular/forms +MIT + +@angular/platform-browser +MIT + +@angular/router +MIT + +rxjs +Apache-2.0 + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +zone.js +MIT +The MIT License + +Copyright (c) 2010-2020 Google LLC. https://angular.io/license + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/docs/djongocs/create-account/index.html b/docs/djongocs/create-account/index.html new file mode 100644 index 00000000..7fb11b1a --- /dev/null +++ b/docs/djongocs/create-account/index.html @@ -0,0 +1,158 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/dashboard/index.html b/docs/djongocs/dashboard/index.html new file mode 100644 index 00000000..7fb11b1a --- /dev/null +++ b/docs/djongocs/dashboard/index.html @@ -0,0 +1,158 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/index.html b/docs/djongocs/index.html new file mode 100644 index 00000000..7fb11b1a --- /dev/null +++ b/docs/djongocs/index.html @@ -0,0 +1,158 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/login/index.html b/docs/djongocs/login/index.html new file mode 100644 index 00000000..7fb11b1a --- /dev/null +++ b/docs/djongocs/login/index.html @@ -0,0 +1,158 @@ + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+
+ + +
+
+ + + + + + \ No newline at end of file diff --git a/docs/djongocs/main.3134bea8b116a698.js b/docs/djongocs/main.3134bea8b116a698.js new file mode 100644 index 00000000..9efe88b7 --- /dev/null +++ b/docs/djongocs/main.3134bea8b116a698.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdjongo_FE=self.webpackChunkdjongo_FE||[]).push([[179],{169:()=>{function Un(e){return"function"==typeof e}let mo=!1;const vt={Promise:void 0,set useDeprecatedSynchronousErrorHandling(e){if(e){const t=new Error;console.warn("DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n"+t.stack)}else mo&&console.log("RxJS: Back to a better error behavior. Thank you. <3");mo=e},get useDeprecatedSynchronousErrorHandling(){return mo}};function Mn(e){setTimeout(()=>{throw e},0)}const Bi={closed:!0,next(e){},error(e){if(vt.useDeprecatedSynchronousErrorHandling)throw e;Mn(e)},complete(){}},Hi=Array.isArray||(e=>e&&"number"==typeof e.length);function tl(e){return null!==e&&"object"==typeof e}const Ui=(()=>{function e(t){return Error.call(this),this.message=t?`${t.length} errors occurred during unsubscription:\n${t.map((n,r)=>`${r+1}) ${n.toString()}`).join("\n ")}`:"",this.name="UnsubscriptionError",this.errors=t,this}return e.prototype=Object.create(Error.prototype),e})();class ye{constructor(t){this.closed=!1,this._parentOrParents=null,this._subscriptions=null,t&&(this._ctorUnsubscribe=!0,this._unsubscribe=t)}unsubscribe(){let t;if(this.closed)return;let{_parentOrParents:n,_ctorUnsubscribe:r,_unsubscribe:o,_subscriptions:i}=this;if(this.closed=!0,this._parentOrParents=null,this._subscriptions=null,n instanceof ye)n.remove(this);else if(null!==n)for(let s=0;st.concat(n instanceof Ui?n.errors:n),[])}ye.EMPTY=((e=new ye).closed=!0,e);const $i="function"==typeof Symbol?Symbol("rxSubscriber"):"@@rxSubscriber_"+Math.random();class fe extends ye{constructor(t,n,r){switch(super(),this.syncErrorValue=null,this.syncErrorThrown=!1,this.syncErrorThrowable=!1,this.isStopped=!1,arguments.length){case 0:this.destination=Bi;break;case 1:if(!t){this.destination=Bi;break}if("object"==typeof t){t instanceof fe?(this.syncErrorThrowable=t.syncErrorThrowable,this.destination=t,t.add(this)):(this.syncErrorThrowable=!0,this.destination=new If(this,t));break}default:this.syncErrorThrowable=!0,this.destination=new If(this,t,n,r)}}[$i](){return this}static create(t,n,r){const o=new fe(t,n,r);return o.syncErrorThrowable=!1,o}next(t){this.isStopped||this._next(t)}error(t){this.isStopped||(this.isStopped=!0,this._error(t))}complete(){this.isStopped||(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe())}_next(t){this.destination.next(t)}_error(t){this.destination.error(t),this.unsubscribe()}_complete(){this.destination.complete(),this.unsubscribe()}_unsubscribeAndRecycle(){const{_parentOrParents:t}=this;return this._parentOrParents=null,this.unsubscribe(),this.closed=!1,this.isStopped=!1,this._parentOrParents=t,this}}class If extends fe{constructor(t,n,r,o){super(),this._parentSubscriber=t;let i,s=this;Un(n)?i=n:n&&(i=n.next,r=n.error,o=n.complete,n!==Bi&&(s=Object.create(n),Un(s.unsubscribe)&&this.add(s.unsubscribe.bind(s)),s.unsubscribe=this.unsubscribe.bind(this))),this._context=s,this._next=i,this._error=r,this._complete=o}next(t){if(!this.isStopped&&this._next){const{_parentSubscriber:n}=this;vt.useDeprecatedSynchronousErrorHandling&&n.syncErrorThrowable?this.__tryOrSetError(n,this._next,t)&&this.unsubscribe():this.__tryOrUnsub(this._next,t)}}error(t){if(!this.isStopped){const{_parentSubscriber:n}=this,{useDeprecatedSynchronousErrorHandling:r}=vt;if(this._error)r&&n.syncErrorThrowable?(this.__tryOrSetError(n,this._error,t),this.unsubscribe()):(this.__tryOrUnsub(this._error,t),this.unsubscribe());else if(n.syncErrorThrowable)r?(n.syncErrorValue=t,n.syncErrorThrown=!0):Mn(t),this.unsubscribe();else{if(this.unsubscribe(),r)throw t;Mn(t)}}}complete(){if(!this.isStopped){const{_parentSubscriber:t}=this;if(this._complete){const n=()=>this._complete.call(this._context);vt.useDeprecatedSynchronousErrorHandling&&t.syncErrorThrowable?(this.__tryOrSetError(t,n),this.unsubscribe()):(this.__tryOrUnsub(n),this.unsubscribe())}else this.unsubscribe()}}__tryOrUnsub(t,n){try{t.call(this._context,n)}catch(r){if(this.unsubscribe(),vt.useDeprecatedSynchronousErrorHandling)throw r;Mn(r)}}__tryOrSetError(t,n,r){if(!vt.useDeprecatedSynchronousErrorHandling)throw new Error("bad call");try{n.call(this._context,r)}catch(o){return vt.useDeprecatedSynchronousErrorHandling?(t.syncErrorValue=o,t.syncErrorThrown=!0,!0):(Mn(o),!0)}return!1}_unsubscribe(){const{_parentSubscriber:t}=this;this._context=null,this._parentSubscriber=null,t.unsubscribe()}}const yo="function"==typeof Symbol&&Symbol.observable||"@@observable";function Gi(e){return e}let pe=(()=>{class e{constructor(n){this._isScalar=!1,n&&(this._subscribe=n)}lift(n){const r=new e;return r.source=this,r.operator=n,r}subscribe(n,r,o){const{operator:i}=this,s=function UC(e,t,n){if(e){if(e instanceof fe)return e;if(e[$i])return e[$i]()}return e||t||n?new fe(e,t,n):new fe(Bi)}(n,r,o);if(s.add(i?i.call(s,this.source):this.source||vt.useDeprecatedSynchronousErrorHandling&&!s.syncErrorThrowable?this._subscribe(s):this._trySubscribe(s)),vt.useDeprecatedSynchronousErrorHandling&&s.syncErrorThrowable&&(s.syncErrorThrowable=!1,s.syncErrorThrown))throw s.syncErrorValue;return s}_trySubscribe(n){try{return this._subscribe(n)}catch(r){vt.useDeprecatedSynchronousErrorHandling&&(n.syncErrorThrown=!0,n.syncErrorValue=r),function HC(e){for(;e;){const{closed:t,destination:n,isStopped:r}=e;if(t||r)return!1;e=n&&n instanceof fe?n:null}return!0}(n)?n.error(r):console.warn(r)}}forEach(n,r){return new(r=Tf(r))((o,i)=>{let s;s=this.subscribe(a=>{try{n(a)}catch(l){i(l),s&&s.unsubscribe()}},i,o)})}_subscribe(n){const{source:r}=this;return r&&r.subscribe(n)}[yo](){return this}pipe(...n){return 0===n.length?this:function Af(e){return 0===e.length?Gi:1===e.length?e[0]:function(n){return e.reduce((r,o)=>o(r),n)}}(n)(this)}toPromise(n){return new(n=Tf(n))((r,o)=>{let i;this.subscribe(s=>i=s,s=>o(s),()=>r(i))})}}return e.create=t=>new e(t),e})();function Tf(e){if(e||(e=vt.Promise||Promise),!e)throw new Error("no Promise impl found");return e}const pr=(()=>{function e(){return Error.call(this),this.message="object unsubscribed",this.name="ObjectUnsubscribedError",this}return e.prototype=Object.create(Error.prototype),e})();class $C extends ye{constructor(t,n){super(),this.subject=t,this.subscriber=n,this.closed=!1}unsubscribe(){if(this.closed)return;this.closed=!0;const t=this.subject,n=t.observers;if(this.subject=null,!n||0===n.length||t.isStopped||t.closed)return;const r=n.indexOf(this.subscriber);-1!==r&&n.splice(r,1)}}class xf extends fe{constructor(t){super(t),this.destination=t}}let Ut=(()=>{class e extends pe{constructor(){super(),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}[$i](){return new xf(this)}lift(n){const r=new Nf(this,this);return r.operator=n,r}next(n){if(this.closed)throw new pr;if(!this.isStopped){const{observers:r}=this,o=r.length,i=r.slice();for(let s=0;snew Nf(t,n),e})();class Nf extends Ut{constructor(t,n){super(),this.destination=t,this.source=n}next(t){const{destination:n}=this;n&&n.next&&n.next(t)}error(t){const{destination:n}=this;n&&n.error&&this.destination.error(t)}complete(){const{destination:t}=this;t&&t.complete&&this.destination.complete()}_subscribe(t){const{source:n}=this;return n?this.source.subscribe(t):ye.EMPTY}}function zi(e){return e&&"function"==typeof e.schedule}function Y(e,t){return function(r){if("function"!=typeof e)throw new TypeError("argument is not a function. Are you looking for `mapTo()`?");return r.lift(new GC(e,t))}}class GC{constructor(t,n){this.project=t,this.thisArg=n}call(t,n){return n.subscribe(new zC(t,this.project,this.thisArg))}}class zC extends fe{constructor(t,n,r){super(t),this.project=n,this.count=0,this.thisArg=r||this}_next(t){let n;try{n=this.project.call(this.thisArg,t,this.count++)}catch(r){return void this.destination.error(r)}this.destination.next(n)}}const Rf=e=>t=>{for(let n=0,r=e.length;ne&&"number"==typeof e.length&&"function"!=typeof e;function Pf(e){return!!e&&"function"!=typeof e.subscribe&&"function"==typeof e.then}const nl=e=>{if(e&&"function"==typeof e[yo])return(e=>t=>{const n=e[yo]();if("function"!=typeof n.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return n.subscribe(t)})(e);if(Ff(e))return Rf(e);if(Pf(e))return(e=>t=>(e.then(n=>{t.closed||(t.next(n),t.complete())},n=>t.error(n)).then(null,Mn),t))(e);if(e&&"function"==typeof e[qi])return(e=>t=>{const n=e[qi]();for(;;){let r;try{r=n.next()}catch(o){return t.error(o),t}if(r.done){t.complete();break}if(t.next(r.value),t.closed)break}return"function"==typeof n.return&&t.add(()=>{n.return&&n.return()}),t})(e);{const n=`You provided ${tl(e)?"an invalid object":`'${e}'`} where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.`;throw new TypeError(n)}};function rl(e,t){return new pe(n=>{const r=new ye;let o=0;return r.add(t.schedule(function(){o!==e.length?(n.next(e[o++]),n.closed||r.add(this.schedule())):n.complete()})),r})}function Oe(e,t){return t?function tw(e,t){if(null!=e){if(function XC(e){return e&&"function"==typeof e[yo]}(e))return function ZC(e,t){return new pe(n=>{const r=new ye;return r.add(t.schedule(()=>{const o=e[yo]();r.add(o.subscribe({next(i){r.add(t.schedule(()=>n.next(i)))},error(i){r.add(t.schedule(()=>n.error(i)))},complete(){r.add(t.schedule(()=>n.complete()))}}))})),r})}(e,t);if(Pf(e))return function YC(e,t){return new pe(n=>{const r=new ye;return r.add(t.schedule(()=>e.then(o=>{r.add(t.schedule(()=>{n.next(o),r.add(t.schedule(()=>n.complete()))}))},o=>{r.add(t.schedule(()=>n.error(o)))}))),r})}(e,t);if(Ff(e))return rl(e,t);if(function ew(e){return e&&"function"==typeof e[qi]}(e)||"string"==typeof e)return function JC(e,t){if(!e)throw new Error("Iterable cannot be null");return new pe(n=>{const r=new ye;let o;return r.add(()=>{o&&"function"==typeof o.return&&o.return()}),r.add(t.schedule(()=>{o=e[qi](),r.add(t.schedule(function(){if(n.closed)return;let i,s;try{const a=o.next();i=a.value,s=a.done}catch(a){return void n.error(a)}s?n.complete():(n.next(i),this.schedule())}))})),r})}(e,t)}throw new TypeError((null!==e&&typeof e||e)+" is not observable")}(e,t):e instanceof pe?e:new pe(nl(e))}class ol extends fe{constructor(t){super(),this.parent=t}_next(t){this.parent.notifyNext(t)}_error(t){this.parent.notifyError(t),this.unsubscribe()}_complete(){this.parent.notifyComplete(),this.unsubscribe()}}class il extends fe{notifyNext(t){this.destination.next(t)}notifyError(t){this.destination.error(t)}notifyComplete(){this.destination.complete()}}function sl(e,t){if(t.closed)return;if(e instanceof pe)return e.subscribe(t);let n;try{n=nl(e)(t)}catch(r){t.error(r)}return n}function Ve(e,t,n=Number.POSITIVE_INFINITY){return"function"==typeof t?r=>r.pipe(Ve((o,i)=>Oe(e(o,i)).pipe(Y((s,a)=>t(o,s,i,a))),n)):("number"==typeof t&&(n=t),r=>r.lift(new nw(e,n)))}class nw{constructor(t,n=Number.POSITIVE_INFINITY){this.project=t,this.concurrent=n}call(t,n){return n.subscribe(new rw(t,this.project,this.concurrent))}}class rw extends il{constructor(t,n,r=Number.POSITIVE_INFINITY){super(t),this.project=n,this.concurrent=r,this.hasCompleted=!1,this.buffer=[],this.active=0,this.index=0}_next(t){this.active0?this._next(t.shift()):0===this.active&&this.hasCompleted&&this.destination.complete()}}function gr(e=Number.POSITIVE_INFINITY){return Ve(Gi,e)}function al(e,t){return t?rl(e,t):new pe(Rf(e))}function Wi(){return function(t){return t.lift(new iw(t))}}class iw{constructor(t){this.connectable=t}call(t,n){const{connectable:r}=this;r._refCount++;const o=new sw(t,r),i=n.subscribe(o);return o.closed||(o.connection=r.connect()),i}}class sw extends fe{constructor(t,n){super(t),this.connectable=n}_unsubscribe(){const{connectable:t}=this;if(!t)return void(this.connection=null);this.connectable=null;const n=t._refCount;if(n<=0)return void(this.connection=null);if(t._refCount=n-1,n>1)return void(this.connection=null);const{connection:r}=this,o=t._connection;this.connection=null,o&&(!r||o===r)&&o.unsubscribe()}}class ll extends pe{constructor(t,n){super(),this.source=t,this.subjectFactory=n,this._refCount=0,this._isComplete=!1}_subscribe(t){return this.getSubject().subscribe(t)}getSubject(){const t=this._subject;return(!t||t.isStopped)&&(this._subject=this.subjectFactory()),this._subject}connect(){let t=this._connection;return t||(this._isComplete=!1,t=this._connection=new ye,t.add(this.source.subscribe(new lw(this.getSubject(),this))),t.closed&&(this._connection=null,t=ye.EMPTY)),t}refCount(){return Wi()(this)}}const aw=(()=>{const e=ll.prototype;return{operator:{value:null},_refCount:{value:0,writable:!0},_subject:{value:null,writable:!0},_connection:{value:null,writable:!0},_subscribe:{value:e._subscribe},_isComplete:{value:e._isComplete,writable:!0},getSubject:{value:e.getSubject},connect:{value:e.connect},refCount:{value:e.refCount}}})();class lw extends xf{constructor(t,n){super(t),this.connectable=n}_error(t){this._unsubscribe(),super._error(t)}_complete(){this.connectable._isComplete=!0,this._unsubscribe(),super._complete()}_unsubscribe(){const t=this.connectable;if(t){this.connectable=null;const n=t._connection;t._refCount=0,t._subject=null,t._connection=null,n&&n.unsubscribe()}}}class dw{constructor(t,n){this.subjectFactory=t,this.selector=n}call(t,n){const{selector:r}=this,o=this.subjectFactory(),i=r(o).subscribe(t);return i.add(n.subscribe(o)),i}}function fw(){return new Ut}function oe(e){for(let t in e)if(e[t]===oe)return t;throw Error("Could not find renamed property on target object.")}function ul(e,t){for(const n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function ie(e){if("string"==typeof e)return e;if(Array.isArray(e))return"["+e.map(ie).join(", ")+"]";if(null==e)return""+e;if(e.overriddenName)return`${e.overriddenName}`;if(e.name)return`${e.name}`;const t=e.toString();if(null==t)return""+t;const n=t.indexOf("\n");return-1===n?t:t.substring(0,n)}function cl(e,t){return null==e||""===e?null===t?"":t:null==t||""===t?e:e+" "+t}const pw=oe({__forward_ref__:oe});function ae(e){return e.__forward_ref__=ae,e.toString=function(){return ie(this())},e}function F(e){return dl(e)?e():e}function dl(e){return"function"==typeof e&&e.hasOwnProperty(pw)&&e.__forward_ref__===ae}class U extends Error{constructor(t,n){super(function Ki(e,t){return`NG0${Math.abs(e)}${t?": "+t.trim():""}`}(t,n)),this.code=t}}function j(e){return"string"==typeof e?e:null==e?"":String(e)}function Qi(e,t){throw new U(-201,!1)}function at(e,t){null==e&&function J(e,t,n,r){throw new Error(`ASSERTION ERROR: ${e}`+(null==r?"":` [Expected=> ${n} ${r} ${t} <=Actual]`))}(t,e,null,"!=")}function O(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function lt(e){return{providers:e.providers||[],imports:e.imports||[]}}function fl(e){return Of(e,Zi)||Of(e,Vf)}function Of(e,t){return e.hasOwnProperty(t)?e[t]:null}function kf(e){return e&&(e.hasOwnProperty(hl)||e.hasOwnProperty(ww))?e[hl]:null}const Zi=oe({\u0275prov:oe}),hl=oe({\u0275inj:oe}),Vf=oe({ngInjectableDef:oe}),ww=oe({ngInjectorDef:oe});var x=(()=>((x=x||{})[x.Default=0]="Default",x[x.Host=1]="Host",x[x.Self=2]="Self",x[x.SkipSelf=4]="SkipSelf",x[x.Optional=8]="Optional",x))();let pl;function $t(e){const t=pl;return pl=e,t}function Lf(e,t,n){const r=fl(e);return r&&"root"==r.providedIn?void 0===r.value?r.value=r.factory():r.value:n&x.Optional?null:void 0!==t?t:void Qi(ie(e))}function Sn(e){return{toString:e}.toString()}var At=(()=>((At=At||{})[At.OnPush=0]="OnPush",At[At.Default=1]="Default",At))(),Gt=(()=>(function(e){e[e.Emulated=0]="Emulated",e[e.None=2]="None",e[e.ShadowDom=3]="ShadowDom"}(Gt||(Gt={})),Gt))();const te=(()=>typeof globalThis<"u"&&globalThis||typeof global<"u"&&global||typeof window<"u"&&window||typeof self<"u"&&typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&self)(),mr={},Z=[],Yi=oe({\u0275cmp:oe}),gl=oe({\u0275dir:oe}),ml=oe({\u0275pipe:oe}),jf=oe({\u0275mod:oe}),un=oe({\u0275fac:oe}),vo=oe({__NG_ELEMENT_ID__:oe});let bw=0;function zt(e){return Sn(()=>{const n=!0===e.standalone,r={},o={type:e.type,providersResolver:null,decls:e.decls,vars:e.vars,factory:null,template:e.template||null,consts:e.consts||null,ngContentSelectors:e.ngContentSelectors,hostBindings:e.hostBindings||null,hostVars:e.hostVars||0,hostAttrs:e.hostAttrs||null,contentQueries:e.contentQueries||null,declaredInputs:r,inputs:null,outputs:null,exportAs:e.exportAs||null,onPush:e.changeDetection===At.OnPush,directiveDefs:null,pipeDefs:null,standalone:n,dependencies:n&&e.dependencies||null,getStandaloneInjector:null,selectors:e.selectors||Z,viewQuery:e.viewQuery||null,features:e.features||null,data:e.data||{},encapsulation:e.encapsulation||Gt.Emulated,id:"c"+bw++,styles:e.styles||Z,_:null,setInput:null,schemas:e.schemas||null,tView:null},i=e.dependencies,s=e.features;return o.inputs=Uf(e.inputs,r),o.outputs=Uf(e.outputs),s&&s.forEach(a=>a(o)),o.directiveDefs=i?()=>("function"==typeof i?i():i).map(Bf).filter(Hf):null,o.pipeDefs=i?()=>("function"==typeof i?i():i).map(Ke).filter(Hf):null,o})}function Bf(e){return se(e)||We(e)}function Hf(e){return null!==e}const Sw={};function _t(e){return Sn(()=>{const t={type:e.type,bootstrap:e.bootstrap||Z,declarations:e.declarations||Z,imports:e.imports||Z,exports:e.exports||Z,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null};return null!=e.id&&(Sw[e.id]=e.type),t})}function Uf(e,t){if(null==e)return mr;const n={};for(const r in e)if(e.hasOwnProperty(r)){let o=e[r],i=o;Array.isArray(o)&&(i=o[1],o=o[0]),n[o]=r,t&&(t[o]=i)}return n}const R=zt;function se(e){return e[Yi]||null}function We(e){return e[gl]||null}function Ke(e){return e[ml]||null}function ut(e,t){const n=e[jf]||null;if(!n&&!0===t)throw new Error(`Type ${ie(e)} does not have '\u0275mod' property.`);return n}const $=11;function ot(e){return Array.isArray(e)&&"object"==typeof e[1]}function xt(e){return Array.isArray(e)&&!0===e[1]}function _l(e){return 0!=(8&e.flags)}function ts(e){return 2==(2&e.flags)}function ns(e){return 1==(1&e.flags)}function Nt(e){return null!==e.template}function Nw(e){return 0!=(256&e[2])}function Wn(e,t){return e.hasOwnProperty(un)?e[un]:null}class Pw{constructor(t,n,r){this.previousValue=t,this.currentValue=n,this.firstChange=r}isFirstChange(){return this.firstChange}}function Ct(){return zf}function zf(e){return e.type.prototype.ngOnChanges&&(e.setInput=kw),Ow}function Ow(){const e=Wf(this),t=e?.current;if(t){const n=e.previous;if(n===mr)e.previous=t;else for(let r in t)n[r]=t[r];e.current=null,this.ngOnChanges(t)}}function kw(e,t,n,r){const o=Wf(e)||function Vw(e,t){return e[qf]=t}(e,{previous:mr,current:null}),i=o.current||(o.current={}),s=o.previous,a=this.declaredInputs[n],l=s[a];i[a]=new Pw(l&&l.currentValue,t,s===mr),e[r]=t}Ct.ngInherit=!0;const qf="__ngSimpleChanges__";function Wf(e){return e[qf]||null}let bl;function ve(e){return!!e.listen}const Kf={createRenderer:(e,t)=>function Ml(){return void 0!==bl?bl:typeof document<"u"?document:void 0}()};function Ee(e){for(;Array.isArray(e);)e=e[0];return e}function rs(e,t){return Ee(t[e])}function Et(e,t){return Ee(t[e.index])}function Sl(e,t){return e.data[t]}function dt(e,t){const n=t[e];return ot(n)?n:n[0]}function Qf(e){return 4==(4&e[2])}function Il(e){return 64==(64&e[2])}function In(e,t){return null==t?null:e[t]}function Zf(e){e[18]=0}function Al(e,t){e[5]+=t;let n=e,r=e[3];for(;null!==r&&(1===t&&1===n[5]||-1===t&&0===n[5]);)r[5]+=t,n=r,r=r[3]}const k={lFrame:ih(null),bindingsEnabled:!0};function Jf(){return k.bindingsEnabled}function y(){return k.lFrame.lView}function K(){return k.lFrame.tView}function Kn(e){return k.lFrame.contextLView=e,e[8]}function Qn(e){return k.lFrame.contextLView=null,e}function Te(){let e=Xf();for(;null!==e&&64===e.type;)e=e.parent;return e}function Xf(){return k.lFrame.currentTNode}function qt(e,t){const n=k.lFrame;n.currentTNode=e,n.isParent=t}function Tl(){return k.lFrame.isParent}function wr(){return k.lFrame.bindingIndex++}function dn(e){const t=k.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function eE(e,t){const n=k.lFrame;n.bindingIndex=n.bindingRootIndex=e,Nl(t)}function Nl(e){k.lFrame.currentDirectiveIndex=e}function nh(){return k.lFrame.currentQueryIndex}function Fl(e){k.lFrame.currentQueryIndex=e}function nE(e){const t=e[1];return 2===t.type?t.declTNode:1===t.type?e[6]:null}function rh(e,t,n){if(n&x.SkipSelf){let o=t,i=e;for(;!(o=o.parent,null!==o||n&x.Host||(o=nE(i),null===o||(i=i[15],10&o.type))););if(null===o)return!1;t=o,e=i}const r=k.lFrame=oh();return r.currentTNode=t,r.lView=e,!0}function is(e){const t=oh(),n=e[1];k.lFrame=t,t.currentTNode=n.firstChild,t.lView=e,t.tView=n,t.contextLView=e,t.bindingIndex=n.bindingStartIndex,t.inI18n=!1}function oh(){const e=k.lFrame,t=null===e?null:e.child;return null===t?ih(e):t}function ih(e){const t={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:e,child:null,inI18n:!1};return null!==e&&(e.child=t),t}function sh(){const e=k.lFrame;return k.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}const ah=sh;function ss(){const e=sh();e.isParent=!0,e.tView=null,e.selectedIndex=-1,e.contextLView=null,e.elementDepthCount=0,e.currentDirectiveIndex=-1,e.currentNamespace=null,e.bindingRootIndex=-1,e.bindingIndex=-1,e.currentQueryIndex=0}function Ze(){return k.lFrame.selectedIndex}function An(e){k.lFrame.selectedIndex=e}function _e(){const e=k.lFrame;return Sl(e.tView,e.selectedIndex)}function Er(){k.lFrame.currentNamespace="svg"}function Eo(){!function sE(){k.lFrame.currentNamespace=null}()}function as(e,t){for(let n=t.directiveStart,r=t.directiveEnd;n=r)break}else t[l]<0&&(e[18]+=65536),(a>11>16&&(3&e[2])===t){e[2]+=2048;try{i.call(a)}finally{}}}else try{i.call(a)}finally{}}class bo{constructor(t,n,r){this.factory=t,this.resolving=!1,this.canSeeViewProviders=n,this.injectImpl=r}}function cs(e,t,n){const r=ve(e);let o=0;for(;ot){s=i-1;break}}}for(;i>16}(e),r=t;for(;n>0;)r=r[15],n--;return r}let Vl=!0;function fs(e){const t=Vl;return Vl=e,t}let gE=0;const Wt={};function So(e,t){const n=jl(e,t);if(-1!==n)return n;const r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,Ll(r.data,e),Ll(t,null),Ll(r.blueprint,null));const o=hs(e,t),i=e.injectorIndex;if(dh(o)){const s=br(o),a=Mr(o,t),l=a[1].data;for(let u=0;u<8;u++)t[i+u]=a[s+u]|l[s+u]}return t[i+8]=o,i}function Ll(e,t){e.push(0,0,0,0,0,0,0,0,t)}function jl(e,t){return-1===e.injectorIndex||e.parent&&e.parent.injectorIndex===e.injectorIndex||null===t[e.injectorIndex+8]?-1:e.injectorIndex}function hs(e,t){if(e.parent&&-1!==e.parent.injectorIndex)return e.parent.injectorIndex;let n=0,r=null,o=t;for(;null!==o;){if(r=Dh(o),null===r)return-1;if(n++,o=o[15],-1!==r.injectorIndex)return r.injectorIndex|n<<16}return-1}function ps(e,t,n){!function mE(e,t,n){let r;"string"==typeof n?r=n.charCodeAt(0)||0:n.hasOwnProperty(vo)&&(r=n[vo]),null==r&&(r=n[vo]=gE++);const o=255&r;t.data[e+(o>>5)]|=1<=0?255&t:DE:t}(n);if("function"==typeof i){if(!rh(t,e,r))return r&x.Host?ph(o,0,r):gh(t,n,r,o);try{const s=i(r);if(null!=s||r&x.Optional)return s;Qi()}finally{ah()}}else if("number"==typeof i){let s=null,a=jl(e,t),l=-1,u=r&x.Host?t[16][6]:null;for((-1===a||r&x.SkipSelf)&&(l=-1===a?hs(e,t):t[a+8],-1!==l&&_h(r,!1)?(s=t[1],a=br(l),t=Mr(l,t)):a=-1);-1!==a;){const c=t[1];if(vh(i,a,c.data)){const d=vE(a,t,n,s,r,u);if(d!==Wt)return d}l=t[a+8],-1!==l&&_h(r,t[1].data[a+8]===u)&&vh(i,a,t)?(s=c,a=br(l),t=Mr(l,t)):a=-1}}return o}function vE(e,t,n,r,o,i){const s=t[1],a=s.data[e+8],c=gs(a,s,n,null==r?ts(a)&&Vl:r!=s&&0!=(3&a.type),o&x.Host&&i===a);return null!==c?Io(t,s,c,a):Wt}function gs(e,t,n,r,o){const i=e.providerIndexes,s=t.data,a=1048575&i,l=e.directiveStart,c=i>>20,f=o?a+c:e.directiveEnd;for(let h=r?a:a+c;h=l&&p.type===n)return h}if(o){const h=s[l];if(h&&Nt(h)&&h.type===n)return l}return null}function Io(e,t,n,r){let o=e[n];const i=t.data;if(function cE(e){return e instanceof bo}(o)){const s=o;s.resolving&&function gw(e,t){const n=t?`. Dependency path: ${t.join(" > ")} > ${e}`:"";throw new U(-200,`Circular dependency in DI detected for ${e}${n}`)}(function Q(e){return"function"==typeof e?e.name||e.toString():"object"==typeof e&&null!=e&&"function"==typeof e.type?e.type.name||e.type.toString():j(e)}(i[n]));const a=fs(s.canSeeViewProviders);s.resolving=!0;const l=s.injectImpl?$t(s.injectImpl):null;rh(e,r,x.Default);try{o=e[n]=s.factory(void 0,i,e,r),t.firstCreatePass&&n>=r.directiveStart&&function lE(e,t,n){const{ngOnChanges:r,ngOnInit:o,ngDoCheck:i}=t.type.prototype;if(r){const s=zf(t);(n.preOrderHooks||(n.preOrderHooks=[])).push(e,s),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(e,s)}o&&(n.preOrderHooks||(n.preOrderHooks=[])).push(0-e,o),i&&((n.preOrderHooks||(n.preOrderHooks=[])).push(e,i),(n.preOrderCheckHooks||(n.preOrderCheckHooks=[])).push(e,i))}(n,i[n],t)}finally{null!==l&&$t(l),fs(a),s.resolving=!1,ah()}}return o}function vh(e,t,n){return!!(n[t+(e>>5)]&1<{const t=e.prototype.constructor,n=t[un]||Bl(t),r=Object.prototype;let o=Object.getPrototypeOf(e.prototype).constructor;for(;o&&o!==r;){const i=o[un]||Bl(o);if(i&&i!==n)return i;o=Object.getPrototypeOf(o)}return i=>new i})}function Bl(e){return dl(e)?()=>{const t=Bl(F(e));return t&&t()}:Wn(e)}function Dh(e){const t=e[1],n=t.type;return 2===n?t.declTNode:1===n?e[6]:null}function Ao(e){return function yE(e,t){if("class"===t)return e.classes;if("style"===t)return e.styles;const n=e.attrs;if(n){const r=n.length;let o=0;for(;o{const r=function Hl(e){return function(...n){if(e){const r=e(...n);for(const o in r)this[o]=r[o]}}}(t);function o(...i){if(this instanceof o)return r.apply(this,i),this;const s=new o(...i);return a.annotation=s,a;function a(l,u,c){const d=l.hasOwnProperty(Ar)?l[Ar]:Object.defineProperty(l,Ar,{value:[]})[Ar];for(;d.length<=c;)d.push(null);return(d[c]=d[c]||[]).push(s),l}}return n&&(o.prototype=Object.create(n.prototype)),o.prototype.ngMetadataName=e,o.annotationCls=o,o})}class P{constructor(t,n){this._desc=t,this.ngMetadataName="InjectionToken",this.\u0275prov=void 0,"number"==typeof n?this.__NG_ELEMENT_ID__=n:void 0!==n&&(this.\u0275prov=O({token:this,providedIn:n.providedIn||"root",factory:n.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}}const EE=new P("AnalyzeForEntryComponents");function ft(e,t){void 0===t&&(t=e);for(let n=0;nArray.isArray(n)?fn(n,t):t(n))}function wh(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function ms(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function ht(e,t,n){let r=Nr(e,t);return r>=0?e[1|r]=n:(r=~r,function SE(e,t,n,r){let o=e.length;if(o==t)e.push(n,r);else if(1===o)e.push(r,e[0]),e[0]=n;else{for(o--,e.push(e[o-1],e[o]);o>t;)e[o]=e[o-2],o--;e[t]=n,e[t+1]=r}}(e,r,t,n)),r}function $l(e,t){const n=Nr(e,t);if(n>=0)return e[1|n]}function Nr(e,t){return function Mh(e,t,n){let r=0,o=e.length>>n;for(;o!==r;){const i=r+(o-r>>1),s=e[i<t?o=i:r=i+1}return~(o<({token:e})),-1),hn=Po(xr("Optional"),8),Oo=Po(xr("SkipSelf"),4);function tu(e){return e.ngOriginalError}class Pr{constructor(){this._console=console}handleError(t){const n=this._findOriginalError(t);this._console.error("ERROR",t),n&&this._console.error("ORIGINAL ERROR",n)}_findOriginalError(t){let n=t&&tu(t);for(;n&&tu(n);)n=tu(n);return n||null}}const nu=new Map;let xb=0;const ou="__ngContext__";function He(e,t){ot(t)?(e[ou]=t[20],function Rb(e){nu.set(e[20],e)}(t)):e[ou]=t}function Ho(e){const t=e[ou];return"number"==typeof t?function Kh(e){return nu.get(e)||null}(t):t||null}function iu(e){const t=Ho(e);return t?ot(t)?t:t.lView:null}const Hb=(()=>(typeof requestAnimationFrame<"u"&&requestAnimationFrame||setTimeout).bind(te))();function pn(e){return e instanceof Function?e():e}var pt=(()=>((pt=pt||{})[pt.Important=1]="Important",pt[pt.DashCase=2]="DashCase",pt))();function au(e,t){return undefined(e,t)}function Uo(e){const t=e[3];return xt(t)?t[3]:t}function lu(e){return rp(e[13])}function uu(e){return rp(e[4])}function rp(e){for(;null!==e&&!xt(e);)e=e[4];return e}function kr(e,t,n,r,o){if(null!=r){let i,s=!1;xt(r)?i=r:ot(r)&&(s=!0,r=r[0]);const a=Ee(r);0===e&&null!==n?null==o?up(t,n,a):Zn(t,n,a,o||null,!0):1===e&&null!==n?Zn(t,n,a,o||null,!0):2===e?function yp(e,t,n){const r=Is(e,t);r&&function nM(e,t,n,r){ve(e)?e.removeChild(t,n,r):t.removeChild(n)}(e,r,t,n)}(t,a,s):3===e&&t.destroyNode(a),null!=i&&function iM(e,t,n,r,o){const i=n[7];i!==Ee(n)&&kr(t,e,r,i,o);for(let a=10;a0&&(e[n-1][4]=r[4]);const i=ms(e,10+t);!function Kb(e,t){$o(e,t,t[$],2,null,null),t[0]=null,t[6]=null}(r[1],r);const s=i[19];null!==s&&s.detachView(i[1]),r[3]=null,r[4]=null,r[2]&=-65}return r}function sp(e,t){if(!(128&t[2])){const n=t[$];ve(n)&&n.destroyNode&&$o(e,t,n,3,null,null),function Yb(e){let t=e[13];if(!t)return hu(e[1],e);for(;t;){let n=null;if(ot(t))n=t[13];else{const r=t[10];r&&(n=r)}if(!n){for(;t&&!t[4]&&t!==e;)ot(t)&&hu(t[1],t),t=t[3];null===t&&(t=e),ot(t)&&hu(t[1],t),n=t&&t[4]}t=n}}(t)}}function hu(e,t){if(!(128&t[2])){t[2]&=-65,t[2]|=128,function tM(e,t){let n;if(null!=e&&null!=(n=e.destroyHooks))for(let r=0;r=0?r[o=u]():r[o=-u].unsubscribe(),i+=2}else{const s=r[o=n[i+1]];n[i].call(s)}if(null!==r){for(let i=o+1;ii?"":o[d+1].toLowerCase();const h=8&r?f:null;if(h&&-1!==Dp(h,u,0)||2&r&&u!==f){if(Rt(r))return!1;s=!0}}}}else{if(!s&&!Rt(r)&&!Rt(l))return!1;if(s&&Rt(l))continue;s=!1,r=l|1&r}}return Rt(r)||s}function Rt(e){return 0==(1&e)}function cM(e,t,n,r){if(null===t)return-1;let o=0;if(r||!n){let i=!1;for(;o-1)for(n++;n0?'="'+a+'"':"")+"]"}else 8&r?o+="."+s:4&r&&(o+=" "+s);else""!==o&&!Rt(s)&&(t+=bp(i,o),o=""),r=s,i=i||!Rt(r);n++}return""!==o&&(t+=bp(i,o)),t}const B={};function X(e){Mp(K(),y(),Ze()+e,!1)}function Mp(e,t,n,r){if(!r)if(3==(3&t[2])){const i=e.preOrderCheckHooks;null!==i&&ls(t,i,n)}else{const i=e.preOrderHooks;null!==i&&us(t,i,0,n)}An(n)}const Tp=new P("ENVIRONMENT_INITIALIZER"),xp=new P("INJECTOR_DEF_TYPES");function EM(...e){return{\u0275providers:Np(0,e)}}function Np(e,...t){const n=[],r=new Set;let o;return fn(t,i=>{const s=i;vu(s,n,[],r)&&(o||(o=[]),o.push(s))}),void 0!==o&&Rp(o,n),n}function Rp(e,t){for(let n=0;n{t.push(i)})}}function vu(e,t,n,r){if(!(e=F(e)))return!1;let o=null,i=kf(e);const s=!i&&se(e);if(i||s){if(s&&!s.standalone)return!1;o=e}else{const l=e.ngModule;if(i=kf(l),!i)return!1;o=l}const a=r.has(o);if(s){if(a)return!1;if(r.add(o),s.dependencies){const l="function"==typeof s.dependencies?s.dependencies():s.dependencies;for(const u of l)vu(u,t,n,r)}}else{if(!i)return!1;{if(null!=i.imports&&!a){let u;r.add(o);try{fn(i.imports,c=>{vu(c,t,n,r)&&(u||(u=[]),u.push(c))})}finally{}void 0!==u&&Rp(u,t)}if(!a){const u=Wn(o)||(()=>new o);t.push({provide:o,useFactory:u,deps:Z},{provide:xp,useValue:o,multi:!0},{provide:Tp,useValue:()=>S(o),multi:!0})}const l=i.providers;null==l||a||fn(l,c=>{t.push(c)})}}return o!==e&&void 0!==e.providers}const bM=oe({provide:String,useValue:oe});function _u(e){return null!==e&&"object"==typeof e&&bM in e}function Yn(e){return"function"==typeof e}const Du=new P("INJECTOR",-1);class Op{get(t,n=Ro){if(n===Ro){const r=new Error(`NullInjectorError: No provider for ${ie(t)}!`);throw r.name="NullInjectorError",r}return n}}const Cu=new P("Set Injector scope."),xs={},SM={};let wu;function Eu(){return void 0===wu&&(wu=new Op),wu}class Jn{}class kp extends Jn{constructor(t,n,r,o){super(),this.parent=n,this.source=r,this.scopes=o,this.records=new Map,this._ngOnDestroyHooks=new Set,this._onDestroyHooks=[],this._destroyed=!1,Mu(t,s=>this.processProvider(s)),this.records.set(Du,Vr(void 0,this)),o.has("environment")&&this.records.set(Jn,Vr(void 0,this));const i=this.records.get(Cu);null!=i&&"string"==typeof i.value&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(xp.multi,Z,x.Self))}get destroyed(){return this._destroyed}destroy(){this.assertNotDestroyed(),this._destroyed=!0;try{for(const t of this._ngOnDestroyHooks)t.ngOnDestroy();for(const t of this._onDestroyHooks)t()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),this._onDestroyHooks.length=0}}onDestroy(t){this._onDestroyHooks.push(t)}get(t,n=Ro,r=x.Default){this.assertNotDestroyed();const o=_s(this),i=$t(void 0);try{if(!(r&x.SkipSelf)){let a=this.records.get(t);if(void 0===a){const l=function NM(e){return"function"==typeof e||"object"==typeof e&&e instanceof P}(t)&&fl(t);a=l&&this.injectableDefInScope(l)?Vr(bu(t),xs):null,this.records.set(t,a)}if(null!=a)return this.hydrate(t,a)}return(r&x.Self?Eu():this.parent).get(t,n=r&x.Optional&&n===Ro?null:n)}catch(s){if("NullInjectorError"===s.name){if((s[vs]=s[vs]||[]).unshift(ie(t)),o)throw s;return function jE(e,t,n,r){const o=e[vs];throw t[Sh]&&o.unshift(t[Sh]),e.message=function BE(e,t,n,r=null){e=e&&"\n"===e.charAt(0)&&"\u0275"==e.charAt(1)?e.slice(2):e;let o=ie(t);if(Array.isArray(t))o=t.map(ie).join(" -> ");else if("object"==typeof t){let i=[];for(let s in t)if(t.hasOwnProperty(s)){let a=t[s];i.push(s+":"+("string"==typeof a?JSON.stringify(a):ie(a)))}o=`{${i.join(", ")}}`}return`${n}${r?"("+r+")":""}[${o}]: ${e.replace(PE,"\n ")}`}("\n"+e.message,o,n,r),e.ngTokenPath=o,e[vs]=null,e}(s,t,"R3InjectorError",this.source)}throw s}finally{$t(i),_s(o)}}resolveInjectorInitializers(){const t=_s(this),n=$t(void 0);try{const r=this.get(Tp.multi,Z,x.Self);for(const o of r)o()}finally{_s(t),$t(n)}}toString(){const t=[],n=this.records;for(const r of n.keys())t.push(ie(r));return`R3Injector[${t.join(", ")}]`}assertNotDestroyed(){if(this._destroyed)throw new U(205,!1)}processProvider(t){let n=Yn(t=F(t))?t:F(t&&t.provide);const r=function AM(e){return _u(e)?Vr(void 0,e.useValue):Vr(Vp(e),xs)}(t);if(Yn(t)||!0!==t.multi)this.records.get(n);else{let o=this.records.get(n);o||(o=Vr(void 0,xs,!0),o.factory=()=>ql(o.multi),this.records.set(n,o)),n=t,o.multi.push(t)}this.records.set(n,r)}hydrate(t,n){return n.value===xs&&(n.value=SM,n.value=n.factory()),"object"==typeof n.value&&n.value&&function xM(e){return null!==e&&"object"==typeof e&&"function"==typeof e.ngOnDestroy}(n.value)&&this._ngOnDestroyHooks.add(n.value),n.value}injectableDefInScope(t){if(!t.providedIn)return!1;const n=F(t.providedIn);return"string"==typeof n?"any"===n||this.scopes.has(n):this.injectorDefTypes.has(n)}}function bu(e){const t=fl(e),n=null!==t?t.factory:Wn(e);if(null!==n)return n;if(e instanceof P)throw new U(204,!1);if(e instanceof Function)return function IM(e){const t=e.length;if(t>0)throw function No(e,t){const n=[];for(let r=0;rn.factory(e):()=>new e}(e);throw new U(204,!1)}function Vp(e,t,n){let r;if(Yn(e)){const o=F(e);return Wn(o)||bu(o)}if(_u(e))r=()=>F(e.useValue);else if(function Pp(e){return!(!e||!e.useFactory)}(e))r=()=>e.useFactory(...ql(e.deps||[]));else if(function Fp(e){return!(!e||!e.useExisting)}(e))r=()=>S(F(e.useExisting));else{const o=F(e&&(e.useClass||e.provide));if(!function TM(e){return!!e.deps}(e))return Wn(o)||bu(o);r=()=>new o(...ql(e.deps))}return r}function Vr(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function RM(e){return!!e.\u0275providers}function Mu(e,t){for(const n of e)Array.isArray(n)?Mu(n,t):RM(n)?Mu(n.\u0275providers,t):t(n)}function Lp(e,t=null,n=null,r){const o=jp(e,t,n,r);return o.resolveInjectorInitializers(),o}function jp(e,t=null,n=null,r,o=new Set){const i=[n||Z,EM(e)];return r=r||("object"==typeof e?void 0:ie(e)),new kp(i,t||Eu(),r||null,o)}let Je=(()=>{class e{static create(n,r){if(Array.isArray(n))return Lp({name:""},r,n,"");{var o;const i=null!==(o=n.name)&&void 0!==o?o:"";return Lp({name:i},n.parent,n.providers,i)}}}return e.THROW_IF_NOT_FOUND=Ro,e.NULL=new Op,e.\u0275prov=O({token:e,providedIn:"any",factory:()=>S(Du)}),e.__NG_ELEMENT_ID__=-1,e})();function v(e,t=x.Default){const n=y();return null===n?S(e,t):mh(Te(),n,F(e),t)}function xu(){throw new Error("invalid")}function Rs(e,t){return e<<17|t<<2}function Ft(e){return e>>17&32767}function Pu(e){return 2|e}function gn(e){return(131068&e)>>2}function Ou(e,t){return-131069&e|t<<2}function ku(e){return 1|e}function ig(e,t){const n=e.contentQueries;if(null!==n)for(let r=0;r22&&Mp(e,t,22,!1),n(r,o)}finally{An(i)}}function qu(e,t,n){!Jf()||(function v0(e,t,n,r){const o=n.directiveStart,i=n.directiveEnd;e.firstCreatePass||So(n,t),He(r,t);const s=n.initialInputs;for(let a=o;a0;){const n=e[--t];if("number"==typeof n&&n<0)return n}return 0})(a)!=l&&a.push(l),a.push(r,o,s)}}function pg(e,t){null!==e.hostBindings&&e.hostBindings(1,t)}function gg(e,t){t.flags|=2,(e.components||(e.components=[])).push(t.index)}function w0(e,t,n){if(n){if(t.exportAs)for(let r=0;r0&&Zu(n)}}function Zu(e){for(let r=lu(e);null!==r;r=uu(r))for(let o=10;o0&&Zu(i)}const n=e[1].components;if(null!==n)for(let r=0;r0&&Zu(o)}}function T0(e,t){const n=dt(t,e),r=n[1];(function x0(e,t){for(let n=t.length;nPromise.resolve(null))();function Dg(e){return e[7]||(e[7]=[])}function Cg(e){return e.cleanup||(e.cleanup=[])}function Eg(e,t){const n=e[9],r=n?n.get(Pr,null):null;r&&r.handleError(t)}function bg(e,t,n,r,o){for(let i=0;i=0;r--){const o=e[r];o.hostVars=t+=o.hostVars,o.hostAttrs=ds(o.hostAttrs,n=ds(n,o.hostAttrs))}}(r)}function nc(e){return e===mr?{}:e===Z?[]:e}function z0(e,t){const n=e.viewQuery;e.viewQuery=n?(r,o)=>{t(r,o),n(r,o)}:t}function q0(e,t){const n=e.contentQueries;e.contentQueries=n?(r,o,i)=>{t(r,o,i),n(r,o,i)}:t}function W0(e,t){const n=e.hostBindings;e.hostBindings=n?(r,o)=>{t(r,o),n(r,o)}:t}let Ls=null;function Xn(){if(!Ls){const e=te.Symbol;if(e&&e.iterator)Ls=e.iterator;else{const t=Object.getOwnPropertyNames(Map.prototype);for(let n=0;na(Ee(I[r.index])):r.index;if(ve(n)){let I=null;if(!a&&l&&(I=function oS(e,t,n,r){const o=e.cleanup;if(null!=o)for(let i=0;il?a[l]:null}"string"==typeof s&&(i+=2)}return null}(e,t,o,r.index)),null!==I)(I.__ngLastListenerFn__||I).__ngNextListenerFn__=i,I.__ngLastListenerFn__=i,h=!1;else{i=lc(r,t,d,i,!1);const L=n.listen(D,o,i);f.push(i,L),c&&c.push(o,m,w,w+1)}}else i=lc(r,t,d,i,!0),D.addEventListener(o,i,s),f.push(i),c&&c.push(o,m,w,s)}else i=lc(r,t,d,i,!1);const p=r.outputs;let g;if(h&&null!==p&&(g=p[o])){const _=g.length;if(_)for(let D=0;D<_;D+=2){const re=t[g[D]][g[D+1]].subscribe(i),hr=f.length;f.push(i,re),c&&c.push(o,r.index,hr,-(hr+1))}}}(i,o,o[$],s,e,t,!!n,r),ne}function Zg(e,t,n,r){try{return!1!==n(r)}catch(o){return Eg(e,o),!1}}function lc(e,t,n,r,o){return function i(s){if(s===Function)return r;Yu(2&e.flags?dt(e.index,t):t);let l=Zg(t,0,r,s),u=i.__ngNextListenerFn__;for(;u;)l=Zg(t,0,u,s)&&l,u=u.__ngNextListenerFn__;return o&&!1===l&&(s.preventDefault(),s.returnValue=!1),l}}function Jt(e=1){return function rE(e){return(k.lFrame.contextLView=function oE(e,t){for(;e>0;)t=t[15],e--;return t}(e,k.lFrame.contextLView))[8]}(e)}function sm(e,t,n,r,o){const i=e[n+1],s=null===t;let a=r?Ft(i):gn(i),l=!1;for(;0!==a&&(!1===l||s);){const c=e[a+1];cS(e[a],t)&&(l=!0,e[a+1]=r?ku(c):Pu(c)),a=r?Ft(c):gn(c)}l&&(e[n+1]=r?Pu(i):ku(i))}function cS(e,t){return null===e||null==t||(Array.isArray(e)?e[1]:e)===t||!(!Array.isArray(e)||"string"!=typeof t)&&Nr(e,t)>=0}function Qo(e,t){return function Ot(e,t,n,r){const o=y(),i=K(),s=dn(2);i.firstUpdatePass&&function gm(e,t,n,r){const o=e.data;if(null===o[n+1]){const i=o[Ze()],s=function pm(e,t){return t>=e.expandoStartIndex}(e,n);(function _m(e,t){return 0!=(e.flags&(t?16:32))})(i,r)&&null===t&&!s&&(t=!1),t=function _S(e,t,n,r){const o=function Rl(e){const t=k.lFrame.currentDirectiveIndex;return-1===t?null:e[t]}(e);let i=r?t.residualClasses:t.residualStyles;if(null===o)0===(r?t.classBindings:t.styleBindings)&&(n=Zo(n=cc(null,e,t,n,r),t.attrs,r),i=null);else{const s=t.directiveStylingLast;if(-1===s||e[s]!==o)if(n=cc(o,e,t,n,r),null===i){let l=function DS(e,t,n){const r=n?t.classBindings:t.styleBindings;if(0!==gn(r))return e[Ft(r)]}(e,t,r);void 0!==l&&Array.isArray(l)&&(l=cc(null,e,t,l[1],r),l=Zo(l,t.attrs,r),function CS(e,t,n,r){e[Ft(n?t.classBindings:t.styleBindings)]=r}(e,t,r,l))}else i=function wS(e,t,n){let r;const o=t.directiveEnd;for(let i=1+t.directiveStylingLast;i0)&&(u=!0)}else c=n;if(o)if(0!==l){const f=Ft(e[a+1]);e[r+1]=Rs(f,a),0!==f&&(e[f+1]=Ou(e[f+1],r)),e[a+1]=function QM(e,t){return 131071&e|t<<17}(e[a+1],r)}else e[r+1]=Rs(a,0),0!==a&&(e[a+1]=Ou(e[a+1],r)),a=r;else e[r+1]=Rs(l,0),0===a?a=r:e[l+1]=Ou(e[l+1],r),l=r;u&&(e[r+1]=Pu(e[r+1])),sm(e,c,r,!0),sm(e,c,r,!1),function uS(e,t,n,r,o){const i=o?e.residualClasses:e.residualStyles;null!=i&&"string"==typeof t&&Nr(i,t)>=0&&(n[r+1]=ku(n[r+1]))}(t,c,e,r,i),s=Rs(a,l),i?t.classBindings=s:t.styleBindings=s}(o,i,t,n,s,r)}}(i,e,s,r),t!==B&&Ue(o,s,t)&&function ym(e,t,n,r,o,i,s,a){if(!(3&t.type))return;const l=e.data,u=l[a+1];Us(function Yp(e){return 1==(1&e)}(u)?vm(l,t,n,o,gn(u),s):void 0)||(Us(i)||function Zp(e){return 2==(2&e)}(u)&&(i=vm(l,null,n,o,a,s)),function sM(e,t,n,r,o){const i=ve(e);if(t)o?i?e.addClass(n,r):n.classList.add(r):i?e.removeClass(n,r):n.classList.remove(r);else{let s=-1===r.indexOf("-")?void 0:pt.DashCase;if(null==o)i?e.removeStyle(n,r,s):n.style.removeProperty(r);else{const a="string"==typeof o&&o.endsWith("!important");a&&(o=o.slice(0,-10),s|=pt.Important),i?e.setStyle(n,r,o,s):n.style.setProperty(r,o,a?"important":"")}}}(r,s,rs(Ze(),n),o,i))}(i,i.data[Ze()],o,o[$],e,o[s+1]=function MS(e,t){return null==e||("string"==typeof t?e+=t:"object"==typeof e&&(e=ie(function xn(e){return e instanceof class Lh{constructor(t){this.changingThisBreaksApplicationSecurity=t}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see https://g.co/ng/security#xss)`}}?e.changingThisBreaksApplicationSecurity:e}(e)))),e}(t,n),r,s)}(e,t,null,!0),Qo}function cc(e,t,n,r,o){let i=null;const s=n.directiveEnd;let a=n.directiveStylingLast;for(-1===a?a=n.directiveStart:a++;a0;){const l=e[o],u=Array.isArray(l),c=u?l[1]:l,d=null===c;let f=n[o+1];f===B&&(f=d?Z:void 0);let h=d?$l(f,r):c===r?f:void 0;if(u&&!Us(h)&&(h=$l(l,r)),Us(h)&&(a=h,s))return a;const p=e[o+1];o=s?Ft(p):gn(p)}if(null!==t){let l=i?t.residualClasses:t.residualStyles;null!=l&&(a=$l(l,r))}return a}function Us(e){return void 0!==e}function T(e,t=""){const n=y(),r=K(),o=e+22,i=r.firstCreatePass?jr(r,o,1,t,null):r.data[o],s=n[o]=function cu(e,t){return ve(e)?e.createText(t):e.createTextNode(t)}(n[$],t);As(r,n,s,i),qt(i,!1)}function Yo(e){return Jo("",e,""),Yo}function Jo(e,t,n){const r=y(),o=function $r(e,t,n,r){return Ue(e,wr(),n)?t+j(n)+r:B}(r,e,t,n);return o!==B&&mn(r,Ze(),o),Jo}function dc(e,t,n,r,o){const i=y(),s=Gr(i,e,t,n,r,o);return s!==B&&mn(i,Ze(),s),dc}const Xr="en-US";let Bm=Xr;function pc(e,t,n,r,o){if(e=F(e),Array.isArray(e))for(let i=0;i>20;if(Yn(e)||!e.multi){const h=new bo(l,o,v),p=mc(a,t,o?c:c+f,d);-1===p?(ps(So(u,s),i,a),gc(i,e,t.length),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(h),s.push(h)):(n[p]=h,s[p]=h)}else{const h=mc(a,t,c+f,d),p=mc(a,t,c,c+f),g=h>=0&&n[h],_=p>=0&&n[p];if(o&&!_||!o&&!g){ps(So(u,s),i,a);const D=function $I(e,t,n,r,o){const i=new bo(e,n,v);return i.multi=[],i.index=t,i.componentProviders=0,dy(i,o,r&&!n),i}(o?UI:HI,n.length,o,r,l);!o&&_&&(n[p].providerFactory=D),gc(i,e,t.length,0),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(D),s.push(D)}else gc(i,e,h>-1?h:p,dy(n[o?p:h],l,!o&&r));!o&&r&&_&&n[p].componentProviders++}}}function gc(e,t,n,r){const o=Yn(t),i=function MM(e){return!!e.useClass}(t);if(o||i){const l=(i?F(t.useClass):t).prototype.ngOnDestroy;if(l){const u=e.destroyHooks||(e.destroyHooks=[]);if(!o&&t.multi){const c=u.indexOf(n);-1===c?u.push(n,[r,l]):u[c+1].push(r,l)}else u.push(n,l)}}}function dy(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function mc(e,t,n,r){for(let o=n;o{n.providersResolver=(r,o)=>function BI(e,t,n){const r=K();if(r.firstCreatePass){const o=Nt(e);pc(n,r.data,r.blueprint,o,!0),pc(t,r.data,r.blueprint,o,!1)}}(r,o?o(e):e,t)}}class zI{resolveComponentFactory(t){throw function GI(e){const t=Error(`No component factory found for ${ie(e)}. Did you add it to @NgModule.entryComponents?`);return t.ngComponent=e,t}(t)}}let ri=(()=>{class e{}return e.NULL=new zI,e})();class Fn{}class hy{}class py{}function WI(){return to(Te(),y())}function to(e,t){return new yt(Et(e,t))}let yt=(()=>{class e{constructor(n){this.nativeElement=n}}return e.__NG_ELEMENT_ID__=WI,e})();function KI(e){return e instanceof yt?e.nativeElement:e}class gy{}let yn=(()=>{class e{}return e.__NG_ELEMENT_ID__=()=>function ZI(){const e=y(),n=dt(Te().index,e);return function QI(e){return e[$]}(ot(n)?n:e)}(),e})(),YI=(()=>{class e{}return e.\u0275prov=O({token:e,providedIn:"root",factory:()=>null}),e})();class oi{constructor(t){this.full=t,this.major=t.split(".")[0],this.minor=t.split(".")[1],this.patch=t.split(".").slice(2).join(".")}}const JI=new oi("14.0.1"),vc={};function Ws(e,t,n,r,o=!1){for(;null!==n;){const i=t[n.index];if(null!==i&&r.push(Ee(i)),xt(i))for(let a=10;a-1&&(fu(t,r),ms(n,r))}this._attachedToViewContainer=!1}sp(this._lView[1],this._lView)}onDestroy(t){dg(this._lView[1],this._lView,null,t)}markForCheck(){Yu(this._cdRefInjectingView||this._lView)}detach(){this._lView[2]&=-65}reattach(){this._lView[2]|=64}detectChanges(){!function Xu(e,t,n){const r=t[10];r.begin&&r.begin();try{Hr(e,t,e.template,n)}catch(o){throw Eg(t,o),o}finally{r.end&&r.end()}}(this._lView[1],this._lView,this.context)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new U(902,"");this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null,function Zb(e,t){$o(e,t,t[$],2,null,null)}(this._lView[1],this._lView)}attachToAppRef(t){if(this._attachedToViewContainer)throw new U(902,"");this._appRef=t}}class XI extends ii{constructor(t){super(t),this._view=t}detectChanges(){_g(this._view)}checkNoChanges(){}get context(){return null}}class _c extends ri{constructor(t){super(),this.ngModule=t}resolveComponentFactory(t){const n=se(t);return new Dc(n,this.ngModule)}}function my(e){const t=[];for(let n in e)e.hasOwnProperty(n)&&t.push({propName:e[n],templateName:n});return t}class tA{constructor(t,n){this.injector=t,this.parentInjector=n}get(t,n,r){const o=this.injector.get(t,vc,r);return o!==vc||n===vc?o:this.parentInjector.get(t,n,r)}}class Dc extends py{constructor(t,n){super(),this.componentDef=t,this.ngModule=n,this.componentType=t.type,this.selector=function mM(e){return e.map(gM).join(",")}(t.selectors),this.ngContentSelectors=t.ngContentSelectors?t.ngContentSelectors:[],this.isBoundToModule=!!n}get inputs(){return my(this.componentDef.inputs)}get outputs(){return my(this.componentDef.outputs)}create(t,n,r,o){var i;let s=(o=o||this.ngModule)instanceof Jn?o:null===(i=o)||void 0===i?void 0:i.injector;s&&null!==this.componentDef.getStandaloneInjector&&(s=this.componentDef.getStandaloneInjector(s)||s);const a=s?new tA(t,s):t,l=a.get(gy,Kf),u=a.get(YI,null),c=l.createRenderer(null,this.componentDef),d=this.componentDef.selectors[0][0]||"div",f=r?function cg(e,t,n){if(ve(e))return e.selectRootElement(t,n===Gt.ShadowDom);let r="string"==typeof t?e.querySelector(t):t;return r.textContent="",r}(c,r,this.componentDef.encapsulation):du(l.createRenderer(null,this.componentDef),d,function eA(e){const t=e.toLowerCase();return"svg"===t?"svg":"math"===t?"math":null}(d)),h=this.componentDef.onPush?288:272,p=function Og(e,t){return{components:[],scheduler:e||Hb,clean:R0,playerHandler:t||null,flags:0}}(),g=Os(0,null,null,1,0,null,null,null,null,null),_=Go(null,g,p,h,null,null,l,c,u,a,null);let D,w;is(_);try{const m=function Fg(e,t,n,r,o,i){const s=n[1];n[22]=e;const l=jr(s,22,2,"#host",null),u=l.mergedAttrs=t.hostAttrs;null!==u&&(Vs(l,u,!0),null!==e&&(cs(o,e,u),null!==l.classes&&yu(o,e,l.classes),null!==l.styles&&_p(o,e,l.styles)));const c=r.createRenderer(e,t),d=Go(n,lg(t),null,t.onPush?32:16,n[22],l,r,c,i||null,null,null);return s.firstCreatePass&&(ps(So(l,n),s,t.type),gg(s,l),mg(l,n.length,1)),ks(n,d),n[22]=d}(f,this.componentDef,_,l,c);if(f)if(r)cs(c,f,["ng-version",JI.full]);else{const{attrs:I,classes:L}=function yM(e){const t=[],n=[];let r=1,o=2;for(;r0&&yu(c,f,L.join(" "))}if(w=Sl(g,22),void 0!==n){const I=w.projection=[];for(let L=0;Ln()),this.destroyCbs=null}onDestroy(t){this.destroyCbs.push(t)}}class Cc extends hy{constructor(t){super(),this.moduleType=t}create(t){return new yy(this.moduleType,t)}}class iA extends Fn{constructor(t,n,r){super(),this.componentFactoryResolver=new _c(this),this.instance=null;const o=new kp([...t,{provide:Fn,useValue:this},{provide:ri,useValue:this.componentFactoryResolver}],n||Eu(),r,new Set(["environment"]));this.injector=o,o.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(t){this.injector.onDestroy(t)}}function Ks(e,t=null,n=null){return new iA(e,t,n).injector}function wc(e){return t=>{setTimeout(e,void 0,t)}}const Ce=class SA extends Ut{constructor(t=!1){super(),this.__isAsync=t}emit(t){super.next(t)}subscribe(t,n,r){let o=t,i=n||(()=>null),s=r;if(t&&"object"==typeof t){var a,l,u;const d=t;o=null===(a=d.next)||void 0===a?void 0:a.bind(d),i=null===(l=d.error)||void 0===l?void 0:l.bind(d),s=null===(u=d.complete)||void 0===u?void 0:u.bind(d)}this.__isAsync&&(i=wc(i),o&&(o=wc(o)),s&&(s=wc(s)));const c=super.subscribe({next:o,error:i,complete:s});return t instanceof ye&&t.add(c),c}};function IA(){return this._results[Xn()]()}class Ec{constructor(t=!1){this._emitDistinctChangesOnly=t,this.dirty=!0,this._results=[],this._changesDetected=!1,this._changes=null,this.length=0,this.first=void 0,this.last=void 0;const n=Xn(),r=Ec.prototype;r[n]||(r[n]=IA)}get changes(){return this._changes||(this._changes=new Ce)}get(t){return this._results[t]}map(t){return this._results.map(t)}filter(t){return this._results.filter(t)}find(t){return this._results.find(t)}reduce(t,n){return this._results.reduce(t,n)}forEach(t){this._results.forEach(t)}some(t){return this._results.some(t)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(t,n){const r=this;r.dirty=!1;const o=ft(t);(this._changesDetected=!function bE(e,t,n){if(e.length!==t.length)return!1;for(let r=0;r{class e{}return e.__NG_ELEMENT_ID__=xA,e})();const AA=vn,TA=class extends AA{constructor(t,n,r){super(),this._declarationLView=t,this._declarationTContainer=n,this.elementRef=r}createEmbeddedView(t,n){const r=this._declarationTContainer.tViews,o=Go(this._declarationLView,r,t,16,null,r.declTNode,null,null,null,null,n||null);o[17]=this._declarationLView[this._declarationTContainer.index];const s=this._declarationLView[19];return null!==s&&(o[19]=s.createEmbeddedView(r)),zo(r,o,t),new ii(o)}};function xA(){return Qs(Te(),y())}function Qs(e,t){return 4&e.type?new TA(t,e,to(e,t)):null}let Vt=(()=>{class e{}return e.__NG_ELEMENT_ID__=NA,e})();function NA(){return My(Te(),y())}const RA=Vt,Ey=class extends RA{constructor(t,n,r){super(),this._lContainer=t,this._hostTNode=n,this._hostLView=r}get element(){return to(this._hostTNode,this._hostLView)}get injector(){return new Sr(this._hostTNode,this._hostLView)}get parentInjector(){const t=hs(this._hostTNode,this._hostLView);if(dh(t)){const n=Mr(t,this._hostLView),r=br(t);return new Sr(n[1].data[r+8],n)}return new Sr(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(t){const n=by(this._lContainer);return null!==n&&n[t]||null}get length(){return this._lContainer.length-10}createEmbeddedView(t,n,r){let o,i;"number"==typeof r?o=r:null!=r&&(o=r.index,i=r.injector);const s=t.createEmbeddedView(n||{},i);return this.insert(s,o),s}createComponent(t,n,r,o,i){const s=t&&!function xo(e){return"function"==typeof e}(t);let a;if(s)a=n;else{const d=n||{};a=d.index,r=d.injector,o=d.projectableNodes,i=d.environmentInjector||d.ngModuleRef}const l=s?t:new Dc(se(t)),u=r||this.parentInjector;if(!i&&null==l.ngModule){const f=(s?u:this.parentInjector).get(Jn,null);f&&(i=f)}const c=l.create(u,o,void 0,i);return this.insert(c.hostView,a),c}insert(t,n){const r=t._lView,o=r[1];if(function qw(e){return xt(e[3])}(r)){const c=this.indexOf(t);if(-1!==c)this.detach(c);else{const d=r[3],f=new Ey(d,d[6],d[3]);f.detach(f.indexOf(t))}}const i=this._adjustIndex(n),s=this._lContainer;!function Jb(e,t,n,r){const o=10+r,i=n.length;r>0&&(n[o-1][4]=t),r0)r.push(s[a/2]);else{const u=i[a+1],c=t[-l];for(let d=10;d{class e{constructor(n){this.appInits=n,this.resolve=Xs,this.reject=Xs,this.initialized=!1,this.done=!1,this.donePromise=new Promise((r,o)=>{this.resolve=r,this.reject=o})}runInitializers(){if(this.initialized)return;const n=[],r=()=>{this.done=!0,this.resolve()};if(this.appInits)for(let o=0;o{i.subscribe({complete:a,error:l})});n.push(s)}}Promise.all(n).then(()=>{r()}).catch(o=>{this.reject(o)}),0===n.length&&r(),this.initialized=!0}}return e.\u0275fac=function(n){return new(n||e)(S(Oc,8))},e.\u0275prov=O({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const ui=new P("AppId",{providedIn:"root",factory:function Yy(){return`${kc()}${kc()}${kc()}`}});function kc(){return String.fromCharCode(97+Math.floor(25*Math.random()))}const Jy=new P("Platform Initializer"),Vc=new P("Platform ID",{providedIn:"platform",factory:()=>"unknown"}),Xy=new P("appBootstrapListener");let sT=(()=>{class e{log(n){console.log(n)}warn(n){console.warn(n)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=O({token:e,factory:e.\u0275fac,providedIn:"platform"}),e})();const _n=new P("LocaleId",{providedIn:"root",factory:()=>function VE(e,t=x.Default){return S(e,t)}(_n,x.Optional|x.SkipSelf)||function aT(){return typeof $localize<"u"&&$localize.locale||Xr}()});class uT{constructor(t,n){this.ngModuleFactory=t,this.componentFactories=n}}let Lc=(()=>{class e{compileModuleSync(n){return new Cc(n)}compileModuleAsync(n){return Promise.resolve(this.compileModuleSync(n))}compileModuleAndAllComponentsSync(n){const r=this.compileModuleSync(n),i=pn(ut(n).declarations).reduce((s,a)=>{const l=se(a);return l&&s.push(new Dc(l)),s},[]);return new uT(r,i)}compileModuleAndAllComponentsAsync(n){return Promise.resolve(this.compileModuleAndAllComponentsSync(n))}clearCache(){}clearCacheFor(n){}getModuleId(n){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=O({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const dT=(()=>Promise.resolve(0))();function jc(e){typeof Zone>"u"?dT.then(()=>{e&&e.apply(null,null)}):Zone.current.scheduleMicroTask("scheduleMicrotask",e)}class Me{constructor({enableLongStackTrace:t=!1,shouldCoalesceEventChangeDetection:n=!1,shouldCoalesceRunChangeDetection:r=!1}){if(this.hasPendingMacrotasks=!1,this.hasPendingMicrotasks=!1,this.isStable=!0,this.onUnstable=new Ce(!1),this.onMicrotaskEmpty=new Ce(!1),this.onStable=new Ce(!1),this.onError=new Ce(!1),typeof Zone>"u")throw new Error("In this configuration Angular requires Zone.js");Zone.assertZonePatched();const o=this;o._nesting=0,o._outer=o._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(o._inner=o._inner.fork(new Zone.TaskTrackingZoneSpec)),t&&Zone.longStackTraceZoneSpec&&(o._inner=o._inner.fork(Zone.longStackTraceZoneSpec)),o.shouldCoalesceEventChangeDetection=!r&&n,o.shouldCoalesceRunChangeDetection=r,o.lastRequestAnimationFrameId=-1,o.nativeRequestAnimationFrame=function fT(){let e=te.requestAnimationFrame,t=te.cancelAnimationFrame;if(typeof Zone<"u"&&e&&t){const n=e[Zone.__symbol__("OriginalDelegate")];n&&(e=n);const r=t[Zone.__symbol__("OriginalDelegate")];r&&(t=r)}return{nativeRequestAnimationFrame:e,nativeCancelAnimationFrame:t}}().nativeRequestAnimationFrame,function gT(e){const t=()=>{!function pT(e){e.isCheckStableRunning||-1!==e.lastRequestAnimationFrameId||(e.lastRequestAnimationFrameId=e.nativeRequestAnimationFrame.call(te,()=>{e.fakeTopEventTask||(e.fakeTopEventTask=Zone.root.scheduleEventTask("fakeTopEventTask",()=>{e.lastRequestAnimationFrameId=-1,Hc(e),e.isCheckStableRunning=!0,Bc(e),e.isCheckStableRunning=!1},void 0,()=>{},()=>{})),e.fakeTopEventTask.invoke()}),Hc(e))}(e)};e._inner=e._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:(n,r,o,i,s,a)=>{try{return ev(e),n.invokeTask(o,i,s,a)}finally{(e.shouldCoalesceEventChangeDetection&&"eventTask"===i.type||e.shouldCoalesceRunChangeDetection)&&t(),tv(e)}},onInvoke:(n,r,o,i,s,a,l)=>{try{return ev(e),n.invoke(o,i,s,a,l)}finally{e.shouldCoalesceRunChangeDetection&&t(),tv(e)}},onHasTask:(n,r,o,i)=>{n.hasTask(o,i),r===o&&("microTask"==i.change?(e._hasPendingMicrotasks=i.microTask,Hc(e),Bc(e)):"macroTask"==i.change&&(e.hasPendingMacrotasks=i.macroTask))},onHandleError:(n,r,o,i)=>(n.handleError(o,i),e.runOutsideAngular(()=>e.onError.emit(i)),!1)})}(o)}static isInAngularZone(){return typeof Zone<"u"&&!0===Zone.current.get("isAngularZone")}static assertInAngularZone(){if(!Me.isInAngularZone())throw new Error("Expected to be in Angular Zone, but it is not!")}static assertNotInAngularZone(){if(Me.isInAngularZone())throw new Error("Expected to not be in Angular Zone, but it is!")}run(t,n,r){return this._inner.run(t,n,r)}runTask(t,n,r,o){const i=this._inner,s=i.scheduleEventTask("NgZoneEvent: "+o,t,hT,Xs,Xs);try{return i.runTask(s,n,r)}finally{i.cancelTask(s)}}runGuarded(t,n,r){return this._inner.runGuarded(t,n,r)}runOutsideAngular(t){return this._outer.run(t)}}const hT={};function Bc(e){if(0==e._nesting&&!e.hasPendingMicrotasks&&!e.isStable)try{e._nesting++,e.onMicrotaskEmpty.emit(null)}finally{if(e._nesting--,!e.hasPendingMicrotasks)try{e.runOutsideAngular(()=>e.onStable.emit(null))}finally{e.isStable=!0}}}function Hc(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&-1!==e.lastRequestAnimationFrameId)}function ev(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function tv(e){e._nesting--,Bc(e)}class mT{constructor(){this.hasPendingMicrotasks=!1,this.hasPendingMacrotasks=!1,this.isStable=!0,this.onUnstable=new Ce,this.onMicrotaskEmpty=new Ce,this.onStable=new Ce,this.onError=new Ce}run(t,n,r){return t.apply(n,r)}runGuarded(t,n,r){return t.apply(n,r)}runOutsideAngular(t){return t()}runTask(t,n,r,o){return t.apply(n,r)}}const nv=new P(""),ta=new P("");let Gc,Uc=(()=>{class e{constructor(n,r,o){this._ngZone=n,this.registry=r,this._pendingCount=0,this._isZoneStable=!0,this._didWork=!1,this._callbacks=[],this.taskTrackingZone=null,Gc||(function yT(e){Gc=e}(o),o.addToWindow(r)),this._watchAngularEvents(),n.run(()=>{this.taskTrackingZone=typeof Zone>"u"?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){this._ngZone.onUnstable.subscribe({next:()=>{this._didWork=!0,this._isZoneStable=!1}}),this._ngZone.runOutsideAngular(()=>{this._ngZone.onStable.subscribe({next:()=>{Me.assertNotInAngularZone(),jc(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}})})}increasePendingRequestCount(){return this._pendingCount+=1,this._didWork=!0,this._pendingCount}decreasePendingRequestCount(){if(this._pendingCount-=1,this._pendingCount<0)throw new Error("pending async requests below zero");return this._runCallbacksIfReady(),this._pendingCount}isStable(){return this._isZoneStable&&0===this._pendingCount&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())jc(()=>{for(;0!==this._callbacks.length;){let n=this._callbacks.pop();clearTimeout(n.timeoutId),n.doneCb(this._didWork)}this._didWork=!1});else{let n=this.getPendingTasks();this._callbacks=this._callbacks.filter(r=>!r.updateCb||!r.updateCb(n)||(clearTimeout(r.timeoutId),!1)),this._didWork=!0}}getPendingTasks(){return this.taskTrackingZone?this.taskTrackingZone.macroTasks.map(n=>({source:n.source,creationLocation:n.creationLocation,data:n.data})):[]}addCallback(n,r,o){let i=-1;r&&r>0&&(i=setTimeout(()=>{this._callbacks=this._callbacks.filter(s=>s.timeoutId!==i),n(this._didWork,this.getPendingTasks())},r)),this._callbacks.push({doneCb:n,timeoutId:i,updateCb:o})}whenStable(n,r,o){if(o&&!this.taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(n,r,o),this._runCallbacksIfReady()}getPendingRequestCount(){return this._pendingCount}registerApplication(n){this.registry.registerApplication(n,this)}unregisterApplication(n){this.registry.unregisterApplication(n)}findProviders(n,r,o){return[]}}return e.\u0275fac=function(n){return new(n||e)(S(Me),S($c),S(ta))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})(),$c=(()=>{class e{constructor(){this._applications=new Map}registerApplication(n,r){this._applications.set(n,r)}unregisterApplication(n){this._applications.delete(n)}unregisterAllApplications(){this._applications.clear()}getTestability(n){return this._applications.get(n)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(n,r=!0){var o,i;return null!==(o=null===(i=Gc)||void 0===i?void 0:i.findTestabilityInTree(this,n,r))&&void 0!==o?o:null}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=O({token:e,factory:e.\u0275fac,providedIn:"platform"}),e})(),Pn=null;const rv=new P("AllowMultipleToken"),ov=new P("PlatformOnDestroy");class iv{constructor(t,n){this.name=t,this.token=n}}function av(e,t,n=[]){const r=`Platform: ${t}`,o=new P(r);return(i=[])=>{let s=zc();if(!s||s.injector.get(rv,!1)){const a=[...n,...i,{provide:o,useValue:!0}];e?e(a):function DT(e){if(Pn&&!Pn.get(rv,!1))throw new U(400,"");Pn=e;const t=e.get(uv);(function sv(e){const t=e.get(Jy,null);t&&t.forEach(n=>n())})(e)}(function lv(e=[],t){return Je.create({name:t,providers:[{provide:Cu,useValue:"platform"},{provide:ov,useValue:()=>Pn=null},...e]})}(a,r))}return function wT(e){const t=zc();if(!t)throw new U(401,"");return t}()}}function zc(){var e,t;return null!==(e=null===(t=Pn)||void 0===t?void 0:t.get(uv))&&void 0!==e?e:null}let uv=(()=>{class e{constructor(n){this._injector=n,this._modules=[],this._destroyListeners=[],this._destroyed=!1}bootstrapModuleFactory(n,r){const o=function ET(e,t){let n;return n="noop"===e?new mT:("zone.js"===e?void 0:e)||new Me(t),n}(r?.ngZone,function cv(e){return{enableLongStackTrace:!1,shouldCoalesceEventChangeDetection:!(!e||!e.ngZoneEventCoalescing)||!1,shouldCoalesceRunChangeDetection:!(!e||!e.ngZoneRunCoalescing)||!1}}(r)),i=[{provide:Me,useValue:o}];return o.run(()=>{const s=Je.create({providers:i,parent:this.injector,name:n.moduleType.name}),a=n.create(s),l=a.injector.get(Pr,null);if(!l)throw new U(402,"");return o.runOutsideAngular(()=>{const u=o.onError.subscribe({next:c=>{l.handleError(c)}});a.onDestroy(()=>{ra(this._modules,a),u.unsubscribe()})}),function dv(e,t,n){try{const r=n();return Ko(r)?r.catch(o=>{throw t.runOutsideAngular(()=>e.handleError(o)),o}):r}catch(r){throw t.runOutsideAngular(()=>e.handleError(r)),r}}(l,o,()=>{const u=a.injector.get(ea);return u.runInitializers(),u.donePromise.then(()=>(function Hm(e){at(e,"Expected localeId to be defined"),"string"==typeof e&&(Bm=e.toLowerCase().replace(/_/g,"-"))}(a.injector.get(_n,Xr)||Xr),this._moduleDoBootstrap(a),a))})})}bootstrapModule(n,r=[]){const o=fv({},r);return function vT(e,t,n){const r=new Cc(n);return Promise.resolve(r)}(0,0,n).then(i=>this.bootstrapModuleFactory(i,o))}_moduleDoBootstrap(n){const r=n.injector.get(na);if(n._bootstrapComponents.length>0)n._bootstrapComponents.forEach(o=>r.bootstrap(o));else{if(!n.instance.ngDoBootstrap)throw new U(403,"");n.instance.ngDoBootstrap(r)}this._modules.push(n)}onDestroy(n){this._destroyListeners.push(n)}get injector(){return this._injector}destroy(){if(this._destroyed)throw new U(404,"");this._modules.slice().forEach(r=>r.destroy()),this._destroyListeners.forEach(r=>r()),this._injector.get(ov,null)?.(),this._destroyed=!0}get destroyed(){return this._destroyed}}return e.\u0275fac=function(n){return new(n||e)(S(Je))},e.\u0275prov=O({token:e,factory:e.\u0275fac,providedIn:"platform"}),e})();function fv(e,t){return Array.isArray(t)?t.reduce(fv,e):{...e,...t}}let na=(()=>{class e{constructor(n,r,o,i){this._zone=n,this._injector=r,this._exceptionHandler=o,this._initStatus=i,this._bootstrapListeners=[],this._views=[],this._runningTick=!1,this._stable=!0,this._destroyed=!1,this._destroyListeners=[],this.componentTypes=[],this.components=[],this._onMicrotaskEmptySubscription=this._zone.onMicrotaskEmpty.subscribe({next:()=>{this._zone.run(()=>{this.tick()})}});const s=new pe(l=>{this._stable=this._zone.isStable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks,this._zone.runOutsideAngular(()=>{l.next(this._stable),l.complete()})}),a=new pe(l=>{let u;this._zone.runOutsideAngular(()=>{u=this._zone.onStable.subscribe(()=>{Me.assertNotInAngularZone(),jc(()=>{!this._stable&&!this._zone.hasPendingMacrotasks&&!this._zone.hasPendingMicrotasks&&(this._stable=!0,l.next(!0))})})});const c=this._zone.onUnstable.subscribe(()=>{Me.assertInAngularZone(),this._stable&&(this._stable=!1,this._zone.runOutsideAngular(()=>{l.next(!1)}))});return()=>{u.unsubscribe(),c.unsubscribe()}});this.isStable=function ow(...e){let t=Number.POSITIVE_INFINITY,n=null,r=e[e.length-1];return zi(r)?(n=e.pop(),e.length>1&&"number"==typeof e[e.length-1]&&(t=e.pop())):"number"==typeof r&&(t=e.pop()),null===n&&1===e.length&&e[0]instanceof pe?e[0]:gr(t)(al(e,n))}(s,a.pipe(function hw(){return e=>Wi()(function cw(e,t){return function(r){let o;if(o="function"==typeof e?e:function(){return e},"function"==typeof t)return r.lift(new dw(o,t));const i=Object.create(r,aw);return i.source=r,i.subjectFactory=o,i}}(fw)(e))}()))}get destroyed(){return this._destroyed}get injector(){return this._injector}bootstrap(n,r){const o=n instanceof py;if(!this._initStatus.done)throw!o&&function ro(e){const t=se(e)||We(e)||Ke(e);return null!==t&&t.standalone}(n),new U(405,false);let i;i=o?n:this._injector.get(ri).resolveComponentFactory(n),this.componentTypes.push(i.componentType);const s=function _T(e){return e.isBoundToModule}(i)?void 0:this._injector.get(Fn),l=i.create(Je.NULL,[],r||i.selector,s),u=l.location.nativeElement,c=l.injector.get(nv,null);return c?.registerApplication(u),l.onDestroy(()=>{this.detachView(l.hostView),ra(this.components,l),c?.unregisterApplication(u)}),this._loadComponent(l),l}tick(){if(this._runningTick)throw new U(101,"");try{this._runningTick=!0;for(let n of this._views)n.detectChanges()}catch(n){this._zone.runOutsideAngular(()=>this._exceptionHandler.handleError(n))}finally{this._runningTick=!1}}attachView(n){const r=n;this._views.push(r),r.attachToAppRef(this)}detachView(n){const r=n;ra(this._views,r),r.detachFromAppRef()}_loadComponent(n){this.attachView(n.hostView),this.tick(),this.components.push(n),this._injector.get(Xy,[]).concat(this._bootstrapListeners).forEach(o=>o(n))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(n=>n()),this._views.slice().forEach(n=>n.destroy()),this._onMicrotaskEmptySubscription.unsubscribe()}finally{this._destroyed=!0,this._views=[],this._bootstrapListeners=[],this._destroyListeners=[]}}onDestroy(n){return this._destroyListeners.push(n),()=>ra(this._destroyListeners,n)}destroy(){if(this._destroyed)throw new U(406,false);const n=this._injector;n.destroy&&!n.destroyed&&n.destroy()}get viewCount(){return this._views.length}warnIfDestroyed(){}}return e.\u0275fac=function(n){return new(n||e)(S(Me),S(Je),S(Pr),S(ea))},e.\u0275prov=O({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();function ra(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}let pv=!0,oa=(()=>{class e{}return e.__NG_ELEMENT_ID__=ST,e})();function ST(e){return function IT(e,t,n){if(ts(e)&&!n){const r=dt(e.index,t);return new ii(r,r)}return 47&e.type?new ii(t[16],t):null}(Te(),y(),16==(16&e))}const BT=av(null,"core",[]);let HT=(()=>{class e{constructor(n){}}return e.\u0275fac=function(n){return new(n||e)(S(na))},e.\u0275mod=_t({type:e}),e.\u0275inj=lt({}),e})();function Dn(e){return"boolean"==typeof e?e:null!=e&&"false"!==e}let la=null;function nn(){return la}const tt=new P("DocumentToken");let di=(()=>{class e{historyGo(n){throw new Error("Not implemented")}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=O({token:e,factory:function(){return function zT(){return S(Mv)}()},providedIn:"platform"}),e})();const qT=new P("Location Initialized");let Mv=(()=>{class e extends di{constructor(n){super(),this._doc=n,this._init()}_init(){this.location=window.location,this._history=window.history}getBaseHrefFromDOM(){return nn().getBaseHref(this._doc)}onPopState(n){const r=nn().getGlobalEventTarget(this._doc,"window");return r.addEventListener("popstate",n,!1),()=>r.removeEventListener("popstate",n)}onHashChange(n){const r=nn().getGlobalEventTarget(this._doc,"window");return r.addEventListener("hashchange",n,!1),()=>r.removeEventListener("hashchange",n)}get href(){return this.location.href}get protocol(){return this.location.protocol}get hostname(){return this.location.hostname}get port(){return this.location.port}get pathname(){return this.location.pathname}get search(){return this.location.search}get hash(){return this.location.hash}set pathname(n){this.location.pathname=n}pushState(n,r,o){Sv()?this._history.pushState(n,r,o):this.location.hash=o}replaceState(n,r,o){Sv()?this._history.replaceState(n,r,o):this.location.hash=o}forward(){this._history.forward()}back(){this._history.back()}historyGo(n=0){this._history.go(n)}getState(){return this._history.state}}return e.\u0275fac=function(n){return new(n||e)(S(tt))},e.\u0275prov=O({token:e,factory:function(){return function WT(){return new Mv(S(tt))}()},providedIn:"platform"}),e})();function Sv(){return!!window.history.pushState}function Zc(e,t){if(0==e.length)return t;if(0==t.length)return e;let n=0;return e.endsWith("/")&&n++,t.startsWith("/")&&n++,2==n?e+t.substring(1):1==n?e+t:e+"/"+t}function Iv(e){const t=e.match(/#|\?|$/),n=t&&t.index||e.length;return e.slice(0,n-("/"===e[n-1]?1:0))+e.slice(n)}function Cn(e){return e&&"?"!==e[0]?"?"+e:e}let io=(()=>{class e{historyGo(n){throw new Error("Not implemented")}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=O({token:e,factory:function(){return function KT(){const e=S(tt).location;return new Av(S(di),e&&e.origin||"")}()},providedIn:"root"}),e})();const Yc=new P("appBaseHref");let Av=(()=>{class e extends io{constructor(n,r){if(super(),this._platformLocation=n,this._removeListenerFns=[],null==r&&(r=this._platformLocation.getBaseHrefFromDOM()),null==r)throw new Error("No base href set. Please provide a value for the APP_BASE_HREF token or add a base element to the document.");this._baseHref=r}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(n){this._removeListenerFns.push(this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n))}getBaseHref(){return this._baseHref}prepareExternalUrl(n){return Zc(this._baseHref,n)}path(n=!1){const r=this._platformLocation.pathname+Cn(this._platformLocation.search),o=this._platformLocation.hash;return o&&n?`${r}${o}`:r}pushState(n,r,o,i){const s=this.prepareExternalUrl(o+Cn(i));this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){const s=this.prepareExternalUrl(o+Cn(i));this._platformLocation.replaceState(n,r,s)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(n=0){var r,o;null===(r=(o=this._platformLocation).historyGo)||void 0===r||r.call(o,n)}}return e.\u0275fac=function(n){return new(n||e)(S(di),S(Yc,8))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})(),QT=(()=>{class e extends io{constructor(n,r){super(),this._platformLocation=n,this._baseHref="",this._removeListenerFns=[],null!=r&&(this._baseHref=r)}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(n){this._removeListenerFns.push(this._platformLocation.onPopState(n),this._platformLocation.onHashChange(n))}getBaseHref(){return this._baseHref}path(n=!1){let r=this._platformLocation.hash;return null==r&&(r="#"),r.length>0?r.substring(1):r}prepareExternalUrl(n){const r=Zc(this._baseHref,n);return r.length>0?"#"+r:r}pushState(n,r,o,i){let s=this.prepareExternalUrl(o+Cn(i));0==s.length&&(s=this._platformLocation.pathname),this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+Cn(i));0==s.length&&(s=this._platformLocation.pathname),this._platformLocation.replaceState(n,r,s)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(n=0){var r,o;null===(r=(o=this._platformLocation).historyGo)||void 0===r||r.call(o,n)}}return e.\u0275fac=function(n){return new(n||e)(S(di),S(Yc,8))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})(),Jc=(()=>{class e{constructor(n){this._subject=new Ce,this._urlChangeListeners=[],this._urlChangeSubscription=null,this._locationStrategy=n;const r=this._locationStrategy.getBaseHref();this._baseHref=Iv(Tv(r)),this._locationStrategy.onPopState(o=>{this._subject.emit({url:this.path(!0),pop:!0,state:o.state,type:o.type})})}ngOnDestroy(){var n;null===(n=this._urlChangeSubscription)||void 0===n||n.unsubscribe(),this._urlChangeListeners=[]}path(n=!1){return this.normalize(this._locationStrategy.path(n))}getState(){return this._locationStrategy.getState()}isCurrentPathEqualTo(n,r=""){return this.path()==this.normalize(n+Cn(r))}normalize(n){return e.stripTrailingSlash(function YT(e,t){return e&&t.startsWith(e)?t.substring(e.length):t}(this._baseHref,Tv(n)))}prepareExternalUrl(n){return n&&"/"!==n[0]&&(n="/"+n),this._locationStrategy.prepareExternalUrl(n)}go(n,r="",o=null){this._locationStrategy.pushState(o,"",n,r),this._notifyUrlChangeListeners(this.prepareExternalUrl(n+Cn(r)),o)}replaceState(n,r="",o=null){this._locationStrategy.replaceState(o,"",n,r),this._notifyUrlChangeListeners(this.prepareExternalUrl(n+Cn(r)),o)}forward(){this._locationStrategy.forward()}back(){this._locationStrategy.back()}historyGo(n=0){var r,o;null===(r=(o=this._locationStrategy).historyGo)||void 0===r||r.call(o,n)}onUrlChange(n){return this._urlChangeListeners.push(n),this._urlChangeSubscription||(this._urlChangeSubscription=this.subscribe(r=>{this._notifyUrlChangeListeners(r.url,r.state)})),()=>{const r=this._urlChangeListeners.indexOf(n);var o;this._urlChangeListeners.splice(r,1),0===this._urlChangeListeners.length&&(null===(o=this._urlChangeSubscription)||void 0===o||o.unsubscribe(),this._urlChangeSubscription=null)}}_notifyUrlChangeListeners(n="",r){this._urlChangeListeners.forEach(o=>o(n,r))}subscribe(n,r,o){return this._subject.subscribe({next:n,error:r,complete:o})}}return e.normalizeQueryParams=Cn,e.joinWithSlash=Zc,e.stripTrailingSlash=Iv,e.\u0275fac=function(n){return new(n||e)(S(io))},e.\u0275prov=O({token:e,factory:function(){return function ZT(){return new Jc(S(io))}()},providedIn:"root"}),e})();function Tv(e){return e.replace(/\/index.html$/,"")}function Lv(e,t){t=encodeURIComponent(t);for(const n of e.split(";")){const r=n.indexOf("="),[o,i]=-1==r?[n,""]:[n.slice(0,r),n.slice(r+1)];if(o.trim()===t)return decodeURIComponent(i)}return null}let pi=(()=>{class e{constructor(n,r){this._viewContainer=n,this._context=new Lx,this._thenTemplateRef=null,this._elseTemplateRef=null,this._thenViewRef=null,this._elseViewRef=null,this._thenTemplateRef=r}set ngIf(n){this._context.$implicit=this._context.ngIf=n,this._updateView()}set ngIfThen(n){Hv("ngIfThen",n),this._thenTemplateRef=n,this._thenViewRef=null,this._updateView()}set ngIfElse(n){Hv("ngIfElse",n),this._elseTemplateRef=n,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngTemplateContextGuard(n,r){return!0}}return e.\u0275fac=function(n){return new(n||e)(v(Vt),v(vn))},e.\u0275dir=R({type:e,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"}}),e})();class Lx{constructor(){this.$implicit=null,this.ngIf=null}}function Hv(e,t){if(t&&!t.createEmbeddedView)throw new Error(`${e} must be a TemplateRef, but received '${ie(t)}'.`)}let dN=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=lt({}),e})();let gN=(()=>{class e{}return e.\u0275prov=O({token:e,providedIn:"root",factory:()=>new mN(S(tt),window)}),e})();class mN{constructor(t,n){this.document=t,this.window=n,this.offset=()=>[0,0]}setOffset(t){this.offset=Array.isArray(t)?()=>t:t}getScrollPosition(){return this.supportsScrolling()?[this.window.pageXOffset,this.window.pageYOffset]:[0,0]}scrollToPosition(t){this.supportsScrolling()&&this.window.scrollTo(t[0],t[1])}scrollToAnchor(t){if(!this.supportsScrolling())return;const n=function yN(e,t){const n=e.getElementById(t)||e.getElementsByName(t)[0];if(n)return n;if("function"==typeof e.createTreeWalker&&e.body&&(e.body.createShadowRoot||e.body.attachShadow)){const r=e.createTreeWalker(e.body,NodeFilter.SHOW_ELEMENT);let o=r.currentNode;for(;o;){const i=o.shadowRoot;if(i){const s=i.getElementById(t)||i.querySelector(`[name="${t}"]`);if(s)return s}o=r.nextNode()}}return null}(this.document,t);n&&(this.scrollToElement(n),n.focus())}setHistoryScrollRestoration(t){if(this.supportScrollRestoration()){const n=this.window.history;n&&n.scrollRestoration&&(n.scrollRestoration=t)}}scrollToElement(t){const n=t.getBoundingClientRect(),r=n.left+this.window.pageXOffset,o=n.top+this.window.pageYOffset,i=this.offset();this.window.scrollTo(r-i[0],o-i[1])}supportScrollRestoration(){try{if(!this.supportsScrolling())return!1;const t=zv(this.window.history)||zv(Object.getPrototypeOf(this.window.history));return!(!t||!t.writable&&!t.set)}catch{return!1}}supportsScrolling(){try{return!!this.window&&!!this.window.scrollTo&&"pageXOffset"in this.window}catch{return!1}}}function zv(e){return Object.getOwnPropertyDescriptor(e,"scrollRestoration")}class qv{}class fd extends class vN extends class GT{}{constructor(){super(...arguments),this.supportsDOMEvents=!0}}{static makeCurrent(){!function $T(e){la||(la=e)}(new fd)}onAndCancel(t,n,r){return t.addEventListener(n,r,!1),()=>{t.removeEventListener(n,r,!1)}}dispatchEvent(t,n){t.dispatchEvent(n)}remove(t){t.parentNode&&t.parentNode.removeChild(t)}createElement(t,n){return(n=n||this.getDefaultDocument()).createElement(t)}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}isElementNode(t){return t.nodeType===Node.ELEMENT_NODE}isShadowRoot(t){return t instanceof DocumentFragment}getGlobalEventTarget(t,n){return"window"===n?window:"document"===n?t:"body"===n?t.body:null}getBaseHref(t){const n=function _N(){return gi=gi||document.querySelector("base"),gi?gi.getAttribute("href"):null}();return null==n?null:function DN(e){va=va||document.createElement("a"),va.setAttribute("href",e);const t=va.pathname;return"/"===t.charAt(0)?t:`/${t}`}(n)}resetBaseElement(){gi=null}getUserAgent(){return window.navigator.userAgent}getCookie(t){return Lv(document.cookie,t)}}let va,gi=null;const Wv=new P("TRANSITION_ID"),wN=[{provide:Oc,useFactory:function CN(e,t,n){return()=>{n.get(ea).donePromise.then(()=>{const r=nn(),o=t.querySelectorAll(`style[ng-transition="${e}"]`);for(let i=0;i{class e{build(){return new XMLHttpRequest}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();const _a=new P("EventManagerPlugins");let Da=(()=>{class e{constructor(n,r){this._zone=r,this._eventNameToPlugin=new Map,n.forEach(o=>o.manager=this),this._plugins=n.slice().reverse()}addEventListener(n,r,o){return this._findPluginFor(r).addEventListener(n,r,o)}addGlobalEventListener(n,r,o){return this._findPluginFor(r).addGlobalEventListener(n,r,o)}getZone(){return this._zone}_findPluginFor(n){const r=this._eventNameToPlugin.get(n);if(r)return r;const o=this._plugins;for(let i=0;i{class e{constructor(){this._stylesSet=new Set}addStyles(n){const r=new Set;n.forEach(o=>{this._stylesSet.has(o)||(this._stylesSet.add(o),r.add(o))}),this.onStylesAdded(r)}onStylesAdded(n){}getAllStyles(){return Array.from(this._stylesSet)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})(),mi=(()=>{class e extends Qv{constructor(n){super(),this._doc=n,this._hostNodes=new Map,this._hostNodes.set(n.head,[])}_addStylesToHost(n,r,o){n.forEach(i=>{const s=this._doc.createElement("style");s.textContent=i,o.push(r.appendChild(s))})}addHost(n){const r=[];this._addStylesToHost(this._stylesSet,n,r),this._hostNodes.set(n,r)}removeHost(n){const r=this._hostNodes.get(n);r&&r.forEach(Zv),this._hostNodes.delete(n)}onStylesAdded(n){this._hostNodes.forEach((r,o)=>{this._addStylesToHost(n,o,r)})}ngOnDestroy(){this._hostNodes.forEach(n=>n.forEach(Zv))}}return e.\u0275fac=function(n){return new(n||e)(S(tt))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();function Zv(e){nn().remove(e)}const hd={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/",math:"http://www.w3.org/1998/MathML/"},pd=/%COMP%/g;function Ca(e,t,n){for(let r=0;r{if("__ngUnwrap__"===t)return e;!1===e(t)&&(t.preventDefault(),t.returnValue=!1)}}let gd=(()=>{class e{constructor(n,r,o){this.eventManager=n,this.sharedStylesHost=r,this.appId=o,this.rendererByCompId=new Map,this.defaultRenderer=new md(n)}createRenderer(n,r){if(!n||!r)return this.defaultRenderer;switch(r.encapsulation){case Gt.Emulated:{let o=this.rendererByCompId.get(r.id);return o||(o=new xN(this.eventManager,this.sharedStylesHost,r,this.appId),this.rendererByCompId.set(r.id,o)),o.applyToHost(n),o}case 1:case Gt.ShadowDom:return new NN(this.eventManager,this.sharedStylesHost,n,r);default:if(!this.rendererByCompId.has(r.id)){const o=Ca(r.id,r.styles,[]);this.sharedStylesHost.addStyles(o),this.rendererByCompId.set(r.id,this.defaultRenderer)}return this.defaultRenderer}}begin(){}end(){}}return e.\u0275fac=function(n){return new(n||e)(S(Da),S(mi),S(ui))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();class md{constructor(t){this.eventManager=t,this.data=Object.create(null),this.destroyNode=null}destroy(){}createElement(t,n){return n?document.createElementNS(hd[n]||n,t):document.createElement(t)}createComment(t){return document.createComment(t)}createText(t){return document.createTextNode(t)}appendChild(t,n){(t_(t)?t.content:t).appendChild(n)}insertBefore(t,n,r){t&&(t_(t)?t.content:t).insertBefore(n,r)}removeChild(t,n){t&&t.removeChild(n)}selectRootElement(t,n){let r="string"==typeof t?document.querySelector(t):t;if(!r)throw new Error(`The selector "${t}" did not match any elements`);return n||(r.textContent=""),r}parentNode(t){return t.parentNode}nextSibling(t){return t.nextSibling}setAttribute(t,n,r,o){if(o){n=o+":"+n;const i=hd[o];i?t.setAttributeNS(i,n,r):t.setAttribute(n,r)}else t.setAttribute(n,r)}removeAttribute(t,n,r){if(r){const o=hd[r];o?t.removeAttributeNS(o,n):t.removeAttribute(`${r}:${n}`)}else t.removeAttribute(n)}addClass(t,n){t.classList.add(n)}removeClass(t,n){t.classList.remove(n)}setStyle(t,n,r,o){o&(pt.DashCase|pt.Important)?t.style.setProperty(n,r,o&pt.Important?"important":""):t.style[n]=r}removeStyle(t,n,r){r&pt.DashCase?t.style.removeProperty(n):t.style[n]=""}setProperty(t,n,r){t[n]=r}setValue(t,n){t.nodeValue=n}listen(t,n,r){return"string"==typeof t?this.eventManager.addGlobalEventListener(t,n,Xv(r)):this.eventManager.addEventListener(t,n,Xv(r))}}function t_(e){return"TEMPLATE"===e.tagName&&void 0!==e.content}class xN extends md{constructor(t,n,r,o){super(t),this.component=r;const i=Ca(o+"-"+r.id,r.styles,[]);n.addStyles(i),this.contentAttr=function IN(e){return"_ngcontent-%COMP%".replace(pd,e)}(o+"-"+r.id),this.hostAttr=function AN(e){return"_nghost-%COMP%".replace(pd,e)}(o+"-"+r.id)}applyToHost(t){super.setAttribute(t,this.hostAttr,"")}createElement(t,n){const r=super.createElement(t,n);return super.setAttribute(r,this.contentAttr,""),r}}class NN extends md{constructor(t,n,r,o){super(t),this.sharedStylesHost=n,this.hostEl=r,this.shadowRoot=r.attachShadow({mode:"open"}),this.sharedStylesHost.addHost(this.shadowRoot);const i=Ca(o.id,o.styles,[]);for(let s=0;s{class e extends Kv{constructor(n){super(n)}supports(n){return!0}addEventListener(n,r,o){return n.addEventListener(r,o,!1),()=>this.removeEventListener(n,r,o)}removeEventListener(n,r,o){return n.removeEventListener(r,o)}}return e.\u0275fac=function(n){return new(n||e)(S(tt))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();const n_=["alt","control","meta","shift"],PN={"\b":"Backspace","\t":"Tab","\x7f":"Delete","\x1b":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},r_={A:"1",B:"2",C:"3",D:"4",E:"5",F:"6",G:"7",H:"8",I:"9",J:"*",K:"+",M:"-",N:".",O:"/","`":"0","\x90":"NumLock"},ON={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey};let kN=(()=>{class e extends Kv{constructor(n){super(n)}supports(n){return null!=e.parseEventName(n)}addEventListener(n,r,o){const i=e.parseEventName(r),s=e.eventCallback(i.fullKey,o,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>nn().onAndCancel(n,i.domEventName,s))}static parseEventName(n){const r=n.toLowerCase().split("."),o=r.shift();if(0===r.length||"keydown"!==o&&"keyup"!==o)return null;const i=e._normalizeKey(r.pop());let s="";if(n_.forEach(l=>{const u=r.indexOf(l);u>-1&&(r.splice(u,1),s+=l+".")}),s+=i,0!=r.length||0===i.length)return null;const a={};return a.domEventName=o,a.fullKey=s,a}static getEventFullKey(n){let r="",o=function VN(e){let t=e.key;if(null==t){if(t=e.keyIdentifier,null==t)return"Unidentified";t.startsWith("U+")&&(t=String.fromCharCode(parseInt(t.substring(2),16)),3===e.location&&r_.hasOwnProperty(t)&&(t=r_[t]))}return PN[t]||t}(n);return o=o.toLowerCase()," "===o?o="space":"."===o&&(o="dot"),n_.forEach(i=>{i!=o&&ON[i](n)&&(r+=i+".")}),r+=o,r}static eventCallback(n,r,o){return i=>{e.getEventFullKey(i)===n&&o.runGuarded(()=>r(i))}}static _normalizeKey(n){return"esc"===n?"escape":n}}return e.\u0275fac=function(n){return new(n||e)(S(tt))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();const o_=[{provide:Vc,useValue:"browser"},{provide:Jy,useValue:function LN(){fd.makeCurrent()},multi:!0},{provide:tt,useFactory:function BN(){return function Uw(e){bl=e}(document),document},deps:[]}],HN=av(BT,"browser",o_),i_=new P(""),s_=[{provide:ta,useClass:class EN{addToWindow(t){te.getAngularTestability=(r,o=!0)=>{const i=t.findTestabilityInTree(r,o);if(null==i)throw new Error("Could not find testability for element.");return i},te.getAllAngularTestabilities=()=>t.getAllTestabilities(),te.getAllAngularRootElements=()=>t.getAllRootElements(),te.frameworkStabilizers||(te.frameworkStabilizers=[]),te.frameworkStabilizers.push(r=>{const o=te.getAllAngularTestabilities();let i=o.length,s=!1;const a=function(l){s=s||l,i--,0==i&&r(s)};o.forEach(function(l){l.whenStable(a)})})}findTestabilityInTree(t,n,r){return null==n?null:t.getTestability(n)??(r?nn().isShadowRoot(n)?this.findTestabilityInTree(t,n.host,!0):this.findTestabilityInTree(t,n.parentElement,!0):null)}},deps:[]},{provide:nv,useClass:Uc,deps:[Me,$c,ta]},{provide:Uc,useClass:Uc,deps:[Me,$c,ta]}],a_=[{provide:Cu,useValue:"root"},{provide:Pr,useFactory:function jN(){return new Pr},deps:[]},{provide:_a,useClass:RN,multi:!0,deps:[tt,Me,Vc]},{provide:_a,useClass:kN,multi:!0,deps:[tt]},{provide:gd,useClass:gd,deps:[Da,mi,ui]},{provide:gy,useExisting:gd},{provide:Qv,useExisting:mi},{provide:mi,useClass:mi,deps:[tt]},{provide:Da,useClass:Da,deps:[_a,Me]},{provide:qv,useClass:bN,deps:[]},[]];let UN=(()=>{class e{constructor(n){}static withServerTransition(n){return{ngModule:e,providers:[{provide:ui,useValue:n.appId},{provide:Wv,useExisting:ui},wN]}}}return e.\u0275fac=function(n){return new(n||e)(S(i_,12))},e.\u0275mod=_t({type:e}),e.\u0275inj=lt({providers:[...a_,...s_],imports:[dN,HT]}),e})(),l_=(()=>{class e{constructor(n){this._doc=n}getTitle(){return this._doc.title}setTitle(n){this._doc.title=n||""}}return e.\u0275fac=function(n){return new(n||e)(S(tt))},e.\u0275prov=O({token:e,factory:function(n){let r=null;return r=n?new n:function GN(){return new l_(S(tt))}(),r},providedIn:"root"}),e})();function V(...e){let t=e[e.length-1];return zi(t)?(e.pop(),rl(e,t)):al(e)}typeof window<"u"&&window;class Bt extends Ut{constructor(t){super(),this._value=t}get value(){return this.getValue()}_subscribe(t){const n=super._subscribe(t);return n&&!n.closed&&t.next(this._value),n}getValue(){if(this.hasError)throw this.thrownError;if(this.closed)throw new pr;return this._value}next(t){super.next(this._value=t)}}class XN extends fe{notifyNext(t,n,r,o,i){this.destination.next(n)}notifyError(t,n){this.destination.error(t)}notifyComplete(t){this.destination.complete()}}class eR extends fe{constructor(t,n,r){super(),this.parent=t,this.outerValue=n,this.outerIndex=r,this.index=0}_next(t){this.parent.notifyNext(this.outerValue,t,this.outerIndex,this.index++,this)}_error(t){this.parent.notifyError(t,this),this.unsubscribe()}_complete(){this.parent.notifyComplete(this),this.unsubscribe()}}function tR(e,t,n,r,o=new eR(e,n,r)){if(!o.closed)return t instanceof pe?t.subscribe(o):nl(t)(o)}const d_={};function f_(...e){let t,n;return zi(e[e.length-1])&&(n=e.pop()),"function"==typeof e[e.length-1]&&(t=e.pop()),1===e.length&&Hi(e[0])&&(e=e[0]),al(e,n).lift(new nR(t))}class nR{constructor(t){this.resultSelector=t}call(t,n){return n.subscribe(new rR(t,this.resultSelector))}}class rR extends XN{constructor(t,n){super(t),this.resultSelector=n,this.active=0,this.values=[],this.observables=[]}_next(t){this.values.push(d_),this.observables.push(t)}_complete(){const t=this.observables,n=t.length;if(0===n)this.destination.complete();else{this.active=n,this.toRespond=n;for(let r=0;rt.schedule(oR,0,{error:e,subscriber:n}):n=>n.error(e))}function oR({error:e,subscriber:t}){t.error(e)}const vi=(()=>{function e(){return Error.call(this),this.message="no elements in sequence",this.name="EmptyError",this}return e.prototype=Object.create(Error.prototype),e})();function _d(...e){return function iR(){return gr(1)}()(V(...e))}const so=new pe(e=>e.complete());function Dd(e){return e?function sR(e){return new pe(t=>e.schedule(()=>t.complete()))}(e):so}function h_(e){return new pe(t=>{let n;try{n=e()}catch(o){return void t.error(o)}return(n?Oe(n):Dd()).subscribe(t)})}function kn(e,t){return"function"==typeof t?n=>n.pipe(kn((r,o)=>Oe(e(r,o)).pipe(Y((i,s)=>t(r,i,o,s))))):n=>n.lift(new aR(e))}class aR{constructor(t){this.project=t}call(t,n){return n.subscribe(new lR(t,this.project))}}class lR extends il{constructor(t,n){super(t),this.project=n,this.index=0}_next(t){let n;const r=this.index++;try{n=this.project(t,r)}catch(o){return void this.destination.error(o)}this._innerSub(n)}_innerSub(t){const n=this.innerSubscription;n&&n.unsubscribe();const r=new ol(this),o=this.destination;o.add(r),this.innerSubscription=sl(t,r),this.innerSubscription!==r&&o.add(this.innerSubscription)}_complete(){const{innerSubscription:t}=this;(!t||t.closed)&&super._complete(),this.unsubscribe()}_unsubscribe(){this.innerSubscription=void 0}notifyComplete(){this.innerSubscription=void 0,this.isStopped&&super._complete()}notifyNext(t){this.destination.next(t)}}const p_=(()=>{function e(){return Error.call(this),this.message="argument out of range",this.name="ArgumentOutOfRangeError",this}return e.prototype=Object.create(Error.prototype),e})();function wa(e){return t=>0===e?Dd():t.lift(new uR(e))}class uR{constructor(t){if(this.total=t,this.total<0)throw new p_}call(t,n){return n.subscribe(new cR(t,this.total))}}class cR extends fe{constructor(t,n){super(t),this.total=n,this.count=0}_next(t){const n=this.total,r=++this.count;r<=n&&(this.destination.next(t),r===n&&(this.destination.complete(),this.unsubscribe()))}}function g_(e,t){let n=!1;return arguments.length>=2&&(n=!0),function(o){return o.lift(new fR(e,t,n))}}class fR{constructor(t,n,r=!1){this.accumulator=t,this.seed=n,this.hasSeed=r}call(t,n){return n.subscribe(new hR(t,this.accumulator,this.seed,this.hasSeed))}}class hR extends fe{constructor(t,n,r,o){super(t),this.accumulator=n,this._seed=r,this.hasSeed=o,this.index=0}get seed(){return this._seed}set seed(t){this.hasSeed=!0,this._seed=t}_next(t){if(this.hasSeed)return this._tryNext(t);this.seed=t,this.destination.next(t)}_tryNext(t){const n=this.index++;let r;try{r=this.accumulator(this.seed,t,n)}catch(o){this.destination.error(o)}this.seed=r,this.destination.next(r)}}function rr(e,t){return function(r){return r.lift(new pR(e,t))}}class pR{constructor(t,n){this.predicate=t,this.thisArg=n}call(t,n){return n.subscribe(new gR(t,this.predicate,this.thisArg))}}class gR extends fe{constructor(t,n,r){super(t),this.predicate=n,this.thisArg=r,this.count=0}_next(t){let n;try{n=this.predicate.call(this.thisArg,t,this.count++)}catch(r){return void this.destination.error(r)}n&&this.destination.next(t)}}function or(e){return function(n){const r=new mR(e),o=n.lift(r);return r.caught=o}}class mR{constructor(t){this.selector=t}call(t,n){return n.subscribe(new yR(t,this.selector,this.caught))}}class yR extends il{constructor(t,n,r){super(t),this.selector=n,this.caught=r}error(t){if(!this.isStopped){let n;try{n=this.selector(t,this.caught)}catch(i){return void super.error(i)}this._unsubscribeAndRecycle();const r=new ol(this);this.add(r);const o=sl(n,r);o!==r&&this.add(o)}}}function ao(e,t){return Ve(e,t,1)}function Cd(e){return function(n){return 0===e?Dd():n.lift(new vR(e))}}class vR{constructor(t){if(this.total=t,this.total<0)throw new p_}call(t,n){return n.subscribe(new _R(t,this.total))}}class _R extends fe{constructor(t,n){super(t),this.total=n,this.ring=new Array,this.count=0}_next(t){const n=this.ring,r=this.total,o=this.count++;n.length0){const r=this.count>=this.total?this.total:this.count,o=this.ring;for(let i=0;it.lift(new DR(e))}class DR{constructor(t){this.errorFactory=t}call(t,n){return n.subscribe(new CR(t,this.errorFactory))}}class CR extends fe{constructor(t,n){super(t),this.errorFactory=n,this.hasValue=!1}_next(t){this.hasValue=!0,this.destination.next(t)}_complete(){if(this.hasValue)return this.destination.complete();{let t;try{t=this.errorFactory()}catch(n){t=n}this.destination.error(t)}}}function wR(){return new vi}function wd(e=null){return t=>t.lift(new ER(e))}class ER{constructor(t){this.defaultValue=t}call(t,n){return n.subscribe(new bR(t,this.defaultValue))}}class bR extends fe{constructor(t,n){super(t),this.defaultValue=n,this.isEmpty=!0}_next(t){this.isEmpty=!1,this.destination.next(t)}_complete(){this.isEmpty&&this.destination.next(this.defaultValue),this.destination.complete()}}function ir(e,t){const n=arguments.length>=2;return r=>r.pipe(e?rr((o,i)=>e(o,i,r)):Gi,wa(1),n?wd(t):m_(()=>new vi))}function Vn(){}function $e(e,t,n){return function(o){return o.lift(new SR(e,t,n))}}class SR{constructor(t,n,r){this.nextOrObserver=t,this.error=n,this.complete=r}call(t,n){return n.subscribe(new IR(t,this.nextOrObserver,this.error,this.complete))}}class IR extends fe{constructor(t,n,r,o){super(t),this._tapNext=Vn,this._tapError=Vn,this._tapComplete=Vn,this._tapError=r||Vn,this._tapComplete=o||Vn,Un(n)?(this._context=this,this._tapNext=n):n&&(this._context=n,this._tapNext=n.next||Vn,this._tapError=n.error||Vn,this._tapComplete=n.complete||Vn)}_next(t){try{this._tapNext.call(this._context,t)}catch(n){return void this.destination.error(n)}this.destination.next(t)}_error(t){try{this._tapError.call(this._context,t)}catch(n){return void this.destination.error(n)}this.destination.error(t)}_complete(){try{this._tapComplete.call(this._context)}catch(t){return void this.destination.error(t)}return this.destination.complete()}}class TR{constructor(t){this.value=t}call(t,n){return n.subscribe(new xR(t,this.value))}}class xR extends fe{constructor(t,n){super(t),this.value=n}_next(t){this.destination.next(this.value)}}function Ed(e){return t=>t.lift(new NR(e))}class NR{constructor(t){this.callback=t}call(t,n){return n.subscribe(new RR(t,this.callback))}}class RR extends fe{constructor(t,n){super(t),this.add(new ye(n))}}class En{constructor(t,n){this.id=t,this.url=n}}class bd extends En{constructor(t,n,r="imperative",o=null){super(t,n),this.type=0,this.navigationTrigger=r,this.restoredState=o}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}}class _i extends En{constructor(t,n,r){super(t,n),this.urlAfterRedirects=r,this.type=1}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}}class y_ extends En{constructor(t,n,r){super(t,n),this.reason=r,this.type=2}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}}class FR extends En{constructor(t,n,r){super(t,n),this.error=r,this.type=3}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}}class PR extends En{constructor(t,n,r,o){super(t,n),this.urlAfterRedirects=r,this.state=o,this.type=4}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class OR extends En{constructor(t,n,r,o){super(t,n),this.urlAfterRedirects=r,this.state=o,this.type=7}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class kR extends En{constructor(t,n,r,o,i){super(t,n),this.urlAfterRedirects=r,this.state=o,this.shouldActivate=i,this.type=8}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}}class VR extends En{constructor(t,n,r,o){super(t,n),this.urlAfterRedirects=r,this.state=o,this.type=5}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class LR extends En{constructor(t,n,r,o){super(t,n),this.urlAfterRedirects=r,this.state=o,this.type=6}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}}class jR{constructor(t){this.route=t,this.type=9}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}}class BR{constructor(t){this.route=t,this.type=10}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}}class HR{constructor(t){this.snapshot=t,this.type=11}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class UR{constructor(t){this.snapshot=t,this.type=12}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class $R{constructor(t){this.snapshot=t,this.type=13}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class GR{constructor(t){this.snapshot=t,this.type=14}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class v_{constructor(t,n,r){this.routerEvent=t,this.position=n,this.anchor=r,this.type=15}toString(){return`Scroll(anchor: '${this.anchor}', position: '${this.position?`${this.position[0]}, ${this.position[1]}`:null}')`}}const z="primary";class zR{constructor(t){this.params=t||{}}has(t){return Object.prototype.hasOwnProperty.call(this.params,t)}get(t){if(this.has(t)){const n=this.params[t];return Array.isArray(n)?n[0]:n}return null}getAll(t){if(this.has(t)){const n=this.params[t];return Array.isArray(n)?n:[n]}return[]}get keys(){return Object.keys(this.params)}}function lo(e){return new zR(e)}const __="ngNavigationCancelingError";function Md(e){const t=Error("NavigationCancelingError: "+e);return t[__]=!0,t}function WR(e,t,n){const r=n.path.split("/");if(r.length>e.length||"full"===n.pathMatch&&(t.hasChildren()||r.lengthr[i]===o)}return e===t}function C_(e){return Array.prototype.concat.apply([],e)}function w_(e){return e.length>0?e[e.length-1]:null}function ke(e,t){for(const n in e)e.hasOwnProperty(n)&&t(e[n],n)}function Ht(e){return ac(e)?e:Ko(e)?Oe(Promise.resolve(e)):V(e)}const ZR={exact:function M_(e,t,n){if(!ar(e.segments,t.segments)||!Ea(e.segments,t.segments,n)||e.numberOfChildren!==t.numberOfChildren)return!1;for(const r in t.children)if(!e.children[r]||!M_(e.children[r],t.children[r],n))return!1;return!0},subset:S_},E_={exact:function YR(e,t){return rn(e,t)},subset:function JR(e,t){return Object.keys(t).length<=Object.keys(e).length&&Object.keys(t).every(n=>D_(e[n],t[n]))},ignored:()=>!0};function b_(e,t,n){return ZR[n.paths](e.root,t.root,n.matrixParams)&&E_[n.queryParams](e.queryParams,t.queryParams)&&!("exact"===n.fragment&&e.fragment!==t.fragment)}function S_(e,t,n){return I_(e,t,t.segments,n)}function I_(e,t,n,r){if(e.segments.length>n.length){const o=e.segments.slice(0,n.length);return!(!ar(o,n)||t.hasChildren()||!Ea(o,n,r))}if(e.segments.length===n.length){if(!ar(e.segments,n)||!Ea(e.segments,n,r))return!1;for(const o in t.children)if(!e.children[o]||!S_(e.children[o],t.children[o],r))return!1;return!0}{const o=n.slice(0,e.segments.length),i=n.slice(e.segments.length);return!!(ar(e.segments,o)&&Ea(e.segments,o,r)&&e.children[z])&&I_(e.children[z],t,i,r)}}function Ea(e,t,n){return t.every((r,o)=>E_[n](e[o].parameters,r.parameters))}class sr{constructor(t,n,r){this.root=t,this.queryParams=n,this.fragment=r}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=lo(this.queryParams)),this._queryParamMap}toString(){return tF.serialize(this)}}class W{constructor(t,n){this.segments=t,this.children=n,this.parent=null,ke(n,(r,o)=>r.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return ba(this)}}class Di{constructor(t,n){this.path=t,this.parameters=n}get parameterMap(){return this._parameterMap||(this._parameterMap=lo(this.parameters)),this._parameterMap}toString(){return R_(this)}}function ar(e,t){return e.length===t.length&&e.every((n,r)=>n.path===t[r].path)}class A_{}class T_{parse(t){const n=new cF(t);return new sr(n.parseRootSegment(),n.parseQueryParams(),n.parseFragment())}serialize(t){const n=`/${Ci(t.root,!0)}`,r=function oF(e){const t=Object.keys(e).map(n=>{const r=e[n];return Array.isArray(r)?r.map(o=>`${Ma(n)}=${Ma(o)}`).join("&"):`${Ma(n)}=${Ma(r)}`}).filter(n=>!!n);return t.length?`?${t.join("&")}`:""}(t.queryParams),o="string"==typeof t.fragment?`#${function nF(e){return encodeURI(e)}(t.fragment)}`:"";return`${n}${r}${o}`}}const tF=new T_;function ba(e){return e.segments.map(t=>R_(t)).join("/")}function Ci(e,t){if(!e.hasChildren())return ba(e);if(t){const n=e.children[z]?Ci(e.children[z],!1):"",r=[];return ke(e.children,(o,i)=>{i!==z&&r.push(`${i}:${Ci(o,!1)}`)}),r.length>0?`${n}(${r.join("//")})`:n}{const n=function eF(e,t){let n=[];return ke(e.children,(r,o)=>{o===z&&(n=n.concat(t(r,o)))}),ke(e.children,(r,o)=>{o!==z&&(n=n.concat(t(r,o)))}),n}(e,(r,o)=>o===z?[Ci(e.children[z],!1)]:[`${o}:${Ci(r,!1)}`]);return 1===Object.keys(e.children).length&&null!=e.children[z]?`${ba(e)}/${n[0]}`:`${ba(e)}/(${n.join("//")})`}}function x_(e){return encodeURIComponent(e).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function Ma(e){return x_(e).replace(/%3B/gi,";")}function Sd(e){return x_(e).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function Sa(e){return decodeURIComponent(e)}function N_(e){return Sa(e.replace(/\+/g,"%20"))}function R_(e){return`${Sd(e.path)}${function rF(e){return Object.keys(e).map(t=>`;${Sd(t)}=${Sd(e[t])}`).join("")}(e.parameters)}`}const iF=/^[^\/()?;=#]+/;function Ia(e){const t=e.match(iF);return t?t[0]:""}const sF=/^[^=?&#]+/,lF=/^[^&#]+/;class cF{constructor(t){this.url=t,this.remaining=t}parseRootSegment(){return this.consumeOptional("/"),""===this.remaining||this.peekStartsWith("?")||this.peekStartsWith("#")?new W([],{}):new W([],this.parseChildren())}parseQueryParams(){const t={};if(this.consumeOptional("?"))do{this.parseQueryParam(t)}while(this.consumeOptional("&"));return t}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(){if(""===this.remaining)return{};this.consumeOptional("/");const t=[];for(this.peekStartsWith("(")||t.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),t.push(this.parseSegment());let n={};this.peekStartsWith("/(")&&(this.capture("/"),n=this.parseParens(!0));let r={};return this.peekStartsWith("(")&&(r=this.parseParens(!1)),(t.length>0||Object.keys(n).length>0)&&(r[z]=new W(t,n)),r}parseSegment(){const t=Ia(this.remaining);if(""===t&&this.peekStartsWith(";"))throw new Error(`Empty path url segment cannot have parameters: '${this.remaining}'.`);return this.capture(t),new Di(Sa(t),this.parseMatrixParams())}parseMatrixParams(){const t={};for(;this.consumeOptional(";");)this.parseParam(t);return t}parseParam(t){const n=Ia(this.remaining);if(!n)return;this.capture(n);let r="";if(this.consumeOptional("=")){const o=Ia(this.remaining);o&&(r=o,this.capture(r))}t[Sa(n)]=Sa(r)}parseQueryParam(t){const n=function aF(e){const t=e.match(sF);return t?t[0]:""}(this.remaining);if(!n)return;this.capture(n);let r="";if(this.consumeOptional("=")){const s=function uF(e){const t=e.match(lF);return t?t[0]:""}(this.remaining);s&&(r=s,this.capture(r))}const o=N_(n),i=N_(r);if(t.hasOwnProperty(o)){let s=t[o];Array.isArray(s)||(s=[s],t[o]=s),s.push(i)}else t[o]=i}parseParens(t){const n={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){const r=Ia(this.remaining),o=this.remaining[r.length];if("/"!==o&&")"!==o&&";"!==o)throw new Error(`Cannot parse url '${this.url}'`);let i;r.indexOf(":")>-1?(i=r.slice(0,r.indexOf(":")),this.capture(i),this.capture(":")):t&&(i=z);const s=this.parseChildren();n[i]=1===Object.keys(s).length?s[z]:new W([],s),this.consumeOptional("//")}return n}peekStartsWith(t){return this.remaining.startsWith(t)}consumeOptional(t){return!!this.peekStartsWith(t)&&(this.remaining=this.remaining.substring(t.length),!0)}capture(t){if(!this.consumeOptional(t))throw new Error(`Expected "${t}".`)}}class F_{constructor(t){this._root=t}get root(){return this._root.value}parent(t){const n=this.pathFromRoot(t);return n.length>1?n[n.length-2]:null}children(t){const n=Id(t,this._root);return n?n.children.map(r=>r.value):[]}firstChild(t){const n=Id(t,this._root);return n&&n.children.length>0?n.children[0].value:null}siblings(t){const n=Ad(t,this._root);return n.length<2?[]:n[n.length-2].children.map(o=>o.value).filter(o=>o!==t)}pathFromRoot(t){return Ad(t,this._root).map(n=>n.value)}}function Id(e,t){if(e===t.value)return t;for(const n of t.children){const r=Id(e,n);if(r)return r}return null}function Ad(e,t){if(e===t.value)return[t];for(const n of t.children){const r=Ad(e,n);if(r.length)return r.unshift(t),r}return[]}class bn{constructor(t,n){this.value=t,this.children=n}toString(){return`TreeNode(${this.value})`}}function uo(e){const t={};return e&&e.children.forEach(n=>t[n.value.outlet]=n),t}class P_ extends F_{constructor(t,n){super(t),this.snapshot=n,Td(this,t)}toString(){return this.snapshot.toString()}}function O_(e,t){const n=function dF(e,t){const s=new Aa([],{},{},"",{},z,t,null,e.root,-1,{});return new V_("",new bn(s,[]))}(e,t),r=new Bt([new Di("",{})]),o=new Bt({}),i=new Bt({}),s=new Bt({}),a=new Bt(""),l=new co(r,o,s,a,i,z,t,n.root);return l.snapshot=n.root,new P_(new bn(l,[]),n)}class co{constructor(t,n,r,o,i,s,a,l){this.url=t,this.params=n,this.queryParams=r,this.fragment=o,this.data=i,this.outlet=s,this.component=a,this._futureSnapshot=l}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap||(this._paramMap=this.params.pipe(Y(t=>lo(t)))),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=this.queryParams.pipe(Y(t=>lo(t)))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}}function k_(e,t="emptyOnly"){const n=e.pathFromRoot;let r=0;if("always"!==t)for(r=n.length-1;r>=1;){const o=n[r],i=n[r-1];if(o.routeConfig&&""===o.routeConfig.path)r--;else{if(i.component)break;r--}}return function fF(e){return e.reduce((t,n)=>{var r;return{params:{...t.params,...n.params},data:{...t.data,...n.data},resolve:{...n.data,...t.resolve,...null===(r=n.routeConfig)||void 0===r?void 0:r.data,...n._resolvedData}}},{params:{},data:{},resolve:{}})}(n.slice(r))}class Aa{constructor(t,n,r,o,i,s,a,l,u,c,d,f){this.url=t,this.params=n,this.queryParams=r,this.fragment=o,this.data=i,this.outlet=s,this.component=a,this.routeConfig=l,this._urlSegment=u,this._lastPathIndex=c,this._correctedLastPathIndex=f??c,this._resolve=d}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap||(this._paramMap=lo(this.params)),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=lo(this.queryParams)),this._queryParamMap}toString(){return`Route(url:'${this.url.map(r=>r.toString()).join("/")}', path:'${this.routeConfig?this.routeConfig.path:""}')`}}class V_ extends F_{constructor(t,n){super(n),this.url=t,Td(this,n)}toString(){return L_(this._root)}}function Td(e,t){t.value._routerState=e,t.children.forEach(n=>Td(e,n))}function L_(e){const t=e.children.length>0?` { ${e.children.map(L_).join(", ")} } `:"";return`${e.value}${t}`}function xd(e){if(e.snapshot){const t=e.snapshot,n=e._futureSnapshot;e.snapshot=n,rn(t.queryParams,n.queryParams)||e.queryParams.next(n.queryParams),t.fragment!==n.fragment&&e.fragment.next(n.fragment),rn(t.params,n.params)||e.params.next(n.params),function KR(e,t){if(e.length!==t.length)return!1;for(let n=0;nrn(n.parameters,t[r].parameters))}(e.url,t.url);return n&&!(!e.parent!=!t.parent)&&(!e.parent||Nd(e.parent,t.parent))}function wi(e,t,n){if(n&&e.shouldReuseRoute(t.value,n.value.snapshot)){const r=n.value;r._futureSnapshot=t.value;const o=function pF(e,t,n){return t.children.map(r=>{for(const o of n.children)if(e.shouldReuseRoute(r.value,o.value.snapshot))return wi(e,r,o);return wi(e,r)})}(e,t,n);return new bn(r,o)}{if(e.shouldAttach(t.value)){const i=e.retrieve(t.value);if(null!==i){const s=i.route;return s.value._futureSnapshot=t.value,s.children=t.children.map(a=>wi(e,a)),s}}const r=function gF(e){return new co(new Bt(e.url),new Bt(e.params),new Bt(e.queryParams),new Bt(e.fragment),new Bt(e.data),e.outlet,e.component,e)}(t.value),o=t.children.map(i=>wi(e,i));return new bn(r,o)}}function Ta(e){return"object"==typeof e&&null!=e&&!e.outlets&&!e.segmentPath}function Ei(e){return"object"==typeof e&&null!=e&&e.outlets}function Rd(e,t,n,r,o){let i={};if(r&&ke(r,(a,l)=>{i[l]=Array.isArray(a)?a.map(u=>`${u}`):`${a}`}),e===t)return new sr(n,i,o);const s=j_(e,t,n);return new sr(s,i,o)}function j_(e,t,n){const r={};return ke(e.children,(o,i)=>{r[i]=o===t?n:j_(o,t,n)}),new W(e.segments,r)}class B_{constructor(t,n,r){if(this.isAbsolute=t,this.numberOfDoubleDots=n,this.commands=r,t&&r.length>0&&Ta(r[0]))throw new Error("Root segment cannot have matrix parameters");const o=r.find(Ei);if(o&&o!==w_(r))throw new Error("{outlets:{}} has to be the last command")}toRoot(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]}}class Fd{constructor(t,n,r){this.segmentGroup=t,this.processChildren=n,this.index=r}}function H_(e,t,n){if(e||(e=new W([],{})),0===e.segments.length&&e.hasChildren())return xa(e,t,n);const r=function CF(e,t,n){let r=0,o=t;const i={match:!1,pathIndex:0,commandIndex:0};for(;o=n.length)return i;const s=e.segments[o],a=n[r];if(Ei(a))break;const l=`${a}`,u=r0&&void 0===l)break;if(l&&u&&"object"==typeof u&&void 0===u.outlets){if(!$_(l,u,s))return i;r+=2}else{if(!$_(l,{},s))return i;r++}o++}return{match:!0,pathIndex:o,commandIndex:r}}(e,t,n),o=n.slice(r.commandIndex);if(r.match&&r.pathIndex{"string"==typeof i&&(i=[i]),null!==i&&(o[s]=H_(e.children[s],t,i))}),ke(e.children,(i,s)=>{void 0===r[s]&&(o[s]=i)}),new W(e.segments,o)}}function Pd(e,t,n){const r=e.segments.slice(0,t);let o=0;for(;o{"string"==typeof n&&(n=[n]),null!==n&&(t[r]=Pd(new W([],{}),0,n))}),t}function U_(e){const t={};return ke(e,(n,r)=>t[r]=`${n}`),t}function $_(e,t,n){return e==n.path&&rn(t,n.parameters)}class EF{constructor(){this.outlet=null,this.route=null,this.resolver=null,this.injector=null,this.children=new bi,this.attachRef=null}}class bi{constructor(){this.contexts=new Map}onChildOutletCreated(t,n){const r=this.getOrCreateContext(t);r.outlet=n,this.contexts.set(t,r)}onChildOutletDestroyed(t){const n=this.getContext(t);n&&(n.outlet=null,n.attachRef=null)}onOutletDeactivated(){const t=this.contexts;return this.contexts=new Map,t}onOutletReAttached(t){this.contexts=t}getOrCreateContext(t){let n=this.getContext(t);return n||(n=new EF,this.contexts.set(t,n)),n}getContext(t){return this.contexts.get(t)||null}}let Od=(()=>{class e{constructor(n,r,o,i,s){this.parentContexts=n,this.location=r,this.changeDetector=i,this.environmentInjector=s,this.activated=null,this._activatedRoute=null,this.activateEvents=new Ce,this.deactivateEvents=new Ce,this.attachEvents=new Ce,this.detachEvents=new Ce,this.name=o||z,n.onChildOutletCreated(this.name,this)}ngOnDestroy(){this.parentContexts.onChildOutletDestroyed(this.name)}ngOnInit(){if(!this.activated){const n=this.parentContexts.getContext(this.name);n&&n.route&&(n.attachRef?this.attach(n.attachRef,n.route):this.activateWith(n.route,n.injector))}}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new Error("Outlet is not activated");return this.activated.instance}get activatedRoute(){if(!this.activated)throw new Error("Outlet is not activated");return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new Error("Outlet is not activated");this.location.detach();const n=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(n.instance),n}attach(n,r){this.activated=n,this._activatedRoute=r,this.location.insert(n.hostView),this.attachEvents.emit(n.instance)}deactivate(){if(this.activated){const n=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(n)}}activateWith(n,r){if(this.isActivated)throw new Error("Cannot activate an already activated outlet");this._activatedRoute=n;const o=this.location,s=n._futureSnapshot.component,a=this.parentContexts.getOrCreateContext(this.name).children,l=new bF(n,a,o.injector);if(r&&function MF(e){return!!e.resolveComponentFactory}(r)){const u=r.resolveComponentFactory(s);this.activated=o.createComponent(u,o.length,l)}else this.activated=o.createComponent(s,{index:o.length,injector:l,environmentInjector:r??this.environmentInjector});this.changeDetector.markForCheck(),this.activateEvents.emit(this.activated.instance)}}return e.\u0275fac=function(n){return new(n||e)(v(bi),v(Vt),Ao("name"),v(oa),v(Jn))},e.\u0275dir=R({type:e,selectors:[["router-outlet"]],outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"]}),e})();class bF{constructor(t,n,r){this.route=t,this.childContexts=n,this.parent=r}get(t,n){return t===co?this.route:t===bi?this.childContexts:this.parent.get(t,n)}}let G_=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=zt({type:e,selectors:[["ng-component"]],decls:1,vars:0,template:function(n,r){1&n&&Pe(0,"router-outlet")},dependencies:[Od],encapsulation:2}),e})();function z_(e,t){var n;return e.providers&&!e._injector&&(e._injector=Ks(e.providers,t,`Route: ${e.path}`)),null!==(n=e._injector)&&void 0!==n?n:t}function Vd(e){const t=e.children&&e.children.map(Vd),n=t?{...e,children:t}:{...e};return!n.component&&!n.loadComponent&&(t||n.loadChildren)&&n.outlet&&n.outlet!==z&&(n.component=G_),n}function It(e){return e.outlet||z}function q_(e,t){const n=e.filter(r=>It(r)===t);return n.push(...e.filter(r=>It(r)!==t)),n}function W_(e){var t;if(!e)return null;if(null!==(t=e.routeConfig)&&void 0!==t&&t._injector)return e.routeConfig._injector;for(let n=e.parent;n;n=n.parent){const r=n.routeConfig;if(null!=r&&r._loadedInjector)return r._loadedInjector;if(null!=r&&r._injector)return r._injector}return null}class xF{constructor(t,n,r,o){this.routeReuseStrategy=t,this.futureState=n,this.currState=r,this.forwardEvent=o}activate(t){const n=this.futureState._root,r=this.currState?this.currState._root:null;this.deactivateChildRoutes(n,r,t),xd(this.futureState.root),this.activateChildRoutes(n,r,t)}deactivateChildRoutes(t,n,r){const o=uo(n);t.children.forEach(i=>{const s=i.value.outlet;this.deactivateRoutes(i,o[s],r),delete o[s]}),ke(o,(i,s)=>{this.deactivateRouteAndItsChildren(i,r)})}deactivateRoutes(t,n,r){const o=t.value,i=n?n.value:null;if(o===i)if(o.component){const s=r.getContext(o.outlet);s&&this.deactivateChildRoutes(t,n,s.children)}else this.deactivateChildRoutes(t,n,r);else i&&this.deactivateRouteAndItsChildren(n,r)}deactivateRouteAndItsChildren(t,n){t.value.component&&this.routeReuseStrategy.shouldDetach(t.value.snapshot)?this.detachAndStoreRouteSubtree(t,n):this.deactivateRouteAndOutlet(t,n)}detachAndStoreRouteSubtree(t,n){const r=n.getContext(t.value.outlet),o=r&&t.value.component?r.children:n,i=uo(t);for(const s of Object.keys(i))this.deactivateRouteAndItsChildren(i[s],o);if(r&&r.outlet){const s=r.outlet.detach(),a=r.children.onOutletDeactivated();this.routeReuseStrategy.store(t.value.snapshot,{componentRef:s,route:t,contexts:a})}}deactivateRouteAndOutlet(t,n){const r=n.getContext(t.value.outlet),o=r&&t.value.component?r.children:n,i=uo(t);for(const s of Object.keys(i))this.deactivateRouteAndItsChildren(i[s],o);r&&r.outlet&&(r.outlet.deactivate(),r.children.onOutletDeactivated(),r.attachRef=null,r.resolver=null,r.route=null)}activateChildRoutes(t,n,r){const o=uo(n);t.children.forEach(i=>{this.activateRoutes(i,o[i.value.outlet],r),this.forwardEvent(new GR(i.value.snapshot))}),t.children.length&&this.forwardEvent(new UR(t.value.snapshot))}activateRoutes(t,n,r){const o=t.value,i=n?n.value:null;if(xd(o),o===i)if(o.component){const a=r.getOrCreateContext(o.outlet);this.activateChildRoutes(t,n,a.children)}else this.activateChildRoutes(t,n,r);else if(o.component){const a=r.getOrCreateContext(o.outlet);if(this.routeReuseStrategy.shouldAttach(o.snapshot)){const l=this.routeReuseStrategy.retrieve(o.snapshot);this.routeReuseStrategy.store(o.snapshot,null),a.children.onOutletReAttached(l.contexts),a.attachRef=l.componentRef,a.route=l.route.value,a.outlet&&a.outlet.attach(l.componentRef,l.route.value),xd(l.route.value),this.activateChildRoutes(t,null,a.children)}else{var s;const l=W_(o.snapshot),u=null!==(s=l?.get(ri))&&void 0!==s?s:null;a.attachRef=null,a.route=o,a.resolver=u,a.injector=l,a.outlet&&a.outlet.activateWith(o,a.injector),this.activateChildRoutes(t,null,a.children)}}else this.activateChildRoutes(t,null,r)}}function Ln(e){return"function"==typeof e}function lr(e){return e instanceof sr}const Mi=Symbol("INITIAL_VALUE");function Si(){return kn(e=>f_(e.map(t=>t.pipe(wa(1),function dR(...e){const t=e[e.length-1];return zi(t)?(e.pop(),n=>_d(e,n,t)):n=>_d(e,n)}(Mi)))).pipe(g_((t,n)=>{let r=!1;return n.reduce((o,i,s)=>o!==Mi?o:(i===Mi&&(r=!0),r||!1!==i&&s!==n.length-1&&!lr(i)?o:i),t)},Mi),rr(t=>t!==Mi),Y(t=>lr(t)?t:!0===t),wa(1)))}const K_={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function Na(e,t,n){var r;if(""===t.path)return"full"===t.pathMatch&&(e.hasChildren()||n.length>0)?{...K_}:{matched:!0,consumedSegments:[],remainingSegments:n,parameters:{},positionalParamSegments:{}};const i=(t.matcher||WR)(n,e,t);if(!i)return{...K_};const s={};ke(i.posParams,(l,u)=>{s[u]=l.path});const a=i.consumed.length>0?{...s,...i.consumed[i.consumed.length-1].parameters}:s;return{matched:!0,consumedSegments:i.consumed,remainingSegments:n.slice(i.consumed.length),parameters:a,positionalParamSegments:null!==(r=i.posParams)&&void 0!==r?r:{}}}function Ra(e,t,n,r,o="corrected"){if(n.length>0&&function LF(e,t,n){return n.some(r=>Fa(e,t,r)&&It(r)!==z)}(e,n,r)){const s=new W(t,function VF(e,t,n,r){const o={};o[z]=r,r._sourceSegment=e,r._segmentIndexShift=t.length;for(const i of n)if(""===i.path&&It(i)!==z){const s=new W([],{});s._sourceSegment=e,s._segmentIndexShift=t.length,o[It(i)]=s}return o}(e,t,r,new W(n,e.children)));return s._sourceSegment=e,s._segmentIndexShift=t.length,{segmentGroup:s,slicedSegments:[]}}if(0===n.length&&function jF(e,t,n){return n.some(r=>Fa(e,t,r))}(e,n,r)){const s=new W(e.segments,function kF(e,t,n,r,o,i){const s={};for(const a of r)if(Fa(e,n,a)&&!o[It(a)]){const l=new W([],{});l._sourceSegment=e,l._segmentIndexShift="legacy"===i?e.segments.length:t.length,s[It(a)]=l}return{...o,...s}}(e,t,n,r,e.children,o));return s._sourceSegment=e,s._segmentIndexShift=t.length,{segmentGroup:s,slicedSegments:n}}const i=new W(e.segments,e.children);return i._sourceSegment=e,i._segmentIndexShift=t.length,{segmentGroup:i,slicedSegments:n}}function Fa(e,t,n){return(!(e.hasChildren()||t.length>0)||"full"!==n.pathMatch)&&""===n.path}function Q_(e,t,n,r){return!!(It(e)===r||r!==z&&Fa(t,n,e))&&("**"===e.path||Na(t,e,n).matched)}function Z_(e,t,n){return 0===t.length&&!e.children[n]}class Pa{constructor(t){this.segmentGroup=t||null}}class Y_{constructor(t){this.urlTree=t}}function Ii(e){return yi(new Pa(e))}function J_(e){return yi(new Y_(e))}function BF(e){return yi(new Error(`Only absolute redirects can have named outlets. redirectTo: '${e}'`))}class $F{constructor(t,n,r,o,i){this.injector=t,this.configLoader=n,this.urlSerializer=r,this.urlTree=o,this.config=i,this.allowRedirects=!0}apply(){const t=Ra(this.urlTree.root,[],[],this.config).segmentGroup,n=new W(t.segments,t.children);return this.expandSegmentGroup(this.injector,this.config,n,z).pipe(Y(i=>this.createUrlTree(Ld(i),this.urlTree.queryParams,this.urlTree.fragment))).pipe(or(i=>{if(i instanceof Y_)return this.allowRedirects=!1,this.match(i.urlTree);throw i instanceof Pa?this.noMatchError(i):i}))}match(t){return this.expandSegmentGroup(this.injector,this.config,t.root,z).pipe(Y(o=>this.createUrlTree(Ld(o),t.queryParams,t.fragment))).pipe(or(o=>{throw o instanceof Pa?this.noMatchError(o):o}))}noMatchError(t){return new Error(`Cannot match any routes. URL Segment: '${t.segmentGroup}'`)}createUrlTree(t,n,r){const o=t.segments.length>0?new W([],{[z]:t}):t;return new sr(o,n,r)}expandSegmentGroup(t,n,r,o){return 0===r.segments.length&&r.hasChildren()?this.expandChildren(t,n,r).pipe(Y(i=>new W([],i))):this.expandSegment(t,r,n,r.segments,o,!0)}expandChildren(t,n,r){const o=[];for(const i of Object.keys(r.children))"primary"===i?o.unshift(i):o.push(i);return Oe(o).pipe(ao(i=>{const s=r.children[i],a=q_(n,i);return this.expandSegmentGroup(t,a,s,i).pipe(Y(l=>({segment:l,outlet:i})))}),g_((i,s)=>(i[s.outlet]=s.segment,i),{}),function MR(e,t){const n=arguments.length>=2;return r=>r.pipe(e?rr((o,i)=>e(o,i,r)):Gi,Cd(1),n?wd(t):m_(()=>new vi))}())}expandSegment(t,n,r,o,i,s){return Oe(r).pipe(ao(a=>this.expandSegmentAgainstRoute(t,n,r,a,o,i,s).pipe(or(u=>{if(u instanceof Pa)return V(null);throw u}))),ir(a=>!!a),or((a,l)=>{if(a instanceof vi||"EmptyError"===a.name)return Z_(n,o,i)?V(new W([],{})):Ii(n);throw a}))}expandSegmentAgainstRoute(t,n,r,o,i,s,a){return Q_(o,n,i,s)?void 0===o.redirectTo?this.matchSegmentAgainstRoute(t,n,o,i,s):a&&this.allowRedirects?this.expandSegmentAgainstRouteUsingRedirect(t,n,r,o,i,s):Ii(n):Ii(n)}expandSegmentAgainstRouteUsingRedirect(t,n,r,o,i,s){return"**"===o.path?this.expandWildCardWithParamsAgainstRouteUsingRedirect(t,r,o,s):this.expandRegularSegmentAgainstRouteUsingRedirect(t,n,r,o,i,s)}expandWildCardWithParamsAgainstRouteUsingRedirect(t,n,r,o){const i=this.applyRedirectCommands([],r.redirectTo,{});return r.redirectTo.startsWith("/")?J_(i):this.lineralizeSegments(r,i).pipe(Ve(s=>{const a=new W(s,{});return this.expandSegment(t,a,n,s,o,!1)}))}expandRegularSegmentAgainstRouteUsingRedirect(t,n,r,o,i,s){const{matched:a,consumedSegments:l,remainingSegments:u,positionalParamSegments:c}=Na(n,o,i);if(!a)return Ii(n);const d=this.applyRedirectCommands(l,o.redirectTo,c);return o.redirectTo.startsWith("/")?J_(d):this.lineralizeSegments(o,d).pipe(Ve(f=>this.expandSegment(t,n,r,f.concat(u),s,!1)))}matchSegmentAgainstRoute(t,n,r,o,i){if("**"===r.path)return t=z_(r,t),r.loadChildren?(r._loadedRoutes?V({routes:r._loadedRoutes,injector:r._loadedInjector}):this.configLoader.loadChildren(t,r)).pipe(Y(d=>(r._loadedRoutes=d.routes,r._loadedInjector=d.injector,new W(o,{})))):V(new W(o,{}));const{matched:s,consumedSegments:a,remainingSegments:l}=Na(n,r,o);return s?(t=z_(r,t),this.getChildConfig(t,r,o).pipe(Ve(c=>{var d;const f=null!==(d=c.injector)&&void 0!==d?d:t,h=c.routes,{segmentGroup:p,slicedSegments:g}=Ra(n,a,l,h),_=new W(p.segments,p.children);if(0===g.length&&_.hasChildren())return this.expandChildren(f,h,_).pipe(Y(I=>new W(a,I)));if(0===h.length&&0===g.length)return V(new W(a,{}));const D=It(r)===i;return this.expandSegment(f,_,h,g,D?z:i,!0).pipe(Y(m=>new W(a.concat(m.segments),m.children)))}))):Ii(n)}getChildConfig(t,n,r){return n.children?V({routes:n.children,injector:t}):n.loadChildren?void 0!==n._loadedRoutes?V({routes:n._loadedRoutes,injector:n._loadedInjector}):this.runCanLoadGuards(t,n,r).pipe(Ve(o=>o?this.configLoader.loadChildren(t,n).pipe($e(i=>{n._loadedRoutes=i.routes,n._loadedInjector=i.injector})):function HF(e){return yi(Md(`Cannot load children because the guard of the route "path: '${e.path}'" returned false`))}(n))):V({routes:[],injector:t})}runCanLoadGuards(t,n,r){const o=n.canLoad;if(!o||0===o.length)return V(!0);const i=o.map(s=>{const a=t.get(s);let l;if(function RF(e){return e&&Ln(e.canLoad)}(a))l=a.canLoad(n,r);else{if(!Ln(a))throw new Error("Invalid CanLoad guard");l=a(n,r)}return Ht(l)});return V(i).pipe(Si(),$e(s=>{if(!lr(s))return;const a=Md(`Redirecting to "${this.urlSerializer.serialize(s)}"`);throw a.url=s,a}),Y(s=>!0===s))}lineralizeSegments(t,n){let r=[],o=n.root;for(;;){if(r=r.concat(o.segments),0===o.numberOfChildren)return V(r);if(o.numberOfChildren>1||!o.children[z])return BF(t.redirectTo);o=o.children[z]}}applyRedirectCommands(t,n,r){return this.applyRedirectCreatreUrlTree(n,this.urlSerializer.parse(n),t,r)}applyRedirectCreatreUrlTree(t,n,r,o){const i=this.createSegmentGroup(t,n.root,r,o);return new sr(i,this.createQueryParams(n.queryParams,this.urlTree.queryParams),n.fragment)}createQueryParams(t,n){const r={};return ke(t,(o,i)=>{if("string"==typeof o&&o.startsWith(":")){const a=o.substring(1);r[i]=n[a]}else r[i]=o}),r}createSegmentGroup(t,n,r,o){const i=this.createSegments(t,n.segments,r,o);let s={};return ke(n.children,(a,l)=>{s[l]=this.createSegmentGroup(t,a,r,o)}),new W(i,s)}createSegments(t,n,r,o){return n.map(i=>i.path.startsWith(":")?this.findPosParam(t,i,o):this.findOrReturn(i,r))}findPosParam(t,n,r){const o=r[n.path.substring(1)];if(!o)throw new Error(`Cannot redirect to '${t}'. Cannot find '${n.path}'.`);return o}findOrReturn(t,n){let r=0;for(const o of n){if(o.path===t.path)return n.splice(r),o;r++}return t}}function Ld(e){const t={};for(const r of Object.keys(e.children)){const i=Ld(e.children[r]);(i.segments.length>0||i.hasChildren())&&(t[r]=i)}return function GF(e){if(1===e.numberOfChildren&&e.children[z]){const t=e.children[z];return new W(e.segments.concat(t.segments),t.children)}return e}(new W(e.segments,t))}class X_{constructor(t){this.path=t,this.route=this.path[this.path.length-1]}}class Oa{constructor(t,n){this.component=t,this.route=n}}function qF(e,t,n){const r=e._root;return Ai(r,t?t._root:null,n,[r.value])}function ka(e,t,n){return(W_(t)??n).get(e)}function Ai(e,t,n,r,o={canDeactivateChecks:[],canActivateChecks:[]}){const i=uo(t);return e.children.forEach(s=>{(function KF(e,t,n,r,o={canDeactivateChecks:[],canActivateChecks:[]}){const i=e.value,s=t?t.value:null,a=n?n.getContext(e.value.outlet):null;if(s&&i.routeConfig===s.routeConfig){const l=function QF(e,t,n){if("function"==typeof n)return n(e,t);switch(n){case"pathParamsChange":return!ar(e.url,t.url);case"pathParamsOrQueryParamsChange":return!ar(e.url,t.url)||!rn(e.queryParams,t.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!Nd(e,t)||!rn(e.queryParams,t.queryParams);default:return!Nd(e,t)}}(s,i,i.routeConfig.runGuardsAndResolvers);l?o.canActivateChecks.push(new X_(r)):(i.data=s.data,i._resolvedData=s._resolvedData),Ai(e,t,i.component?a?a.children:null:n,r,o),l&&a&&a.outlet&&a.outlet.isActivated&&o.canDeactivateChecks.push(new Oa(a.outlet.component,s))}else s&&Ti(t,a,o),o.canActivateChecks.push(new X_(r)),Ai(e,null,i.component?a?a.children:null:n,r,o)})(s,i[s.value.outlet],n,r.concat([s.value]),o),delete i[s.value.outlet]}),ke(i,(s,a)=>Ti(s,n.getContext(a),o)),o}function Ti(e,t,n){const r=uo(e),o=e.value;ke(r,(i,s)=>{Ti(i,o.component?t?t.children.getContext(s):null:t,n)}),n.canDeactivateChecks.push(new Oa(o.component&&t&&t.outlet&&t.outlet.isActivated?t.outlet.component:null,o))}class o1{}function tD(e){return new pe(t=>t.error(e))}class s1{constructor(t,n,r,o,i,s){this.rootComponentType=t,this.config=n,this.urlTree=r,this.url=o,this.paramsInheritanceStrategy=i,this.relativeLinkResolution=s}recognize(){const t=Ra(this.urlTree.root,[],[],this.config.filter(s=>void 0===s.redirectTo),this.relativeLinkResolution).segmentGroup,n=this.processSegmentGroup(this.config,t,z);if(null===n)return null;const r=new Aa([],Object.freeze({}),Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,{},z,this.rootComponentType,null,this.urlTree.root,-1,{}),o=new bn(r,n),i=new V_(this.url,o);return this.inheritParamsAndData(i._root),i}inheritParamsAndData(t){const n=t.value,r=k_(n,this.paramsInheritanceStrategy);n.params=Object.freeze(r.params),n.data=Object.freeze(r.data),t.children.forEach(o=>this.inheritParamsAndData(o))}processSegmentGroup(t,n,r){return 0===n.segments.length&&n.hasChildren()?this.processChildren(t,n):this.processSegment(t,n,n.segments,r)}processChildren(t,n){const r=[];for(const i of Object.keys(n.children)){const s=n.children[i],a=q_(t,i),l=this.processSegmentGroup(a,s,i);if(null===l)return null;r.push(...l)}const o=nD(r);return function a1(e){e.sort((t,n)=>t.value.outlet===z?-1:n.value.outlet===z?1:t.value.outlet.localeCompare(n.value.outlet))}(o),o}processSegment(t,n,r,o){for(const i of t){const s=this.processSegmentAgainstRoute(i,n,r,o);if(null!==s)return s}return Z_(n,r,o)?[]:null}processSegmentAgainstRoute(t,n,r,o){if(t.redirectTo||!Q_(t,n,r,o))return null;let i,s=[],a=[];if("**"===t.path){var l,u;const D=r.length>0?w_(r).parameters:{},w=oD(n)+r.length;i=new Aa(r,D,Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,sD(t),It(t),null!==(l=null!==(u=t.component)&&void 0!==u?u:t._loadedComponent)&&void 0!==l?l:null,t,rD(n),w,aD(t),w)}else{var c,d;const D=Na(n,t,r);if(!D.matched)return null;s=D.consumedSegments,a=D.remainingSegments;const w=oD(n)+s.length;i=new Aa(s,D.parameters,Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,sD(t),It(t),null!==(c=null!==(d=t.component)&&void 0!==d?d:t._loadedComponent)&&void 0!==c?c:null,t,rD(n),w,aD(t),w)}const f=function l1(e){return e.children?e.children:e.loadChildren?e._loadedRoutes:[]}(t),{segmentGroup:h,slicedSegments:p}=Ra(n,s,a,f.filter(D=>void 0===D.redirectTo),this.relativeLinkResolution);if(0===p.length&&h.hasChildren()){const D=this.processChildren(f,h);return null===D?null:[new bn(i,D)]}if(0===f.length&&0===p.length)return[new bn(i,[])];const g=It(t)===o,_=this.processSegment(f,h,p,g?z:o);return null===_?null:[new bn(i,_)]}}function u1(e){const t=e.value.routeConfig;return t&&""===t.path&&void 0===t.redirectTo}function nD(e){const t=[],n=new Set;for(const r of e){if(!u1(r)){t.push(r);continue}const o=t.find(i=>r.value.routeConfig===i.value.routeConfig);void 0!==o?(o.children.push(...r.children),n.add(o)):t.push(r)}for(const r of n){const o=nD(r.children);t.push(new bn(r.value,o))}return t.filter(r=>!n.has(r))}function rD(e){let t=e;for(;t._sourceSegment;)t=t._sourceSegment;return t}function oD(e){var t;let n=e,r=null!==(t=n._segmentIndexShift)&&void 0!==t?t:0;for(;n._sourceSegment;){var o;n=n._sourceSegment,r+=null!==(o=n._segmentIndexShift)&&void 0!==o?o:0}return r-1}function sD(e){return e.data||{}}function aD(e){return e.resolve||{}}const jd=Symbol("RouteTitle");function lD(e){return"string"==typeof e.title||null===e.title}function Va(e){return kn(t=>{const n=e(t);return n?Oe(n).pipe(Y(()=>t)):V(t)})}class v1 extends class y1{shouldDetach(t){return!1}store(t,n){}shouldAttach(t){return!1}retrieve(t){return null}shouldReuseRoute(t,n){return t.routeConfig===n.routeConfig}}{}const Bd=new P("ROUTES");let Hd=(()=>{class e{constructor(n,r){this.injector=n,this.compiler=r,this.componentLoaders=new WeakMap,this.childrenLoaders=new WeakMap}loadComponent(n){if(this.componentLoaders.get(n))return this.componentLoaders.get(n);if(n._loadedComponent)return V(n._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(n);const r=Ht(n.loadComponent()).pipe($e(i=>{this.onLoadEndListener&&this.onLoadEndListener(n),n._loadedComponent=i}),Ed(()=>{this.componentLoaders.delete(n)})),o=new ll(r,()=>new Ut).pipe(Wi());return this.componentLoaders.set(n,o),o}loadChildren(n,r){if(this.childrenLoaders.get(r))return this.childrenLoaders.get(r);if(r._loadedRoutes)return V({routes:r._loadedRoutes,injector:r._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(r);const i=this.loadModuleFactoryOrRoutes(r.loadChildren).pipe(Y(a=>{this.onLoadEndListener&&this.onLoadEndListener(r);let l,u,c=!1;Array.isArray(a)?u=a:(l=a.create(n).injector,u=C_(l.get(Bd,[],x.Self|x.Optional)));return{routes:u.map(Vd),injector:l}}),Ed(()=>{this.childrenLoaders.delete(r)})),s=new ll(i,()=>new Ut).pipe(Wi());return this.childrenLoaders.set(r,s),s}loadModuleFactoryOrRoutes(n){return Ht(n()).pipe(Ve(r=>r instanceof hy||Array.isArray(r)?V(r):Oe(this.compiler.compileModuleAsync(r))))}}return e.\u0275fac=function(n){return new(n||e)(S(Je),S(Lc))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();class D1{shouldProcessUrl(t){return!0}extract(t){return t}merge(t,n){return t}}function w1(e){throw e}function E1(e,t,n){return t.parse("/")}function cD(e,t){return V(null)}const b1={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},M1={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};let Ge=(()=>{class e{constructor(n,r,o,i,s,a,l){this.rootComponentType=n,this.urlSerializer=r,this.rootContexts=o,this.location=i,this.config=l,this.lastSuccessfulNavigation=null,this.currentNavigation=null,this.disposed=!1,this.navigationId=0,this.currentPageId=0,this.isNgZoneEnabled=!1,this.events=new Ut,this.errorHandler=w1,this.malformedUriErrorHandler=E1,this.navigated=!1,this.lastSuccessfulId=-1,this.hooks={beforePreactivation:cD,afterPreactivation:cD},this.urlHandlingStrategy=new D1,this.routeReuseStrategy=new v1,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.urlUpdateStrategy="deferred",this.relativeLinkResolution="corrected",this.canceledNavigationResolution="replace",this.configLoader=s.get(Hd),this.configLoader.onLoadEndListener=f=>this.triggerEvent(new BR(f)),this.configLoader.onLoadStartListener=f=>this.triggerEvent(new jR(f)),this.ngModule=s.get(Fn),this.console=s.get(sT);const d=s.get(Me);this.isNgZoneEnabled=d instanceof Me&&Me.isInAngularZone(),this.resetConfig(l),this.currentUrlTree=function QR(){return new sr(new W([],{}),{},null)}(),this.rawUrlTree=this.currentUrlTree,this.browserUrlTree=this.currentUrlTree,this.routerState=O_(this.currentUrlTree,this.rootComponentType),this.transitions=new Bt({id:0,targetPageId:0,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,extractedUrl:this.urlHandlingStrategy.extract(this.currentUrlTree),urlAfterRedirects:this.urlHandlingStrategy.extract(this.currentUrlTree),rawUrl:this.currentUrlTree,extras:{},resolve:null,reject:null,promise:Promise.resolve(!0),source:"imperative",restoredState:null,currentSnapshot:this.routerState.snapshot,targetSnapshot:null,currentRouterState:this.routerState,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null}),this.navigations=this.setupNavigations(this.transitions),this.processNavigations()}get browserPageId(){var n;return null===(n=this.location.getState())||void 0===n?void 0:n.\u0275routerPageId}setupNavigations(n){const r=this.events;return n.pipe(rr(o=>0!==o.id),Y(o=>({...o,extractedUrl:this.urlHandlingStrategy.extract(o.rawUrl)})),kn(o=>{let i=!1,s=!1;return V(o).pipe($e(a=>{this.currentNavigation={id:a.id,initialUrl:a.rawUrl,extractedUrl:a.extractedUrl,trigger:a.source,extras:a.extras,previousNavigation:this.lastSuccessfulNavigation?{...this.lastSuccessfulNavigation,previousNavigation:null}:null}}),kn(a=>{const l=this.browserUrlTree.toString(),u=!this.navigated||a.extractedUrl.toString()!==l||l!==this.currentUrlTree.toString();if(("reload"===this.onSameUrlNavigation||u)&&this.urlHandlingStrategy.shouldProcessUrl(a.rawUrl))return dD(a.source)&&(this.browserUrlTree=a.extractedUrl),V(a).pipe(kn(d=>{const f=this.transitions.getValue();return r.next(new bd(d.id,this.serializeUrl(d.extractedUrl),d.source,d.restoredState)),f!==this.transitions.getValue()?so:Promise.resolve(d)}),function zF(e,t,n,r){return kn(o=>function UF(e,t,n,r,o){return new $F(e,t,n,r,o).apply()}(e,t,n,o.extractedUrl,r).pipe(Y(i=>({...o,urlAfterRedirects:i}))))}(this.ngModule.injector,this.configLoader,this.urlSerializer,this.config),$e(d=>{this.currentNavigation={...this.currentNavigation,finalUrl:d.urlAfterRedirects}}),function c1(e,t,n,r,o){return Ve(i=>function i1(e,t,n,r,o="emptyOnly",i="legacy"){try{const s=new s1(e,t,n,r,o,i).recognize();return null===s?tD(new o1):V(s)}catch(s){return tD(s)}}(e,t,i.urlAfterRedirects,n(i.urlAfterRedirects),r,o).pipe(Y(s=>({...i,targetSnapshot:s}))))}(this.rootComponentType,this.config,d=>this.serializeUrl(d),this.paramsInheritanceStrategy,this.relativeLinkResolution),$e(d=>{if("eager"===this.urlUpdateStrategy){if(!d.extras.skipLocationChange){const h=this.urlHandlingStrategy.merge(d.urlAfterRedirects,d.rawUrl);this.setBrowserUrl(h,d)}this.browserUrlTree=d.urlAfterRedirects}const f=new PR(d.id,this.serializeUrl(d.extractedUrl),this.serializeUrl(d.urlAfterRedirects),d.targetSnapshot);r.next(f)}));if(u&&this.rawUrlTree&&this.urlHandlingStrategy.shouldProcessUrl(this.rawUrlTree)){const{id:f,extractedUrl:h,source:p,restoredState:g,extras:_}=a,D=new bd(f,this.serializeUrl(h),p,g);r.next(D);const w=O_(h,this.rootComponentType).snapshot;return V({...a,targetSnapshot:w,urlAfterRedirects:h,extras:{..._,skipLocationChange:!1,replaceUrl:!1}})}return this.rawUrlTree=a.rawUrl,a.resolve(null),so}),Va(a=>{const{targetSnapshot:l,id:u,extractedUrl:c,rawUrl:d,extras:{skipLocationChange:f,replaceUrl:h}}=a;return this.hooks.beforePreactivation(l,{navigationId:u,appliedUrlTree:c,rawUrlTree:d,skipLocationChange:!!f,replaceUrl:!!h})}),$e(a=>{const l=new OR(a.id,this.serializeUrl(a.extractedUrl),this.serializeUrl(a.urlAfterRedirects),a.targetSnapshot);this.triggerEvent(l)}),Y(a=>({...a,guards:qF(a.targetSnapshot,a.currentSnapshot,this.rootContexts)})),function ZF(e,t){return Ve(n=>{const{targetSnapshot:r,currentSnapshot:o,guards:{canActivateChecks:i,canDeactivateChecks:s}}=n;return 0===s.length&&0===i.length?V({...n,guardsResult:!0}):function YF(e,t,n,r){return Oe(e).pipe(Ve(o=>function r1(e,t,n,r,o){const i=t&&t.routeConfig?t.routeConfig.canDeactivate:null;return i&&0!==i.length?V(i.map(a=>{const l=ka(a,t,o);let u;if(function OF(e){return e&&Ln(e.canDeactivate)}(l))u=Ht(l.canDeactivate(e,t,n,r));else{if(!Ln(l))throw new Error("Invalid CanDeactivate guard");u=Ht(l(e,t,n,r))}return u.pipe(ir())})).pipe(Si()):V(!0)}(o.component,o.route,n,t,r)),ir(o=>!0!==o,!0))}(s,r,o,e).pipe(Ve(a=>a&&function NF(e){return"boolean"==typeof e}(a)?function JF(e,t,n,r){return Oe(t).pipe(ao(o=>_d(function e1(e,t){return null!==e&&t&&t(new HR(e)),V(!0)}(o.route.parent,r),function XF(e,t){return null!==e&&t&&t(new $R(e)),V(!0)}(o.route,r),function n1(e,t,n){const r=t[t.length-1],i=t.slice(0,t.length-1).reverse().map(s=>function WF(e){const t=e.routeConfig?e.routeConfig.canActivateChild:null;return t&&0!==t.length?{node:e,guards:t}:null}(s)).filter(s=>null!==s).map(s=>h_(()=>V(s.guards.map(l=>{const u=ka(l,s.node,n);let c;if(function PF(e){return e&&Ln(e.canActivateChild)}(u))c=Ht(u.canActivateChild(r,e));else{if(!Ln(u))throw new Error("Invalid CanActivateChild guard");c=Ht(u(r,e))}return c.pipe(ir())})).pipe(Si())));return V(i).pipe(Si())}(e,o.path,n),function t1(e,t,n){const r=t.routeConfig?t.routeConfig.canActivate:null;if(!r||0===r.length)return V(!0);const o=r.map(i=>h_(()=>{const s=ka(i,t,n);let a;if(function FF(e){return e&&Ln(e.canActivate)}(s))a=Ht(s.canActivate(t,e));else{if(!Ln(s))throw new Error("Invalid CanActivate guard");a=Ht(s(t,e))}return a.pipe(ir())}));return V(o).pipe(Si())}(e,o.route,n))),ir(o=>!0!==o,!0))}(r,i,e,t):V(a)),Y(a=>({...n,guardsResult:a})))})}(this.ngModule.injector,a=>this.triggerEvent(a)),$e(a=>{if(lr(a.guardsResult)){const u=Md(`Redirecting to "${this.serializeUrl(a.guardsResult)}"`);throw u.url=a.guardsResult,u}const l=new kR(a.id,this.serializeUrl(a.extractedUrl),this.serializeUrl(a.urlAfterRedirects),a.targetSnapshot,!!a.guardsResult);this.triggerEvent(l)}),rr(a=>!!a.guardsResult||(this.restoreHistory(a),this.cancelNavigationTransition(a,""),!1)),Va(a=>{if(a.guards.canActivateChecks.length)return V(a).pipe($e(l=>{const u=new VR(l.id,this.serializeUrl(l.extractedUrl),this.serializeUrl(l.urlAfterRedirects),l.targetSnapshot);this.triggerEvent(u)}),kn(l=>{let u=!1;return V(l).pipe(function d1(e,t){return Ve(n=>{const{targetSnapshot:r,guards:{canActivateChecks:o}}=n;if(!o.length)return V(n);let i=0;return Oe(o).pipe(ao(s=>function f1(e,t,n,r){const o=e.routeConfig,i=e._resolve;return void 0!==o?.title&&!lD(o)&&(i[jd]=o.title),function h1(e,t,n,r){const o=function p1(e){return[...Object.keys(e),...Object.getOwnPropertySymbols(e)]}(e);if(0===o.length)return V({});const i={};return Oe(o).pipe(Ve(s=>function g1(e,t,n,r){const o=ka(e,t,r);return Ht(o.resolve?o.resolve(t,n):o(t,n))}(e[s],t,n,r).pipe(ir(),$e(a=>{i[s]=a}))),Cd(1),function AR(e){return t=>t.lift(new TR(e))}(i),or(s=>s instanceof vi?so:yi(s)))}(i,e,t,r).pipe(Y(s=>(e._resolvedData=s,e.data=k_(e,n).resolve,o&&lD(o)&&(e.data[jd]=o.title),null)))}(s.route,r,e,t)),$e(()=>i++),Cd(1),Ve(s=>i===o.length?V(n):so))})}(this.paramsInheritanceStrategy,this.ngModule.injector),$e({next:()=>u=!0,complete:()=>{u||(this.restoreHistory(l),this.cancelNavigationTransition(l,"At least one route resolver didn't emit any value."))}}))}),$e(l=>{const u=new LR(l.id,this.serializeUrl(l.extractedUrl),this.serializeUrl(l.urlAfterRedirects),l.targetSnapshot);this.triggerEvent(u)}))}),Va(a=>{const{targetSnapshot:l,id:u,extractedUrl:c,rawUrl:d,extras:{skipLocationChange:f,replaceUrl:h}}=a;return this.hooks.afterPreactivation(l,{navigationId:u,appliedUrlTree:c,rawUrlTree:d,skipLocationChange:!!f,replaceUrl:!!h})}),Va(a=>{const l=u=>{var c;const d=[];null!==(c=u.routeConfig)&&void 0!==c&&c.loadComponent&&!u.routeConfig._loadedComponent&&d.push(this.configLoader.loadComponent(u.routeConfig).pipe($e(f=>{u.component=f}),Y(()=>{})));for(const f of u.children)d.push(...l(f));return d};return f_(l(a.targetSnapshot.root)).pipe(wd(),wa(1))}),Y(a=>{const l=function hF(e,t,n){const r=wi(e,t._root,n?n._root:void 0);return new P_(r,t)}(this.routeReuseStrategy,a.targetSnapshot,a.currentRouterState);return{...a,targetRouterState:l}}),$e(a=>{this.currentUrlTree=a.urlAfterRedirects,this.rawUrlTree=this.urlHandlingStrategy.merge(a.urlAfterRedirects,a.rawUrl),this.routerState=a.targetRouterState,"deferred"===this.urlUpdateStrategy&&(a.extras.skipLocationChange||this.setBrowserUrl(this.rawUrlTree,a),this.browserUrlTree=a.urlAfterRedirects)}),((e,t,n)=>Y(r=>(new xF(t,r.targetRouterState,r.currentRouterState,n).activate(e),r)))(this.rootContexts,this.routeReuseStrategy,a=>this.triggerEvent(a)),$e({next(){i=!0},complete(){i=!0}}),Ed(()=>{var a;i||s||this.cancelNavigationTransition(o,`Navigation ID ${o.id} is not equal to the current navigation id ${this.navigationId}`),(null===(a=this.currentNavigation)||void 0===a?void 0:a.id)===o.id&&(this.currentNavigation=null)}),or(a=>{if(s=!0,function qR(e){return e&&e[__]}(a)){const l=lr(a.url);l||(this.navigated=!0,this.restoreHistory(o,!0));const u=new y_(o.id,this.serializeUrl(o.extractedUrl),a.message);if(r.next(u),l){const c=this.urlHandlingStrategy.merge(a.url,this.rawUrlTree),d={skipLocationChange:o.extras.skipLocationChange,replaceUrl:"eager"===this.urlUpdateStrategy||dD(o.source)};this.scheduleNavigation(c,"imperative",null,d,{resolve:o.resolve,reject:o.reject,promise:o.promise})}else o.resolve(!1)}else{this.restoreHistory(o,!0);const l=new FR(o.id,this.serializeUrl(o.extractedUrl),a);r.next(l);try{o.resolve(this.errorHandler(a))}catch(u){o.reject(u)}}return so}))}))}resetRootComponentType(n){this.rootComponentType=n,this.routerState.root.component=this.rootComponentType}setTransition(n){this.transitions.next({...this.transitions.value,...n})}initialNavigation(){this.setUpLocationChangeListener(),0===this.navigationId&&this.navigateByUrl(this.location.path(!0),{replaceUrl:!0})}setUpLocationChangeListener(){this.locationSubscription||(this.locationSubscription=this.location.subscribe(n=>{const r="popstate"===n.type?"popstate":"hashchange";"popstate"===r&&setTimeout(()=>{var o;const i={replaceUrl:!0},s=null!==(o=n.state)&&void 0!==o&&o.navigationId?n.state:null;if(s){const l={...s};delete l.navigationId,delete l.\u0275routerPageId,0!==Object.keys(l).length&&(i.state=l)}const a=this.parseUrl(n.url);this.scheduleNavigation(a,r,s,i)},0)}))}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return this.currentNavigation}triggerEvent(n){this.events.next(n)}resetConfig(n){this.config=n.map(Vd),this.navigated=!1,this.lastSuccessfulId=-1}ngOnDestroy(){this.dispose()}dispose(){this.transitions.complete(),this.locationSubscription&&(this.locationSubscription.unsubscribe(),this.locationSubscription=void 0),this.disposed=!0}createUrlTree(n,r={}){const{relativeTo:o,queryParams:i,fragment:s,queryParamsHandling:a,preserveFragment:l}=r,u=o||this.routerState.root,c=l?this.currentUrlTree.fragment:s;let d=null;switch(a){case"merge":d={...this.currentUrlTree.queryParams,...i};break;case"preserve":d=this.currentUrlTree.queryParams;break;default:d=i||null}return null!==d&&(d=this.removeEmptyProps(d)),function mF(e,t,n,r,o){var i;if(0===n.length)return Rd(t.root,t.root,t.root,r,o);const s=function yF(e){if("string"==typeof e[0]&&1===e.length&&"/"===e[0])return new B_(!0,0,e);let t=0,n=!1;const r=e.reduce((o,i,s)=>{if("object"==typeof i&&null!=i){if(i.outlets){const a={};return ke(i.outlets,(l,u)=>{a[u]="string"==typeof l?l.split("/"):l}),[...o,{outlets:a}]}if(i.segmentPath)return[...o,i.segmentPath]}return"string"!=typeof i?[...o,i]:0===s?(i.split("/").forEach((a,l)=>{0==l&&"."===a||(0==l&&""===a?n=!0:".."===a?t++:""!=a&&o.push(a))}),o):[...o,i]},[]);return new B_(n,t,r)}(n);if(s.toRoot())return Rd(t.root,t.root,new W([],{}),r,o);const l=function a(c){var d;const f=function vF(e,t,n,r){return e.isAbsolute?new Fd(t.root,!0,0):-1===r?new Fd(n,n===t.root,0):function _F(e,t,n){let r=e,o=t,i=n;for(;i>o;){if(i-=o,r=r.parent,!r)throw new Error("Invalid number of '../'");o=r.segments.length}return new Fd(r,!1,o-i)}(n,r+(Ta(e.commands[0])?0:1),e.numberOfDoubleDots)}(s,t,null===(d=e.snapshot)||void 0===d?void 0:d._urlSegment,c),h=f.processChildren?xa(f.segmentGroup,f.index,s.commands):H_(f.segmentGroup,f.index,s.commands);return Rd(t.root,f.segmentGroup,h,r,o)}(null===(i=e.snapshot)||void 0===i?void 0:i._lastPathIndex);return l}(u,this.currentUrlTree,n,d,c??null)}navigateByUrl(n,r={skipLocationChange:!1}){const o=lr(n)?n:this.parseUrl(n),i=this.urlHandlingStrategy.merge(o,this.rawUrlTree);return this.scheduleNavigation(i,"imperative",null,r)}navigate(n,r={skipLocationChange:!1}){return function S1(e){for(let t=0;t{const i=n[o];return null!=i&&(r[o]=i),r},{})}processNavigations(){this.navigations.subscribe(n=>{var r;this.navigated=!0,this.lastSuccessfulId=n.id,this.currentPageId=n.targetPageId,this.events.next(new _i(n.id,this.serializeUrl(n.extractedUrl),this.serializeUrl(this.currentUrlTree))),this.lastSuccessfulNavigation=this.currentNavigation,null===(r=this.titleStrategy)||void 0===r||r.updateTitle(this.routerState.snapshot),n.resolve(!0)},n=>{this.console.warn(`Unhandled Navigation Error: ${n}`)})}scheduleNavigation(n,r,o,i,s){if(this.disposed)return Promise.resolve(!1);let a,l,u;s?(a=s.resolve,l=s.reject,u=s.promise):u=new Promise((p,g)=>{a=p,l=g});const c=++this.navigationId;let d;if("computed"===this.canceledNavigationResolution)if(0===this.currentPageId&&(o=this.location.getState()),o&&o.\u0275routerPageId)d=o.\u0275routerPageId;else if(i.replaceUrl||i.skipLocationChange){var f;d=null!==(f=this.browserPageId)&&void 0!==f?f:0}else{var h;d=(null!==(h=this.browserPageId)&&void 0!==h?h:0)+1}else d=0;return this.setTransition({id:c,targetPageId:d,source:r,restoredState:o,currentUrlTree:this.currentUrlTree,currentRawUrl:this.rawUrlTree,rawUrl:n,extras:i,resolve:a,reject:l,promise:u,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),u.catch(p=>Promise.reject(p))}setBrowserUrl(n,r){const o=this.urlSerializer.serialize(n),i={...r.extras.state,...this.generateNgRouterState(r.id,r.targetPageId)};this.location.isCurrentPathEqualTo(o)||r.extras.replaceUrl?this.location.replaceState(o,"",i):this.location.go(o,"",i)}restoreHistory(n,r=!1){if("computed"===this.canceledNavigationResolution){var o,i;const s=this.currentPageId-n.targetPageId;"popstate"!==n.source&&"eager"!==this.urlUpdateStrategy&&this.currentUrlTree!==(null===(o=this.currentNavigation)||void 0===o?void 0:o.finalUrl)||0===s?this.currentUrlTree===(null===(i=this.currentNavigation)||void 0===i?void 0:i.finalUrl)&&0===s&&(this.resetState(n),this.browserUrlTree=n.currentUrlTree,this.resetUrlToCurrentUrlTree()):this.location.historyGo(s)}else"replace"===this.canceledNavigationResolution&&(r&&this.resetState(n),this.resetUrlToCurrentUrlTree())}resetState(n){this.routerState=n.currentRouterState,this.currentUrlTree=n.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,n.rawUrl)}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.rawUrlTree),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}cancelNavigationTransition(n,r){const o=new y_(n.id,this.serializeUrl(n.extractedUrl),r);this.triggerEvent(o),n.resolve(!1)}generateNgRouterState(n,r){return"computed"===this.canceledNavigationResolution?{navigationId:n,\u0275routerPageId:r}:{navigationId:n}}}return e.\u0275fac=function(n){xu()},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();function dD(e){return"imperative"!==e}let La=(()=>{class e{constructor(n,r,o,i,s){this.router=n,this.route=r,this.tabIndexAttribute=o,this.renderer=i,this.el=s,this.commands=null,this.onChanges=new Ut,this.setTabIndexIfNotOnNativeEl("0")}setTabIndexIfNotOnNativeEl(n){if(null!=this.tabIndexAttribute)return;const r=this.renderer,o=this.el.nativeElement;null!==n?r.setAttribute(o,"tabindex",n):r.removeAttribute(o,"tabindex")}ngOnChanges(n){this.onChanges.next(this)}set routerLink(n){null!=n?(this.commands=Array.isArray(n)?n:[n],this.setTabIndexIfNotOnNativeEl("0")):(this.commands=null,this.setTabIndexIfNotOnNativeEl(null))}onClick(){if(null===this.urlTree)return!0;const n={skipLocationChange:Dn(this.skipLocationChange),replaceUrl:Dn(this.replaceUrl),state:this.state};return this.router.navigateByUrl(this.urlTree,n),!0}get urlTree(){return null===this.commands?null:this.router.createUrlTree(this.commands,{relativeTo:void 0!==this.relativeTo?this.relativeTo:this.route,queryParams:this.queryParams,fragment:this.fragment,queryParamsHandling:this.queryParamsHandling,preserveFragment:Dn(this.preserveFragment)})}}return e.\u0275fac=function(n){return new(n||e)(v(Ge),v(co),Ao("tabindex"),v(yn),v(yt))},e.\u0275dir=R({type:e,selectors:[["","routerLink","",5,"a",5,"area"]],hostBindings:function(n,r){1&n&&ne("click",function(){return r.onClick()})},inputs:{queryParams:"queryParams",fragment:"fragment",queryParamsHandling:"queryParamsHandling",preserveFragment:"preserveFragment",skipLocationChange:"skipLocationChange",replaceUrl:"replaceUrl",state:"state",relativeTo:"relativeTo",routerLink:"routerLink"},features:[Ct]}),e})();class fD{buildTitle(t){let n,r=t.root;for(;void 0!==r;){var o;n=null!==(o=this.getResolvedTitleForRoute(r))&&void 0!==o?o:n,r=r.children.find(i=>i.outlet===z)}return n}getResolvedTitleForRoute(t){return t.data[jd]}}let T1=(()=>{class e extends fD{constructor(n){super(),this.title=n}updateTitle(n){const r=this.buildTitle(n);void 0!==r&&this.title.setTitle(r)}}return e.\u0275fac=function(n){return new(n||e)(S(l_))},e.\u0275prov=O({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();class hD{}class pD{preload(t,n){return V(null)}}let gD=(()=>{class e{constructor(n,r,o,i,s){this.router=n,this.injector=o,this.preloadingStrategy=i,this.loader=s}setUpPreloading(){this.subscription=this.router.events.pipe(rr(n=>n instanceof _i),ao(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription&&this.subscription.unsubscribe()}processRoutes(n,r){const o=[];for(const l of r){var i,s;l.providers&&!l._injector&&(l._injector=Ks(l.providers,n,`Route: ${l.path}`));const u=null!==(i=l._injector)&&void 0!==i?i:n,c=null!==(s=l._loadedInjector)&&void 0!==s?s:u;if(l.loadChildren&&!l._loadedRoutes||l.loadComponent&&!l._loadedComponent)o.push(this.preloadConfig(u,l));else if(l.children||l._loadedRoutes){var a;o.push(this.processRoutes(c,null!==(a=l.children)&&void 0!==a?a:l._loadedRoutes))}}return Oe(o).pipe(gr())}preloadConfig(n,r){return this.preloadingStrategy.preload(r,()=>{let o;o=r.loadChildren&&void 0===r.canLoad?this.loader.loadChildren(n,r):V(null);const i=o.pipe(Ve(s=>{var a;return null===s?V(void 0):(r._loadedRoutes=s.routes,r._loadedInjector=s.injector,this.processRoutes(null!==(a=s.injector)&&void 0!==a?a:n,s.routes))}));return r.loadComponent&&!r._loadedComponent?Oe([i,this.loader.loadComponent(r)]).pipe(gr()):i})}}return e.\u0275fac=function(n){return new(n||e)(S(Ge),S(Lc),S(Jn),S(hD),S(Hd))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})(),$d=(()=>{class e{constructor(n,r,o={}){this.router=n,this.viewportScroller=r,this.options=o,this.lastId=0,this.lastSource="imperative",this.restoredId=0,this.store={},o.scrollPositionRestoration=o.scrollPositionRestoration||"disabled",o.anchorScrolling=o.anchorScrolling||"disabled"}init(){"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.router.events.subscribe(n=>{n instanceof bd?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=n.navigationTrigger,this.restoredId=n.restoredState?n.restoredState.navigationId:0):n instanceof _i&&(this.lastId=n.id,this.scheduleScrollEvent(n,this.router.parseUrl(n.urlAfterRedirects).fragment))})}consumeScrollEvents(){return this.router.events.subscribe(n=>{n instanceof v_&&(n.position?"top"===this.options.scrollPositionRestoration?this.viewportScroller.scrollToPosition([0,0]):"enabled"===this.options.scrollPositionRestoration&&this.viewportScroller.scrollToPosition(n.position):n.anchor&&"enabled"===this.options.anchorScrolling?this.viewportScroller.scrollToAnchor(n.anchor):"disabled"!==this.options.scrollPositionRestoration&&this.viewportScroller.scrollToPosition([0,0]))})}scheduleScrollEvent(n,r){this.router.triggerEvent(new v_(n,"popstate"===this.lastSource?this.store[this.restoredId]:null,r))}ngOnDestroy(){this.routerEventsSubscription&&this.routerEventsSubscription.unsubscribe(),this.scrollEventsSubscription&&this.scrollEventsSubscription.unsubscribe()}}return e.\u0275fac=function(n){xu()},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();const ur=new P("ROUTER_CONFIGURATION"),mD=new P("ROUTER_FORROOT_GUARD"),N1=[Jc,{provide:A_,useClass:T_},{provide:Ge,useFactory:function k1(e,t,n,r,o,i,s={},a,l,u,c){const d=new Ge(null,e,t,n,r,o,C_(i));return u&&(d.urlHandlingStrategy=u),c&&(d.routeReuseStrategy=c),d.titleStrategy=l??a,function V1(e,t){e.errorHandler&&(t.errorHandler=e.errorHandler),e.malformedUriErrorHandler&&(t.malformedUriErrorHandler=e.malformedUriErrorHandler),e.onSameUrlNavigation&&(t.onSameUrlNavigation=e.onSameUrlNavigation),e.paramsInheritanceStrategy&&(t.paramsInheritanceStrategy=e.paramsInheritanceStrategy),e.relativeLinkResolution&&(t.relativeLinkResolution=e.relativeLinkResolution),e.urlUpdateStrategy&&(t.urlUpdateStrategy=e.urlUpdateStrategy),e.canceledNavigationResolution&&(t.canceledNavigationResolution=e.canceledNavigationResolution)}(s,d),d},deps:[A_,bi,Jc,Je,Lc,Bd,ur,T1,[fD,new hn],[class _1{},new hn],[class m1{},new hn]]},bi,{provide:co,useFactory:function L1(e){return e.routerState.root},deps:[Ge]},gD,pD,class x1{preload(t,n){return n().pipe(or(()=>V(null)))}},{provide:ur,useValue:{enableTracing:!1}},Hd];function R1(){return new iv("Router",Ge)}let yD=(()=>{class e{constructor(n,r){}static forRoot(n,r){return{ngModule:e,providers:[N1,vD(n),{provide:mD,useFactory:O1,deps:[[Ge,new hn,new Oo]]},{provide:ur,useValue:r||{}},{provide:io,useFactory:P1,deps:[di,[new Ds(Yc),new hn],ur]},{provide:$d,useFactory:F1,deps:[Ge,gN,ur]},{provide:hD,useExisting:r&&r.preloadingStrategy?r.preloadingStrategy:pD},{provide:iv,multi:!0,useFactory:R1},[Gd,{provide:Oc,multi:!0,useFactory:j1,deps:[Gd]},{provide:_D,useFactory:B1,deps:[Gd]},{provide:Xy,multi:!0,useExisting:_D}]]}}static forChild(n){return{ngModule:e,providers:[vD(n)]}}}return e.\u0275fac=function(n){return new(n||e)(S(mD,8),S(Ge,8))},e.\u0275mod=_t({type:e}),e.\u0275inj=lt({}),e})();function F1(e,t,n){return n.scrollOffset&&t.setOffset(n.scrollOffset),new $d(e,t,n)}function P1(e,t,n={}){return n.useHash?new QT(e,t):new Av(e,t)}function O1(e){return"guarded"}function vD(e){return[{provide:EE,multi:!0,useValue:e},{provide:Bd,multi:!0,useValue:e}]}let Gd=(()=>{class e{constructor(n){this.injector=n,this.initNavigation=!1,this.destroyed=!1,this.resultOfPreactivationDone=new Ut}appInitializer(){return this.injector.get(qT,Promise.resolve(null)).then(()=>{if(this.destroyed)return Promise.resolve(!0);let r=null;const o=new Promise(a=>r=a),i=this.injector.get(Ge),s=this.injector.get(ur);return"disabled"===s.initialNavigation?(i.setUpLocationChangeListener(),r(!0)):"enabledBlocking"===s.initialNavigation?(i.hooks.afterPreactivation=()=>this.initNavigation?V(null):(this.initNavigation=!0,r(!0),this.resultOfPreactivationDone),i.initialNavigation()):r(!0),o})}bootstrapListener(n){const r=this.injector.get(ur),o=this.injector.get(gD),i=this.injector.get($d),s=this.injector.get(Ge),a=this.injector.get(na);n===a.components[0]&&(("enabledNonBlocking"===r.initialNavigation||void 0===r.initialNavigation)&&s.initialNavigation(),o.setUpPreloading(),i.init(),s.resetRootComponentType(a.componentTypes[0]),this.resultOfPreactivationDone.next(null),this.resultOfPreactivationDone.complete())}ngOnDestroy(){this.destroyed=!0}}return e.\u0275fac=function(n){return new(n||e)(S(Je))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();function j1(e){return e.appInitializer.bind(e)}function B1(e){return e.bootstrapListener.bind(e)}const _D=new P("Router Initializer");let U1=(()=>{class e{constructor(){this.title="djongo-FE"}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=zt({type:e,selectors:[["app-root"]],decls:1,vars:0,template:function(n,r){1&n&&Pe(0,"router-outlet")},dependencies:[Od]}),e})();var xi=(()=>(function(e){e.intention="intention/",e.payment="payment/"}(xi||(xi={})),xi))(),ja=(()=>(function(e){e[e.OK=0]="OK",e[e.EMAIL_EXISTS=1]="EMAIL_EXISTS",e[e.OTHER=2]="OTHER"}(ja||(ja={})),ja))(),fo=(()=>(function(e){e[e.OK=0]="OK",e[e.STRIPE_REJ=1]="STRIPE_REJ",e[e.OTHER=2]="OTHER"}(fo||(fo={})),fo))(),ze=(()=>(function(e){e.createAccount="create-account/",e.login="login/",e.dashboard="dashboard/"}(ze||(ze={})),ze))();class DD{}class CD{}class on{constructor(t){this.normalizedNames=new Map,this.lazyUpdate=null,t?this.lazyInit="string"==typeof t?()=>{this.headers=new Map,t.split("\n").forEach(n=>{const r=n.indexOf(":");if(r>0){const o=n.slice(0,r),i=o.toLowerCase(),s=n.slice(r+1).trim();this.maybeSetNormalizedName(o,i),this.headers.has(i)?this.headers.get(i).push(s):this.headers.set(i,[s])}})}:()=>{this.headers=new Map,Object.keys(t).forEach(n=>{let r=t[n];const o=n.toLowerCase();"string"==typeof r&&(r=[r]),r.length>0&&(this.headers.set(o,r),this.maybeSetNormalizedName(n,o))})}:this.headers=new Map}has(t){return this.init(),this.headers.has(t.toLowerCase())}get(t){this.init();const n=this.headers.get(t.toLowerCase());return n&&n.length>0?n[0]:null}keys(){return this.init(),Array.from(this.normalizedNames.values())}getAll(t){return this.init(),this.headers.get(t.toLowerCase())||null}append(t,n){return this.clone({name:t,value:n,op:"a"})}set(t,n){return this.clone({name:t,value:n,op:"s"})}delete(t,n){return this.clone({name:t,value:n,op:"d"})}maybeSetNormalizedName(t,n){this.normalizedNames.has(n)||this.normalizedNames.set(n,t)}init(){this.lazyInit&&(this.lazyInit instanceof on?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(t=>this.applyUpdate(t)),this.lazyUpdate=null))}copyFrom(t){t.init(),Array.from(t.headers.keys()).forEach(n=>{this.headers.set(n,t.headers.get(n)),this.normalizedNames.set(n,t.normalizedNames.get(n))})}clone(t){const n=new on;return n.lazyInit=this.lazyInit&&this.lazyInit instanceof on?this.lazyInit:this,n.lazyUpdate=(this.lazyUpdate||[]).concat([t]),n}applyUpdate(t){const n=t.name.toLowerCase();switch(t.op){case"a":case"s":let r=t.value;if("string"==typeof r&&(r=[r]),0===r.length)return;this.maybeSetNormalizedName(t.name,n);const o=("a"===t.op?this.headers.get(n):void 0)||[];o.push(...r),this.headers.set(n,o);break;case"d":const i=t.value;if(i){let s=this.headers.get(n);if(!s)return;s=s.filter(a=>-1===i.indexOf(a)),0===s.length?(this.headers.delete(n),this.normalizedNames.delete(n)):this.headers.set(n,s)}else this.headers.delete(n),this.normalizedNames.delete(n)}}forEach(t){this.init(),Array.from(this.normalizedNames.keys()).forEach(n=>t(this.normalizedNames.get(n),this.headers.get(n)))}}class $1{encodeKey(t){return wD(t)}encodeValue(t){return wD(t)}decodeKey(t){return decodeURIComponent(t)}decodeValue(t){return decodeURIComponent(t)}}const z1=/%(\d[a-f0-9])/gi,q1={40:"@","3A":":",24:"$","2C":",","3B":";","3D":"=","3F":"?","2F":"/"};function wD(e){return encodeURIComponent(e).replace(z1,(t,n)=>{var r;return null!==(r=q1[n])&&void 0!==r?r:t})}function Ba(e){return`${e}`}class sn{constructor(t={}){if(this.updates=null,this.cloneFrom=null,this.encoder=t.encoder||new $1,t.fromString){if(t.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=function G1(e,t){const n=new Map;return e.length>0&&e.replace(/^\?/,"").split("&").forEach(o=>{const i=o.indexOf("="),[s,a]=-1==i?[t.decodeKey(o),""]:[t.decodeKey(o.slice(0,i)),t.decodeValue(o.slice(i+1))],l=n.get(s)||[];l.push(a),n.set(s,l)}),n}(t.fromString,this.encoder)}else t.fromObject?(this.map=new Map,Object.keys(t.fromObject).forEach(n=>{const r=t.fromObject[n],o=Array.isArray(r)?r.map(Ba):[Ba(r)];this.map.set(n,o)})):this.map=null}has(t){return this.init(),this.map.has(t)}get(t){this.init();const n=this.map.get(t);return n?n[0]:null}getAll(t){return this.init(),this.map.get(t)||null}keys(){return this.init(),Array.from(this.map.keys())}append(t,n){return this.clone({param:t,value:n,op:"a"})}appendAll(t){const n=[];return Object.keys(t).forEach(r=>{const o=t[r];Array.isArray(o)?o.forEach(i=>{n.push({param:r,value:i,op:"a"})}):n.push({param:r,value:o,op:"a"})}),this.clone(n)}set(t,n){return this.clone({param:t,value:n,op:"s"})}delete(t,n){return this.clone({param:t,value:n,op:"d"})}toString(){return this.init(),this.keys().map(t=>{const n=this.encoder.encodeKey(t);return this.map.get(t).map(r=>n+"="+this.encoder.encodeValue(r)).join("&")}).filter(t=>""!==t).join("&")}clone(t){const n=new sn({encoder:this.encoder});return n.cloneFrom=this.cloneFrom||this,n.updates=(this.updates||[]).concat(t),n}init(){null===this.map&&(this.map=new Map),null!==this.cloneFrom&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(t=>this.map.set(t,this.cloneFrom.map.get(t))),this.updates.forEach(t=>{switch(t.op){case"a":case"s":const n=("a"===t.op?this.map.get(t.param):void 0)||[];n.push(Ba(t.value)),this.map.set(t.param,n);break;case"d":if(void 0===t.value){this.map.delete(t.param);break}{let r=this.map.get(t.param)||[];const o=r.indexOf(Ba(t.value));-1!==o&&r.splice(o,1),r.length>0?this.map.set(t.param,r):this.map.delete(t.param)}}}),this.cloneFrom=this.updates=null)}}class W1{constructor(){this.map=new Map}set(t,n){return this.map.set(t,n),this}get(t){return this.map.has(t)||this.map.set(t,t.defaultValue()),this.map.get(t)}delete(t){return this.map.delete(t),this}has(t){return this.map.has(t)}keys(){return this.map.keys()}}function ED(e){return typeof ArrayBuffer<"u"&&e instanceof ArrayBuffer}function bD(e){return typeof Blob<"u"&&e instanceof Blob}function MD(e){return typeof FormData<"u"&&e instanceof FormData}class Ni{constructor(t,n,r,o){let i;if(this.url=n,this.body=null,this.reportProgress=!1,this.withCredentials=!1,this.responseType="json",this.method=t.toUpperCase(),function K1(e){switch(e){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}(this.method)||o?(this.body=void 0!==r?r:null,i=o):i=r,i&&(this.reportProgress=!!i.reportProgress,this.withCredentials=!!i.withCredentials,i.responseType&&(this.responseType=i.responseType),i.headers&&(this.headers=i.headers),i.context&&(this.context=i.context),i.params&&(this.params=i.params)),this.headers||(this.headers=new on),this.context||(this.context=new W1),this.params){const s=this.params.toString();if(0===s.length)this.urlWithParams=n;else{const a=n.indexOf("?");this.urlWithParams=n+(-1===a?"?":af.set(h,t.setHeaders[h]),u)),t.setParams&&(c=Object.keys(t.setParams).reduce((f,h)=>f.set(h,t.setParams[h]),c)),new Ni(r,o,s,{params:c,headers:u,context:d,reportProgress:l,responseType:i,withCredentials:a})}}var Ae=(()=>((Ae=Ae||{})[Ae.Sent=0]="Sent",Ae[Ae.UploadProgress=1]="UploadProgress",Ae[Ae.ResponseHeader=2]="ResponseHeader",Ae[Ae.DownloadProgress=3]="DownloadProgress",Ae[Ae.Response=4]="Response",Ae[Ae.User=5]="User",Ae))();class zd{constructor(t,n=200,r="OK"){this.headers=t.headers||new on,this.status=void 0!==t.status?t.status:n,this.statusText=t.statusText||r,this.url=t.url||null,this.ok=this.status>=200&&this.status<300}}class qd extends zd{constructor(t={}){super(t),this.type=Ae.ResponseHeader}clone(t={}){return new qd({headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})}}class Ha extends zd{constructor(t={}){super(t),this.type=Ae.Response,this.body=void 0!==t.body?t.body:null}clone(t={}){return new Ha({body:void 0!==t.body?t.body:this.body,headers:t.headers||this.headers,status:void 0!==t.status?t.status:this.status,statusText:t.statusText||this.statusText,url:t.url||this.url||void 0})}}class SD extends zd{constructor(t){super(t,0,"Unknown Error"),this.name="HttpErrorResponse",this.ok=!1,this.message=this.status>=200&&this.status<300?`Http failure during parsing for ${t.url||"(unknown url)"}`:`Http failure response for ${t.url||"(unknown url)"}: ${t.status} ${t.statusText}`,this.error=t.error||null}}function Wd(e,t){return{body:t,headers:e.headers,context:e.context,observe:e.observe,params:e.params,reportProgress:e.reportProgress,responseType:e.responseType,withCredentials:e.withCredentials}}let ID=(()=>{class e{constructor(n){this.handler=n}request(n,r,o={}){let i;if(n instanceof Ni)i=n;else{let l,u;l=o.headers instanceof on?o.headers:new on(o.headers),o.params&&(u=o.params instanceof sn?o.params:new sn({fromObject:o.params})),i=new Ni(n,r,void 0!==o.body?o.body:null,{headers:l,context:o.context,params:u,reportProgress:o.reportProgress,responseType:o.responseType||"json",withCredentials:o.withCredentials})}const s=V(i).pipe(ao(l=>this.handler.handle(l)));if(n instanceof Ni||"events"===o.observe)return s;const a=s.pipe(rr(l=>l instanceof Ha));switch(o.observe||"body"){case"body":switch(i.responseType){case"arraybuffer":return a.pipe(Y(l=>{if(null!==l.body&&!(l.body instanceof ArrayBuffer))throw new Error("Response is not an ArrayBuffer.");return l.body}));case"blob":return a.pipe(Y(l=>{if(null!==l.body&&!(l.body instanceof Blob))throw new Error("Response is not a Blob.");return l.body}));case"text":return a.pipe(Y(l=>{if(null!==l.body&&"string"!=typeof l.body)throw new Error("Response is not a string.");return l.body}));default:return a.pipe(Y(l=>l.body))}case"response":return a;default:throw new Error(`Unreachable: unhandled observe type ${o.observe}}`)}}delete(n,r={}){return this.request("DELETE",n,r)}get(n,r={}){return this.request("GET",n,r)}head(n,r={}){return this.request("HEAD",n,r)}jsonp(n,r){return this.request("JSONP",n,{params:(new sn).append(r,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}options(n,r={}){return this.request("OPTIONS",n,r)}patch(n,r,o={}){return this.request("PATCH",n,Wd(o,r))}post(n,r,o={}){return this.request("POST",n,Wd(o,r))}put(n,r,o={}){return this.request("PUT",n,Wd(o,r))}}return e.\u0275fac=function(n){return new(n||e)(S(DD))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();class AD{constructor(t,n){this.next=t,this.interceptor=n}handle(t){return this.interceptor.intercept(t,this.next)}}const TD=new P("HTTP_INTERCEPTORS");let Z1=(()=>{class e{intercept(n,r){return r.handle(n)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();const Y1=/^\)\]\}',?\n/;let xD=(()=>{class e{constructor(n){this.xhrFactory=n}handle(n){if("JSONP"===n.method)throw new Error("Attempted to construct Jsonp request without HttpClientJsonpModule installed.");return new pe(r=>{const o=this.xhrFactory.build();if(o.open(n.method,n.urlWithParams),n.withCredentials&&(o.withCredentials=!0),n.headers.forEach((h,p)=>o.setRequestHeader(h,p.join(","))),n.headers.has("Accept")||o.setRequestHeader("Accept","application/json, text/plain, */*"),!n.headers.has("Content-Type")){const h=n.detectContentTypeHeader();null!==h&&o.setRequestHeader("Content-Type",h)}if(n.responseType){const h=n.responseType.toLowerCase();o.responseType="json"!==h?h:"text"}const i=n.serializeBody();let s=null;const a=()=>{if(null!==s)return s;const h=o.statusText||"OK",p=new on(o.getAllResponseHeaders()),g=function J1(e){return"responseURL"in e&&e.responseURL?e.responseURL:/^X-Request-URL:/m.test(e.getAllResponseHeaders())?e.getResponseHeader("X-Request-URL"):null}(o)||n.url;return s=new qd({headers:p,status:o.status,statusText:h,url:g}),s},l=()=>{let{headers:h,status:p,statusText:g,url:_}=a(),D=null;204!==p&&(D=typeof o.response>"u"?o.responseText:o.response),0===p&&(p=D?200:0);let w=p>=200&&p<300;if("json"===n.responseType&&"string"==typeof D){const m=D;D=D.replace(Y1,"");try{D=""!==D?JSON.parse(D):null}catch(I){D=m,w&&(w=!1,D={error:I,text:D})}}w?(r.next(new Ha({body:D,headers:h,status:p,statusText:g,url:_||void 0})),r.complete()):r.error(new SD({error:D,headers:h,status:p,statusText:g,url:_||void 0}))},u=h=>{const{url:p}=a(),g=new SD({error:h,status:o.status||0,statusText:o.statusText||"Unknown Error",url:p||void 0});r.error(g)};let c=!1;const d=h=>{c||(r.next(a()),c=!0);let p={type:Ae.DownloadProgress,loaded:h.loaded};h.lengthComputable&&(p.total=h.total),"text"===n.responseType&&!!o.responseText&&(p.partialText=o.responseText),r.next(p)},f=h=>{let p={type:Ae.UploadProgress,loaded:h.loaded};h.lengthComputable&&(p.total=h.total),r.next(p)};return o.addEventListener("load",l),o.addEventListener("error",u),o.addEventListener("timeout",u),o.addEventListener("abort",u),n.reportProgress&&(o.addEventListener("progress",d),null!==i&&o.upload&&o.upload.addEventListener("progress",f)),o.send(i),r.next({type:Ae.Sent}),()=>{o.removeEventListener("error",u),o.removeEventListener("abort",u),o.removeEventListener("load",l),o.removeEventListener("timeout",u),n.reportProgress&&(o.removeEventListener("progress",d),null!==i&&o.upload&&o.upload.removeEventListener("progress",f)),o.readyState!==o.DONE&&o.abort()}})}}return e.\u0275fac=function(n){return new(n||e)(S(qv))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})();const Kd=new P("XSRF_COOKIE_NAME"),Qd=new P("XSRF_HEADER_NAME");class ND{}let X1=(()=>{class e{constructor(n,r,o){this.doc=n,this.platform=r,this.cookieName=o,this.lastCookieString="",this.lastToken=null,this.parseCount=0}getToken(){if("server"===this.platform)return null;const n=this.doc.cookie||"";return n!==this.lastCookieString&&(this.parseCount++,this.lastToken=Lv(n,this.cookieName),this.lastCookieString=n),this.lastToken}}return e.\u0275fac=function(n){return new(n||e)(S(tt),S(Vc),S(Kd))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})(),Zd=(()=>{class e{constructor(n,r){this.tokenService=n,this.headerName=r}intercept(n,r){const o=n.url.toLowerCase();if("GET"===n.method||"HEAD"===n.method||o.startsWith("http://")||o.startsWith("https://"))return r.handle(n);const i=this.tokenService.getToken();return null!==i&&!n.headers.has(this.headerName)&&(n=n.clone({headers:n.headers.set(this.headerName,i)})),r.handle(n)}}return e.\u0275fac=function(n){return new(n||e)(S(ND),S(Qd))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})(),eP=(()=>{class e{constructor(n,r){this.backend=n,this.injector=r,this.chain=null}handle(n){if(null===this.chain){const r=this.injector.get(TD,[]);this.chain=r.reduceRight((o,i)=>new AD(o,i),this.backend)}return this.chain.handle(n)}}return e.\u0275fac=function(n){return new(n||e)(S(CD),S(Je))},e.\u0275prov=O({token:e,factory:e.\u0275fac}),e})(),tP=(()=>{class e{static disable(){return{ngModule:e,providers:[{provide:Zd,useClass:Z1}]}}static withOptions(n={}){return{ngModule:e,providers:[n.cookieName?{provide:Kd,useValue:n.cookieName}:[],n.headerName?{provide:Qd,useValue:n.headerName}:[]]}}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=lt({providers:[Zd,{provide:TD,useExisting:Zd,multi:!0},{provide:ND,useClass:X1},{provide:Kd,useValue:"XSRF-TOKEN"},{provide:Qd,useValue:"X-XSRF-TOKEN"}]}),e})(),nP=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=lt({providers:[ID,{provide:DD,useClass:eP},xD,{provide:CD,useExisting:xD}],imports:[tP.withOptions({cookieName:"XSRF-TOKEN",headerName:"X-XSRF-TOKEN"})]}),e})();const Ri_baseUrl="https://api.djongomapper.com/mapper/";class RD{constructor(){}static has(t){return document.cookie.split(";").some(n=>n.trim().startsWith(t+"="))}static get(t){let n=document.cookie.split(";").find(r=>r.trim().startsWith(t+"="));if(n)return n.trim().split("=")[1]}static set(t,n){document.cookie=t+"="+n+";Secure"}}let cr=(()=>{class e{constructor(n){this.http=n}post(n,r){let o={"Content-Type":"text/plain"},i=RD.get("csrftoken");i&&(o["X-CSRFTOKEN"]=i);let s={withCredentials:!0};return s.headers=new on(o),this.http.post(Ri_baseUrl+n,r,s)}postForm(n,r){let o=new sn({fromObject:r}),i=RD.get("csrftoken");return i&&(o=o.set("csrfmiddlewaretoken",i)),this.http.post(Ri_baseUrl+n,o,{withCredentials:!0})}get(n,r){let o={withCredentials:!0};return r&&(o.params=new sn({fromObject:r})),this.http.get(Ri_baseUrl+n,o)}}return e.\u0275fac=function(n){return new(n||e)(S(ID))},e.\u0275prov=O({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const FD={dashboard:[{provide:cr,useClass:cr}],createAccount:[{provide:cr,useClass:cr}]};function Ua(e,t){return new pe(n=>{const r=e.length;if(0===r)return void n.complete();const o=new Array(r);let i=0,s=0;for(let a=0;a{u||(u=!0,s++),o[a]=c},error:c=>n.error(c),complete:()=>{i++,(i===r||!u)&&(s===r&&n.next(t?t.reduce((c,d,f)=>(c[d]=o[f],c),{}):o),n.complete())}}))}})}let PD=(()=>{class e{constructor(n,r){this._renderer=n,this._elementRef=r,this.onChange=o=>{},this.onTouched=()=>{}}setProperty(n,r){this._renderer.setProperty(this._elementRef.nativeElement,n,r)}registerOnTouched(n){this.onTouched=n}registerOnChange(n){this.onChange=n}setDisabledState(n){this.setProperty("disabled",n)}}return e.\u0275fac=function(n){return new(n||e)(v(yn),v(yt))},e.\u0275dir=R({type:e}),e})(),dr=(()=>{class e extends PD{}return e.\u0275fac=function(){let t;return function(r){return(t||(t=Be(e)))(r||e)}}(),e.\u0275dir=R({type:e,features:[ee]}),e})();const an=new P("NgValueAccessor"),iP={provide:an,useExisting:ae(()=>ho),multi:!0},aP=new P("CompositionEventMode");let ho=(()=>{class e extends PD{constructor(n,r,o){super(n,r),this._compositionMode=o,this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function sP(){const e=nn()?nn().getUserAgent():"";return/android (\d+)/.test(e.toLowerCase())}())}writeValue(n){this.setProperty("value",n??"")}_handleInput(n){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(n)}_compositionStart(){this._composing=!0}_compositionEnd(n){this._composing=!1,this._compositionMode&&this.onChange(n)}}return e.\u0275fac=function(n){return new(n||e)(v(yn),v(yt),v(aP,8))},e.\u0275dir=R({type:e,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(n,r){1&n&&ne("input",function(i){return r._handleInput(i.target.value)})("blur",function(){return r.onTouched()})("compositionstart",function(){return r._compositionStart()})("compositionend",function(i){return r._compositionEnd(i.target.value)})},features:[ue([iP]),ee]}),e})();function jn(e){return null==e||("string"==typeof e||Array.isArray(e))&&0===e.length}const qe=new P("NgValidators"),Bn=new P("NgAsyncValidators");function jD(e){return jn(e.value)?{required:!0}:null}function $a(e){return null}function zD(e){return null!=e}function qD(e){const t=Ko(e)?Oe(e):e;return ac(t),t}function WD(e){let t={};return e.forEach(n=>{t=null!=n?{...t,...n}:t}),0===Object.keys(t).length?null:t}function KD(e,t){return t.map(n=>n(e))}function QD(e){return e.map(t=>function uP(e){return!e.validate}(t)?t:n=>t.validate(n))}function Yd(e){return null!=e?function ZD(e){if(!e)return null;const t=e.filter(zD);return 0==t.length?null:function(n){return WD(KD(n,t))}}(QD(e)):null}function Jd(e){return null!=e?function YD(e){if(!e)return null;const t=e.filter(zD);return 0==t.length?null:function(n){return function rP(...e){if(1===e.length){const t=e[0];if(Hi(t))return Ua(t,null);if(tl(t)&&Object.getPrototypeOf(t)===Object.prototype){const n=Object.keys(t);return Ua(n.map(r=>t[r]),n)}}if("function"==typeof e[e.length-1]){const t=e.pop();return Ua(e=1===e.length&&Hi(e[0])?e[0]:e,null).pipe(Y(n=>t(...n)))}return Ua(e,null)}(KD(n,t).map(qD)).pipe(Y(WD))}}(QD(e)):null}function JD(e,t){return null===e?[t]:Array.isArray(e)?[...e,t]:[e,t]}function Xd(e){return e?Array.isArray(e)?e:[e]:[]}function Ga(e,t){return Array.isArray(e)?e.includes(t):e===t}function tC(e,t){const n=Xd(t);return Xd(e).forEach(o=>{Ga(n,o)||n.push(o)}),n}function nC(e,t){return Xd(t).filter(n=>!Ga(e,n))}class rC{constructor(){this._rawValidators=[],this._rawAsyncValidators=[],this._onDestroyCallbacks=[]}get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_setValidators(t){this._rawValidators=t||[],this._composedValidatorFn=Yd(this._rawValidators)}_setAsyncValidators(t){this._rawAsyncValidators=t||[],this._composedAsyncValidatorFn=Jd(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_registerOnDestroy(t){this._onDestroyCallbacks.push(t)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(t=>t()),this._onDestroyCallbacks=[]}reset(t){this.control&&this.control.reset(t)}hasError(t,n){return!!this.control&&this.control.hasError(t,n)}getError(t,n){return this.control?this.control.getError(t,n):null}}class nt extends rC{get formDirective(){return null}get path(){return null}}class Hn extends rC{constructor(){super(...arguments),this._parent=null,this.name=null,this.valueAccessor=null}}class oC{constructor(t){this._cd=t}get isTouched(){var t,n;return!(null===(t=this._cd)||void 0===t||null===(n=t.control)||void 0===n||!n.touched)}get isUntouched(){var t,n;return!(null===(t=this._cd)||void 0===t||null===(n=t.control)||void 0===n||!n.untouched)}get isPristine(){var t,n;return!(null===(t=this._cd)||void 0===t||null===(n=t.control)||void 0===n||!n.pristine)}get isDirty(){var t,n;return!(null===(t=this._cd)||void 0===t||null===(n=t.control)||void 0===n||!n.dirty)}get isValid(){var t,n;return!(null===(t=this._cd)||void 0===t||null===(n=t.control)||void 0===n||!n.valid)}get isInvalid(){var t,n;return!(null===(t=this._cd)||void 0===t||null===(n=t.control)||void 0===n||!n.invalid)}get isPending(){var t,n;return!(null===(t=this._cd)||void 0===t||null===(n=t.control)||void 0===n||!n.pending)}get isSubmitted(){var t;return!(null===(t=this._cd)||void 0===t||!t.submitted)}}let za=(()=>{class e extends oC{constructor(n){super(n)}}return e.\u0275fac=function(n){return new(n||e)(v(Hn,2))},e.\u0275dir=R({type:e,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(n,r){2&n&&Qo("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)},features:[ee]}),e})(),ef=(()=>{class e extends oC{constructor(n){super(n)}}return e.\u0275fac=function(n){return new(n||e)(v(nt,10))},e.\u0275dir=R({type:e,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(n,r){2&n&&Qo("ng-untouched",r.isUntouched)("ng-touched",r.isTouched)("ng-pristine",r.isPristine)("ng-dirty",r.isDirty)("ng-valid",r.isValid)("ng-invalid",r.isInvalid)("ng-pending",r.isPending)("ng-submitted",r.isSubmitted)},features:[ee]}),e})();const Fi="VALID",Wa="INVALID",po="PENDING",Pi="DISABLED";function of(e){return(Ka(e)?e.validators:e)||null}function sC(e){return Array.isArray(e)?Yd(e):e||null}function sf(e,t){return(Ka(t)?t.asyncValidators:e)||null}function aC(e){return Array.isArray(e)?Jd(e):e||null}function Ka(e){return null!=e&&!Array.isArray(e)&&"object"==typeof e}class cC{constructor(t,n){this._pendingDirty=!1,this._hasOwnPendingAsyncValidator=!1,this._pendingTouched=!1,this._onCollectionChange=()=>{},this._parent=null,this.pristine=!0,this.touched=!1,this._onDisabledChange=[],this._rawValidators=t,this._rawAsyncValidators=n,this._composedValidatorFn=sC(this._rawValidators),this._composedAsyncValidatorFn=aC(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn}set validator(t){this._rawValidators=this._composedValidatorFn=t}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(t){this._rawAsyncValidators=this._composedAsyncValidatorFn=t}get parent(){return this._parent}get valid(){return this.status===Fi}get invalid(){return this.status===Wa}get pending(){return this.status==po}get disabled(){return this.status===Pi}get enabled(){return this.status!==Pi}get dirty(){return!this.pristine}get untouched(){return!this.touched}get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(t){this._rawValidators=t,this._composedValidatorFn=sC(t)}setAsyncValidators(t){this._rawAsyncValidators=t,this._composedAsyncValidatorFn=aC(t)}addValidators(t){this.setValidators(tC(t,this._rawValidators))}addAsyncValidators(t){this.setAsyncValidators(tC(t,this._rawAsyncValidators))}removeValidators(t){this.setValidators(nC(t,this._rawValidators))}removeAsyncValidators(t){this.setAsyncValidators(nC(t,this._rawAsyncValidators))}hasValidator(t){return Ga(this._rawValidators,t)}hasAsyncValidator(t){return Ga(this._rawAsyncValidators,t)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(t={}){this.touched=!0,this._parent&&!t.onlySelf&&this._parent.markAsTouched(t)}markAllAsTouched(){this.markAsTouched({onlySelf:!0}),this._forEachChild(t=>t.markAllAsTouched())}markAsUntouched(t={}){this.touched=!1,this._pendingTouched=!1,this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)}markAsDirty(t={}){this.pristine=!1,this._parent&&!t.onlySelf&&this._parent.markAsDirty(t)}markAsPristine(t={}){this.pristine=!0,this._pendingDirty=!1,this._forEachChild(n=>{n.markAsPristine({onlySelf:!0})}),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)}markAsPending(t={}){this.status=po,!1!==t.emitEvent&&this.statusChanges.emit(this.status),this._parent&&!t.onlySelf&&this._parent.markAsPending(t)}disable(t={}){const n=this._parentMarkedDirty(t.onlySelf);this.status=Pi,this.errors=null,this._forEachChild(r=>{r.disable({...t,onlySelf:!0})}),this._updateValue(),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors({...t,skipPristineCheck:n}),this._onDisabledChange.forEach(r=>r(!0))}enable(t={}){const n=this._parentMarkedDirty(t.onlySelf);this.status=Fi,this._forEachChild(r=>{r.enable({...t,onlySelf:!0})}),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent}),this._updateAncestors({...t,skipPristineCheck:n}),this._onDisabledChange.forEach(r=>r(!1))}_updateAncestors(t){this._parent&&!t.onlySelf&&(this._parent.updateValueAndValidity(t),t.skipPristineCheck||this._parent._updatePristine(),this._parent._updateTouched())}setParent(t){this._parent=t}getRawValue(){return this.value}updateValueAndValidity(t={}){this._setInitialStatus(),this._updateValue(),this.enabled&&(this._cancelExistingSubscription(),this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===Fi||this.status===po)&&this._runAsyncValidator(t.emitEvent)),!1!==t.emitEvent&&(this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!t.onlySelf&&this._parent.updateValueAndValidity(t)}_updateTreeValidity(t={emitEvent:!0}){this._forEachChild(n=>n._updateTreeValidity(t)),this.updateValueAndValidity({onlySelf:!0,emitEvent:t.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?Pi:Fi}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(t){if(this.asyncValidator){this.status=po,this._hasOwnPendingAsyncValidator=!0;const n=qD(this.asyncValidator(this));this._asyncValidationSubscription=n.subscribe(r=>{this._hasOwnPendingAsyncValidator=!1,this.setErrors(r,{emitEvent:t})})}}_cancelExistingSubscription(){this._asyncValidationSubscription&&(this._asyncValidationSubscription.unsubscribe(),this._hasOwnPendingAsyncValidator=!1)}setErrors(t,n={}){this.errors=t,this._updateControlsErrors(!1!==n.emitEvent)}get(t){let n=t;return null==n||(Array.isArray(n)||(n=n.split(".")),0===n.length)?null:n.reduce((r,o)=>r&&r._find(o),this)}getError(t,n){const r=n?this.get(n):this;return r&&r.errors?r.errors[t]:null}hasError(t,n){return!!this.getError(t,n)}get root(){let t=this;for(;t._parent;)t=t._parent;return t}_updateControlsErrors(t){this.status=this._calculateStatus(),t&&this.statusChanges.emit(this.status),this._parent&&this._parent._updateControlsErrors(t)}_initObservables(){this.valueChanges=new Ce,this.statusChanges=new Ce}_calculateStatus(){return this._allControlsDisabled()?Pi:this.errors?Wa:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(po)?po:this._anyControlsHaveStatus(Wa)?Wa:Fi}_anyControlsHaveStatus(t){return this._anyControls(n=>n.status===t)}_anyControlsDirty(){return this._anyControls(t=>t.dirty)}_anyControlsTouched(){return this._anyControls(t=>t.touched)}_updatePristine(t={}){this.pristine=!this._anyControlsDirty(),this._parent&&!t.onlySelf&&this._parent._updatePristine(t)}_updateTouched(t={}){this.touched=this._anyControlsTouched(),this._parent&&!t.onlySelf&&this._parent._updateTouched(t)}_registerOnCollectionChange(t){this._onCollectionChange=t}_setUpdateStrategy(t){Ka(t)&&null!=t.updateOn&&(this._updateOn=t.updateOn)}_parentMarkedDirty(t){return!t&&!(!this._parent||!this._parent.dirty)&&!this._parent._anyControlsDirty()}_find(t){return null}}class af extends cC{constructor(t,n,r){super(of(n),sf(r,n)),this.controls=t,this._initObservables(),this._setUpdateStrategy(n),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}registerControl(t,n){return this.controls[t]?this.controls[t]:(this.controls[t]=n,n.setParent(this),n._registerOnCollectionChange(this._onCollectionChange),n)}addControl(t,n,r={}){this.registerControl(t,n),this.updateValueAndValidity({emitEvent:r.emitEvent}),this._onCollectionChange()}removeControl(t,n={}){this.controls[t]&&this.controls[t]._registerOnCollectionChange(()=>{}),delete this.controls[t],this.updateValueAndValidity({emitEvent:n.emitEvent}),this._onCollectionChange()}setControl(t,n,r={}){this.controls[t]&&this.controls[t]._registerOnCollectionChange(()=>{}),delete this.controls[t],n&&this.registerControl(t,n),this.updateValueAndValidity({emitEvent:r.emitEvent}),this._onCollectionChange()}contains(t){return this.controls.hasOwnProperty(t)&&this.controls[t].enabled}setValue(t,n={}){(function uC(e,t,n){e._forEachChild((r,o)=>{if(void 0===n[o])throw new U(1002,"")})})(this,0,t),Object.keys(t).forEach(r=>{(function lC(e,t,n){const r=e.controls;if(!(t?Object.keys(r):r).length)throw new U(1e3,"");if(!r[n])throw new U(1001,"")})(this,!0,r),this.controls[r].setValue(t[r],{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n)}patchValue(t,n={}){null!=t&&(Object.keys(t).forEach(r=>{const o=this.controls[r];o&&o.patchValue(t[r],{onlySelf:!0,emitEvent:n.emitEvent})}),this.updateValueAndValidity(n))}reset(t={},n={}){this._forEachChild((r,o)=>{r.reset(t[o],{onlySelf:!0,emitEvent:n.emitEvent})}),this._updatePristine(n),this._updateTouched(n),this.updateValueAndValidity(n)}getRawValue(){return this._reduceChildren({},(t,n,r)=>(t[r]=n.getRawValue(),t))}_syncPendingControls(){let t=this._reduceChildren(!1,(n,r)=>!!r._syncPendingControls()||n);return t&&this.updateValueAndValidity({onlySelf:!0}),t}_forEachChild(t){Object.keys(this.controls).forEach(n=>{const r=this.controls[n];r&&t(r,n)})}_setUpControls(){this._forEachChild(t=>{t.setParent(this),t._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(t){for(const[n,r]of Object.entries(this.controls))if(this.contains(n)&&t(r))return!0;return!1}_reduceValue(){return this._reduceChildren({},(n,r,o)=>((r.enabled||this.disabled)&&(n[o]=r.value),n))}_reduceChildren(t,n){let r=t;return this._forEachChild((o,i)=>{r=n(r,o,i)}),r}_allControlsDisabled(){for(const t of Object.keys(this.controls))if(this.controls[t].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(t){return this.controls.hasOwnProperty(t)?this.controls[t]:null}}function Oi(e,t){var n,r;lf(e,t),t.valueAccessor.writeValue(e.value),e.disabled&&(null===(n=(r=t.valueAccessor).setDisabledState)||void 0===n||n.call(r,!0)),function vP(e,t){t.valueAccessor.registerOnChange(n=>{e._pendingValue=n,e._pendingChange=!0,e._pendingDirty=!0,"change"===e.updateOn&&dC(e,t)})}(e,t),function DP(e,t){const n=(r,o)=>{t.valueAccessor.writeValue(r),o&&t.viewToModelUpdate(r)};e.registerOnChange(n),t._registerOnDestroy(()=>{e._unregisterOnChange(n)})}(e,t),function _P(e,t){t.valueAccessor.registerOnTouched(()=>{e._pendingTouched=!0,"blur"===e.updateOn&&e._pendingChange&&dC(e,t),"submit"!==e.updateOn&&e.markAsTouched()})}(e,t),function yP(e,t){if(t.valueAccessor.setDisabledState){const n=r=>{t.valueAccessor.setDisabledState(r)};e.registerOnDisabledChange(n),t._registerOnDestroy(()=>{e._unregisterOnDisabledChange(n)})}}(e,t)}function Ya(e,t){e.forEach(n=>{n.registerOnValidatorChange&&n.registerOnValidatorChange(t)})}function lf(e,t){const n=function XD(e){return e._rawValidators}(e);null!==t.validator?e.setValidators(JD(n,t.validator)):"function"==typeof n&&e.setValidators([n]);const r=function eC(e){return e._rawAsyncValidators}(e);null!==t.asyncValidator?e.setAsyncValidators(JD(r,t.asyncValidator)):"function"==typeof r&&e.setAsyncValidators([r]);const o=()=>e.updateValueAndValidity();Ya(t._rawValidators,o),Ya(t._rawAsyncValidators,o)}function dC(e,t){e._pendingDirty&&e.markAsDirty(),e.setValue(e._pendingValue,{emitModelToViewChange:!1}),t.viewToModelUpdate(e._pendingValue),e._pendingChange=!1}const MP={provide:nt,useExisting:ae(()=>Vi)},ki=(()=>Promise.resolve(null))();let Vi=(()=>{class e extends nt{constructor(n,r){super(),this.submitted=!1,this._directives=new Set,this.ngSubmit=new Ce,this.form=new af({},Yd(n),Jd(r))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(n){ki.then(()=>{const r=this._findContainer(n.path);n.control=r.registerControl(n.name,n.control),Oi(n.control,n),n.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(n)})}getControl(n){return this.form.get(n.path)}removeControl(n){ki.then(()=>{const r=this._findContainer(n.path);r&&r.removeControl(n.name),this._directives.delete(n)})}addFormGroup(n){ki.then(()=>{const r=this._findContainer(n.path),o=new af({});(function fC(e,t){lf(e,t)})(o,n),r.registerControl(n.name,o),o.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(n){ki.then(()=>{const r=this._findContainer(n.path);r&&r.removeControl(n.name)})}getFormGroup(n){return this.form.get(n.path)}updateModel(n,r){ki.then(()=>{this.form.get(n.path).setValue(r)})}setValue(n){this.control.setValue(n)}onSubmit(n){return this.submitted=!0,function pC(e,t){e._syncPendingControls(),t.forEach(n=>{const r=n.control;"submit"===r.updateOn&&r._pendingChange&&(n.viewToModelUpdate(r._pendingValue),r._pendingChange=!1)})}(this.form,this._directives),this.ngSubmit.emit(n),!1}onReset(){this.resetForm()}resetForm(n){this.form.reset(n),this.submitted=!1}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.form._updateOn=this.options.updateOn)}_findContainer(n){return n.pop(),n.length?this.form.get(n):this.form}}return e.\u0275fac=function(n){return new(n||e)(v(qe,10),v(Bn,10))},e.\u0275dir=R({type:e,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(n,r){1&n&&ne("submit",function(i){return r.onSubmit(i)})("reset",function(){return r.onReset()})},inputs:{options:["ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[ue([MP]),ee]}),e})();function gC(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}function mC(e){return"object"==typeof e&&null!==e&&2===Object.keys(e).length&&"value"in e&&"disabled"in e}const yC=class extends cC{constructor(t=null,n,r){super(of(n),sf(r,n)),this.defaultValue=null,this._onChange=[],this._pendingChange=!1,this._applyFormState(t),this._setUpdateStrategy(n),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),Ka(n)&&(n.nonNullable||n.initialValueIsDefault)&&(this.defaultValue=mC(t)?t.value:t)}setValue(t,n={}){this.value=this._pendingValue=t,this._onChange.length&&!1!==n.emitModelToViewChange&&this._onChange.forEach(r=>r(this.value,!1!==n.emitViewToModelChange)),this.updateValueAndValidity(n)}patchValue(t,n={}){this.setValue(t,n)}reset(t=this.defaultValue,n={}){this._applyFormState(t),this.markAsPristine(n),this.markAsUntouched(n),this.setValue(this.value,n),this._pendingChange=!1}_updateValue(){}_anyControls(t){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(t){this._onChange.push(t)}_unregisterOnChange(t){gC(this._onChange,t)}registerOnDisabledChange(t){this._onDisabledChange.push(t)}_unregisterOnDisabledChange(t){gC(this._onDisabledChange,t)}_forEachChild(t){}_syncPendingControls(){return!("submit"!==this.updateOn||(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),!this._pendingChange)||(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),0))}_applyFormState(t){mC(t)?(this.value=this._pendingValue=t.value,t.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=t}},AP={provide:Hn,useExisting:ae(()=>Li)},DC=(()=>Promise.resolve(null))();let Li=(()=>{class e extends Hn{constructor(n,r,o,i,s){super(),this._changeDetectorRef=s,this.control=new yC,this._registered=!1,this.update=new Ce,this._parent=n,this._setValidators(r),this._setAsyncValidators(o),this.valueAccessor=function cf(e,t){if(!t)return null;let n,r,o;return Array.isArray(t),t.forEach(i=>{i.constructor===ho?n=i:function EP(e){return Object.getPrototypeOf(e.constructor)===dr}(i)?r=i:o=i}),o||r||n||null}(0,i)}ngOnChanges(n){if(this._checkForErrors(),!this._registered||"name"in n){if(this._registered&&(this._checkName(),this.formDirective)){const r=n.name.previousValue;this.formDirective.removeControl({name:r,path:this._getPath(r)})}this._setUpControl()}"isDisabled"in n&&this._updateDisabled(n),function uf(e,t){if(!e.hasOwnProperty("model"))return!1;const n=e.model;return!!n.isFirstChange()||!Object.is(t,n.currentValue)}(n,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(n){this.viewModel=n,this.update.emit(n)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&null!=this.options.updateOn&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!(!this.options||!this.options.standalone)}_setUpStandalone(){Oi(this.control,this),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._isStandalone()||this._checkParentType(),this._checkName()}_checkParentType(){}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),this._isStandalone()}_updateValue(n){DC.then(()=>{var r;this.control.setValue(n,{emitViewToModelChange:!1}),null===(r=this._changeDetectorRef)||void 0===r||r.markForCheck()})}_updateDisabled(n){const r=n.isDisabled.currentValue,o=0!==r&&Dn(r);DC.then(()=>{var i;o&&!this.control.disabled?this.control.disable():!o&&this.control.disabled&&this.control.enable(),null===(i=this._changeDetectorRef)||void 0===i||i.markForCheck()})}_getPath(n){return this._parent?function Qa(e,t){return[...t.path,e]}(n,this._parent):[n]}}return e.\u0275fac=function(n){return new(n||e)(v(nt,9),v(qe,10),v(Bn,10),v(an,10),v(oa,8))},e.\u0275dir=R({type:e,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:["disabled","isDisabled"],model:["ngModel","model"],options:["ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],features:[ue([AP]),ee,Ct]}),e})(),df=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275dir=R({type:e,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""]}),e})(),wC=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=lt({}),e})(),fr=(()=>{class e{constructor(){this._validator=$a}ngOnChanges(n){if(this.inputName in n){const r=this.normalizeInput(n[this.inputName].currentValue);this._enabled=this.enabled(r),this._validator=this._enabled?this.createValidator(r):$a,this._onChange&&this._onChange()}}validate(n){return this._validator(n)}registerOnValidatorChange(n){this._onChange=n}enabled(n){return null!=n}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275dir=R({type:e,features:[Ct]}),e})();const qP={provide:qe,useExisting:ae(()=>ji),multi:!0};let ji=(()=>{class e extends fr{constructor(){super(...arguments),this.inputName="required",this.normalizeInput=Dn,this.createValidator=n=>jD}enabled(n){return n}}return e.\u0275fac=function(){let t;return function(r){return(t||(t=Be(e)))(r||e)}}(),e.\u0275dir=R({type:e,selectors:[["","required","","formControlName","",3,"type","checkbox"],["","required","","formControl","",3,"type","checkbox"],["","required","","ngModel","",3,"type","checkbox"]],hostVars:1,hostBindings:function(n,r){2&n&&Yt("required",r._enabled?"":null)},inputs:{required:"required"},features:[ue([qP]),ee]}),e})();const YP={provide:qe,useExisting:ae(()=>Xa),multi:!0};let Xa=(()=>{class e extends fr{constructor(){super(...arguments),this.inputName="pattern",this.normalizeInput=n=>n,this.createValidator=n=>function GD(e){if(!e)return $a;let t,n;return"string"==typeof e?(n="","^"!==e.charAt(0)&&(n+="^"),n+=e,"$"!==e.charAt(e.length-1)&&(n+="$"),t=new RegExp(n)):(n=e.toString(),t=e),r=>{if(jn(r.value))return null;const o=r.value;return t.test(o)?null:{pattern:{requiredPattern:n,actualValue:o}}}}(n)}}return e.\u0275fac=function(){let t;return function(r){return(t||(t=Be(e)))(r||e)}}(),e.\u0275dir=R({type:e,selectors:[["","pattern","","formControlName",""],["","pattern","","formControl",""],["","pattern","","ngModel",""]],hostVars:1,hostBindings:function(n,r){2&n&&Yt("pattern",r._enabled?r.pattern:null)},inputs:{pattern:"pattern"},features:[ue([YP]),ee]}),e})(),JP=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=lt({imports:[wC]}),e})(),XP=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=lt({imports:[JP]}),e})(),jC=(()=>{class e{constructor(){}ngOnInit(){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=zt({type:e,selectors:[["app-spinner"]],decls:12,vars:0,consts:[["width","1.9em","height","1.9em","viewBox","0 0 38 38","xmlns","http://www.w3.org/2000/svg"],["x1","8.042%","y1","0%","x2","65.682%","y2","23.865%","id","a"],["stop-color","#000","stop-opacity","0","offset","0%"],["stop-color","#000","stop-opacity",".631","offset","63.146%"],["stop-color","#000","offset","100%"],["fill","none","fill-rule","evenodd"],["transform","translate(1 1)"],["d","M36 18c0-9.94-8.06-18-18-18","id","Oval-2","stroke","url(#a)","stroke-width","2"],["attributeName","transform","type","rotate","from","0 18 18","to","360 18 18","dur","0.9s","repeatCount","indefinite"],["fill","#fff","cx","36","cy","18","r","1"]],template:function(n,r){1&n&&(Er(),C(0,"svg",0)(1,"defs")(2,"linearGradient",1),Pe(3,"stop",2)(4,"stop",3)(5,"stop",4),M()(),C(6,"g",5)(7,"g",6)(8,"path",7),Pe(9,"animateTransform",8),M(),C(10,"circle",9),Pe(11,"animateTransform",8),M()()()())}}),e})();function nO(e,t){if(1&e){const n=Hs();C(0,"div")(1,"div",1)(2,"div",2),Er(),C(3,"svg",3),ne("click",function(){return Kn(n),Qn(Jt().prev())}),C(4,"g",4),Pe(5,"path",5),M()()(),Eo(),C(6,"div",6),T(7,"DjongoCS Instance"),M(),C(8,"div",2),Er(),C(9,"svg",3),ne("click",function(){return Kn(n),Qn(Jt().next())}),C(10,"g",4),Pe(11,"path",7),M()()()(),Eo(),C(12,"div",8),T(13,"$15"),M(),C(14,"div",9),T(15," PER MONTH "),M(),C(16,"div",10)(17,"ul")(18,"li"),T(19,"The DjongoCS Package."),M(),C(20,"li"),T(21,"DjongoCS Cloud Services."),M(),C(22,"li"),T(23,"Email Support."),M()()()()}}function rO(e,t){if(1&e){const n=Hs();C(0,"div")(1,"div",1)(2,"div",2),Er(),C(3,"svg",3),ne("click",function(){return Kn(n),Qn(Jt().prev())}),C(4,"g",4),Pe(5,"path",5),M()()(),Eo(),C(6,"div",6),T(7,"DjongoCS Support"),M(),C(8,"div",2),Er(),C(9,"svg",3),ne("click",function(){return Kn(n),Qn(Jt().next())}),C(10,"g",4),Pe(11,"path",7),M()()()(),Eo(),C(12,"div",8),T(13,"$149"),M(),C(14,"div",9),T(15," PER HOUR "),M(),C(16,"div",10)(17,"ul")(18,"li"),T(19,"For existing DjongoCS users"),M(),C(20,"li"),T(21,"Issue resolved within the next day."),M(),C(22,"li"),T(23,"Chat support."),M()()()()}}let BC=(()=>{class e{constructor(){this.show={server:!0,support:!1}}ngOnInit(){}prev(){this.show.server=!this.show.server,this.show.support=!this.show.support}next(){this.show.server=!this.show.server,this.show.support=!this.show.support}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=zt({type:e,selectors:[["app-features"]],decls:2,vars:2,consts:[[4,"ngIf"],[1,"l-tire-switcher"],[1,"svg-box"],["width","16","height","20","viewBox","0 0 6.4833 7.9377","xmlns","http://www.w3.org/2000/svg",3,"click"],["transform","translate(-93.567 -111.32)"],["d","m99.77 111.76-5.6634 3.5266 5.6579 3.5106","fill","none","stroke","#c8c8c8","stroke-linejoin","round","stroke-width","1.058"],["itemprop","name",1,"switcher-title"],["d","m93.858 111.76 5.6634 3.5266-5.6579 3.5106","fill","none","stroke","#c8c8c8","stroke-linejoin","round","stroke-width","1.058"],["itemprop","price",1,"tire-price"],["itemprop","eligibleDuration",1,"tire-period"],["itemprop","description"]],template:function(n,r){1&n&&(mt(0,nO,24,0,"div",0),mt(1,rO,24,0,"div",0)),2&n&&(de("ngIf",r.show.server),X(1),de("ngIf",r.show.support))},dependencies:[pi]}),e})();const oO=["cardErrorEl"];function iO(e,t){if(1&e&&(C(0,"div",19)(1,"div",20)(2,"p"),T(3," The Base URL for your endpoints: "),C(4,"em"),T(5),M()(),C(6,"p"),T(7," Your username on VM instance: "),C(8,"em"),T(9),M()()()()),2&e){const n=Jt();X(5),Jo("https://api.djongomapper.com/",n.formData.userName,"/"),X(4),Yo(n.formData.userName)}}function sO(e,t){1&e&&(C(0,"div",21),Pe(1,"app-spinner"),M())}function aO(e,t){1&e&&(C(0,"div",19)(1,"p",22)(2,"strong"),T(3,"Oops!"),M(),T(4," Passwords do not match."),M()())}function lO(e,t){1&e&&(C(0,"div",21),Pe(1,"app-spinner"),M())}function uO(e,t){1&e&&(C(0,"div",19)(1,"div",20)(2,"p"),T(3,"Your instance is being setup. This can take several minutes."),M(),C(4,"div",21),Pe(5,"app-spinner"),M()()())}let cO=(()=>{class e{constructor(n,r){this.backend=n,this.router=r,this.confirmPassword="",this.submitted={intention:!1,payment:!1},this.formData={userName:"",password:"",email:""},this.show={buttonSpinner:!1,userApi:!1,passwordMismatch:!1,waitingPaymentConfirm:!1,waitingBackendConfirm:!1},this.intentionResponse={status:-1,clientSecret:"",stripeCustomerId:""},this.intentionResponseStatus=ja,this.message=this.formData.userName.length>=4}ngOnInit(){this.stripe=Stripe("pk_live_eEfW8XjO4oZUPRFaYASLCWqn");let n=this.stripe.elements();this.card=n.create("card"),this.card.mount("#card-element"),this.card.on("change",r=>{let o=this.cardErrorEl.nativeElement;r.error?(o.hidden=!1,o.textContent=r.error.message):(o.textContent="",o.hidden=!0)})}onSubmit(){this.confirmPassword==this.formData.password?(this.submitted.intention=!0,this.show.buttonSpinner=!0,this.backend.get(ze.createAccount+xi.intention,{userName:this.formData.userName,email:this.formData.email}).subscribe(o=>{this.show.buttonSpinner=!1,this.intentionResponse=o},o=>{})):this.show.passwordMismatch=!0}onBlur(){this.show.passwordMismatch=""!=this.confirmPassword&&""!=this.formData.password&&this.confirmPassword!=this.formData.password}showMessage(){return this.formData.userName.length>=4}onPayment(){this.submitted.payment=!0,this.show.waitingPaymentConfirm=!0,this.stripe.confirmCardPayment(this.intentionResponse.clientSecret,{payment_method:{card:this.card,billing_details:{name:this.formData.email}}}).then(n=>this.onStripeResponse(n))}onStripeResponse(n){n.error?(alert(n.error.message),this.submitted.payment=!1,this.show.waitingPaymentConfirm=!1):this.backend.post(ze.createAccount+xi.payment,{status:fo.OK,userName:this.formData.userName,email:this.formData.email,password:this.formData.password,stripeCustomerId:this.intentionResponse.stripeCustomerId}).subscribe(i=>{i.status===fo.OK?this.router.navigateByUrl(ze.dashboard.slice(0,-1)):alert("Request failed with status: "+fo[i.status])})}}return e.\u0275fac=function(n){return new(n||e)(v(cr),v(Ge))},e.\u0275cmp=zt({type:e,selectors:[["app-create-account"]],viewQuery:function(n,r){if(1&n&&Ay(oO,5),2&n){let o;Zs(o=function Ys(){return function jA(e,t){return e[19].queries[t].queryList}(y(),nh())}())&&(r.cardErrorEl=o.first)}},features:[ue(FD.createAccount)],decls:34,vars:14,consts:[[1,"splash","page__content"],[1,"h1-title"],["class","text-center",4,"ngIf"],[1,"l-tire"],[1,"tire-2-col"],["ngNativeValidate","",1,"form-2-col",3,"ngSubmit"],["formRef","ngForm"],["type","text","name","userName","required","","autocomplete","username","title","Alphanumeric characters: min 4, max 8","pattern","[a-z0-9]{4,8}",3,"ngModel","ngModelChange"],["type","password","name","password","required","","autocomplete","new-password",3,"ngModel","ngModelChange","blur"],["type","password","name","confirmPassword","required","","autocomplete","new-password",3,"ngModel","ngModelChange","blur"],["type","email","name","email","placeholder","name@org.com","required","","autocomplete","email","pattern","\\w+@\\w+\\.\\w+",3,"ngModel","ngModelChange"],["type","submit",1,"btn","btn--primary","btn--large",3,"disabled"],["class","spinner",4,"ngIf"],["id","payment-form",1,"form-2-col",3,"hidden"],["id","card-element",1,"card"],["hidden","","role","alert",1,"card-err"],["cardErrorEl",""],["type","submit",1,"btn","btn--success","btn--large",3,"disabled","click"],[1,"tire-2-col","tire-distinct"],[1,"text-center"],[1,"message","notice--success"],[1,"spinner"],[1,"message","notice--warning"]],template:function(n,r){if(1&n&&(C(0,"div",0)(1,"h1",1),T(2,"Create Endpoint"),M(),mt(3,iO,10,2,"div",2),C(4,"div",3)(5,"div",4)(6,"form",5,6),ne("ngSubmit",function(){return r.onSubmit()}),C(8,"label"),T(9,"Username: "),C(10,"input",7),ne("ngModelChange",function(i){return r.formData.userName=i}),M()(),C(11,"label"),T(12,"Password: "),C(13,"input",8),ne("ngModelChange",function(i){return r.formData.password=i})("blur",function(){return r.onBlur()}),M()(),C(14,"label"),T(15,"Confirm Password: "),C(16,"input",9),ne("ngModelChange",function(i){return r.confirmPassword=i})("blur",function(){return r.onBlur()}),M()(),C(17,"label"),T(18,"Email: "),C(19,"input",10),ne("ngModelChange",function(i){return r.formData.email=i}),M()(),C(20,"button",11),T(21," Create Endpoint "),M(),mt(22,sO,2,0,"div",12),M(),mt(23,aO,5,0,"div",2),C(24,"form",13),Pe(25,"div",14)(26,"div",15,16),C(28,"button",17),ne("click",function(){return r.onPayment()}),T(29,"Confirm Payment "),M(),mt(30,lO,2,0,"div",12),M(),mt(31,uO,6,0,"div",2),M(),C(32,"div",18),Pe(33,"app-features"),M()()()),2&n){const o=Bs(7);X(1),Qo("h1-message",r.showMessage()),X(2),de("ngIf",r.showMessage()),X(7),de("ngModel",r.formData.userName),X(3),de("ngModel",r.formData.password),X(3),de("ngModel",r.confirmPassword),X(3),de("ngModel",r.formData.email),X(1),de("disabled",!o.valid||r.show.passwordMismatch||r.submitted.intention),X(2),de("ngIf",r.show.buttonSpinner),X(1),de("ngIf",r.show.passwordMismatch),X(1),de("hidden",r.intentionResponse.status!==r.intentionResponseStatus.OK),X(4),de("disabled",r.submitted.payment),X(2),de("ngIf",r.submitted.payment&&r.show.waitingPaymentConfirm),X(1),de("ngIf",r.show.waitingBackendConfirm)}},dependencies:[pi,df,ho,za,ef,ji,Xa,Li,Vi,jC,BC],styles:[".h1-message[_ngcontent-%COMP%]{margin:3em auto 0}.card[_ngcontent-%COMP%]{background-color:#fff;padding:10px;margin-bottom:.5em}.card-err[_ngcontent-%COMP%]{margin:.5em 0;padding:1em;color:#3d4144;font-family:-apple-system,BlinkMacSystemFont,Roboto,Segoe UI,Helvetica Neue,Lucida Grande,Arial,sans-serif;font-size:.75em!important;text-indent:initial;background-color:#f7e5cd;border-radius:4px;box-shadow:0 1px 1px #d67f0540}.message-placeholder[_ngcontent-%COMP%]{height:4em}"]}),e})();var el=(()=>(function(e){e[e.OK=0]="OK",e[e.DOES_NOT_EXIST=1]="DOES_NOT_EXIST"}(el||(el={})),el))();function dO(e,t){1&e&&(C(0,"div",13),Pe(1,"app-spinner"),M())}function fO(e,t){1&e&&(C(0,"div",14)(1,"div",15)(2,"p"),T(3,"Username or Password is incorrect."),M(),C(4,"p"),T(5,"Do not have an endpoint yet? "),C(6,"a",16),T(7,"Create an endpoint."),M()()()())}let hO=(()=>{class e{constructor(n,r){this.backend=n,this.router=r,this.submitted=!1,this.show={loginFail:!1,buttonSpinner:!1},this.formData={userName:"",password:""}}onSubmit(){this.submitted=!0,this.show.buttonSpinner=!0,this.backend.postForm(ze.login,this.formData).subscribe(n=>{this.show.buttonSpinner=!1,n.status===el.OK?this.router.navigateByUrl(ze.dashboard.slice(0,-1)):(this.show.loginFail=!0,this.submitted=!1)})}}return e.\u0275fac=function(n){return new(n||e)(v(cr),v(Ge))},e.\u0275cmp=zt({type:e,selectors:[["app-login"]],decls:21,vars:5,consts:[[1,"splash","page__content"],[1,"h1-title"],[1,"l-tire"],[1,"tire-2-col"],[1,"form-2-col",3,"ngSubmit"],["formRef","ngForm"],["type","text","name","userName","required","","autocomplete","username","title","Alphanumeric characters: min 4, max 8","pattern","[a-z0-9]{4,8}",3,"ngModel","ngModelChange"],["type","password","name","password","required","","autocomplete","new-password",3,"ngModel","ngModelChange"],["type","submit",1,"btn","btn--primary","btn--large",3,"disabled"],["class","spinner",4,"ngIf"],["class","text-center",4,"ngIf"],[1,"tire-2-col","tire-distinct"],["type","button","routerLink","/create-account",1,"btn","btn--primary","btn--large","align-left"],[1,"spinner"],[1,"text-center"],[1,"message","notice--warning"],["href","/djongocs/create-account/"]],template:function(n,r){if(1&n&&(C(0,"div",0)(1,"h1",1),T(2,"MongoDB Django Hosting Server"),M(),C(3,"div",2)(4,"div",3)(5,"form",4,5),ne("ngSubmit",function(){return r.onSubmit()}),C(7,"label"),T(8,"Username: "),C(9,"input",6),ne("ngModelChange",function(i){return r.formData.userName=i}),M()(),C(10,"label"),T(11,"Password: "),C(12,"input",7),ne("ngModelChange",function(i){return r.formData.password=i}),M()(),C(13,"button",8),T(14," Login "),M(),mt(15,dO,2,0,"div",9),M(),mt(16,fO,8,0,"div",10),M(),C(17,"div",11),Pe(18,"app-features"),C(19,"button",12),T(20," Create Account "),M()()()()),2&n){const o=Bs(6);X(9),de("ngModel",r.formData.userName),X(3),de("ngModel",r.formData.password),X(1),de("disabled",!o.valid||r.submitted),X(2),de("ngIf",r.show.buttonSpinner),X(1),de("ngIf",r.show.loginFail)}},dependencies:[pi,df,ho,za,ef,ji,Xa,Li,Vi,La,jC,BC]}),e})(),pO=(()=>{class e{constructor(){}ngOnInit(){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=zt({type:e,selectors:[["app-not-found"]],decls:2,vars:0,consts:[[1,"h1-title"]],template:function(n,r){1&n&&(C(0,"h1",0),T(1,"Oops! The page you are looking for does not exist"),M())}}),e})();var go=(()=>(function(e){e[e.OK=0]="OK",e[e.LOGIN_REQUIRED=1]="LOGIN_REQUIRED",e[e.VALUE_ERR=2]="VALUE_ERR"}(go||(go={})),go))();function gO(e,t){if(1&e&&(C(0,"td"),T(1),M()),2&e){const n=Jt(2);X(1),dc("ssh ",n.body.username,"@api.djongomapper.com -p ",n.body.sshPort,"")}}function mO(e,t){1&e&&(C(0,"td"),T(1,""),M())}function yO(e,t){if(1&e){const n=Hs();C(0,"table")(1,"thead")(2,"tr")(3,"th"),T(4,"Property"),M(),C(5,"th"),T(6,"Value"),M()()(),C(7,"tbody")(8,"tr")(9,"td"),T(10,"Username"),M(),C(11,"td"),T(12),M()(),C(13,"tr")(14,"td"),T(15,"Base URL"),M(),C(16,"td"),T(17),M()(),C(18,"tr")(19,"td"),T(20,"Status"),M(),C(21,"td"),T(22),M()(),C(23,"tr")(24,"td"),T(25,"SSH Command"),M(),mt(26,gO,2,2,"td",2),mt(27,mO,2,0,"ng-template",null,3,Ry),M(),C(29,"tr")(30,"td"),T(31,"SSH Public Key"),M(),C(32,"td")(33,"textarea",4),ne("ngModelChange",function(o){return Kn(n),Qn(Jt().body.sshPublicKey=o)}),T(34," "),M(),C(35,"button",5),ne("click",function(){return Kn(n),Qn(Jt().onSubmit())}),T(36,"Update"),M()()()()()}if(2&e){const n=Bs(28),r=Jt();X(12),Yo(r.body.username),X(5),Jo("https://api.djongomapper.com/",r.body.username,""),X(5),Yo(r.body.state),X(4),de("ngIf",r.body.sshPort&&r.body.sshPublicKey)("ngIfElse",n),X(7),de("ngModel",r.body.sshPublicKey),X(2),de("disabled","setup"!=r.body.state)}}let vO=(()=>{class e{constructor(n,r){this.backend=n,this.router=r,this.body={username:"",sshPort:0,sshPublicKey:"",state:""},this.show=!1}ngOnInit(){this.backend.get(ze.dashboard).subscribe(n=>{n.status===go.LOGIN_REQUIRED?this.router.navigateByUrl(ze.login.slice(0,-1)):(this.show=!0,this.body=n.body)},n=>{this.router.navigateByUrl(ze.login.slice(0,-1))})}onSubmit(){this.backend.post(ze.dashboard,{sshPublicKey:this.body.sshPublicKey}).subscribe(n=>{n.status===go.LOGIN_REQUIRED?this.router.navigateByUrl(ze.login.slice(0,-1)):n.status===go.VALUE_ERR&&alert("Oops something went wrong. We are working to fix this. Please contact: support@doableware.com")})}}return e.\u0275fac=function(n){return new(n||e)(v(cr),v(Ge))},e.\u0275cmp=zt({type:e,selectors:[["app-dashboard"]],features:[ue(FD.dashboard)],decls:2,vars:1,consts:[[2,"display","flex"],[4,"ngIf"],[4,"ngIf","ngIfElse"],["elseBlock",""],[3,"ngModel","ngModelChange"],[1,"btn","btn--primary","btn--small",3,"disabled","click"]],template:function(n,r){1&n&&(C(0,"div",0),mt(1,yO,37,7,"table",1),M()),2&n&&(X(1),de("ngIf",r.show))},dependencies:[pi,ho,za,Li],styles:["td[_ngcontent-%COMP%]:first-child, th[_ngcontent-%COMP%]:first-child{padding-left:1em}table[_ngcontent-%COMP%]{margin:3em auto 1em;display:table}"]}),e})();const _O=[{path:ze.createAccount.slice(0,-1),title:"DjongoCS - Create Account",component:cO},{path:ze.dashboard.slice(0,-1),title:"DjongoCS - Dashboard",component:vO},{path:ze.login.slice(0,-1),title:"DjongoCS - Login",component:hO},{path:"**",component:pO}];let DO=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=lt({imports:[yD.forRoot(_O),yD]}),e})(),CO=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e,bootstrap:[U1]}),e.\u0275inj=lt({imports:[UN,XP,DO,nP]}),e})();(function MT(){pv=!1})(),HN().bootstrapModule(CO).catch(e=>console.error(e))}},Un=>{Un(Un.s=169)}]); \ No newline at end of file diff --git a/docs/djongocs/polyfills.e09968753ddaaa7d.js b/docs/djongocs/polyfills.e09968753ddaaa7d.js new file mode 100644 index 00000000..b7040d5f --- /dev/null +++ b/docs/djongocs/polyfills.e09968753ddaaa7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdjongo_FE=self.webpackChunkdjongo_FE||[]).push([[429],{435:(we,ue,he)=>{he(583)},583:()=>{!function(e){const n=e.performance;function i(I){n&&n.mark&&n.mark(I)}function r(I,p){n&&n.measure&&n.measure(I,p)}i("Zone");const c=e.__Zone_symbol_prefix||"__zone_symbol__";function u(I){return c+I}const f=!0===e[u("forceDuplicateZoneCheck")];if(e.Zone){if(f||"function"!=typeof e.Zone.__symbol__)throw new Error("Zone already loaded.");return e.Zone}let _=(()=>{class I{constructor(t,o){this._parent=t,this._name=o?o.name||"unnamed":"",this._properties=o&&o.properties||{},this._zoneDelegate=new T(this,this._parent&&this._parent._zoneDelegate,o)}static assertZonePatched(){if(e.Promise!==J.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let t=I.current;for(;t.parent;)t=t.parent;return t}static get current(){return G.zone}static get currentTask(){return te}static __load_patch(t,o,g=!1){if(J.hasOwnProperty(t)){if(!g&&f)throw Error("Already loaded patch: "+t)}else if(!e["__Zone_disable_"+t]){const P="Zone:"+t;i(P),J[t]=o(e,I,le),r(P,P)}}get parent(){return this._parent}get name(){return this._name}get(t){const o=this.getZoneWith(t);if(o)return o._properties[t]}getZoneWith(t){let o=this;for(;o;){if(o._properties.hasOwnProperty(t))return o;o=o._parent}return null}fork(t){if(!t)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,t)}wrap(t,o){if("function"!=typeof t)throw new Error("Expecting function got: "+t);const g=this._zoneDelegate.intercept(this,t,o),P=this;return function(){return P.runGuarded(g,this,arguments,o)}}run(t,o,g,P){G={parent:G,zone:this};try{return this._zoneDelegate.invoke(this,t,o,g,P)}finally{G=G.parent}}runGuarded(t,o=null,g,P){G={parent:G,zone:this};try{try{return this._zoneDelegate.invoke(this,t,o,g,P)}catch(K){if(this._zoneDelegate.handleError(this,K))throw K}}finally{G=G.parent}}runTask(t,o,g){if(t.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(t.zone||z).name+"; Execution: "+this.name+")");if(t.state===A&&(t.type===R||t.type===M))return;const P=t.state!=X;P&&t._transitionTo(X,O),t.runCount++;const K=te;te=t,G={parent:G,zone:this};try{t.type==M&&t.data&&!t.data.isPeriodic&&(t.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,t,o,g)}catch(l){if(this._zoneDelegate.handleError(this,l))throw l}}finally{t.state!==A&&t.state!==Y&&(t.type==R||t.data&&t.data.isPeriodic?P&&t._transitionTo(O,X):(t.runCount=0,this._updateTaskCount(t,-1),P&&t._transitionTo(A,X,A))),G=G.parent,te=K}}scheduleTask(t){if(t.zone&&t.zone!==this){let g=this;for(;g;){if(g===t.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${t.zone.name}`);g=g.parent}}t._transitionTo(q,A);const o=[];t._zoneDelegates=o,t._zone=this;try{t=this._zoneDelegate.scheduleTask(this,t)}catch(g){throw t._transitionTo(Y,q,A),this._zoneDelegate.handleError(this,g),g}return t._zoneDelegates===o&&this._updateTaskCount(t,1),t.state==q&&t._transitionTo(O,q),t}scheduleMicroTask(t,o,g,P){return this.scheduleTask(new m(v,t,o,g,P,void 0))}scheduleMacroTask(t,o,g,P,K){return this.scheduleTask(new m(M,t,o,g,P,K))}scheduleEventTask(t,o,g,P,K){return this.scheduleTask(new m(R,t,o,g,P,K))}cancelTask(t){if(t.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(t.zone||z).name+"; Execution: "+this.name+")");t._transitionTo(j,O,X);try{this._zoneDelegate.cancelTask(this,t)}catch(o){throw t._transitionTo(Y,j),this._zoneDelegate.handleError(this,o),o}return this._updateTaskCount(t,-1),t._transitionTo(A,j),t.runCount=0,t}_updateTaskCount(t,o){const g=t._zoneDelegates;-1==o&&(t._zoneDelegates=null);for(let P=0;PI.hasTask(t,o),onScheduleTask:(I,p,t,o)=>I.scheduleTask(t,o),onInvokeTask:(I,p,t,o,g,P)=>I.invokeTask(t,o,g,P),onCancelTask:(I,p,t,o)=>I.cancelTask(t,o)};class T{constructor(p,t,o){this._taskCounts={microTask:0,macroTask:0,eventTask:0},this.zone=p,this._parentDelegate=t,this._forkZS=o&&(o&&o.onFork?o:t._forkZS),this._forkDlgt=o&&(o.onFork?t:t._forkDlgt),this._forkCurrZone=o&&(o.onFork?this.zone:t._forkCurrZone),this._interceptZS=o&&(o.onIntercept?o:t._interceptZS),this._interceptDlgt=o&&(o.onIntercept?t:t._interceptDlgt),this._interceptCurrZone=o&&(o.onIntercept?this.zone:t._interceptCurrZone),this._invokeZS=o&&(o.onInvoke?o:t._invokeZS),this._invokeDlgt=o&&(o.onInvoke?t:t._invokeDlgt),this._invokeCurrZone=o&&(o.onInvoke?this.zone:t._invokeCurrZone),this._handleErrorZS=o&&(o.onHandleError?o:t._handleErrorZS),this._handleErrorDlgt=o&&(o.onHandleError?t:t._handleErrorDlgt),this._handleErrorCurrZone=o&&(o.onHandleError?this.zone:t._handleErrorCurrZone),this._scheduleTaskZS=o&&(o.onScheduleTask?o:t._scheduleTaskZS),this._scheduleTaskDlgt=o&&(o.onScheduleTask?t:t._scheduleTaskDlgt),this._scheduleTaskCurrZone=o&&(o.onScheduleTask?this.zone:t._scheduleTaskCurrZone),this._invokeTaskZS=o&&(o.onInvokeTask?o:t._invokeTaskZS),this._invokeTaskDlgt=o&&(o.onInvokeTask?t:t._invokeTaskDlgt),this._invokeTaskCurrZone=o&&(o.onInvokeTask?this.zone:t._invokeTaskCurrZone),this._cancelTaskZS=o&&(o.onCancelTask?o:t._cancelTaskZS),this._cancelTaskDlgt=o&&(o.onCancelTask?t:t._cancelTaskDlgt),this._cancelTaskCurrZone=o&&(o.onCancelTask?this.zone:t._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;const g=o&&o.onHasTask;(g||t&&t._hasTaskZS)&&(this._hasTaskZS=g?o:y,this._hasTaskDlgt=t,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=p,o.onScheduleTask||(this._scheduleTaskZS=y,this._scheduleTaskDlgt=t,this._scheduleTaskCurrZone=this.zone),o.onInvokeTask||(this._invokeTaskZS=y,this._invokeTaskDlgt=t,this._invokeTaskCurrZone=this.zone),o.onCancelTask||(this._cancelTaskZS=y,this._cancelTaskDlgt=t,this._cancelTaskCurrZone=this.zone))}fork(p,t){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,p,t):new _(p,t)}intercept(p,t,o){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,p,t,o):t}invoke(p,t,o,g,P){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,p,t,o,g,P):t.apply(o,g)}handleError(p,t){return!this._handleErrorZS||this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,p,t)}scheduleTask(p,t){let o=t;if(this._scheduleTaskZS)this._hasTaskZS&&o._zoneDelegates.push(this._hasTaskDlgtOwner),o=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,p,t),o||(o=t);else if(t.scheduleFn)t.scheduleFn(t);else{if(t.type!=v)throw new Error("Task is missing scheduleFn.");d(t)}return o}invokeTask(p,t,o,g){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,p,t,o,g):t.callback.apply(o,g)}cancelTask(p,t){let o;if(this._cancelTaskZS)o=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,p,t);else{if(!t.cancelFn)throw Error("Task is not cancelable");o=t.cancelFn(t)}return o}hasTask(p,t){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,p,t)}catch(o){this.handleError(p,o)}}_updateTaskCount(p,t){const o=this._taskCounts,g=o[p],P=o[p]=g+t;if(P<0)throw new Error("More tasks executed then were scheduled.");0!=g&&0!=P||this.hasTask(this.zone,{microTask:o.microTask>0,macroTask:o.macroTask>0,eventTask:o.eventTask>0,change:p})}}class m{constructor(p,t,o,g,P,K){if(this._zone=null,this.runCount=0,this._zoneDelegates=null,this._state="notScheduled",this.type=p,this.source=t,this.data=g,this.scheduleFn=P,this.cancelFn=K,!o)throw new Error("callback is not defined");this.callback=o;const l=this;this.invoke=p===R&&g&&g.useG?m.invokeTask:function(){return m.invokeTask.call(e,l,this,arguments)}}static invokeTask(p,t,o){p||(p=this),re++;try{return p.runCount++,p.zone.runTask(p,t,o)}finally{1==re&&L(),re--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(A,q)}_transitionTo(p,t,o){if(this._state!==t&&this._state!==o)throw new Error(`${this.type} '${this.source}': can not transition to '${p}', expecting state '${t}'${o?" or '"+o+"'":""}, was '${this._state}'.`);this._state=p,p==A&&(this._zoneDelegates=null)}toString(){return this.data&&typeof this.data.handleId<"u"?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}const S=u("setTimeout"),D=u("Promise"),Z=u("then");let E,F=[],V=!1;function d(I){if(0===re&&0===F.length)if(E||e[D]&&(E=e[D].resolve(0)),E){let p=E[Z];p||(p=E.then),p.call(E,L)}else e[S](L,0);I&&F.push(I)}function L(){if(!V){for(V=!0;F.length;){const I=F;F=[];for(let p=0;pG,onUnhandledError:B,microtaskDrainDone:B,scheduleMicroTask:d,showUncaughtError:()=>!_[u("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:B,patchMethod:()=>B,bindArguments:()=>[],patchThen:()=>B,patchMacroTask:()=>B,patchEventPrototype:()=>B,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>B,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>B,wrapWithCurrentZone:()=>B,filterProperties:()=>[],attachOriginToPatched:()=>B,_redefineProperty:()=>B,patchCallbacks:()=>B};let G={parent:null,zone:new _(null,null)},te=null,re=0;function B(){}r("Zone","Zone"),e.Zone=_}(typeof window<"u"&&window||typeof self<"u"&&self||global);const ue=Object.getOwnPropertyDescriptor,he=Object.defineProperty,de=Object.getPrototypeOf,Fe=Object.create,ut=Array.prototype.slice,Se="addEventListener",Oe="removeEventListener",Ze=Zone.__symbol__(Se),Ie=Zone.__symbol__(Oe),se="true",ie="false",ke=Zone.__symbol__("");function Le(e,n){return Zone.current.wrap(e,n)}function Me(e,n,i,r,c){return Zone.current.scheduleMacroTask(e,n,i,r,c)}const x=Zone.__symbol__,Pe=typeof window<"u",pe=Pe?window:void 0,$=Pe&&pe||"object"==typeof self&&self||global,ht=[null];function je(e,n){for(let i=e.length-1;i>=0;i--)"function"==typeof e[i]&&(e[i]=Le(e[i],n+"_"+i));return e}function Be(e){return!e||!1!==e.writable&&!("function"==typeof e.get&&typeof e.set>"u")}const Ue=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,Re=!("nw"in $)&&typeof $.process<"u"&&"[object process]"==={}.toString.call($.process),Ae=!Re&&!Ue&&!(!Pe||!pe.HTMLElement),We=typeof $.process<"u"&&"[object process]"==={}.toString.call($.process)&&!Ue&&!(!Pe||!pe.HTMLElement),Ce={},qe=function(e){if(!(e=e||$.event))return;let n=Ce[e.type];n||(n=Ce[e.type]=x("ON_PROPERTY"+e.type));const i=this||e.target||$,r=i[n];let c;if(Ae&&i===pe&&"error"===e.type){const u=e;c=r&&r.call(this,u.message,u.filename,u.lineno,u.colno,u.error),!0===c&&e.preventDefault()}else c=r&&r.apply(this,arguments),null!=c&&!c&&e.preventDefault();return c};function Xe(e,n,i){let r=ue(e,n);if(!r&&i&&ue(i,n)&&(r={enumerable:!0,configurable:!0}),!r||!r.configurable)return;const c=x("on"+n+"patched");if(e.hasOwnProperty(c)&&e[c])return;delete r.writable,delete r.value;const u=r.get,f=r.set,_=n.substr(2);let y=Ce[_];y||(y=Ce[_]=x("ON_PROPERTY"+_)),r.set=function(T){let m=this;!m&&e===$&&(m=$),m&&(m[y]&&m.removeEventListener(_,qe),f&&f.apply(m,ht),"function"==typeof T?(m[y]=T,m.addEventListener(_,qe,!1)):m[y]=null)},r.get=function(){let T=this;if(!T&&e===$&&(T=$),!T)return null;const m=T[y];if(m)return m;if(u){let S=u&&u.call(this);if(S)return r.set.call(this,S),"function"==typeof T.removeAttribute&&T.removeAttribute(n),S}return null},he(e,n,r),e[c]=!0}function Ye(e,n,i){if(n)for(let r=0;rfunction(f,_){const y=i(f,_);return y.cbIdx>=0&&"function"==typeof _[y.cbIdx]?Me(y.name,_[y.cbIdx],y,c):u.apply(f,_)})}function ae(e,n){e[x("OriginalDelegate")]=n}let $e=!1,He=!1;function mt(){if($e)return He;$e=!0;try{const e=pe.navigator.userAgent;(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/")||-1!==e.indexOf("Edge/"))&&(He=!0)}catch{}return He}Zone.__load_patch("ZoneAwarePromise",(e,n,i)=>{const r=Object.getOwnPropertyDescriptor,c=Object.defineProperty,f=i.symbol,_=[],y=!0===e[f("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")],T=f("Promise"),m=f("then");i.onUnhandledError=l=>{if(i.showUncaughtError()){const s=l&&l.rejection;s?console.error("Unhandled Promise rejection:",s instanceof Error?s.message:s,"; Zone:",l.zone.name,"; Task:",l.task&&l.task.source,"; Value:",s,s instanceof Error?s.stack:void 0):console.error(l)}},i.microtaskDrainDone=()=>{for(;_.length;){const l=_.shift();try{l.zone.runGuarded(()=>{throw l.throwOriginal?l.rejection:l})}catch(s){Z(s)}}};const D=f("unhandledPromiseRejectionHandler");function Z(l){i.onUnhandledError(l);try{const s=n[D];"function"==typeof s&&s.call(this,l)}catch{}}function F(l){return l&&l.then}function V(l){return l}function E(l){return t.reject(l)}const d=f("state"),L=f("value"),z=f("finally"),A=f("parentPromiseValue"),q=f("parentPromiseState"),X=null,j=!0,Y=!1;function M(l,s){return a=>{try{G(l,s,a)}catch(h){G(l,!1,h)}}}const le=f("currentTaskTrace");function G(l,s,a){const h=function(){let l=!1;return function(a){return function(){l||(l=!0,a.apply(null,arguments))}}}();if(l===a)throw new TypeError("Promise resolved with itself");if(l[d]===X){let w=null;try{("object"==typeof a||"function"==typeof a)&&(w=a&&a.then)}catch(C){return h(()=>{G(l,!1,C)})(),l}if(s!==Y&&a instanceof t&&a.hasOwnProperty(d)&&a.hasOwnProperty(L)&&a[d]!==X)re(a),G(l,a[d],a[L]);else if(s!==Y&&"function"==typeof w)try{w.call(a,h(M(l,s)),h(M(l,!1)))}catch(C){h(()=>{G(l,!1,C)})()}else{l[d]=s;const C=l[L];if(l[L]=a,l[z]===z&&s===j&&(l[d]=l[q],l[L]=l[A]),s===Y&&a instanceof Error){const k=n.currentTask&&n.currentTask.data&&n.currentTask.data.__creationTrace__;k&&c(a,le,{configurable:!0,enumerable:!1,writable:!0,value:k})}for(let k=0;k{try{const b=l[L],N=!!a&&z===a[z];N&&(a[A]=b,a[q]=C);const H=s.run(k,void 0,N&&k!==E&&k!==V?[]:[b]);G(a,!0,H)}catch(b){G(a,!1,b)}},a)}const p=function(){};class t{static toString(){return"function ZoneAwarePromise() { [native code] }"}static resolve(s){return G(new this(null),j,s)}static reject(s){return G(new this(null),Y,s)}static race(s){let a,h,w=new this((b,N)=>{a=b,h=N});function C(b){a(b)}function k(b){h(b)}for(let b of s)F(b)||(b=this.resolve(b)),b.then(C,k);return w}static all(s){return t.allWithCallback(s)}static allSettled(s){return(this&&this.prototype instanceof t?this:t).allWithCallback(s,{thenCallback:h=>({status:"fulfilled",value:h}),errorCallback:h=>({status:"rejected",reason:h})})}static allWithCallback(s,a){let h,w,C=new this((H,U)=>{h=H,w=U}),k=2,b=0;const N=[];for(let H of s){F(H)||(H=this.resolve(H));const U=b;try{H.then(Q=>{N[U]=a?a.thenCallback(Q):Q,k--,0===k&&h(N)},Q=>{a?(N[U]=a.errorCallback(Q),k--,0===k&&h(N)):w(Q)})}catch(Q){w(Q)}k++,b++}return k-=2,0===k&&h(N),C}constructor(s){const a=this;if(!(a instanceof t))throw new Error("Must be an instanceof Promise.");a[d]=X,a[L]=[];try{s&&s(M(a,j),M(a,Y))}catch(h){G(a,!1,h)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return t}then(s,a){let h=this.constructor[Symbol.species];(!h||"function"!=typeof h)&&(h=this.constructor||t);const w=new h(p),C=n.current;return this[d]==X?this[L].push(C,w,s,a):B(this,C,w,s,a),w}catch(s){return this.then(null,s)}finally(s){let a=this.constructor[Symbol.species];(!a||"function"!=typeof a)&&(a=t);const h=new a(p);h[z]=z;const w=n.current;return this[d]==X?this[L].push(w,h,s,s):B(this,w,h,s,s),h}}t.resolve=t.resolve,t.reject=t.reject,t.race=t.race,t.all=t.all;const o=e[T]=e.Promise;e.Promise=t;const g=f("thenPatched");function P(l){const s=l.prototype,a=r(s,"then");if(a&&(!1===a.writable||!a.configurable))return;const h=s.then;s[m]=h,l.prototype.then=function(w,C){return new t((b,N)=>{h.call(this,b,N)}).then(w,C)},l[g]=!0}return i.patchThen=P,o&&(P(o),ce(e,"fetch",l=>function K(l){return function(s,a){let h=l.apply(s,a);if(h instanceof t)return h;let w=h.constructor;return w[g]||P(w),h}}(l))),Promise[n.__symbol__("uncaughtPromiseErrors")]=_,t}),Zone.__load_patch("toString",e=>{const n=Function.prototype.toString,i=x("OriginalDelegate"),r=x("Promise"),c=x("Error"),u=function(){if("function"==typeof this){const T=this[i];if(T)return"function"==typeof T?n.call(T):Object.prototype.toString.call(T);if(this===Promise){const m=e[r];if(m)return n.call(m)}if(this===Error){const m=e[c];if(m)return n.call(m)}}return n.call(this)};u[i]=n,Function.prototype.toString=u;const f=Object.prototype.toString;Object.prototype.toString=function(){return"function"==typeof Promise&&this instanceof Promise?"[object Promise]":f.call(this)}});let me=!1;if(typeof window<"u")try{const e=Object.defineProperty({},"passive",{get:function(){me=!0}});window.addEventListener("test",e,e),window.removeEventListener("test",e,e)}catch{me=!1}const Et={useG:!0},ee={},Ke={},Je=new RegExp("^"+ke+"(\\w+)(true|false)$"),xe=x("propagationStopped");function Qe(e,n){const i=(n?n(e):e)+ie,r=(n?n(e):e)+se,c=ke+i,u=ke+r;ee[e]={},ee[e][ie]=c,ee[e][se]=u}function Tt(e,n,i){const r=i&&i.add||Se,c=i&&i.rm||Oe,u=i&&i.listeners||"eventListeners",f=i&&i.rmAll||"removeAllListeners",_=x(r),y="."+r+":",S=function(E,d,L){if(E.isRemoved)return;const z=E.callback;"object"==typeof z&&z.handleEvent&&(E.callback=q=>z.handleEvent(q),E.originalDelegate=z),E.invoke(E,d,[L]);const A=E.options;A&&"object"==typeof A&&A.once&&d[c].call(d,L.type,E.originalDelegate?E.originalDelegate:E.callback,A)},D=function(E){if(!(E=E||e.event))return;const d=this||E.target||e,L=d[ee[E.type][ie]];if(L)if(1===L.length)S(L[0],d,E);else{const z=L.slice();for(let A=0;Afunction(c,u){c[xe]=!0,r&&r.apply(c,u)})}function yt(e,n,i,r,c){const u=Zone.__symbol__(r);if(n[u])return;const f=n[u]=n[r];n[r]=function(_,y,T){return y&&y.prototype&&c.forEach(function(m){const S=`${i}.${r}::`+m,D=y.prototype;if(D.hasOwnProperty(m)){const Z=e.ObjectGetOwnPropertyDescriptor(D,m);Z&&Z.value?(Z.value=e.wrapWithCurrentZone(Z.value,S),e._redefineProperty(y.prototype,m,Z)):D[m]&&(D[m]=e.wrapWithCurrentZone(D[m],S))}else D[m]&&(D[m]=e.wrapWithCurrentZone(D[m],S))}),f.call(n,_,y,T)},e.attachOriginToPatched(n[r],f)}const Ve=["absolutedeviceorientation","afterinput","afterprint","appinstalled","beforeinstallprompt","beforeprint","beforeunload","devicelight","devicemotion","deviceorientation","deviceorientationabsolute","deviceproximity","hashchange","languagechange","message","mozbeforepaint","offline","online","paint","pageshow","pagehide","popstate","rejectionhandled","storage","unhandledrejection","unload","userproximity","vrdisplayconnected","vrdisplaydisconnected","vrdisplaypresentchange"],wt=["encrypted","waitingforkey","msneedkey","mozinterruptbegin","mozinterruptend"],tt=["load"],nt=["blur","error","focus","load","resize","scroll","messageerror"],Dt=["bounce","finish","start"],rt=["loadstart","progress","abort","error","load","progress","timeout","loadend","readystatechange"],Ee=["upgradeneeded","complete","abort","success","error","blocked","versionchange","close"],St=["close","error","open","message"],Ot=["error","message"],Te=["abort","animationcancel","animationend","animationiteration","auxclick","beforeinput","blur","cancel","canplay","canplaythrough","change","compositionstart","compositionupdate","compositionend","cuechange","click","close","contextmenu","curechange","dblclick","drag","dragend","dragenter","dragexit","dragleave","dragover","drop","durationchange","emptied","ended","error","focus","focusin","focusout","gotpointercapture","input","invalid","keydown","keypress","keyup","load","loadstart","loadeddata","loadedmetadata","lostpointercapture","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","mousewheel","orientationchange","pause","play","playing","pointercancel","pointerdown","pointerenter","pointerleave","pointerlockchange","mozpointerlockchange","webkitpointerlockerchange","pointerlockerror","mozpointerlockerror","webkitpointerlockerror","pointermove","pointout","pointerover","pointerup","progress","ratechange","reset","resize","scroll","seeked","seeking","select","selectionchange","selectstart","show","sort","stalled","submit","suspend","timeupdate","volumechange","touchcancel","touchmove","touchstart","touchend","transitioncancel","transitionend","waiting","wheel"].concat(["webglcontextrestored","webglcontextlost","webglcontextcreationerror"],["autocomplete","autocompleteerror"],["toggle"],["afterscriptexecute","beforescriptexecute","DOMContentLoaded","freeze","fullscreenchange","mozfullscreenchange","webkitfullscreenchange","msfullscreenchange","fullscreenerror","mozfullscreenerror","webkitfullscreenerror","msfullscreenerror","readystatechange","visibilitychange","resume"],Ve,["beforecopy","beforecut","beforepaste","copy","cut","paste","dragstart","loadend","animationstart","search","transitionrun","transitionstart","webkitanimationend","webkitanimationiteration","webkitanimationstart","webkittransitionend"],["activate","afterupdate","ariarequest","beforeactivate","beforedeactivate","beforeeditfocus","beforeupdate","cellchange","controlselect","dataavailable","datasetchanged","datasetcomplete","errorupdate","filterchange","layoutcomplete","losecapture","move","moveend","movestart","propertychange","resizeend","resizestart","rowenter","rowexit","rowsdelete","rowsinserted","command","compassneedscalibration","deactivate","help","mscontentzoom","msmanipulationstatechanged","msgesturechange","msgesturedoubletap","msgestureend","msgesturehold","msgesturestart","msgesturetap","msgotpointercapture","msinertiastart","mslostpointercapture","mspointercancel","mspointerdown","mspointerenter","mspointerhover","mspointerleave","mspointermove","mspointerout","mspointerover","mspointerup","pointerout","mssitemodejumplistitemremoved","msthumbnailclick","stop","storagecommit"]);function ot(e,n,i){if(!i||0===i.length)return n;const r=i.filter(u=>u.target===e);if(!r||0===r.length)return n;const c=r[0].ignoreProperties;return n.filter(u=>-1===c.indexOf(u))}function W(e,n,i,r){e&&Ye(e,ot(e,n,i),r)}Zone.__load_patch("util",(e,n,i)=>{i.patchOnProperties=Ye,i.patchMethod=ce,i.bindArguments=je,i.patchMacroTask=_t;const r=n.__symbol__("BLACK_LISTED_EVENTS"),c=n.__symbol__("UNPATCHED_EVENTS");e[c]&&(e[r]=e[c]),e[r]&&(n[r]=n[c]=e[r]),i.patchEventPrototype=gt,i.patchEventTarget=Tt,i.isIEOrEdge=mt,i.ObjectDefineProperty=he,i.ObjectGetOwnPropertyDescriptor=ue,i.ObjectCreate=Fe,i.ArraySlice=ut,i.patchClass=ve,i.wrapWithCurrentZone=Le,i.filterProperties=ot,i.attachOriginToPatched=ae,i._redefineProperty=Object.defineProperty,i.patchCallbacks=yt,i.getGlobalObjects=()=>({globalSources:Ke,zoneSymbolEventNames:ee,eventNames:Te,isBrowser:Ae,isMix:We,isNode:Re,TRUE_STR:se,FALSE_STR:ie,ZONE_SYMBOL_PREFIX:ke,ADD_EVENT_LISTENER_STR:Se,REMOVE_EVENT_LISTENER_STR:Oe})});const Ne=x("zoneTask");function ge(e,n,i,r){let c=null,u=null;i+=r;const f={};function _(T){const m=T.data;return m.args[0]=function(){return T.invoke.apply(this,arguments)},m.handleId=c.apply(e,m.args),T}function y(T){return u.call(e,T.data.handleId)}c=ce(e,n+=r,T=>function(m,S){if("function"==typeof S[0]){const D={isPeriodic:"Interval"===r,delay:"Timeout"===r||"Interval"===r?S[1]||0:void 0,args:S},Z=S[0];S[0]=function(){try{return Z.apply(this,arguments)}finally{D.isPeriodic||("number"==typeof D.handleId?delete f[D.handleId]:D.handleId&&(D.handleId[Ne]=null))}};const F=Me(n,S[0],D,_,y);if(!F)return F;const V=F.data.handleId;return"number"==typeof V?f[V]=F:V&&(V[Ne]=F),V&&V.ref&&V.unref&&"function"==typeof V.ref&&"function"==typeof V.unref&&(F.ref=V.ref.bind(V),F.unref=V.unref.bind(V)),"number"==typeof V||V?V:F}return T.apply(e,S)}),u=ce(e,i,T=>function(m,S){const D=S[0];let Z;"number"==typeof D?Z=f[D]:(Z=D&&D[Ne],Z||(Z=D)),Z&&"string"==typeof Z.type?"notScheduled"!==Z.state&&(Z.cancelFn&&Z.data.isPeriodic||0===Z.runCount)&&("number"==typeof D?delete f[D]:D&&(D[Ne]=null),Z.zone.cancelTask(Z)):T.apply(e,S)})}Zone.__load_patch("legacy",e=>{const n=e[Zone.__symbol__("legacyPatch")];n&&n()}),Zone.__load_patch("queueMicrotask",(e,n,i)=>{i.patchMethod(e,"queueMicrotask",r=>function(c,u){n.current.scheduleMicroTask("queueMicrotask",u[0])})}),Zone.__load_patch("timers",e=>{const n="set",i="clear";ge(e,n,i,"Timeout"),ge(e,n,i,"Interval"),ge(e,n,i,"Immediate")}),Zone.__load_patch("requestAnimationFrame",e=>{ge(e,"request","cancel","AnimationFrame"),ge(e,"mozRequest","mozCancel","AnimationFrame"),ge(e,"webkitRequest","webkitCancel","AnimationFrame")}),Zone.__load_patch("blocking",(e,n)=>{const i=["alert","prompt","confirm"];for(let r=0;rfunction(y,T){return n.current.run(u,e,T,_)})}),Zone.__load_patch("EventTarget",(e,n,i)=>{(function Mt(e,n){n.patchEventPrototype(e,n)})(e,i),function Lt(e,n){if(Zone[n.symbol("patchEventTarget")])return;const{eventNames:i,zoneSymbolEventNames:r,TRUE_STR:c,FALSE_STR:u,ZONE_SYMBOL_PREFIX:f}=n.getGlobalObjects();for(let y=0;y{ve("MutationObserver"),ve("WebKitMutationObserver")}),Zone.__load_patch("IntersectionObserver",(e,n,i)=>{ve("IntersectionObserver")}),Zone.__load_patch("FileReader",(e,n,i)=>{ve("FileReader")}),Zone.__load_patch("on_property",(e,n,i)=>{!function Zt(e,n){if(Re&&!We||Zone[e.symbol("patchEvents")])return;const i=typeof WebSocket<"u",r=n.__Zone_ignore_on_properties;if(Ae){const f=window,_=function pt(){try{const e=pe.navigator.userAgent;if(-1!==e.indexOf("MSIE ")||-1!==e.indexOf("Trident/"))return!0}catch{}return!1}()?[{target:f,ignoreProperties:["error"]}]:[];W(f,Te.concat(["messageerror"]),r&&r.concat(_),de(f)),W(Document.prototype,Te,r),typeof f.SVGElement<"u"&&W(f.SVGElement.prototype,Te,r),W(Element.prototype,Te,r),W(HTMLElement.prototype,Te,r),W(HTMLMediaElement.prototype,wt,r),W(HTMLFrameSetElement.prototype,Ve.concat(nt),r),W(HTMLBodyElement.prototype,Ve.concat(nt),r),W(HTMLFrameElement.prototype,tt,r),W(HTMLIFrameElement.prototype,tt,r);const y=f.HTMLMarqueeElement;y&&W(y.prototype,Dt,r);const T=f.Worker;T&&W(T.prototype,Ot,r)}const c=n.XMLHttpRequest;c&&W(c.prototype,rt,r);const u=n.XMLHttpRequestEventTarget;u&&W(u&&u.prototype,rt,r),typeof IDBIndex<"u"&&(W(IDBIndex.prototype,Ee,r),W(IDBRequest.prototype,Ee,r),W(IDBOpenDBRequest.prototype,Ee,r),W(IDBDatabase.prototype,Ee,r),W(IDBTransaction.prototype,Ee,r),W(IDBCursor.prototype,Ee,r)),i&&W(WebSocket.prototype,St,r)}(i,e)}),Zone.__load_patch("customElements",(e,n,i)=>{!function It(e,n){const{isBrowser:i,isMix:r}=n.getGlobalObjects();(i||r)&&e.customElements&&"customElements"in e&&n.patchCallbacks(n,e.customElements,"customElements","define",["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback"])}(e,i)}),Zone.__load_patch("XHR",(e,n)=>{!function y(T){const m=T.XMLHttpRequest;if(!m)return;const S=m.prototype;let Z=S[Ze],F=S[Ie];if(!Z){const v=T.XMLHttpRequestEventTarget;if(v){const M=v.prototype;Z=M[Ze],F=M[Ie]}}const V="readystatechange",E="scheduled";function d(v){const M=v.data,R=M.target;R[u]=!1,R[_]=!1;const J=R[c];Z||(Z=R[Ze],F=R[Ie]),J&&F.call(R,V,J);const le=R[c]=()=>{if(R.readyState===R.DONE)if(!M.aborted&&R[u]&&v.state===E){const te=R[n.__symbol__("loadfalse")];if(0!==R.status&&te&&te.length>0){const re=v.invoke;v.invoke=function(){const B=R[n.__symbol__("loadfalse")];for(let I=0;Ifunction(v,M){return v[r]=0==M[2],v[f]=M[1],A.apply(v,M)}),O=x("fetchTaskAborting"),X=x("fetchTaskScheduling"),j=ce(S,"send",()=>function(v,M){if(!0===n.current[X]||v[r])return j.apply(v,M);{const R={target:v,url:v[f],isPeriodic:!1,args:M,aborted:!1},J=Me("XMLHttpRequest.send",L,R,d,z);v&&!0===v[_]&&!R.aborted&&J.state===E&&J.invoke()}}),Y=ce(S,"abort",()=>function(v,M){const R=function D(v){return v[i]}(v);if(R&&"string"==typeof R.type){if(null==R.cancelFn||R.data&&R.data.aborted)return;R.zone.cancelTask(R)}else if(!0===n.current[O])return Y.apply(v,M)})}(e);const i=x("xhrTask"),r=x("xhrSync"),c=x("xhrListener"),u=x("xhrScheduled"),f=x("xhrURL"),_=x("xhrErrorBeforeScheduled")}),Zone.__load_patch("geolocation",e=>{e.navigator&&e.navigator.geolocation&&function dt(e,n){const i=e.constructor.name;for(let r=0;r{const y=function(){return _.apply(this,je(arguments,i+"."+c))};return ae(y,_),y})(u)}}}(e.navigator.geolocation,["getCurrentPosition","watchPosition"])}),Zone.__load_patch("PromiseRejectionEvent",(e,n)=>{function i(r){return function(c){et(e,r).forEach(f=>{const _=e.PromiseRejectionEvent;if(_){const y=new _(r,{promise:c.promise,reason:c.rejection});f.invoke(y)}})}}e.PromiseRejectionEvent&&(n[x("unhandledPromiseRejectionHandler")]=i("unhandledrejection"),n[x("rejectionHandledHandler")]=i("rejectionhandled"))})}},we=>{we(we.s=435)}]); \ No newline at end of file diff --git a/docs/djongocs/runtime.671c370191d75fbe.js b/docs/djongocs/runtime.671c370191d75fbe.js new file mode 100644 index 00000000..5fb0e1ea --- /dev/null +++ b/docs/djongocs/runtime.671c370191d75fbe.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,_={},d={};function n(e){var a=d[e];if(void 0!==a)return a.exports;var r=d[e]={exports:{}};return _[e](r,r.exports,n),r.exports}n.m=_,e=[],n.O=(a,r,t,o)=>{if(!r){var c=1/0;for(f=0;f=o)&&Object.keys(n.O).every(i=>n.O[i](r[l]))?r.splice(l--,1):(s=!1,o0&&e[f-1][2]>o;f--)e[f]=e[f-1];e[f]=[r,t,o]},n.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return n.d(a,{a}),a},n.d=(e,a)=>{for(var r in a)n.o(a,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},n.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),(()=>{var e={666:0};n.O.j=t=>0===e[t];var a=(t,o)=>{var l,u,[f,c,s]=o,v=0;if(f.some(h=>0!==e[h])){for(l in c)n.o(c,l)&&(n.m[l]=c[l]);if(s)var b=s(n)}for(t&&t(o);vp,.notice--warning>p{margin:0 0 1em}.spinner{display:inline-block;vertical-align:bottom;margin-left:.5em} diff --git a/docs/docs/documentation/djongo/integrating-django-with-mongodb.md b/docs/docs/documentation/djongo/integrating-django-with-mongodb.md new file mode 100644 index 00000000..c181adce --- /dev/null +++ b/docs/docs/documentation/djongo/integrating-django-with-mongodb.md @@ -0,0 +1,156 @@ +--- +title: Django with MongoDB +permalink: /integrating-django-with-mongodb/ +description: "Djongo is an extension to the Django ORM. Use MongoDB as the backend for your Django project, without changing the Django ORM. +Use Django Admin to directly add and modify documents stored in MongoDB. Use other contrib modules such as Auth +and Sessions without any changes. Start using Django with MongoDB by adding just one line of code" +layout: docs +--- + +Use MongoDB as a backend database for your Django project, without changing the Django ORM. Use Django Admin to add and modify documents in MongoDB. Start using Django with MongoDB by adding just one line of code. + + +## How it works +Djongo makes **zero changes** to the existing Django ORM framework, which means unnecessary bugs and security vulnerabilities do not crop up. It simply translates a SQL query string into a [MongoDB query document](https://docs.mongodb.com/manual/tutorial/query-documents/). As a result, all Django features, models, etc., work as is. + +Django contrib modules: + +```python +'django.contrib.admin', +'django.contrib.auth', +'django.contrib.sessions', +``` +and others... fully supported. + +## What you get +Djongo ensures that you: + + * Reuse Django Models/ORM. + * Work with the original Django variant. + * Future proof your code. + * Atomic SQL JOIN operations. + +Get [expert support][support_page] for complex projects. + +## Rapid Prototyping +Djongo lets you rapidly develop and evolve your app models. Modifying your models is **much faster** with Djongo compared to traditional Django ORM. Since MongoDB is a schema-less database, every time you redefine a model, MongoDB does not expect you to redefine the schema. + +### Goodbye Migrations +With Djongo you **permanently say goodbye** to Django Migrations. To enable migration free model evolution simply set `ENFORCE_SCHEMA: False` in your database configuration. Djongo no longer interprets SQL DDL statements (example CREATE TABLE) to emit pymongo `create_collection` commands. With `ENFORCE_SCHEMA: False` collections are created implicitly, on the fly. + +## Use Django Admin to add documents + +The Django Admin interface can be used to work with MongoDB. Additionally, several MongoDB specific features are supported using [EmbeddedField](/using-django-with-mongodb-data-fields/), [ArrayField](/using-django-with-mongodb-array-field/) and other fields. Let’s say you want to create a blogging platform using Django with MongoDB as your backend. In your Blog `app/models.py` file define the `Blog` model: + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True +``` + +Now ‘embed’ your `Blog` inside a `Entry` using the `EmbeddedField`: + +```python +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + ) + + headline = models.CharField(max_length=255) +``` + +Register your `Entry` in `admin.py`: + +```python +from django.contrib import admin +from .models import Entry + +admin.site.register(Entry) +``` + +That’s it you are set! Fire up Django Admin on localhost:8000/admin/ and this is what you get: + + +![Django Admin](/assets/images/admin.png) + + +### Querying Embedded fields + +In the above example, to query all Entries with Blogs which have names that start with *Beatles*, use the following query: + +```python +entries = Entry.objects.filter(blog__startswith={'name': 'Beatles'}) +``` + +Refer to [Using Django with MongoDB data fields](/using-django-with-mongodb-data-fields/) for more details. + +## Migrating an existing Django app to MongoDB + +When migrating an existing Django app to MongoDB, it is recommended to start a new database on MongoDB. For example, use `myapp-djongo-db` in your `settings.py` file. + +1. Into `settings.py` file of your project, add: + + ```python + DATABASES = { + 'default': { + 'ENGINE': 'djongo', + 'NAME': 'myapp-djongo-db', + } + } + ``` + +2. Run `manage.py makemigrations ` followed by `manage.py migrate`. +3. Open Django Admin and you should find all Models defined in your app, showing up in the Admin. +4. While the relevant collections have been created in MongoDB, they have no data inside. +5. Continue by inserting data into the collections manually, or use Django Admin for a GUI. + +## Setting up an existing MongoDB database on Django + +### The internal `__schema__` collection + +There is no concept of an AUTOINCREMENT field in MongoDB. Therefore, Djongo internally creates a `__schema__` collection to track such fields. The `__schema__` collection looks like: + +```python +{ + "_id" : ObjectId("5a5c3c87becdd9fe2fb255a9"), + "name" : "django_migrations", + "auto" : { + "field_names" : [ + "id" + ], + "seq" : NumberInt(14) + } +} +``` +For every collection in the DB that has an autoincrement field, there is a corresponding entry in the `__schema__` collection. Running `manage.py migrate` automatically creates these entries. + +Now there are 2 approaches to setting up your existing data onto MongoDB: + +### Zero risk + +1. Start with a new database name in `settings.py`. +2. If you have not already done so, define your models in the `models.py` file. The model names and model fields have to be exactly the same, as the existing data that you want to setup. +3. Run `manage.py makemigrations ` followed by `manage.py migrate`. +4. Now your empty DB should have a `__schema__` collection, and other collections defined in the `model.py` file. +5. Copy collection data (of your custom models defined in `model.py`) to the new DB. +6. In `__schema__` collection make sure that the `seq` number of your AUTOINCREMENT fields is **set to the latest value**. This should correspond to the document count for each model. For example, if your model has 16 entries (16 documents in the DB), then `seq` should be set as 16. Usually the AUTOINCREMENT field is called `id`. + +However, if you do not want to create a new database (and copy existing data into this new database), you can try this approach: + +### Medium risk + +1. Start with an empty database. You can always delete this later. +2. Same as before. +3. Same as before. +4. Now copy the `__schema__` collection from the new database (from step1) to the existing database. +5. Same as step 6 from before. +6. You can now delete the database created in step 1. + +*You are now done setting up Django with MongoDB. Start using Django with MongoDB, like you would with any other database backend.* + +{% include links %} diff --git a/docs/docs/documentation/djongo/mongodb-field-reference.md b/docs/docs/documentation/djongo/mongodb-field-reference.md new file mode 100644 index 00000000..068c416a --- /dev/null +++ b/docs/docs/documentation/djongo/mongodb-field-reference.md @@ -0,0 +1,32 @@ +--- +title: MongoDB Field Reference +permalink: /mongodb-field-reference/ +layout: docs +--- + +## ObjectIdField + +```python +class ObjectIdField(Field): + def __init__(self, *args, **kwargs): +``` + +### Arguments + +Same as the `Field` Base class + +## ListField + +> Note: To be depreciated soon and replaced with a `JSONField` + +```python +class ListField(Field): + def __init__(self, *args, **kwargs): +``` + +### Arguments + +Same as the `Field` Base class + + + diff --git a/docs/docs/documentation/djongo/using-django-with-mongodb-array-field.md b/docs/docs/documentation/djongo/using-django-with-mongodb-array-field.md new file mode 100644 index 00000000..a27b77e9 --- /dev/null +++ b/docs/docs/documentation/djongo/using-django-with-mongodb-array-field.md @@ -0,0 +1,209 @@ +--- +title: Using Djongo Array Model Field +permalink: /using-django-with-mongodb-array-field/ +layout: docs +--- + +## ArrayField + +With Djongo there can be an [array](https://docs.mongodb.com/manual/core/document/#arrays) of embedded documents inside the parent document. You can create an **embed array/list of models inside the parent model** and store it directly into MongoDB. + +```python +class ArrayField(MongoField): + def __init__(self, + model_container: typing.Type[Model], + model_form_class: typing.Type[forms.ModelForm] = None, + model_form_kwargs: dict = None, + *args, **kwargs): +``` + +### Arguments + +Argument | Type | Description +---------|------|------------- +`model_container` | `models.Model` | The child model class type (not the instance) that this array field will contain. +`model_form_class` | `models.forms.ModelForm` | The child model form class type of the array model. All child models inside the array must be of the same type. Mixing different types of child models inside the embedded array is not supported. +`model_form_kwargs` | `dict()` | The kwargs (if any) that must be passed to the `forms.ModelForm` while instantiating it. + +### Example + +```python +from djongo import models +from django import forms + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class BlogForm(forms.ModelForm): + class Meta: + model = Blog + fields = ( + 'name', 'tagline' + ) + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + class Meta: + abstract = True + +class AuthorForm(forms.ModelForm): + class Meta: + model = Author + fields = ( + 'name', 'email' + ) + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + model_form_class=BlogForm + ) + + headline = models.CharField(max_length=255) + authors = models.ArrayField( + model_container=Author, + model_form_class=AuthorForm + ) + + objects = models.DjongoManager() +``` +### Creating Array fields + +A Model with an Array field can be created as follows: + +```python +entry = Entry() +entry.authors = [{'name': 'John', 'email': 'john@mail.com'}, + {'name': 'Paul', 'email': 'paul@mail.com'}] +entry.save() +``` + +### Querying Array fields + +Djongo uses a mixture of Django query syntax and MongoDB query syntax. Consider a query to retrieve all entries made by the author *Paul*. Using `ManyToManyField` this requires 2 SQL queries. First selects the `id` for author Paul from the `author` table. Next, a JOIN with `entry_authors` and `entry` gives the corresponding entries. + +With `ArrayField` the query reduces to a single simple query: + +```python +entries = Entry.objects.filter(authors={'name': 'Paul'}) +``` + +Djongo lets you get even more specific with your queries. To query all entries where the *third author is Paul*: + +```python +entries = Entry.objects.filter(authors={'2.name': 'Paul'}) +``` +Note: In MongoDB the first element in the array starts at index 0. + +## Using ArrayField in Django Admin + +The official [Django documentation](https://docs.djangoproject.com/en/2.0/topics/db/queries/) exemplifies 3 models that interact with each other: **Blog, Author and Entry**. This tutorial considers the same 3 models. The `blog`; `ForeignKey` of the `Entry` model was optimized in the [other tutorial](/using-django-with-mongodb-data-fields/), here we optimize the `authors`; `ManyToManyField`. + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + def __str__(self): + return self.name + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.ForeignKey(Blog, on_delete=models.CASCADE) + headline = models.CharField(max_length=255) + body_text = models.TextField() + pub_date = models.DateField() + mod_date = models.DateField() + authors = models.ManyToManyField(Author) + n_comments = models.IntegerField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + + def __str__(self): + return self.headline +``` + + A `ManyToManyField` defines a relation wherein *an entry is made by several authors*. It also defines a relation wherein *an author could have made several entries*. Django handles this internally by **creating another table**, the `entry_authors` table which contains different mappings between `entry_id` and `author_id`. + +Fetching an entry will require 2 SQL queries. The second query will be an expensive JOIN query across `entry_authors` and `authors`. The Model described above will work perfectly well on MongoDB as well, when you use Djongo as the connector. MongoDB however offers much more powerful ways to make such queries. These queries come at the cost of higher disk space utilization. + +As a designer using Djongo, you have the freedom to continue with the above schema. Alternatively, you can define a schema having a trade off on disk space for higher performance. + +Let us redefine the `authors` in the `Entry` models using the `ArrayField`: + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class MetaData(models.Model): + pub_date = models.DateField() + mod_date = models.DateField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + + class Meta: + abstract = True + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + class Meta: + abstract = True + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + ) + meta_data = models.EmbeddedField( + model_container=MetaData, + ) + + headline = models.CharField(max_length=255) + body_text = models.TextField() + + authors = models.ArrayField( + model_container=Author, + ) + n_comments = models.IntegerField() + + def __str__(self): + return self.headline + +``` + +**Notice** how the `ManyToManyField` is now replaced by the `ArrayField`. To display the Array field in Django Admin, a `Form` for the field must be present. Since the array is made up of abstract `Author` models, the form can be easily created by using a `ModelForm`. If you do not specify a `ModelForm` for your array models in the `model_form_class` argument, Djongo will automatically generate a `ModelForm` for you. + +![Array-model-field](/assets/images/array-model-field.png) + +> Django Admin reveals multiple neatly nested `Name` and `Email` fields under a single Author label. + +Retrieving an entry from the database will result in **no JOINS and only a single database lookup. It is super fast** + + + + + diff --git a/docs/docs/documentation/djongo/using-django-with-mongodb-array-reference-field.md b/docs/docs/documentation/djongo/using-django-with-mongodb-array-reference-field.md new file mode 100644 index 00000000..8b1fa534 --- /dev/null +++ b/docs/docs/documentation/djongo/using-django-with-mongodb-array-reference-field.md @@ -0,0 +1,60 @@ +--- +title: Using Djongo Array Reference Field +permalink: /using-django-with-mongodb-array-reference-field/ +layout: docs +--- + +## Array Reference field + +The `ArrayField` stores embedded models within a MongoDB array as embedded documents for each entry. However, if entries contain duplicate embedded documents, using the `ArrayField` would result in unnecessary duplication and increased disk space usage. On the other hand, the Django `ManyToManyField` only refers to a different table of entries. In addition however, it creates an intermediate "through/join" table which records all the mappings. + +The `ArrayReferenceField` is one of the most powerful features of Djongo. The `ArrayReferenceField` is a bargain between the `ArrayField` and `ManyToManyField`. Similar to the `ManyToManyField` a separate collection is used for storing duplicate entries (instead of embedding them as an array). This means there is no data duplication. However, the intermediate "through/join" mapping table is completely skipped! This is achieved by storing only a reference to the entries in the embedded array. + +While the `ManyToManyField` required two queries to fetch data, the `ArrayReferenceField` requires just one query and is much faster. If you have used the `ManyToManyField`, then you know how to use the `ArrayReferenceField`. In fact, **it implements the exact same API** as the `ManyToManyField`. You can replace all existing `ManyToManyField` with `ArrayReferenceField` and everything will continue to work as is. + +In the example the `Entry` Model can be rewritten as follows: + +```python +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + model_form_class=BlogForm + ) + meta_data = models.EmbeddedField( + model_container=MetaData, + model_form_class=MetaDataForm + ) + + headline = models.CharField(max_length=255) + body_text = models.TextField() + + authors = models.ArrayReferenceField( + to=Author, + on_delete=models.CASCADE, + ) + n_comments = models.IntegerField() + + def __str__(self): + return self.headline + +``` +**Notice** how the `Author` model is no longer set as `abstract`. This means a separate `author` collection will be created in the DB. Simply set the `authors` to a list containing several author instances. When the entry gets saved, only a reference to the primary_key of the author model is saved in the array. Upon retrieving an entry from the DB the corresponding authors are automatically looked up and the author list is populated. + + The `ArrayReferenceField` behaves exactly like the `ManyToManyField`. However, underneath only references to the entries are being stored in the array. + +## ArrayReferenceField + +```python +class ArrayReferenceField(ForeignKey): + def __init__(self, *args, **kwargs): +``` +### Arguments + +Same as the `ForeignKey` Base class \ No newline at end of file diff --git a/docs/docs/documentation/djongo/using-django-with-mongodb-data-fields.md b/docs/docs/documentation/djongo/using-django-with-mongodb-data-fields.md new file mode 100644 index 00000000..e682f109 --- /dev/null +++ b/docs/docs/documentation/djongo/using-django-with-mongodb-data-fields.md @@ -0,0 +1,410 @@ +--- +title: Using Djongo Model fields +permalink: /using-django-with-mongodb-data-fields/ +layout: docs +--- + +## EmbeddedField + +MongoDB allows the creation of an [embedded document](https://docs.mongodb.com/manual/core/data-model-design/#data-modeling-embedding). By using Djongo as your connector, you can embed any other 'model' into your parent model through the `EmbeddedField`. + +```python +class EmbeddedField(MongoField): + def __init__(self, + model_container: typing.Type[Model], + model_form_class: typing.Type[forms.ModelForm] = None, + model_form_kwargs: dict = None, + *args, **kwargs): +``` + +### Arguments + +Argument | Type | Description +---------|------|------------- +`model_container`| `models.Model` | The child model class type (not instance) that this embedded field will contain. +`model_form_class` | `models.forms.ModelForm` | The child model form class type of the embedded model. +`model_form_kwargs` | `dict()` | The kwargs (if any) that must be passed to the `forms.ModelForm` while instantiating it. + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class Entry(models.Model): + _id = models.ObjectIdField() + blog = models.EmbeddedField( + model_container=Blog + ) + + headline = models.CharField(max_length=255) + objects = models.DjongoManager() + +e = Entry.objects.create( + headline='h1', + blog={ + 'name': 'b1', + 'tagline': 't1' + }) + +g = Entry.objects.get(headline='h1') +assert e == g + +e = Entry() +e.blog = { + 'name': 'b2', + 'tagline': 't2' +} +e.headline = 'h2' +e.save() + +``` + +## Field data integrity checks + +Djongo automatically validates the value assigned to an EmbeddedField. Integrity criteria (`null=True` or `blank=False`) can be applied on the `ÈmbeddedField` or to the internal fields (`CharField`) + +```python +class Entry(models.Model): + _id = models.ObjectIdField() + blog = models.EmbeddedField( + model_container=Blog, + null=True + ) + + headline = models.CharField(max_length=255) + objects = models.DjongoManager() + +e = Entry(headline='h1', blog=None) +e.clean_fields() + +>>> +# No validation error +``` + +```python +class Entry(models.Model): + _id = models.ObjectIdField() + blog = models.EmbeddedField( + model_container=Blog, + null=False + ) + + headline = models.CharField(max_length=255) + objects = models.DjongoManager() + +e = Entry(headline='h1', blog=None) +e.clean_fields() + +>>> + ValidationError({'blog': ['This field cannot be null.']}) +``` + +## Nesting Embedded Fields + +An `EmbeddedField` or `ArrayField` can be nested inside an `EmbeddedField`. There is no limitation on the depth of nesting. + +```python +from djongo import models + +class Tagline(models.Model) + title = models.CharField(max_length=100) + subtitle = models.CharField(max_length=100) + + class Meta: + abstract = True + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.EmbeddedField(model_container=Tagline) + + class Meta: + abstract = True + +class Entry(models.Model): + _id = models.ObjectIdField() + blog = models.EmbeddedField( + model_container=Blog + ) + + headline = models.CharField(max_length=255) + objects = models.DjongoManager() + +e = Entry.objects.create( + headline='h1', + blog={ + 'name': 'b1', + 'tagline': { + 'title': 'Tagline Title' + 'subtitle': 'Tagline Subtitle' + } + }) + +g = Entry.objects.get(headline='h1') +assert e == g + +``` + + +## Embedded Form + +While creating a Form for [the ModelForm](https://docs.djangoproject.com/en/dev/topics/forms/modelforms/), the embedded forms **are automatically generated**. Multiple embedded forms get automatically generated when the Model contains an array of embedded models. However, you can still override this by specifying the `model_form_class` argument in the `EmbeddedField`. + + +```python +from djongo import models +from django import forms + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class BlogForm(forms.ModelForm): + class Meta: + model = Blog + fields = ( + 'name', 'tagline' + ) + + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + model_form_class=BlogForm + ) + + headline = models.CharField(max_length=255) + objects = models.DjongoManager() +``` + +## Querying Embedded fields + +To query all BlogPost with content made by authors whose name startswith *Beatles* use the following query: + +```python +entries = Entry.objects.filter(blog__startswith={'name': 'Beatles'}) +``` + +Internally Djongo converts this query (for BlogPost collection) to the form: + +```python +filter = { + 'blog.name': { + '$regex': '^Beatles.*$' + } +} +``` +For querying nested embedded fields provide the appropriate dictionary value + +```python +entries = Entry.objects.filter(blog__startswith={'tagline': {'subtitle': 'Artist'}) +``` +Internally Djongo converts this query (for BlogPost collection) to the form: + +```python +filter = { + 'blog.tagline.subtitle': { + '$regex': '^Artist.*$' + } +} +``` + +## Using EmbeddedField in Django Admin + +Django Admin is a powerful tool for managing data used in an app. When the models use Djongo relational fields, NoSQL "embedded models" can be created directly from Django Admin. **These fields provide better performance when compared with traditional Django relational fields.** + +Django admin can use models to automatically build a site area that can be used to create, view, update, and delete records. This can save a lot of time during development, making it very easy to test the models and get a feel for the right data. Django Admin is already quite well known, but to demonstrate how to use it with Djongo, here is a simple example. + +First define our basic models. In these tutorials, the same example used in the official [Django documentation](https://docs.djangoproject.com/en/2.0/topics/db/queries/) is used. The documentation talks about 3 models that interact with each other: **Blog, Author and Entry**. To make the example clearer, few fields from the original models are omitted. + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + def __str__(self): + return self.name + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.ForeignKey(Blog, on_delete=models.CASCADE) + headline = models.CharField(max_length=255) + body_text = models.TextField() + pub_date = models.DateField() + mod_date = models.DateField() + authors = models.ManyToManyField(Author) + n_comments = models.IntegerField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + + def __str__(self): + return self.headline +``` + +Start with the admin development by *registering* a model. Register the models defined above in the `admin.py` file. + +```python +from django.contrib import admin +from .models import Blog, Author, Entry + +admin.site.register([Blog, Author, Entry]) +``` + +## Data Model + +The `Entry` model defined in the documentation consists of 3 parts: +* 1-to-Many Relationship: A `Blog` is made up of multiple `Entry`s’ and each `Entry` is associated with just *one* `Blog`. The same entry cannot appear in two `Blog`s’ and this defines the 1-to-Many relationship. +* Many-to-Many Relationship: An `Entry` can have *multiple* `Author`s’ and an `Author` can make multiple `Entry`s’. This defines the many-to-many relationship for our data model. +* Normal data columns. + +**An interesting point of note** is that the `Blog` model consists of just 2 fields. Most of the data is stored in the `Entry` model. + +So what happens when a user enters a blog? The user wants to view the ‘Beatles blog’. In the project you could probably do: + +```python +blog = Blog.objects.get(name='Beatles Blog') +``` + +Next, to retrieve all entries related to the Beatles blog, follow it up with: + +```python +entries = Entry.objects.filter(blog_id=blog.id) +``` + +While it is fine to obtain entries in this fashion, you end up **making 2 trips** to the database. For SQL based backend this is not the most efficient way. The number of trips can be reduced to one. Django makes the query more efficient: + +```python +entries = Entry.objects.filter(blog__name='Beatles Blog') +``` + +This query will hit the database just once. All entries associated with a `Blog` having the name ‘Beatles Blog’ will be retrieved. However, this query generates a SQL JOIN. **JOINs are much slower when compared to single table lookups**. + +Since a `Blog` model shares a 1-to-many relationship with `Entry` the `Entry` model can be written as: + +```python +class Entry(models.Model): + blog_name = models.CharField(max_length=100) + blog_tagline = models.TextField() + headline = models.CharField(max_length=255) + body_text = models.TextField() + pub_date = models.DateField() + mod_date = models.DateField() + authors = models.ManyToManyField(Author) + n_comments = models.IntegerField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + + def __str__(self): + return self.headline +``` + +The `Blog` fields have been inserted into the `Entry` model. With this new data model the query changes to: + +```python +entries = Entry.objects.filter(blog_name='Beatles Blog') +``` + +There are no JOINs generated with this and queries will be much faster. There is data duplication, but only if the backend database does not use data compression. + +Using compression to mitigate data duplication is fine but take a look at the Entry model, it has 10 columns and is getting unmanageable. + +## The Embedded Data Model + +A `Blog` contains a `name` and a `tagline`. An `Entry` contains details of the `Blog`, the `Authors`, `body_text` and some `Meta` data. To make the `Entry` model manageable it can be redefined with an `EmbeddedField`. + +Embedded data models should be used when it does not make sense to store a data set as another table in the database and refer to it every time with a foreign key lookup. However, you still want to group the data set in a hierarchical fashion, to isolate its functionality. + +In case you don't plan on using your embedded model as a standalone model (which means it will always be embedded inside a parent model) you should add the `class Meta` and `abstract = True` This way Djongo will never register this model as an [actual model](https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes). + +It is a good practice to **define embedded models as abstract models** and this is **strongly recommended**. + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class MetaData(models.Model): + pub_date = models.DateField() + mod_date = models.DateField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + + class Meta: + abstract = True + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + ) + meta_data = models.EmbeddedField( + model_container=MetaData, + ) + + headline = models.CharField(max_length=255) + body_text = models.TextField() + authors = models.ManyToManyField(Author) + n_comments = models.IntegerField() + + def __str__(self): + return self.headline +``` + +To display the embedded models in Django Admin, a `Form` for the embedded fields is required. Since the embedded field is an abstract model, the form is easily created by using a `ModelForm`. The `BlogForm` defines `Blog` as the model with `name` and `tagline` as the form fields. + +If you do not specify a `ModelForm` for your embedded models, and pass it using the `model_form_class` argument, Djongo will automatically generate a `ModelForm` for you. + +Register the new models in `admin.py`. + +```python +from django.contrib import admin +from .embedded_models import Author, Entry + +admin.site.register([Author, Entry]) +``` + +The number of fields in the `Entry` model is reduce to 6. Fire up Django Admin to check what is up! + +![Django Admin](/assets/images/embedded-admin.png) + +Only the `Entry` and `Author` model are registered. I click on *Entrys Add* and get: + +![Django Admin](/assets/images/embedded-nested.png) + + +> The `Name` and `Tagline` fields are neatly nested within Blog. `Pub date` `Mod date` `N pingbanks` and `Rating` are neatly nested within Meta data. + +When a user queries for a blog named ‘Beatles Blog’, the query for filtering an embedded model changes to: + +```python +entries = Entry.objects.filter(blog={'name': 'Beatles Blog'}) +``` + +This query will return all entries having an embedded blog with the name ‘Beatles Blog’. **The query will hit the database just once and there are no JOINs involved.** + diff --git a/docs/docs/documentation/djongo/using-django-with-mongodb-gridfs.md b/docs/docs/documentation/djongo/using-django-with-mongodb-gridfs.md new file mode 100644 index 00000000..2d6503f6 --- /dev/null +++ b/docs/docs/documentation/djongo/using-django-with-mongodb-gridfs.md @@ -0,0 +1,98 @@ +--- +title: Using GridFSStorage +permalink: /using-django-with-mongodb-gridfs/ +layout: docs +--- + +[GridFS](https://docs.mongodb.com/manual/core/gridfs/) is a specification for storing and retrieving files that exceed the [BSON-document](https://docs.mongodb.com/manual/reference/glossary/#term-bson) [size limit](https://docs.mongodb.com/manual/reference/limits/#limit-bson-document-size) of 16 MB. + +GridFSStorage backend for Djongo aims to add a GridFS storage to upload files to using Django's file fields. + +We first define our basic models. In the tutorials, we use the example used in the official [Django documentation](https://docs.djangoproject.com/en/2.0/topics/db/queries/). The documentation talks about 3 models that interact with each other: **Blog, Author and Entry**. To make the example clearer, few fields from the original models are omitted. + +```python +## models.py +from djongo import models + + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + def __str__(self): + return self.name + +class Author(models.Model): + name = models.CharField(max_length=200) + email = models.EmailField() + avatar = models.ImageField(upload_to='authors') + + def __str__(self): + return self.name + +class Entry(models.Model): + blog = models.ForeignKey(Blog, on_delete=models.CASCADE) + headline = models.CharField(max_length=255) + body_text = models.TextField() + pub_date = models.DateField() + mod_date = models.DateField() + authors = models.ManyToManyField(Author) + n_comments = models.IntegerField() + n_pingbacks = models.IntegerField() + rating = models.IntegerField() + featured_image = models.ImageField(upload_to='entries') + + def __str__(self): + return self.headline +``` + +### GridFS Storage + +The `Author` and `Entry` models define a field type `ImageField`. Until now, when you upload files, those files will be uploaded to `MEDIA_ROOT/authors` and `MEDIA_ROOT/entries` directories. + +So, what happens if you want to save those files into database? That is when appears GridFS to the rescue!. + +In your `models.py` file you could probably do: + +```python +## models.py +from django.conf import settings + +# Add the import for GridFSStorage +from djongo.storage import GridFSStorage + + +# Define your GrifFSStorage instance +grid_fs_storage = GridFSStorage(collection='myfiles', base_url=''.join([settings.BASE_URL, 'myfiles/'])) +``` + +In `Author` change `avatar` field definition for this: + +```python +avatar = models.ImageField(upload_to='authors', storage=grid_fs_storage) +``` + +In `Entry` change `avatar` field definition for this: + +```python +featured_image = models.ImageField(upload_to='entries', storage=grid_fs_storage) +``` + +And, that's all, when you upload `avatar` for `Author` it will be saved in collection `myfiles.authors.files` or when you upload `featured_image` for `Entry` it will be saved in collection `myfiles.entries.files` + + +### Retriving values + +Suppose that you have saved some documents in your collection related to Author model, so if you want to retrieve one of them, you could probably do: + +``` +# in a python console +>>> author = Author.object.get(id=1) +>>> print(author) +{ 'id': 1, 'name': 'Lisa Stoner', 'email': 'lisa.stoner@nomail.local', 'avatar': 'http://mysite.local/myfiles/5dc880e06a8e6a7effa592a7'} +``` + +As you can see, the value that is retrieved in `avatar` field is the `_id` related to the saved image|file. In this case you get a url because you probably have in your settings file the following: +```python +UPLOADED_FILES_USE_URL = True +``` \ No newline at end of file diff --git a/docs/docs/documentation/djongo/using-django-with-other-fields.md b/docs/docs/documentation/djongo/using-django-with-other-fields.md new file mode 100644 index 00000000..01cf7416 --- /dev/null +++ b/docs/docs/documentation/djongo/using-django-with-other-fields.md @@ -0,0 +1,49 @@ +--- +title: Other fields +permalink: /using-django-with-other-fields/ +layout: docs +--- + +## The ObjectId Field + +For every document inserted into a collection MongoDB internally creates an [ObjectID](https://docs.mongodb.com/manual/reference/method/ObjectId/) field with the name `_id`. Reference this field from within the Model: + +```python +class Entry(models.Model): + _id = models.ObjectIdField() + blog = models.EmbeddedField( + model_container=Blog, + ) +``` + +By default the `ObjectIdField` internally sets `primary_key` as `True`. This means the implicitly created `id` AUTOINCREMENT field will not be created. The Field inherits from the `AutoField`. An ObjectID will be automatically generated by MongoDB for every document inserted. + +Consider using the `ObjectIdField` in your models if you want to avoid calling Django migrations every time you create a new model. + +## ObjectIdField + +```python +class ObjectIdField(Field): + def __init__(self, *args, **kwargs): +``` + +### Arguments + +Same as the `Field` Base class + +## The List field + +> Note: To be depreciated soon and replaced with a `JSONField` + +`ArrayField` and `ArrayReferenceField` require all Models in the list to be of the same type. MongoDB allows the saving of arbitrary data inside it is embedded array. The `ListField` is useful in such cases. The list field cannot be represented in Django Admin though and can only be used in the python script. + +### ListField + +```python +class ListField(Field): + def __init__(self, *args, **kwargs): +``` + +### Arguments + +Same as the `Field` Base class \ No newline at end of file diff --git a/docs/docs/documentation/djongoCS/aggregation.md b/docs/docs/documentation/djongoCS/aggregation.md new file mode 100644 index 00000000..b7d340cd --- /dev/null +++ b/docs/docs/documentation/djongoCS/aggregation.md @@ -0,0 +1,24 @@ +--- +title: Aggregation +permalink: /aggregation/ +layout: server + +--- + +## Using Aggregation Operators + + + \ No newline at end of file diff --git a/docs/docs/documentation/djongoCS/creating-django-capped-models-using-mongodb.md b/docs/docs/documentation/djongoCS/creating-django-capped-models-using-mongodb.md new file mode 100644 index 00000000..12fd9b8a --- /dev/null +++ b/docs/docs/documentation/djongoCS/creating-django-capped-models-using-mongodb.md @@ -0,0 +1,51 @@ +--- +title: Creating Capped Models using MongoDB +permalink: /creating-django-capped-models-using-mongodb/ +layout: server +--- + +[Capped collections][capped] are fixed-size collections that support high-throughput operations that insert and retrieve documents based on insertion order. Capped collections work in a way similar to circular buffers: once a collection fills its allocated space, it makes room for new documents by overwriting the oldest documents in the collection. + +Djongo lets you define certain Models as 'Capped' Models. The `Entry` Model is a perfect candidate for being stored as a Capped Model. + +```python +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + model_form_class=BlogForm + ) + meta_data = models.EmbeddedField( + model_container=MetaData, + model_form_class=MetaDataForm + ) + + headline = models.CharField(max_length=255) + body_text = models.TextField() + + authors = models.ArrayReferenceField( + to=Author, + on_delete=models.CASCADE, + ) + n_comments = models.IntegerField() + + class Meta: + capped = True + size = 5242880 + max = 5000 + + def __str__(self): + return self.headline + +``` + +As most SQL DBs do not support capped tables, Django lacks a way to define such tables during a migration. Djongo comes with it is own version of `manage.py` to make this happen. Switch to the root directory of your app and from the command line run: + +``` +python -m djongo.manage migrate +``` + +This will result in all Models having `capped == True` to being recreated as Capped collections. Use this command only if such a collection doesn't already exists or is empty, as `djongo.manage` will drop all collections marked as capped in the model but are not capped in the DB and create a new empty capped collection. + +{{page.notice.not_ready}} + +[capped]: https://docs.mongodb.com/manual/core/capped-collections/ \ No newline at end of file diff --git a/docs/docs/documentation/djongoCS/database-transactions.md b/docs/docs/documentation/djongoCS/database-transactions.md new file mode 100644 index 00000000..b2ffc879 --- /dev/null +++ b/docs/docs/documentation/djongoCS/database-transactions.md @@ -0,0 +1,33 @@ +--- +title: Database Transactions +layout: server +permalink: /database-transactions/ +--- + + +## Transaction and Commit + +Djongo integrates with MongoDB Transactions API to support multi document atomic transactions. [Atomic transactions](https://docs.djangoproject.com/en/3.0/topics/db/transactions/) are enabled in Django using the usual `transaction.atomic()` decorator or context manager. MongoDB transactions significantly speed up Django test execution and validation. + +### Example + +```python +from djongo import transaction + +def viewfunc(request): + stuff() + + with transaction.atomic(): + # This code executes inside a transaction. + more_stuff() +``` + +This produces the following pymongo commands: + +```python +session = cli.start_session() +transaction = session.start_transaction() +# more_stuff +transaction.commit_transaction() # or transaction.abort_transaction() +session.end_session() +``` diff --git a/docs/docs/documentation/djongoCS/indexes.md b/docs/docs/documentation/djongoCS/indexes.md new file mode 100644 index 00000000..f356dfba --- /dev/null +++ b/docs/docs/documentation/djongoCS/indexes.md @@ -0,0 +1,240 @@ +--- +title: Indexes +permalink: /indexes/ +layout: server +--- + +## Compound Index +```python +class CompoundIndex( + fields=(), + name=None, + unique=False, + background=False, + partialFilterExpression=None, + sparse=False, + collation=None) +``` + +### Arguments + +Argument | Type | Description +---------|------|------------- +`fields` | `Tuple` or `List` | A tuple of strings containing the fields to be indexed. Adding a '-' before the field name, builds the index in the [descending order](https://docs.djangoproject.com/en/dev/ref/models/indexes/#django.db.models.Index.fields). +`name` | `string` | The index name, if not provided will be autogenerated by MongoDB +`unique` | `boolean` | Used to create [unique indexes](https://docs.mongodb.com/manual/core/index-unique/) +`background` | `boolean` | Create the index in the background. +`partialFilterExpression` | `Q` | Used to create [partial indexes](https://docs.mongodb.com/manual/core/index-partial/). Similar to Django [Index condition](https://docs.djangoproject.com/en/dev/ref/models/indexes/#condition). Takes an instance of [Q](https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.Q) to build the filter expression. +`sparse` | `boolean` | Used to create [sparse indexes](https://docs.mongodb.com/manual/core/index-sparse/) +`collation` | `Collation` | Used to specify the [collation](https://docs.mongodb.com/manual/reference/collation/). Takes an instance of [collation](https://api.mongodb.com/python/current/api/pymongo/collation.html) + +### Example + +```python +from djongo.models.indexes import CompoundIndex +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + indexes = [ + CompoundIndex(fields=['name', '-tagline']) + ] +``` + +Generates the pymongo command: + +```python +db.blog.create_index( { 'name': 1, 'tagline': -1 } ) +``` + +## Text Index + +```python +class TextIndex( + fields=(), + name=None, + unique=False, + background=False, + partialFilterExpression=None, + weights=None, + default_language='english', + language_override=None, + textIndexVersion=None) +``` +### Example + +```python +from djongo.models.indexes import TextIndex +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + indexes = [ + TextIndex(fields=['name', 'tagline']) + ] +``` + +Generates the pymongo command: + +```python +db.blog.create_index( { 'name': 'text', 'tagline': 'text' } ) +``` + +## Wildcard Index + +```python +class WildcardIndex( + fields=(), + name=None, + unique=False, + background=False, + partialFilterExpression=None, + sparse=False, + collation=None, + wildcardProjection=None) +``` +### Example + +```python +from djongo.models.indexes import WildcardIndex +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + abstract = True + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog, + ) + class Meta: + indexes = [ + WildcardIndex(fields=['blog']) + ] +``` +Generates the pymongo command: + +```python +db.entry.create_index( { 'blog.$**': 1 } ) +``` + +## 2dsphere Index +```python +class TwoDSphereIndex( + fields=(), + name=None, + unique=False, + background=False, + partialFilterExpression=None, + sparse=False, + collation=None, + min=None, + max=None) +``` +### Example + +```python +from djongo.models.indexes import TwoDSphereIndex +from djongo import models + +class Location(models.Model): + type = models.CharField(max_length=100) + coordinates = models.ArrayField() + + class Meta: + abstract = True + +class Entry(models.Model): + loc = models.EmbeddedField( + model_container=Location, + ) + class Meta: + indexes = [ + TwoDSphereIndex(fields=['loc']) + ] +``` +Generates the pymongo command: + +```python +db.entry.create_index( { 'loc' : '2dsphere' } ) +``` + +## Hashed Index +```python +class HashedIndex( + fields=(), + name=None, + unique=False, + background=False, + partialFilterExpression=None, + sparse=False, + collation=None) +``` +### Example + +```python +from djongo.models.indexes import HashedIndex +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + indexes = [ + HashedIndex(fields=['name']) + ] +``` + +Generates the pymongo command: + +```python +db.blog.create_index( { 'name': 'hashed' } ) +``` + +## TTL Index +```python +class TTLIndex( + field=, + name=None, + unique=False, + background=False, + partialFilterExpression=None, + sparse=False, + collation=None, + expireAfterSeconds=None) +``` +### Example + +```python +from djongo.models.indexes import TTLIndex +from djongo import models + +class Blog(models.Model): + pub_date = models.DateTimeField() + + class Meta: + indexes = [ + TTLIndex(field='pub_date', expireAfterSeconds=3600) + ] +``` + +Generates the pymongo command: + +```python +db.blog.create_index( { 'pub_date': 1 }, expireAfterSeconds=3600 ) +``` + + + diff --git a/docs/docs/documentation/djongoCS/model-creation.md b/docs/docs/documentation/djongoCS/model-creation.md new file mode 100644 index 00000000..bed1ad6d --- /dev/null +++ b/docs/docs/documentation/djongoCS/model-creation.md @@ -0,0 +1,67 @@ +--- +title: Model Creation +layout: server +permalink: /model-creation/ +--- + + +## Schema Validation and CheckConstraint + +Djongo automatically generates schema validation JSON documents for your models providing an extra layer of data validation and checking from within MongoDB. By creating [check constraints](https://docs.djangoproject.com/en/3.0/ref/models/constraints/#checkconstraint) in the Model Meta definition, djongo automatically interprets it to generate a [JSON Schema](https://docs.mongodb.com/manual/core/schema-validation/#json-schema) and a [query expression](https://docs.mongodb.com/manual/core/schema-validation/#other-query-expressions) + +### Example + +```python +from djongo.models import CheckConstraint, Q +from djongo import models +from pymongo.read_concern import ReadConcern + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + author_age = models.IntegerField() + + class Meta: + constraints = [ + CheckConstraint(check=Q(author_age__gte=18), name='age_gte_18') + ] +``` + +## CollectionConstraint and Capped Collections +Djongo introduces a new `CollectionConstraint`. Use this to specify MongoDB specific collection properties that are usually used when calling [create_collection](https://api.mongodb.com/python/current/api/pymongo/database.html#pymongo.database.Database.create_collection) + +```python +class CollectionConstraint(**kwargs) +``` + +All arguments passed to `create_collection` with the exception of `name` can be used to create the `CollectionConstraint` instance. Valid arguments include, but are not limited to those described below + +### Arguments + +Argument | Type | Description +---------|------|------------- +`codec_options` | `CodecOptions` | An instance of [CodecOptions](https://api.mongodb.com/python/current/api/bson/codec_options.html#bson.codec_options.CodecOptions). +`collation` | `Collation` | Takes an instance of [Collation](https://api.mongodb.com/python/current/api/pymongo/collation.html) + +### Example + +```python +from djongo.models import CollectionConstraint +from djongo import models +from pymongo.read_concern import ReadConcern + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + constraints = [ + CollectionConstraint( + read_concern=ReadConcern(level='majority'), + capped=True, + max=100 + ) + ] +``` + + diff --git a/docs/docs/documentation/djongoCS/model-query.md b/docs/docs/documentation/djongoCS/model-query.md new file mode 100644 index 00000000..6a1e18f6 --- /dev/null +++ b/docs/docs/documentation/djongoCS/model-query.md @@ -0,0 +1,136 @@ +--- +title: Model Query +layout: server +permalink: /model-query/ +--- + +## Text Search + +Djongo lets you run [MongoDB text search](https://docs.mongodb.com/manual/core/text-search-operators/) queries on Django `CharField` and `TextField`. To run a text search, use the `text_search` operator that comes built in with Djongo. + +### Example + +```python +from djongo.models.indexes import TextIndex +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + + class Meta: + indexes = [ + TextIndex(fields=['name']) + ] +``` + +```python +Blog.objects.filter(name__text_search='Paul Lennon') +``` +This will generate the pymongo command: + +```python +db.blog.find( { '$text': { '$search': "Paul Lennon" } } ) +``` + + + +## Geospatial Queries + +Geospatial queries are carried out in Djongo by using a combination of the `near` lookup operator and the `Near` search object. + +```python +class Near( + type=None, + coordinates=None, + minDistance=None, + maxDistance=None) +``` +### Example + +```python +from djongo.models.indexes import TwoDSphereIndex +from djongo import models + +class Location(models.Model): + type = models.CharField(max_length=100) + coordinates = models.ArrayField() + + class Meta: + abstract = True + +class Entry(models.Model): + loc = models.EmbeddedField( + model_container=Location, + ) + class Meta: + indexes = [ + TwoDSphereIndex(fields=['loc']) + ] +``` + +```python +from djongo.models import Near + +search_region = Near( + type='point', + coordinates=[-33.9, 89.81], + minDistance=100, + maxDistance=200 +) + +Entry.objects.filter(loc__near=search_region) +``` + +This generates the following pymongo search query: + +```python +db.entry.find({ + 'loc': + { '$near': + { + '$geometry': { 'type': "Point", 'coordinates': [-33.9, 89.81] }, + '$minDistance': 100, + '$maxDistance': 200 + } + } + }) +``` + +## Specifying Query Options + +Djongo lets you specify the configuration of the find command into your [QuerySets](https://docs.djangoproject.com/en/dev/ref/models/querysets/). Call the `configure` method on a QuerySet to configure the find query. All options supported by [aggregate](https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate) or [find](https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.find) can be included as `kwargs`. Example of valid arguments: + +### Arguments + +Argument | Type | Description +---------|------|------------- +`allowDiskUse` | `boolean` | Enables writing to temporary files +`collation` | `Collation` | Used to specify the [collation](https://docs.mongodb.com/manual/reference/collation/). Takes an instance of [Collation](https://api.mongodb.com/python/current/api/pymongo/collation.html) + + +### Example + +```python +Blog.objects.filter(name='John Lennon').configure(hint=['-tagline']) +``` +This generates the following pymongo find query: + +```python +db.blog.find({'name': 'John Lennon'}, hint=[('tagline', pymongo.DESCENDING)]) +``` + +## Tailable Cursors +Tailable cursors are used to retrieve data from [capped collections](https://docs.mongodb.com/manual/core/capped-collections/). The querySet first has to be configured using `configure` to use a tailable cursor in the pymongo find command. Results of the querySet can only be accessed by generating an iterator by calling the [QuerySet iterator](https://docs.djangoproject.com/en/3.0/ref/models/querysets/#iterator) + +### Example + +```python +iterable = Blog.objects.filter(name='John').configure(cursor_type=CursorType.TAILABLE).iterator() +for blog in iterable: + blog.name +``` + + diff --git a/docs/docs/documentation/djongoCS/model-update.md b/docs/docs/documentation/djongoCS/model-update.md new file mode 100644 index 00000000..3c62c4b3 --- /dev/null +++ b/docs/docs/documentation/djongoCS/model-update.md @@ -0,0 +1,52 @@ +--- +title: Model Update +layout: server +permalink: /model-update/ +--- + +## Bulk Write + +MongoDB lets you perform [Bulk Write operations](https://docs.mongodb.com/manual/core/bulk-write-operations/) using [`bulk_write`](https://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.bulk_write) which is currently not supported in Django. However, by using Djongo it is possible to perform bulk writes. + +```python +class BulkWrite(ordered=True) +``` + +### Arguments + +Argument | Type | Description +---------|------|------------- +`ordered` | `boolean` | Perform the write operations either in order or arbitrarily. + +### Example + + ```python +from djongo import BulkWrite + +with BulkWrite(): + entry = Entry.objects.get(pk=p_key) # Queries the DB once + entry.headline = 'The Beatles reconcile' + entry.save() # Djongo does not really do a update to MongoDB + Entry.objects.create(name='How the beatles reconciled') # Djongo does not really do a insert to MongoDB + +# On exit, does: db.entry.bulk_write([UpdateOne(), InsertOne()]) +``` + +## Unordered Bulk Writes + +### Example + + ```python +from djongo import BulkWrite + +with BulkWrite(ordered=False): + entry = Entry.objects.get(pk=p_key) # Queries the DB once + entry.headline = 'The Beatles reconcile' + entry.save() # Djongo does not really do a update to MongoDB + Entry.objects.create(name='How the beatles reconciled') # Djongo does not really do a insert to MongoDB + +# On exit, does: +# db.entry.bulk_write( +# [UpdateOne(), InsertOne()] +# ordered=False) +``` diff --git a/docs/docs/documentation/djongoCS/more-info.md b/docs/docs/documentation/djongoCS/more-info.md new file mode 100644 index 00000000..9f802341 --- /dev/null +++ b/docs/docs/documentation/djongoCS/more-info.md @@ -0,0 +1,8 @@ +--- +title: More Information +permalink: /more-info/ +layout: server +toc: false +--- + + \ No newline at end of file diff --git a/docs/docs/documentation/get-started.md b/docs/docs/documentation/get-started.md new file mode 100644 index 00000000..417559d8 --- /dev/null +++ b/docs/docs/documentation/get-started.md @@ -0,0 +1,378 @@ +--- +title: Get Started +permalink: /get-started/ +description: "Djongo overcomes common pitfalls of PyMongo programming. It maps python objects to MongoDB documents. +Setting up the mapping documents to python objects is easy with Djongo." +layout: docs +--- + +## Deploy + +1. Start by [creating an account](/djongocs/create-account/). You will be assigned +a working webserver instance running Django and MongoDB. +2. (Optional) Test your instance by entering `https://api.djongomapper.com//` in your browser. +The username is what was used while creating the account. +3. Login to your [dashboard](/djongocs/dashboard/) and upload your Public SSH key. The command to open a shell +to your instance will appear in the dashboard. You can upload your app specific Django scripts to the server. + + +## Local Development + +### Setup +For a local installation start with: +1. `pip install djongo` +2. Into `settings.py` file of your project, add: + + ```python + DATABASES = { + 'default': { + 'ENGINE': 'djongo', + 'NAME': 'your-db-name', + } + } + ``` + +### Requirements +1. Python 3.6 or higher. +2. MongoDB 3.4 or higher. +3. If your models use nested queries or sub querysets like: + + ```python + inner_query = Blog.objects.filter(name__contains='Ch').values('name') + entries = Entry.objects.filter(blog__name__in=inner_query) + ``` + MongoDB 3.6 or higher is required. + +## MongoDB and Django + +### EmbeddedField + Nest a `dict` inside a model with the `EmbeddedField`. The `model_container` is used to describe the structure of the + data stored. + +```python +from djongo import models + +class Blog(models.Model): + name = models.CharField(max_length=100) + + class Meta: + abstract = True + +class Entry(models.Model): + blog = models.EmbeddedField( + model_container=Blog + ) + headline = models.CharField(max_length=255) + +e = Entry() +e.blog = { + 'name': 'Djongo' +} +e.headline = 'The Django MongoDB connector' +e.save() +``` + +### ArrayField +Nest a `list` of `dict` inside a model for more complex data. + +```python +from djongo import models + +class Entry(models.Model): + blog = models.ArrayField( + model_container=Blog + ) + headline = models.CharField(max_length=255) + +e = Entry() +e.blog = [ + {'name': 'Djongo'}, {'name': 'Django'}, {'name': 'MongoDB'} +] +e.headline = 'Djongo is the best Django and MongoDB connector' +e.save() +``` + + +## Database Configuration + +The `settings.py` supports (but is not limited to) the following options: + +Attribute | Value | Description +---------|------|------------- +ENGINE | djongo | The MongoDB connection engine for interfacing with Django. +ENFORCE_SCHEMA | True | Ensures that the model schema and database schema are exactly the same. Raises `Migration Error` in case of discrepancy. +ENFORCE_SCHEMA | False | (Default) Implicitly creates collections. Returns missing fields as `None` instead of raising an exception. +NAME | your-db-name | Specify your database name. This field cannot be left empty. +LOGGING | dict | A [dictConfig](https://docs.python.org/3.6/library/logging.config.html) for the type of logging to run on djongo. +CLIENT | dict | A set of key-value pairs that will be passed directly to [`MongoClient`](http://api.mongodb.com/python/current/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient) as kwargs while creating a new client connection. + +All options except `ENGINE` and `ENFORCE_SCHEMA` are the same those listed in the [pymongo documentation](http://api.mongodb.com/python/current/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient). + + +```python + DATABASES = { + 'default': { + 'ENGINE': 'djongo', + 'NAME': 'your-db-name', + 'ENFORCE_SCHEMA': False, + 'CLIENT': { + 'host': 'host-name or ip address', + 'port': port_number, + 'username': 'db-username', + 'password': 'password', + 'authSource': 'db-name', + 'authMechanism': 'SCRAM-SHA-1' + }, + 'LOGGING': { + 'version': 1, + 'loggers': { + 'djongo': { + 'level': 'DEBUG', + 'propagate': False, + } + }, + }, + } + } +``` + +## DjongoCS + +Djongo Cloud Server is the fastest way to deploy to the cloud your djongo powered apps. The DjongoCS package and +dependencies come preconfigured and installed on the [Cloud][support_page]. + +### SSH +On account creation you install your public SSH key at the [dashboard](/djongocs/dashboard/). +This gives a secure shell access to the VM instance for uploading a +[Django App](https://docs.djangoproject.com/en/dev/intro/tutorial01/). Once the key is installed, +the dashboard displays the SSH port number over which you can connect to the VM instance. + +Establish a secure shell connection using: + +```shell +ssh @api.djongomapper.com -p +``` + +The `user` is the same as the username used while creating the account. + +### Public API +When you create an account on DjongoCS you get a unique URL path assigned to you. The Django views that you +create for servicing your API can be accessed and extended further starting from the base URL: + +```shell +https://api.djongomapper.com/ +``` + +### Launching the App + +Establishing a SSH connection to your server logs you into the `/home/$USER` directory. The typical home directory +structure looks like: + +```shell +~home +| -- .ssh/ +| -- site/ +| -- api/ +| -- settings.py +| -- urls.py +| -- apps/ +| -- app1/ +| -- views.py +| -- models.py +| -- app2/ +| -- views.py +| -- models.py +``` + +In your `urls.py` if you add an entry like `path('hello/', app1.views.hello)`, the URL path becomes +`https://api.djongomapper.com//hello` + +#### Reload the Server +After making changes to your app, you need to reload the server. This is done by clicking the reload button +in your [dashboard](/djongocs/dashboard/). + +{% comment %} +### Installing dependencies + +{% endcomment %} + +## Security and Integrity Checks +Djongo allows for checks on data fields before they are saved to the database. Running the correct integrity checks and field value validators before writing data into the database is important. + +### Enforce schema + +MongoDB is *schemaless*, which means no schema rules are enforced by the database. You can add and exclude fields per entry and MongoDB will not complain. This can make life easier, especially when there are frequent changes to the data model. Take for example the `Blog` Model (version 1). + +```python +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() +``` + +You can save several entries into the DB and later modify it to version 2: + +```python +class Blog(models.Model): + name = models.CharField(max_length=100) + tagline = models.TextField() + description = models.TextField() +``` + +The modified Model can be saved **without running any migrations**. + +This works fine if you know what you are doing. Consider a query that retrieves entries belonging to both the 'older' model (with just 2 fields) and the current model. What will the value of `description` now be? To handle such scenarios Djongo comes with the `ENFORCE_SCHEMA` option. + +When connecting to Djongo you can set `ENFORCE_SCHEMA: True`. In this case, a `MigrationError` will be raised when field values are missing from the retrieved documents. You can then check what went wrong. + +`ENFORCE_SCHEMA: False` works by silently setting the missing fields with the value `None`. If your app is programmed to expect this (which means it is not a bug) you can get away by not calling any migrations. + +### Validators +Apply validators to each field before they are saved. + +```python +from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ +from djongo import models +from django.core.validators import URLValidator + +def script_injection(value): + if value.find(' diff --git a/docs/docs/documentation/side-stuff/donate.md b/docs/docs/documentation/side-stuff/donate.md new file mode 100644 index 00000000..a223f701 --- /dev/null +++ b/docs/docs/documentation/side-stuff/donate.md @@ -0,0 +1,10 @@ +--- +title: Donate +permalink: /donate/ +toc: false +--- + +* At the time of payment checkout, **you don't need to** provide accurate personal information as we don't store it. +* In the additional payment description box, do ensure to mention the issue or feature you want prioritized. + +[Donate](http://paypal.me/nesdis){: .btn .btn--success} \ No newline at end of file diff --git a/docs/docs/documentation/side-stuff/forum.md b/docs/docs/documentation/side-stuff/forum.md new file mode 100644 index 00000000..629116d3 --- /dev/null +++ b/docs/docs/documentation/side-stuff/forum.md @@ -0,0 +1,15 @@ +--- +title: Donate +permalink: /forum/ +toc: false +layout: docs +--- + +# Discuss + +[Djongo forum](https://groups.google.com/forum/#!forum/djongo) is where you can watch for: + +* New release announcements. +* Suggest improvements. +* Ask questions. +* Discuss topics pertaining to Django and MongoDB. \ No newline at end of file diff --git a/docs/docs/support/contact/book-a-debug.md b/docs/docs/support/contact/book-a-debug.md new file mode 100644 index 00000000..7599a8cc --- /dev/null +++ b/docs/docs/support/contact/book-a-debug.md @@ -0,0 +1,9 @@ +--- +permalink: /support/contact/book-a-debug/ +layout: support-contact +--- + +{% include form.html + form=site.data.support.tire_form.default + next="/support/request-success/" + subject="Join Book a Debug" %} \ No newline at end of file diff --git a/docs/docs/support/contact/discord-support.md b/docs/docs/support/contact/discord-support.md new file mode 100644 index 00000000..d3b39621 --- /dev/null +++ b/docs/docs/support/contact/discord-support.md @@ -0,0 +1,9 @@ +--- +permalink: /support/contact/discord-support/ +layout: support-contact +--- + +{% include form.html + form=site.data.support.tire_form.default + next="/support/payment/discord-support/" + subject="Discord support" %} \ No newline at end of file diff --git a/docs/docs/support/djongocs/create-account.md b/docs/docs/support/djongocs/create-account.md new file mode 100644 index 00000000..a4830bc7 --- /dev/null +++ b/docs/docs/support/djongocs/create-account.md @@ -0,0 +1,70 @@ +--- +permalink: /support/djongocs/create-account/ +layout: splash +classes: + - empty-banner + - l-splash +--- + +# Create Account + +{% include form.html + form=site.data.support.forms.webserver + next="/support/payment/webserver/" + subject="webserver Access" %} + + + + + + + +{% include vendors/stripe.html btn_id="button" price_id="price_1HIKphLbyDBUaJVjQylkb7QE" %} \ No newline at end of file diff --git a/docs/docs/support/payment/discord-support.md b/docs/docs/support/payment/discord-support.md new file mode 100644 index 00000000..8657e87d --- /dev/null +++ b/docs/docs/support/payment/discord-support.md @@ -0,0 +1,10 @@ +--- +title: Djongo Support +permalink: /support/payment/discord-support/ +layout: splash +classes: + - empty-banner + - l-splash +--- + +{% include feature_page/support/payment.html price_id="price_1I8mqtLbyDBUaJVjs0ZCdbzS" %} diff --git a/docs/docs/support/payment/payment-success.md b/docs/docs/support/payment/payment-success.md new file mode 100644 index 00000000..d2f1f60e --- /dev/null +++ b/docs/docs/support/payment/payment-success.md @@ -0,0 +1,5 @@ +--- +title: Sponsor Djongo +permalink: /support/payment-success/ +layout: splash +--- diff --git a/docs/docs/support/payment/server.md b/docs/docs/support/payment/server.md new file mode 100644 index 00000000..f946aa5c --- /dev/null +++ b/docs/docs/support/payment/server.md @@ -0,0 +1,10 @@ +--- +title: Djongo Support +permalink: /support/payment/webserver/ +layout: splash +classes: + - empty-banner + - l-splash +--- + +{% include feature_page/support/payment.html price_id="price_1HIKphLbyDBUaJVjQylkb7QE" %} diff --git a/docs/docs/support/request-success.md b/docs/docs/support/request-success.md new file mode 100644 index 00000000..8fc6cb53 --- /dev/null +++ b/docs/docs/support/request-success.md @@ -0,0 +1,12 @@ +--- +title: Djongo Support +permalink: /support/request-success/ +layout: splash +classes: + - empty-banner + - l-splash +--- + +# Great! Your request has been recorded + +### We will get back to you soon diff --git a/docs/docs/support/support.md b/docs/docs/support/support.md new file mode 100644 index 00000000..44866e67 --- /dev/null +++ b/docs/docs/support/support.md @@ -0,0 +1,61 @@ +--- +title: Support +permalink: /support/ +layout: splash +tagline: "Create and Deploy a Backend Server" +description: "If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support." +excerpt: "If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support." + +classes: + - l-splash-full + - feature-page + - empty-banner + +redirect_to: /djongocs/create-account/ + +--- + +{% capture head %} + {% include feature_page/support/tire.html %} +{% endcapture%} + +{% capture content %} + {% capture content%} +## Enterprise +If you are an enterprise that uses Djongo for commercial purposes, you need a license to use Djongo. Rights +granted are: + +* Similar to a [MIT](https://opensource.org/licenses/MIT) style license. +* To use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software. + +Get **phone, chat, and email support**. Send us a message for more information. +:: +{% include form.html form=site.data.support.forms.enterprise %} + {% endcapture %} + +{% include feature_page/flex.html + content=content %} +:: + + {% capture content%} +## Discuss +[Djongo forum](https://groups.google.com/forum/#!forum/djongo) is where you can watch for: + +* New release announcements. +* Suggest improvements. +* Ask questions. +* Discuss topics pertaining to Django and MongoDB. + +Alternatively, send us a message and we will get back to you. +:: +{% include form.html form=site.data.support.forms.discuss %} + {% endcapture %} + +{% include feature_page/flex.html + content=content %} + +{% endcapture %} + +{% include feature_page/features.html + content=content + head=head %} \ No newline at end of file diff --git a/docs/docs/support/support.md.bak b/docs/docs/support/support.md.bak new file mode 100644 index 00000000..a9539e35 --- /dev/null +++ b/docs/docs/support/support.md.bak @@ -0,0 +1,65 @@ +--- +title: DjongoCS +permalink: /support/ +layout: splash +tagline: "Create and Deploy a Backend Server" +description: "If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support." +excerpt: "If you are a company that uses Djongo in your products, consider enrolling in a subscription plan. You get long term support." + +classes: + - l-splash-full + - feature-page + - banner-page + +header: + overlay_image: /assets/images/home/banner-rand-dark-many6.png + overlay_color_dark: #092e20 + overlay_color: #09411f + cta_url: /support/djongocs/create-account/ + cta_label: "Create Account" +--- + +{% capture head %} + {% include feature_page/support/tire.html %} +{% endcapture%} + +{% capture content %} + {% capture content%} +## Enterprise +If you are an enterprise that uses Djongo for commercial purposes, you need a license to use Djongo. Rights +granted are: + +* Similar to a [MIT](https://opensource.org/licenses/MIT) style license. +* To use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software. + +Get **phone, chat, and email support**. Send us a message for more information. +:: +{% include form.html form=site.data.support.forms.enterprise %} + {% endcapture %} + +{% include feature_page/flex.html + content=content %} +:: + + {% capture content%} +## Discuss +[Djongo forum](https://groups.google.com/forum/#!forum/djongo) is where you can watch for: + +* New release announcements. +* Suggest improvements. +* Ask questions. +* Discuss topics pertaining to Django and MongoDB. + +Alternatively, send us a message and we will get back to you. +:: +{% include form.html form=site.data.support.forms.discuss %} + {% endcapture %} + +{% include feature_page/flex.html + content=content %} + +{% endcapture %} + +{% include feature_page/features.html + content=content + head=head %} \ No newline at end of file diff --git a/docs/favicon.ico b/docs/favicon.ico new file mode 100644 index 00000000..1658e5bc Binary files /dev/null and b/docs/favicon.ico differ diff --git a/docs/images/layers.png b/docs/images/layers.png deleted file mode 100644 index fa3298a2..00000000 Binary files a/docs/images/layers.png and /dev/null differ diff --git a/docs/images/layers.svg b/docs/images/layers.svg deleted file mode 100644 index cdd5fe13..00000000 --- a/docs/images/layers.svg +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - Django App - - Contrib - - Models - - Query - - DB connector - - DataBase - - diff --git a/docs/images/orm2odm.svg b/docs/images/orm2odm.svg deleted file mode 100644 index 079c62fc..00000000 --- a/docs/images/orm2odm.svg +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - Django App - - Contrib - - Models - - Query - - DB connector - - DataBase - - - - - Django App - - - Contrib - - - ODM - - - - - DataBase - - - - - - - - - diff --git a/docs/images/sql2mongodb.svg b/docs/images/sql2mongodb.svg deleted file mode 100644 index 5a8cd5e4..00000000 --- a/docs/images/sql2mongodb.svg +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - Django App - - Contrib - - Models - - Query - - DB connector - - SQL DataBase - - - - - - - Django App - - Contrib - - Models - - Query - - SQL to pymongo - - MongoDB - - diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 00000000..9eeaa7bb --- /dev/null +++ b/docs/index.html @@ -0,0 +1,616 @@ + + + + + + Djongo - MongoDB Django Hosting + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+ Simplify Query Creation +

+ Autogenerated Queries +

+

+ Writing query documents can get out of control. Djongo does the heavy lifting of creating query documents for you. +

+ + More + +
+
+ Switch DBs instantly +

+ Database Abstraction +

+

+ Switch between MongoDB and other SQL databases. Limit the impact to your Models and business logic. +

+ + More + +
+
+ Security +

+ Security +

+

+ Directly saving raw + + JSON + + into the database is scary. Djongo secures and validates the + + JSON + + document before saving. +

+ + More + +
+
+ Cloud Services +

+ Container Integration +

+

+ Managed DBs, Storage, Kubernetes, Compute and Virtual Private Cloud (VPC) Integration +

+ + More + +
+
+ Rapid Prototyping +

+ Rapid Prototyping +

+

+ Speed up development with schema free models. Enforce protection with evolution. +

+ + More + +
+
+ Web Interface +

+ Web Interface +

+

+ Access and modify MongoDB through the dashboard, CLI or API +

+ + More + +
+
+
+
+
+
+
+

+ Containers +

+

+ Deploy frustration free Djongo containers on Google Cloud Platform +

+
+
+
+ postcard +
+
+

+ Create and deploy a preset Ubuntu, Apache, MongoDB, PostgreSQL and Djongo instance on GCP. +Choose between shared and dedicated VM instances. +

+

+ Focus on developing the models.py and views.py. Let djongo cloud services automate the rest. +Manage access keys, modify subscription plans, and request support using the dashboard. +

+

+ + Create Account + +

+
+
+
+
+
+
+

+ Products +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+   + + Djongo + + DjongoCS + + Enterprise +
+   + +   + + + Create Account + + + + Enquire + +
+ Django MongoDB Connector + + + + + + +
+ Virtualized Containers + + + + + + +
+ Commercial License + + + + + + +
+
+
+
+
+

+ Prototyping +

+
+
+ Security +
+
+
+ JSONField +
+
+ Represents documents with no structure, and no validations. +
+
+ EmbeddedField +
+
+ Used to describe the data structure that triggers automatic validations at the application level. +
+
+ Settings.py +
+
+

+ Set enforce_schema to True in settings.py to enable schema checks at the database level. +

+
+
+
+ Computations +
+ +
+
+
+
+
+

+ Queries +

+
+
+
+
self.db['entry'].aggregate(
+  [{
+    '$match': {
+      'author_id': {
+        '$ne': None,
+        '$exists': True
+       }
+     }
+    },
+    {
+      '$lookup': {
+        'from': 'author',
+        'localField': 'author_id',
+        'foreignField': 'id',
+        'as': 'author'
+      }
+    },
+    {
+      '$unwind': '$author'
+    },
+    {
+      '$lookup': {
+        'from': 'blog',
+        'localField': 'blog_id',
+        'foreignField': 'id',
+        'as': 'blog'
+      }
+    },
+    {
+      '$unwind': {
+        'path': '$blog',
+        'preserveNullAndEmptyArrays': True
+      }
+    },
+    {
+      '$addFields': {
+        'blog': {
+          '$ifNull': ['$blog', {
+            'id': None,
+            'title': None
+          }]
+        }
+      }
+    },
+    {
+      '$match': {
+        'author.name': {
+          '$eq': 'Paul'
+        }
+      }
+    }, 
+    {
+      '$project': {
+        'id': True,
+        'blog_id': True,
+        'author_id': True,
+        'content': True,
+        'blog.id': True,
+        'blog.title': True
+      }
+    }]
+
+
+
+
+
+
+
qs = Entry.objects.filter(author__name='Paul').select_related('blog')
+
+
+
+
+
+ PyMongo +
+
+
+
+ Djongo +
+
+
+

+ Djongo generates complex, error free, aggregation queries automatically. +

+

+ It takes the query on the top and + + automatically + + generates the pymongo query document as the output. +

+
+
+
+
+
+
+
+

+ Security and Integrity Checks +

+
+
def script_injection(value):
+  if value.find('<script>') != -1:
+    raise ValidationError(_('Script injection in %(value)s'),
+                          params={'value': value})
+
+class Entry(models.Model):
+  homepage = models.URLField(validators=[URLValidator,
+                                         script_injection])
+
+
+

+ Djongo performs + + checks on data fields + + before they are saved to the database. +

+

+ Define + + custom validators + + or use builtin validators to check the data. Validation is triggered prior to writing to the database. +

+

+ Running + + integrity checks + + and field value validators ensures protect from garbage data. +

+
+
+
+
+

+ Djongo +

+

+ Djongo + Djongo is a unified approach to database interfacing. It is an extension to the +
+ + Django ORM + + framework but maps python objects to MongoDB documents. + +

+

+ Constructing queries using Djongo is + + much easier + + compared to writing lengthy Pymongo query documents. +Storing raw + + JSON + + emitted by the frontend directly into the database is scary. Djongo ensures that + + only clean data + + gets through. +

+

+ + You no longer + + need to use the shell to inspect your data. By using the + + Admin + + package, you can access and +modify data directly from the browser. + Djongo includes handy UI elements that help represent MongoDB documents on the browser. +

+

+ + Get Started + +

+
+
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/docs/integrating-django-with-mongodb/README.md b/docs/integrating-django-with-mongodb/README.md deleted file mode 100644 index 505790a1..00000000 --- a/docs/integrating-django-with-mongodb/README.md +++ /dev/null @@ -1,99 +0,0 @@ -# Integrating Django with MongoDB - -This document is a tutorial on how to integrate MongoDB with Django. It describes the Django ORM internal implementation that is not covered by the [Django documentation](https://docs.djangoproject.com/en/dev/). There are different ways to integrate MongoDB with Django, each with positives and negatives. - -Insights into the Django ORM design will help in understanding ways to integrate MongoDB and Django. - -## Django ORM internals - -The Django ORM can be broadly thought of as multiple Abstraction Layers stacked on top of each other. - -
- Abstraction Layers -
- - -### Models Layer - -Your Django App and [Contrib](https://docs.djangoproject.com/en/dev/ref/contrib/) packages interface with the Models API to implement their functionality. - -### Query Layer - -The Query Layer converts Models functionality into Django SQL query strings that are similar to sqllite syntax. - -### DB connector - -The Django SQL query string is converted to backend database specific SQL syntax. - -### Database - -The Database only accepts SQL query string specific to its type. - - -## Ways to integrate Django with MongoDB - -### From ORM to ODM - -Object Document Mapping(ODM) is the Object Relational Mapping(ORM) for non-relational document oriented databases (like MongoDB). In an ODM, python objects (or group of them) are stored as documents instead of tables. Implementing an ODM for Django would entail rewriting several Django modules. - -
- Abstraction Layers -
- -#### Django-nonrel - -[Django-nonrel](https://github.com/django-nonrel/django) aims to integrate Django and MongoDB but is not up to date with the latest version of Django. - -#### django-mongo-engine - -[MongoEngine](https://github.com/MongoEngine/mongoengine) is a Python Object-Document Mapper for working with MongoDB. [Django support in MongoEngine](https://mongoengine-odm.readthedocs.io/django.html) is split from the main MongoEngine repository for working with Django. - -### Django SQL to MongoDB transpiler - -A different approach is to translate Django SQL query syntax into pymongo commands. - -
- Abstraction Layers -
- -This has several advantages - -#### Reuse Django Models - - Django is a stable framework with continuous development and enhancements. The [Django ORM](https://docs.djangoproject.com/en/dev/topics/db/models/) is quite extensive and feature rich. Defining *a third party* ORM to work with MongoDB means reproducing the entire Django ORM again. The new ORM needs to constantly align with the Django ORM. Several Django features will never make it into the third party ORM. The idea behind Djongo is to **reuse** existing Django ORM features by finally translating SQL queries to MongoDB syntax. - -#### Future proof your code - - As **SQL syntax will never change** regardless of future additions to Django, by using Djongo your code is now future proof! - -#### Stop the immigrations - - MongoDB is a [schema free](https://docs.mongodb.com/manual/data-modeling/) DB. You no longer need to run manage.py migrate every time you change a model. Making changes to your models is easier. - -#### Work on the Real Django - -Djongo does not make you use a forked version of Django, access MongoDB with the Real Django framework. - -### Common misconceptions - -#### Relational data cannot be represented within a non relational data store - -Relations between objects and subsequent joins can be done in non relational data stores by performing multiple [application level lookups](https://www.mongodb.com/blog/post/6-rules-of-thumb-for-mongodb-schema-design-part-2) - -#### Unstructured database cannot store structured data - -Unstructured data is a super set of structured data. Specifying the data structure to MongoDB will only be ignored by it. - -More details on [implementing Django MongoDB connector](/djongo/django-mongodb-connector-design-document/) can be found in the design document. - - - diff --git a/no-response.yml b/no-response.yml new file mode 100644 index 00000000..f4b26fa7 --- /dev/null +++ b/no-response.yml @@ -0,0 +1,10 @@ +# Number of days of inactivity before an Issue is closed for lack of response +daysUntilClose: 7 +# Label requiring a response +responseRequiredLabel: more-info-needed +# Comment to post when closing an Issue for lack of response. Set to `false` to disable +closeComment: > + This issue has been automatically closed because there has been no response + to our request for more information from the original author. With only the + information that is currently in the issue, we don't have enough information + to take action. diff --git a/requirements.txt b/requirements.txt index 236ffddc..a690aaba 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ -sqlparse>=0.2.3 -pymongo>=3.2.0 -django>=1.11 +sqlparse==0.4.2 +pymongo>=3.2.0,<4.0.0 +django>=2.0 +pytz>=2018.5 diff --git a/setup.py b/setup.py index 6f473ddf..73cb63e0 100644 --- a/setup.py +++ b/setup.py @@ -1,61 +1,121 @@ +# THIS FILE WAS CHANGED ON - 14 Apr 2022 + from distutils.core import setup +from setuptools import find_packages +import os +import codecs +import re +import sys LONG_DESCRIPTION = """ -Use Mongodb as a backend database for your django project, without changing a single django model! -Usage:: +Use Mongodb as a backend database for your django project, without changing a +single django model! + +Usage +----- + +1. Install djongo:: + + pip install djongo + +2. Into settings.py file of your project, add:: - pip install djongo - -Into settings.py file of your project, add:: + DATABASES = { + 'default': { + 'ENGINE': 'djongo', + 'NAME': 'your-db-name', + } + } - DATABASES = { - 'default': { - 'ENGINE': 'djongo', - 'NAME': 'your-db-name', - } - } +3. Run (ONLY the first time to create collections in mongoDB):: -Run (ONLY the first time to create collections in mongoDB):: - - manage.py migrate - -YOUR ARE SET! HAVE FUN! + manage.py makemigrations + manage.py migrate -Requirements: +YOUR ARE SET! HAVE FUN! -1. djongo requires python 3.5 or above. +Requirements +------------ +1. Djongo requires python 3.6 or above. -How it works: -djongo is a SQL to mongodb query transpiler. It translates a SQL query string into a mongoDB query document. As a result, all Django features, models etc work as is. - -Django contrib modules:: - +How it works +------------ + +Djongo is a SQL to mongodb query transpiler. It translates a SQL query string +into a mongoDB query document. As a result, all Django features, models etc +work as is. + +Django contrib modules:: + 'django.contrib.admin', - 'django.contrib.auth', + 'django.contrib.auth', 'django.contrib.sessions', and others... fully supported. - -`Full Documentation `_ + +Important links +--------------- + +* `Full Documentation `_ +* `Source code `_ """ + +BASE_DIR = os.path.abspath(os.path.dirname(__file__)) +packages = find_packages() + + +def read(*parts): + with codecs.open(os.path.join(BASE_DIR, *parts), 'r') as fp: + return fp.read() + + +def find_version(*file_paths): + version_file = read(*file_paths) + version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", + version_file, re.M) + if version_match: + return version_match.group(1) + raise RuntimeError("Unable to find version string.") + + +install_requires = [ + 'sqlparse==0.4.2', + 'pymongo>=3.2.0,<4.0.0', + 'django>=2.1', +] + +if sys.version_info.major == 3 and sys.version_info.minor < 7: + install_requires.append("dataclasses") + setup( name='djongo', - version='1.2.5', - packages=['djongo'], - url='https://nesdis.github.io/djongo/', - license='BSD', - author='nesdis', - author_email='nesdis@gmail.com', - description='Driver for allowing Django to use MongoDB as the database backend.', - install_requires=[ - 'sqlparse>=0.2.3', - 'pymongo>=3.2.0', - 'django>=1.8' - ], - long_description=LONG_DESCRIPTION, - python_requires='>=3.5' + version=find_version("djongo", "__init__.py"), + include_package_data=True, + packages=packages, + url='https://www.djongomapper.com/', + license='AGPL', + author='doableware', + author_email='support@doableware.com', + description=( + 'Driver for allowing Django to use MongoDB as the database backend.'), + install_requires=install_requires, + extras_require=dict( + json=[ + 'jsonfield>=2.0.2', + 'django-jsoneditor>=0.0.12', + ], + ), + long_description=LONG_DESCRIPTION, + python_requires='>=3.6', + keywords='Django MongoDB driver connector', + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: BSD License', + 'Programming Language :: Python :: 3.6', + ] ) diff --git a/tests/django_tests/results/test_list.json b/tests/django_tests/results/test_list.json new file mode 100644 index 00000000..35653c43 --- /dev/null +++ b/tests/django_tests/results/test_list.json @@ -0,0 +1,11969 @@ +{ + "v21": { + "repo_tests": [], + "p36": { + "sqlite": { + "passing": {}, + "failing": {} + }, + "mongodb": { + "passing": {}, + "failing": {} + } + }, + "p38": { + "sqlite": { + "passing": {}, + "failing": {} + }, + "mongodb": { + "passing": {}, + "failing": {} + } + } + }, + "v22": { + "repo_tests": [ + "absolute_url_overrides.tests.AbsoluteUrlOverrideTests.test_get_absolute_url", + "absolute_url_overrides.tests.AbsoluteUrlOverrideTests.test_insert_get_absolute_url", + "absolute_url_overrides.tests.AbsoluteUrlOverrideTests.test_override_get_absolute_url", + "admin_autodiscover.tests.AdminAutoDiscoverTests.test_double_call_autodiscover", + "admin_default_site.tests.CustomAdminSiteTests.test_use_custom_admin_site", + "admin_default_site.tests.DefaultAdminSiteTests.test_use_default_admin_site", + "admin_docs.test_middleware.XViewMiddlewareTest.test_callable_object_view", + "admin_docs.test_middleware.XViewMiddlewareTest.test_xview_class", + "admin_docs.test_middleware.XViewMiddlewareTest.test_xview_func", + "admin_docs.test_utils.TestUtils.test_description_output", + "admin_docs.test_utils.TestUtils.test_initial_header_level", + "admin_docs.test_utils.TestUtils.test_parse_docstring", + "admin_docs.test_utils.TestUtils.test_parse_rst", + "admin_docs.test_utils.TestUtils.test_publish_parts", + "admin_docs.test_utils.TestUtils.test_title_output", + "admin_docs.test_utils.TestUtils.test_trim_docstring", + "admin_inlines.test_templates.TestTemplates.test_javascript_escaping", + "admin_scripts.tests.ArgumentOrder.test_option_then_setting", + "admin_scripts.tests.ArgumentOrder.test_option_then_setting_then_option", + "admin_scripts.tests.ArgumentOrder.test_setting_then_option", + "admin_scripts.tests.ArgumentOrder.test_setting_then_short_option", + "admin_scripts.tests.ArgumentOrder.test_short_option_then_setting", + "admin_scripts.tests.CommandTypes.test_app_command", + "admin_scripts.tests.CommandTypes.test_app_command_invalid_app_label", + "admin_scripts.tests.CommandTypes.test_app_command_multiple_apps", + "admin_scripts.tests.CommandTypes.test_app_command_no_apps", + "admin_scripts.tests.CommandTypes.test_app_command_some_invalid_app_labels", + "admin_scripts.tests.CommandTypes.test_base_command", + "admin_scripts.tests.CommandTypes.test_base_command_multiple_label", + "admin_scripts.tests.CommandTypes.test_base_command_no_label", + "admin_scripts.tests.CommandTypes.test_base_command_with_option", + "admin_scripts.tests.CommandTypes.test_base_command_with_options", + "admin_scripts.tests.CommandTypes.test_base_command_with_wrong_option", + "admin_scripts.tests.CommandTypes.test_base_run_from_argv", + "admin_scripts.tests.CommandTypes.test_color_style", + "admin_scripts.tests.CommandTypes.test_command_color", + "admin_scripts.tests.CommandTypes.test_command_no_color", + "admin_scripts.tests.CommandTypes.test_custom_stderr", + "admin_scripts.tests.CommandTypes.test_custom_stdout", + "admin_scripts.tests.CommandTypes.test_force_color_command_init", + "admin_scripts.tests.CommandTypes.test_force_color_execute", + "admin_scripts.tests.CommandTypes.test_help", + "admin_scripts.tests.CommandTypes.test_help_alternative", + "admin_scripts.tests.CommandTypes.test_help_commands", + "admin_scripts.tests.CommandTypes.test_help_short_altert", + "admin_scripts.tests.CommandTypes.test_label_command", + "admin_scripts.tests.CommandTypes.test_label_command_multiple_label", + "admin_scripts.tests.CommandTypes.test_label_command_no_label", + "admin_scripts.tests.CommandTypes.test_no_color_force_color_mutually_exclusive_command_init", + "admin_scripts.tests.CommandTypes.test_no_color_force_color_mutually_exclusive_execute", + "admin_scripts.tests.CommandTypes.test_noargs", + "admin_scripts.tests.CommandTypes.test_noargs_with_args", + "admin_scripts.tests.CommandTypes.test_run_from_argv_closes_connections", + "admin_scripts.tests.CommandTypes.test_run_from_argv_non_ascii_error", + "admin_scripts.tests.CommandTypes.test_specific_help", + "admin_scripts.tests.CommandTypes.test_version", + "admin_scripts.tests.CommandTypes.test_version_alternative", + "admin_scripts.tests.DiffSettings.test_all", + "admin_scripts.tests.DiffSettings.test_basic", + "admin_scripts.tests.DiffSettings.test_custom_default", + "admin_scripts.tests.DiffSettings.test_settings_configured", + "admin_scripts.tests.DiffSettings.test_unified", + "admin_scripts.tests.DiffSettings.test_unified_all", + "admin_scripts.tests.Discovery.test_precedence", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_custom_command", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_custom_command_with_environment", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_custom_command_with_settings", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_custom_command", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_custom_command_with_environment", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_custom_command_with_settings", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_custom_command", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_custom_command_with_environment", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_custom_command_with_settings", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_custom_command", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_custom_command_with_environment", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_custom_command_with_settings", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_custom_command", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_custom_command_with_environment", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_custom_command_with_settings", + "admin_scripts.tests.DjangoAdminNoSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminNoSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminNoSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminNoSettings.test_commands_with_invalid_settings", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_builtin_command", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_custom_command", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_setup_environ", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_setup_environ_custom_template", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_startapp_unicode_name", + "admin_scripts.tests.DjangoAdminSuggestions.test_no_suggestions", + "admin_scripts.tests.DjangoAdminSuggestions.test_suggestions", + "admin_scripts.tests.Dumpdata.test_pks_parsing", + "admin_scripts.tests.MainModule.test_program_name_in_help", + "admin_scripts.tests.MainModule.test_runs_django_admin", + "admin_scripts.tests.ManageAlternateSettings.test_builtin_command", + "admin_scripts.tests.ManageAlternateSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageAlternateSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageAlternateSettings.test_builtin_with_environment", + "admin_scripts.tests.ManageAlternateSettings.test_builtin_with_settings", + "admin_scripts.tests.ManageAlternateSettings.test_custom_command", + "admin_scripts.tests.ManageAlternateSettings.test_custom_command_output_color", + "admin_scripts.tests.ManageAlternateSettings.test_custom_command_with_environment", + "admin_scripts.tests.ManageAlternateSettings.test_custom_command_with_settings", + "admin_scripts.tests.ManageCheck.test_app_with_import", + "admin_scripts.tests.ManageCheck.test_broken_app", + "admin_scripts.tests.ManageCheck.test_complex_app", + "admin_scripts.tests.ManageCheck.test_nonexistent_app", + "admin_scripts.tests.ManageCheck.test_output_format", + "admin_scripts.tests.ManageCheck.test_warning_does_not_halt", + "admin_scripts.tests.ManageDefaultSettings.test_builtin_command", + "admin_scripts.tests.ManageDefaultSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageDefaultSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageDefaultSettings.test_builtin_with_environment", + "admin_scripts.tests.ManageDefaultSettings.test_builtin_with_settings", + "admin_scripts.tests.ManageDefaultSettings.test_custom_command", + "admin_scripts.tests.ManageDefaultSettings.test_custom_command_with_environment", + "admin_scripts.tests.ManageDefaultSettings.test_custom_command_with_settings", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_builtin_command", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_builtin_with_environment", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_builtin_with_settings", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_custom_command", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_custom_command_with_environment", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_custom_command_with_settings", + "admin_scripts.tests.ManageMinimalSettings.test_builtin_command", + "admin_scripts.tests.ManageMinimalSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageMinimalSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageMinimalSettings.test_builtin_with_environment", + "admin_scripts.tests.ManageMinimalSettings.test_builtin_with_settings", + "admin_scripts.tests.ManageMinimalSettings.test_custom_command", + "admin_scripts.tests.ManageMinimalSettings.test_custom_command_with_environment", + "admin_scripts.tests.ManageMinimalSettings.test_custom_command_with_settings", + "admin_scripts.tests.ManageMultipleSettings.test_builtin_command", + "admin_scripts.tests.ManageMultipleSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageMultipleSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageMultipleSettings.test_builtin_with_environment", + "admin_scripts.tests.ManageMultipleSettings.test_builtin_with_settings", + "admin_scripts.tests.ManageMultipleSettings.test_custom_command", + "admin_scripts.tests.ManageMultipleSettings.test_custom_command_with_environment", + "admin_scripts.tests.ManageMultipleSettings.test_custom_command_with_settings", + "admin_scripts.tests.ManageNoSettings.test_builtin_command", + "admin_scripts.tests.ManageNoSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageNoSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageRunserver.test_no_database", + "admin_scripts.tests.ManageRunserver.test_readonly_database", + "admin_scripts.tests.ManageRunserver.test_runner_addrport_ipv6", + "admin_scripts.tests.ManageRunserver.test_runner_ambiguous", + "admin_scripts.tests.ManageRunserver.test_runner_custom_defaults", + "admin_scripts.tests.ManageRunserver.test_runner_custom_defaults_ipv6", + "admin_scripts.tests.ManageRunserver.test_runner_hostname", + "admin_scripts.tests.ManageRunserver.test_runner_hostname_ipv6", + "admin_scripts.tests.ManageRunserver.test_runserver_addrport", + "admin_scripts.tests.ManageRunserverEmptyAllowedHosts.test_empty_allowed_hosts_error", + "admin_scripts.tests.ManageRunserverMigrationWarning.test_migration_warning_multiple_apps", + "admin_scripts.tests.ManageRunserverMigrationWarning.test_migration_warning_one_app", + "admin_scripts.tests.ManageSettingsWithSettingsErrors.test_attribute_error", + "admin_scripts.tests.ManageSettingsWithSettingsErrors.test_help", + "admin_scripts.tests.ManageSettingsWithSettingsErrors.test_import_error", + "admin_scripts.tests.ManageSettingsWithSettingsErrors.test_key_error", + "admin_scripts.tests.ManageTestserver.test_params_to_runserver", + "admin_scripts.tests.ManageTestserver.test_testserver_handle_params", + "admin_scripts.tests.StartApp.test_importable_name", + "admin_scripts.tests.StartApp.test_invalid_name", + "admin_scripts.tests.StartProject.test_custom_project_destination_missing", + "admin_scripts.tests.StartProject.test_custom_project_template", + "admin_scripts.tests.StartProject.test_custom_project_template_context_variables", + "admin_scripts.tests.StartProject.test_custom_project_template_from_tarball_by_path", + "admin_scripts.tests.StartProject.test_custom_project_template_from_tarball_by_url", + "admin_scripts.tests.StartProject.test_custom_project_template_from_tarball_to_alternative_location", + "admin_scripts.tests.StartProject.test_custom_project_template_with_non_ascii_templates", + "admin_scripts.tests.StartProject.test_file_without_extension", + "admin_scripts.tests.StartProject.test_importable_project_name", + "admin_scripts.tests.StartProject.test_invalid_project_name", + "admin_scripts.tests.StartProject.test_no_escaping_of_project_variables", + "admin_scripts.tests.StartProject.test_project_template_tarball_url", + "admin_scripts.tests.StartProject.test_simple_project", + "admin_scripts.tests.StartProject.test_simple_project_different_directory", + "admin_scripts.tests.StartProject.test_template_dir_with_trailing_slash", + "admin_scripts.tests.StartProject.test_wrong_args", + "admin_views.test_forms.AdminAuthenticationFormTests.test_inactive_user", + "admin_views.test_static_deprecation.AdminStaticDeprecationTests.test", + "app_loading.tests.EggLoadingTest.test_egg1", + "app_loading.tests.EggLoadingTest.test_egg2", + "app_loading.tests.EggLoadingTest.test_egg3", + "app_loading.tests.EggLoadingTest.test_egg4", + "app_loading.tests.EggLoadingTest.test_egg5", + "app_loading.tests.GetModelsTest.test_get_model_only_returns_installed_models", + "app_loading.tests.GetModelsTest.test_get_models_only_returns_installed_models", + "auth_tests.test_admin_multidb.MultiDatabaseTests.test_add_view", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_message_attrs", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_perm_in_perms_attrs", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_perms_attrs", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_session_is_accessed", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_session_not_accessed", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_user_attrs", + "auth_tests.test_context_processors.PermWrapperTests.test_iter", + "auth_tests.test_context_processors.PermWrapperTests.test_permlookupdict_in", + "auth_tests.test_context_processors.PermWrapperTests.test_permwrapper_in", + "auth_tests.test_hashers.BasePasswordHasherTests.test_attributes", + "auth_tests.test_hashers.BasePasswordHasherTests.test_encode", + "auth_tests.test_hashers.BasePasswordHasherTests.test_harden_runtime", + "auth_tests.test_hashers.BasePasswordHasherTests.test_load_library_importerror", + "auth_tests.test_hashers.BasePasswordHasherTests.test_load_library_no_algorithm", + "auth_tests.test_hashers.BasePasswordHasherTests.test_must_update", + "auth_tests.test_hashers.BasePasswordHasherTests.test_safe_summary", + "auth_tests.test_hashers.BasePasswordHasherTests.test_verify", + "auth_tests.test_hashers.TestUtilsHashPass.test_bad_algorithm", + "auth_tests.test_hashers.TestUtilsHashPass.test_bcrypt", + "auth_tests.test_hashers.TestUtilsHashPass.test_bcrypt_harden_runtime", + "auth_tests.test_hashers.TestUtilsHashPass.test_bcrypt_sha256", + "auth_tests.test_hashers.TestUtilsHashPass.test_bcrypt_upgrade", + "auth_tests.test_hashers.TestUtilsHashPass.test_check_password_calls_harden_runtime", + "auth_tests.test_hashers.TestUtilsHashPass.test_crypt", + "auth_tests.test_hashers.TestUtilsHashPass.test_is_password_usable", + "auth_tests.test_hashers.TestUtilsHashPass.test_low_level_pbkdf2", + "auth_tests.test_hashers.TestUtilsHashPass.test_low_level_pbkdf2_sha1", + "auth_tests.test_hashers.TestUtilsHashPass.test_md5", + "auth_tests.test_hashers.TestUtilsHashPass.test_no_upgrade", + "auth_tests.test_hashers.TestUtilsHashPass.test_no_upgrade_on_incorrect_pass", + "auth_tests.test_hashers.TestUtilsHashPass.test_pbkdf2", + "auth_tests.test_hashers.TestUtilsHashPass.test_pbkdf2_harden_runtime", + "auth_tests.test_hashers.TestUtilsHashPass.test_pbkdf2_upgrade", + "auth_tests.test_hashers.TestUtilsHashPass.test_pbkdf2_upgrade_new_hasher", + "auth_tests.test_hashers.TestUtilsHashPass.test_sha1", + "auth_tests.test_hashers.TestUtilsHashPass.test_simple", + "auth_tests.test_hashers.TestUtilsHashPass.test_unsalted_md5", + "auth_tests.test_hashers.TestUtilsHashPass.test_unsalted_sha1", + "auth_tests.test_hashers.TestUtilsHashPass.test_unspecified_password", + "auth_tests.test_hashers.TestUtilsHashPass.test_unusable", + "auth_tests.test_hashers.TestUtilsHashPass.test_upgrade", + "auth_tests.test_hashers.TestUtilsHashPassArgon2.test_argon2", + "auth_tests.test_hashers.TestUtilsHashPassArgon2.test_argon2_upgrade", + "auth_tests.test_hashers.TestUtilsHashPassArgon2.test_argon2_version_upgrade", + "auth_tests.test_middleware.TestAuthenticationMiddleware.test_changed_password_invalidates_session", + "auth_tests.test_middleware.TestAuthenticationMiddleware.test_no_password_change_doesnt_invalidate_session", + "auth_tests.test_mixins.AccessMixinTests.test_access_mixin_permission_denied_response", + "auth_tests.test_mixins.AccessMixinTests.test_stacked_mixins_missing_permission", + "auth_tests.test_mixins.AccessMixinTests.test_stacked_mixins_not_logged_in", + "auth_tests.test_mixins.AccessMixinTests.test_stacked_mixins_success", + "auth_tests.test_mixins.LoginRequiredMixinTests.test_login_required", + "auth_tests.test_mixins.PermissionsRequiredMixinTests.test_many_permissions_pass", + "auth_tests.test_mixins.PermissionsRequiredMixinTests.test_permissioned_denied_exception_raised", + "auth_tests.test_mixins.PermissionsRequiredMixinTests.test_permissioned_denied_redirect", + "auth_tests.test_mixins.PermissionsRequiredMixinTests.test_single_permission_pass", + "auth_tests.test_mixins.UserPassesTestTests.test_custom_redirect_parameter", + "auth_tests.test_mixins.UserPassesTestTests.test_custom_redirect_url", + "auth_tests.test_mixins.UserPassesTestTests.test_default", + "auth_tests.test_mixins.UserPassesTestTests.test_no_redirect_parameter", + "auth_tests.test_mixins.UserPassesTestTests.test_raise_exception", + "auth_tests.test_mixins.UserPassesTestTests.test_raise_exception_custom_message", + "auth_tests.test_mixins.UserPassesTestTests.test_raise_exception_custom_message_function", + "auth_tests.test_mixins.UserPassesTestTests.test_user_passes", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_header_disappears", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_inactive_user", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_known_user", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_last_login", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_no_remote_user", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_unknown_user", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_header_disappears", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_inactive_user", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_known_user", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_last_login", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_no_remote_user", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_unknown_user", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_header_disappears", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_inactive_user", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_known_user", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_last_login", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_no_remote_user", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_unknown_user", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_header_disappears", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_inactive_user", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_known_user", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_last_login", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_no_remote_user", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_unknown_user", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_header_disappears", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_inactive_user", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_known_user", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_last_login", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_no_remote_user", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_unknown_user", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user.RemoteUserTest.test_header_disappears", + "auth_tests.test_remote_user.RemoteUserTest.test_inactive_user", + "auth_tests.test_remote_user.RemoteUserTest.test_known_user", + "auth_tests.test_remote_user.RemoteUserTest.test_last_login", + "auth_tests.test_remote_user.RemoteUserTest.test_no_remote_user", + "auth_tests.test_remote_user.RemoteUserTest.test_unknown_user", + "auth_tests.test_remote_user.RemoteUserTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user_deprecation.RemoteUserCustomTest.test_configure_user_deprecation_warning", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordChangeDoneView", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetChangeView", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetCompleteView", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetConfirmView_invalid_token", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetConfirmView_valid_token", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetDoneView", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetView", + "auth_tests.test_tokens.TokenGeneratorTest.test_10265", + "auth_tests.test_tokens.TokenGeneratorTest.test_check_token_with_nonexistent_token_and_user", + "auth_tests.test_tokens.TokenGeneratorTest.test_make_token", + "auth_tests.test_tokens.TokenGeneratorTest.test_timeout", + "auth_tests.test_tokens.TokenGeneratorTest.test_token_with_different_secret", + "auth_tests.test_validators.CommonPasswordValidatorTest.test_help_text", + "auth_tests.test_validators.CommonPasswordValidatorTest.test_validate", + "auth_tests.test_validators.CommonPasswordValidatorTest.test_validate_custom_list", + "auth_tests.test_validators.CommonPasswordValidatorTest.test_validate_django_supplied_file", + "auth_tests.test_validators.MinimumLengthValidatorTest.test_help_text", + "auth_tests.test_validators.MinimumLengthValidatorTest.test_validate", + "auth_tests.test_validators.NumericPasswordValidatorTest.test_help_text", + "auth_tests.test_validators.NumericPasswordValidatorTest.test_validate", + "auth_tests.test_validators.PasswordValidationTest.test_empty_password_validator_help_text_html", + "auth_tests.test_validators.PasswordValidationTest.test_get_default_password_validators", + "auth_tests.test_validators.PasswordValidationTest.test_get_password_validators_custom", + "auth_tests.test_validators.PasswordValidationTest.test_password_changed", + "auth_tests.test_validators.PasswordValidationTest.test_password_changed_with_custom_validator", + "auth_tests.test_validators.PasswordValidationTest.test_password_validators_help_text_html", + "auth_tests.test_validators.PasswordValidationTest.test_password_validators_help_text_html_escaping", + "auth_tests.test_validators.PasswordValidationTest.test_password_validators_help_texts", + "auth_tests.test_validators.PasswordValidationTest.test_validate_password", + "auth_tests.test_validators.UserAttributeSimilarityValidatorTest.test_help_text", + "auth_tests.test_validators.UserAttributeSimilarityValidatorTest.test_validate", + "auth_tests.test_validators.UserAttributeSimilarityValidatorTest.test_validate_property", + "auth_tests.test_validators.UsernameValidatorsTests.test_ascii_validator", + "auth_tests.test_validators.UsernameValidatorsTests.test_unicode_validator", + "backends.base.test_creation.TestDbSignatureTests.test_custom_test_name", + "backends.base.test_creation.TestDbSignatureTests.test_custom_test_name_with_test_prefix", + "backends.base.test_creation.TestDbSignatureTests.test_default_name", + "backends.base.test_features.TestDatabaseFeatures.test_nonexistent_feature", + "backends.base.test_operations.DatabaseOperationTests.test_distinct_on_fields", + "backends.base.test_operations.DatabaseOperationTests.test_subtract_temporals", + "backends.base.test_operations.DatabaseOperationTests.test_window_frame_raise_not_supported_error", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_datetimefield_value", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_timefield_value", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_timefield_value_none", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_timefield_value_unaware", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_unknown_value_date", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_unknown_value_decimal", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_unknown_value_time", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_date_extract_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_date_interval_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_date_trunc_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_datetime_cast_date_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_datetime_cast_time_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_datetime_extract_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_datetime_trunc_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_deferrable_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_end_transaction_rollback", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_no_limit_value", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_pk_default_value", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_quote_name", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_regex_lookup", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_sequence_reset_by_name_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_set_time_zone_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_sql_flush", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_tablespace_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_time_extract_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_time_trunc_sql", + "backends.base.test_schema.SchemaEditorTests.test_effective_default_callable", + "backends.mysql.test_creation.DatabaseCreationTests.test_clone_test_db_database_exists", + "backends.mysql.test_creation.DatabaseCreationTests.test_create_test_db_database_exists", + "backends.mysql.test_creation.DatabaseCreationTests.test_create_test_db_unexpected_error", + "backends.mysql.test_features.TestFeatures.test_skip_locked_no_wait", + "backends.mysql.test_features.TestFeatures.test_supports_transactions", + "backends.mysql.test_schema.SchemaEditorTests.test_quote_value", + "backends.mysql.tests.IsolationLevelTests.test_auto_is_null_auto_config", + "backends.mysql.tests.IsolationLevelTests.test_connect_isolation_level", + "backends.mysql.tests.IsolationLevelTests.test_default_isolation_level", + "backends.mysql.tests.IsolationLevelTests.test_isolation_level_validation", + "backends.mysql.tests.IsolationLevelTests.test_setting_isolation_level", + "backends.mysql.tests.IsolationLevelTests.test_uppercase_isolation_level", + "backends.oracle.test_creation.DatabaseCreationTests.test_create_test_db", + "backends.oracle.test_creation.DatabaseCreationTests.test_create_test_user", + "backends.oracle.test_creation.DatabaseCreationTests.test_oracle_managed_files", + "backends.oracle.test_operations.OperationsTests.test_bulk_batch_size", + "backends.oracle.test_operations.OperationsTests.test_sequence_name_truncation", + "backends.postgresql.test_creation.DatabaseCreationTests.test_create_test_db", + "backends.postgresql.test_creation.DatabaseCreationTests.test_sql_table_creation_suffix_with_encoding", + "backends.postgresql.test_creation.DatabaseCreationTests.test_sql_table_creation_suffix_with_encoding_and_template", + "backends.postgresql.test_creation.DatabaseCreationTests.test_sql_table_creation_suffix_with_none_settings", + "backends.postgresql.test_creation.DatabaseCreationTests.test_sql_table_creation_suffix_with_template", + "backends.postgresql.tests.Tests.test_connect_and_rollback", + "backends.postgresql.tests.Tests.test_connect_isolation_level", + "backends.postgresql.tests.Tests.test_connect_no_is_usable_checks", + "backends.postgresql.tests.Tests.test_connect_non_autocommit", + "backends.postgresql.tests.Tests.test_correct_extraction_psycopg2_version", + "backends.postgresql.tests.Tests.test_database_name_too_long", + "backends.postgresql.tests.Tests.test_lookup_cast", + "backends.postgresql.tests.Tests.test_nodb_connection", + "backends.postgresql.tests.Tests.test_select_ascii_array", + "backends.postgresql.tests.Tests.test_select_unicode_array", + "backends.sqlite.test_introspection.IntrospectionTests.test_get_primary_key_column", + "backends.sqlite.test_introspection.ParsingTests.test_check_and_unique_column", + "backends.sqlite.test_introspection.ParsingTests.test_check_column", + "backends.sqlite.test_introspection.ParsingTests.test_check_column_with_operators_and_functions", + "backends.sqlite.test_introspection.ParsingTests.test_check_constraint", + "backends.sqlite.test_introspection.ParsingTests.test_unique_column", + "backends.sqlite.test_introspection.ParsingTests.test_unique_constraint", + "backends.sqlite.test_introspection.ParsingTests.test_unique_constraint_multicolumn", + "backends.test_ddl_references.ColumnsTests.test_references_column", + "backends.test_ddl_references.ColumnsTests.test_references_table", + "backends.test_ddl_references.ColumnsTests.test_rename_column_references", + "backends.test_ddl_references.ColumnsTests.test_rename_table_references", + "backends.test_ddl_references.ColumnsTests.test_repr", + "backends.test_ddl_references.ColumnsTests.test_str", + "backends.test_ddl_references.ForeignKeyNameTests.test_references_column", + "backends.test_ddl_references.ForeignKeyNameTests.test_references_table", + "backends.test_ddl_references.ForeignKeyNameTests.test_rename_column_references", + "backends.test_ddl_references.ForeignKeyNameTests.test_rename_table_references", + "backends.test_ddl_references.ForeignKeyNameTests.test_repr", + "backends.test_ddl_references.ForeignKeyNameTests.test_str", + "backends.test_ddl_references.IndexNameTests.test_references_column", + "backends.test_ddl_references.IndexNameTests.test_references_table", + "backends.test_ddl_references.IndexNameTests.test_rename_column_references", + "backends.test_ddl_references.IndexNameTests.test_rename_table_references", + "backends.test_ddl_references.IndexNameTests.test_repr", + "backends.test_ddl_references.IndexNameTests.test_str", + "backends.test_ddl_references.StatementTests.test_references_column", + "backends.test_ddl_references.StatementTests.test_references_table", + "backends.test_ddl_references.StatementTests.test_rename_column_references", + "backends.test_ddl_references.StatementTests.test_rename_table_references", + "backends.test_ddl_references.StatementTests.test_repr", + "backends.test_ddl_references.StatementTests.test_str", + "backends.test_ddl_references.TableTests.test_references_table", + "backends.test_ddl_references.TableTests.test_rename_table_references", + "backends.test_ddl_references.TableTests.test_repr", + "backends.test_ddl_references.TableTests.test_str", + "backends.test_utils.CursorWrapperTests.test_callproc_kparams", + "backends.test_utils.CursorWrapperTests.test_callproc_with_int_params", + "backends.test_utils.CursorWrapperTests.test_callproc_without_params", + "backends.test_utils.CursorWrapperTests.test_unsupported_callproc_kparams_raises_error", + "backends.test_utils.TestUtils.test_format_number", + "backends.test_utils.TestUtils.test_split_identifier", + "backends.test_utils.TestUtils.test_truncate_name", + "bash_completion.tests.BashCompletionTests.test_app_completion", + "bash_completion.tests.BashCompletionTests.test_completed_subcommand", + "bash_completion.tests.BashCompletionTests.test_custom_command", + "bash_completion.tests.BashCompletionTests.test_django_admin_py", + "bash_completion.tests.BashCompletionTests.test_help", + "bash_completion.tests.BashCompletionTests.test_manage_py", + "bash_completion.tests.BashCompletionTests.test_subcommands", + "builtin_server.tests.ServerHandlerChunksProperly.test_chunked_data", + "builtin_server.tests.WSGIFileWrapperTests.test_file_wrapper_no_sendfile", + "builtin_server.tests.WSGIFileWrapperTests.test_file_wrapper_uses_sendfile", + "check_framework.test_caches.CheckCacheSettingsAppDirsTest.test_default_cache_included", + "check_framework.test_caches.CheckCacheSettingsAppDirsTest.test_default_cache_not_included", + "check_framework.test_database.DatabaseCheckTests.test_database_checks_called", + "check_framework.test_database.DatabaseCheckTests.test_database_checks_not_run_by_default", + "check_framework.test_database.DatabaseCheckTests.test_mysql_strict_mode", + "check_framework.test_model_checks.DuplicateDBTableTests.test_collision_across_apps", + "check_framework.test_model_checks.DuplicateDBTableTests.test_collision_in_same_app", + "check_framework.test_model_checks.DuplicateDBTableTests.test_no_collision_for_proxy_models", + "check_framework.test_model_checks.DuplicateDBTableTests.test_no_collision_for_unmanaged_models", + "check_framework.test_model_field_deprecation.TestDeprecatedField.test_default_details", + "check_framework.test_model_field_deprecation.TestDeprecatedField.test_user_specified_details", + "check_framework.test_model_field_deprecation.TestRemovedField.test_default_details", + "check_framework.test_model_field_deprecation.TestRemovedField.test_user_specified_details", + "check_framework.test_multi_db.TestMultiDBChecks.test_checks_called_on_the_default_database", + "check_framework.test_multi_db.TestMultiDBChecks.test_checks_called_on_the_other_database", + "check_framework.test_security.CheckAllowedHostsTest.test_allowed_hosts_empty", + "check_framework.test_security.CheckAllowedHostsTest.test_allowed_hosts_set", + "check_framework.test_security.CheckCSRFCookieSecureTest.test_use_sessions_with_csrf_cookie_secure_false", + "check_framework.test_security.CheckCSRFCookieSecureTest.test_with_csrf_cookie_secure_false", + "check_framework.test_security.CheckCSRFCookieSecureTest.test_with_csrf_cookie_secure_false_no_middleware", + "check_framework.test_security.CheckCSRFCookieSecureTest.test_with_csrf_cookie_secure_true", + "check_framework.test_security.CheckCSRFMiddlewareTest.test_no_csrf_middleware", + "check_framework.test_security.CheckCSRFMiddlewareTest.test_with_csrf_middleware", + "check_framework.test_security.CheckContentTypeNosniffTest.test_no_content_type_nosniff", + "check_framework.test_security.CheckContentTypeNosniffTest.test_no_content_type_nosniff_no_middleware", + "check_framework.test_security.CheckContentTypeNosniffTest.test_with_content_type_nosniff", + "check_framework.test_security.CheckDebugTest.test_debug_false", + "check_framework.test_security.CheckDebugTest.test_debug_true", + "check_framework.test_security.CheckSSLRedirectTest.test_no_ssl_redirect", + "check_framework.test_security.CheckSSLRedirectTest.test_no_ssl_redirect_no_middleware", + "check_framework.test_security.CheckSSLRedirectTest.test_with_ssl_redirect", + "check_framework.test_security.CheckSecretKeyTest.test_empty_secret_key", + "check_framework.test_security.CheckSecretKeyTest.test_low_entropy_secret_key", + "check_framework.test_security.CheckSecretKeyTest.test_low_length_secret_key", + "check_framework.test_security.CheckSecretKeyTest.test_missing_secret_key", + "check_framework.test_security.CheckSecretKeyTest.test_none_secret_key", + "check_framework.test_security.CheckSecretKeyTest.test_okay_secret_key", + "check_framework.test_security.CheckSecurityMiddlewareTest.test_no_security_middleware", + "check_framework.test_security.CheckSecurityMiddlewareTest.test_with_security_middleware", + "check_framework.test_security.CheckSessionCookieHttpOnlyTest.test_session_cookie_httponly_both", + "check_framework.test_security.CheckSessionCookieHttpOnlyTest.test_session_cookie_httponly_true", + "check_framework.test_security.CheckSessionCookieHttpOnlyTest.test_session_cookie_httponly_with_installed_app", + "check_framework.test_security.CheckSessionCookieHttpOnlyTest.test_session_cookie_httponly_with_middleware", + "check_framework.test_security.CheckSessionCookieSecureTest.test_session_cookie_secure_both", + "check_framework.test_security.CheckSessionCookieSecureTest.test_session_cookie_secure_true", + "check_framework.test_security.CheckSessionCookieSecureTest.test_session_cookie_secure_with_installed_app", + "check_framework.test_security.CheckSessionCookieSecureTest.test_session_cookie_secure_with_middleware", + "check_framework.test_security.CheckStrictTransportSecurityPreloadTest.test_no_sts_preload", + "check_framework.test_security.CheckStrictTransportSecurityPreloadTest.test_no_sts_preload_no_middleware", + "check_framework.test_security.CheckStrictTransportSecurityPreloadTest.test_no_sts_preload_no_seconds", + "check_framework.test_security.CheckStrictTransportSecurityPreloadTest.test_with_sts_preload", + "check_framework.test_security.CheckStrictTransportSecuritySubdomainsTest.test_no_sts_subdomains", + "check_framework.test_security.CheckStrictTransportSecuritySubdomainsTest.test_no_sts_subdomains_no_middleware", + "check_framework.test_security.CheckStrictTransportSecuritySubdomainsTest.test_no_sts_subdomains_no_seconds", + "check_framework.test_security.CheckStrictTransportSecuritySubdomainsTest.test_with_sts_subdomains", + "check_framework.test_security.CheckStrictTransportSecurityTest.test_no_sts", + "check_framework.test_security.CheckStrictTransportSecurityTest.test_no_sts_no_middleware", + "check_framework.test_security.CheckStrictTransportSecurityTest.test_with_sts", + "check_framework.test_security.CheckXFrameOptionsDenyTest.test_middleware_not_installed", + "check_framework.test_security.CheckXFrameOptionsDenyTest.test_x_frame_options_not_deny", + "check_framework.test_security.CheckXFrameOptionsDenyTest.test_xframe_deny", + "check_framework.test_security.CheckXFrameOptionsMiddlewareTest.test_middleware_installed", + "check_framework.test_security.CheckXFrameOptionsMiddlewareTest.test_middleware_not_installed", + "check_framework.test_security.CheckXssFilterTest.test_no_xss_filter", + "check_framework.test_security.CheckXssFilterTest.test_no_xss_filter_no_middleware", + "check_framework.test_security.CheckXssFilterTest.test_with_xss_filter", + "check_framework.test_templates.CheckTemplateSettingsAppDirsTest.test_app_dirs_and_loaders", + "check_framework.test_templates.CheckTemplateSettingsAppDirsTest.test_app_dirs_removed", + "check_framework.test_templates.CheckTemplateSettingsAppDirsTest.test_loaders_removed", + "check_framework.test_templates.CheckTemplateStringIfInvalidTest.test_string_if_invalid_both_are_strings", + "check_framework.test_templates.CheckTemplateStringIfInvalidTest.test_string_if_invalid_first_is_string", + "check_framework.test_templates.CheckTemplateStringIfInvalidTest.test_string_if_invalid_not_specified", + "check_framework.test_templates.CheckTemplateStringIfInvalidTest.test_string_if_invalid_not_string", + "check_framework.test_translation.TranslationCheckTests.test_invalid_language_code", + "check_framework.test_translation.TranslationCheckTests.test_valid_language_code", + "check_framework.test_urls.CheckCustomErrorHandlersTests.test_bad_handlers", + "check_framework.test_urls.CheckCustomErrorHandlersTests.test_good_handlers", + "check_framework.test_urls.CheckURLSettingsTests.test_empty_string_no_errors", + "check_framework.test_urls.CheckURLSettingsTests.test_media_url_no_slash", + "check_framework.test_urls.CheckURLSettingsTests.test_slash_no_errors", + "check_framework.test_urls.CheckURLSettingsTests.test_static_url_double_slash_allowed", + "check_framework.test_urls.CheckURLSettingsTests.test_static_url_no_slash", + "check_framework.test_urls.CheckUrlConfigTests.test_beginning_with_slash", + "check_framework.test_urls.CheckUrlConfigTests.test_beginning_with_slash_append_slash", + "check_framework.test_urls.CheckUrlConfigTests.test_check_non_unique_namespaces", + "check_framework.test_urls.CheckUrlConfigTests.test_check_resolver_recursive", + "check_framework.test_urls.CheckUrlConfigTests.test_check_unique_namespaces", + "check_framework.test_urls.CheckUrlConfigTests.test_contains_included_tuple", + "check_framework.test_urls.CheckUrlConfigTests.test_contains_tuple_not_url_instance", + "check_framework.test_urls.CheckUrlConfigTests.test_get_warning_for_invalid_pattern_other", + "check_framework.test_urls.CheckUrlConfigTests.test_get_warning_for_invalid_pattern_string", + "check_framework.test_urls.CheckUrlConfigTests.test_get_warning_for_invalid_pattern_tuple", + "check_framework.test_urls.CheckUrlConfigTests.test_include_with_dollar", + "check_framework.test_urls.CheckUrlConfigTests.test_name_with_colon", + "check_framework.test_urls.CheckUrlConfigTests.test_no_root_urlconf_in_settings", + "check_framework.test_urls.CheckUrlConfigTests.test_no_warnings", + "check_framework.test_urls.CheckUrlConfigTests.test_no_warnings_i18n", + "check_framework.test_urls.UpdatedToPathTests.test_beginning_with_caret", + "check_framework.test_urls.UpdatedToPathTests.test_contains_re_named_group", + "check_framework.test_urls.UpdatedToPathTests.test_ending_with_dollar", + "conditional_processing.tests.ConditionalGet.test_all_if_match", + "conditional_processing.tests.ConditionalGet.test_all_if_none_match", + "conditional_processing.tests.ConditionalGet.test_both_headers", + "conditional_processing.tests.ConditionalGet.test_both_headers_2", + "conditional_processing.tests.ConditionalGet.test_if_match", + "conditional_processing.tests.ConditionalGet.test_if_modified_since", + "conditional_processing.tests.ConditionalGet.test_if_none_match", + "conditional_processing.tests.ConditionalGet.test_if_unmodified_since", + "conditional_processing.tests.ConditionalGet.test_invalid_etag", + "conditional_processing.tests.ConditionalGet.test_single_condition_1", + "conditional_processing.tests.ConditionalGet.test_single_condition_2", + "conditional_processing.tests.ConditionalGet.test_single_condition_3", + "conditional_processing.tests.ConditionalGet.test_single_condition_4", + "conditional_processing.tests.ConditionalGet.test_single_condition_5", + "conditional_processing.tests.ConditionalGet.test_single_condition_6", + "conditional_processing.tests.ConditionalGet.test_single_condition_7", + "conditional_processing.tests.ConditionalGet.test_single_condition_8", + "conditional_processing.tests.ConditionalGet.test_single_condition_9", + "conditional_processing.tests.ConditionalGet.test_single_condition_head", + "conditional_processing.tests.ConditionalGet.test_unquoted", + "conditional_processing.tests.ConditionalGet.test_unquoted_if_none_match", + "conditional_processing.tests.ConditionalGet.test_weak_if_match", + "conditional_processing.tests.ConditionalGet.test_weak_if_none_match", + "conditional_processing.tests.ConditionalGet.test_without_conditions", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_content_type_field_pointing_to_wrong_model", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_field_name_ending_with_underscore", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_generic_foreign_key_checks_are_performed", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_invalid_content_type_field", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_missing_content_type_field", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_missing_object_id_field", + "contenttypes_tests.test_checks.GenericRelationTests.test_field_name_ending_with_underscore", + "contenttypes_tests.test_checks.GenericRelationTests.test_missing_generic_foreign_key", + "contenttypes_tests.test_checks.GenericRelationTests.test_pointing_to_missing_model", + "contenttypes_tests.test_checks.GenericRelationTests.test_pointing_to_swapped_model", + "contenttypes_tests.test_checks.GenericRelationTests.test_valid_generic_relationship", + "contenttypes_tests.test_checks.GenericRelationTests.test_valid_generic_relationship_with_explicit_fields", + "contenttypes_tests.test_checks.GenericRelationTests.test_valid_self_referential_generic_relationship", + "contenttypes_tests.test_checks.ModelCheckTests.test_model_name_max_length", + "contenttypes_tests.test_checks.ModelCheckTests.test_model_name_too_long", + "contenttypes_tests.test_operations.ContentTypeOperationsTests.test_content_type_rename_conflict", + "contenttypes_tests.test_operations.ContentTypeOperationsTests.test_existing_content_type_rename", + "contenttypes_tests.test_operations.ContentTypeOperationsTests.test_missing_content_type_rename_ignore", + "context_processors.tests.DebugContextProcessorTests.test_debug", + "context_processors.tests.DebugContextProcessorTests.test_sql_queries", + "context_processors.tests.RequestContextProcessorTests.test_request_attributes", + "csrf_tests.test_context_processor.TestContextProcessor.test_force_token_to_string", + "csrf_tests.tests.CsrfInErrorHandlingViewsTests.test_csrf_token_on_404_stays_constant", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_bare_secret_accepted_and_replaced", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_cookie_not_reset_on_accepted_request", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_csrf_cookie_age", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_csrf_cookie_age_none", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_csrf_cookie_samesite", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_csrf_token_in_header", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_csrf_token_in_header_with_customized_name", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_ensures_csrf_cookie_no_logging", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_ensures_csrf_cookie_no_middleware", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_ensures_csrf_cookie_with_middleware", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_get_token_for_exempt_view", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_get_token_for_requires_csrf_token_view", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_bad_referer", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_csrf_trusted_origin_allowed", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_csrf_wildcard_trusted_origin_allowed", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_good_referer", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_good_referer_2", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_good_referer_behind_proxy", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_good_referer_matches_cookie_domain", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_good_referer_matches_cookie_domain_with_different_port", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_malformed_host", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_malformed_referer", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_reject_insecure_referer", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_post_data_read_failure", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_request_csrf_cookie_and_token", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_request_csrf_cookie_no_token", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_request_csrf_cookie_no_token_exempt_view", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_request_no_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_response_get_token_not_used", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_view_token_invalid_chars", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_view_token_too_long", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_put_and_delete_allowed", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_put_and_delete_rejected", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_token_node_empty_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_token_node_no_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_token_node_with_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_token_node_with_new_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_cookie_not_reset_on_accepted_request", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_csrf_token_in_header", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_csrf_token_in_header_with_customized_name", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_ensures_csrf_cookie_no_logging", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_ensures_csrf_cookie_with_middleware", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_get_token_for_exempt_view", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_get_token_for_requires_csrf_token_view", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_bad_referer", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_csrf_trusted_origin_allowed", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_csrf_wildcard_trusted_origin_allowed", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_good_referer", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_good_referer_2", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_good_referer_behind_proxy", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_good_referer_matches_cookie_domain", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_good_referer_matches_cookie_domain_with_different_port", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_malformed_host", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_malformed_referer", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_reject_insecure_referer", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_no_session_on_request", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_post_data_read_failure", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_request_csrf_cookie_and_token", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_request_csrf_cookie_no_token", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_request_csrf_cookie_no_token_exempt_view", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_request_no_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_response_get_token_not_used", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_response_get_token_used", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_put_and_delete_allowed", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_put_and_delete_rejected", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_session_modify", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_token_node_empty_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_token_node_no_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_token_node_with_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_token_node_with_new_csrf_cookie", + "db_functions.window.test_validation.ValidationTests.test_lag_negative_offset", + "db_functions.window.test_validation.ValidationTests.test_lead_negative_offset", + "db_functions.window.test_validation.ValidationTests.test_negative_num_buckets_ntile", + "db_functions.window.test_validation.ValidationTests.test_nth_negative_nth_value", + "db_functions.window.test_validation.ValidationTests.test_nth_null_expression", + "db_functions.window.test_validation.ValidationTests.test_null_source_lag", + "db_functions.window.test_validation.ValidationTests.test_null_source_lead", + "db_typecasts.tests.DBTypeCasts.test_typeCasts", + "db_utils.tests.ConnectionHandlerTests.test_connection_handler_no_databases", + "db_utils.tests.ConnectionHandlerTests.test_no_default_database", + "db_utils.tests.DatabaseErrorWrapperTests.test_reraising_backend_specific_database_exception", + "db_utils.tests.LoadBackendTests.test_load_backend_invalid_name", + "dbshell.test_mysql.MySqlDbshellCommandTestCase.test_basic_params_specified_in_settings", + "dbshell.test_mysql.MySqlDbshellCommandTestCase.test_can_connect_using_sockets", + "dbshell.test_mysql.MySqlDbshellCommandTestCase.test_fails_with_keyerror_on_incomplete_config", + "dbshell.test_mysql.MySqlDbshellCommandTestCase.test_options_override_settings_proper_values", + "dbshell.test_mysql.MySqlDbshellCommandTestCase.test_ssl_certificate_is_added", + "dbshell.test_oracle.OracleDbshellTests.test_with_rlwrap", + "dbshell.test_oracle.OracleDbshellTests.test_without_rlwrap", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_accent", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_basic", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_column", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_escape_characters", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_nopass", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_sigint_handler", + "decorators.tests.DecoratorsTest.test_attributes", + "decorators.tests.DecoratorsTest.test_cache_page", + "decorators.tests.DecoratorsTest.test_require_safe_accepts_only_safe_methods", + "decorators.tests.DecoratorsTest.test_user_passes_test_composition", + "decorators.tests.MethodDecoratorTests.test_argumented", + "decorators.tests.MethodDecoratorTests.test_bad_iterable", + "decorators.tests.MethodDecoratorTests.test_class_decoration", + "decorators.tests.MethodDecoratorTests.test_descriptors", + "decorators.tests.MethodDecoratorTests.test_invalid_method_name_to_decorate", + "decorators.tests.MethodDecoratorTests.test_invalid_non_callable_attribute_decoration", + "decorators.tests.MethodDecoratorTests.test_new_attribute", + "decorators.tests.MethodDecoratorTests.test_preserve_attributes", + "decorators.tests.MethodDecoratorTests.test_preserve_signature", + "decorators.tests.MethodDecoratorTests.test_tuple_of_decorators", + "decorators.tests.NeverCacheDecoratorTest.test_never_cache_decorator", + "decorators.tests.XFrameOptionsDecoratorsTests.test_deny_decorator", + "decorators.tests.XFrameOptionsDecoratorsTests.test_exempt_decorator", + "decorators.tests.XFrameOptionsDecoratorsTests.test_sameorigin_decorator", + "deprecation.tests.DeprecationInstanceCheckTest.test_warning", + "deprecation.tests.RenameMethodsTests.test_class_definition_warnings", + "deprecation.tests.RenameMethodsTests.test_deprecated_subclass_renamed", + "deprecation.tests.RenameMethodsTests.test_deprecated_subclass_renamed_and_mixins", + "deprecation.tests.RenameMethodsTests.test_get_new_defined", + "deprecation.tests.RenameMethodsTests.test_get_old_defined", + "deprecation.tests.RenameMethodsTests.test_renamed_subclass_deprecated", + "dispatch.tests.DispatcherTests.test_cached_garbaged_collected", + "dispatch.tests.DispatcherTests.test_cannot_connect_no_kwargs", + "dispatch.tests.DispatcherTests.test_cannot_connect_non_callable", + "dispatch.tests.DispatcherTests.test_disconnection", + "dispatch.tests.DispatcherTests.test_garbage_collected", + "dispatch.tests.DispatcherTests.test_has_listeners", + "dispatch.tests.DispatcherTests.test_multiple_registration", + "dispatch.tests.DispatcherTests.test_send", + "dispatch.tests.DispatcherTests.test_send_connected_no_sender", + "dispatch.tests.DispatcherTests.test_send_different_no_sender", + "dispatch.tests.DispatcherTests.test_send_no_receivers", + "dispatch.tests.DispatcherTests.test_send_robust_fail", + "dispatch.tests.DispatcherTests.test_send_robust_ignored_sender", + "dispatch.tests.DispatcherTests.test_send_robust_no_receivers", + "dispatch.tests.DispatcherTests.test_send_robust_success", + "dispatch.tests.DispatcherTests.test_uid_registration", + "dispatch.tests.DispatcherTests.test_values_returned_by_disconnection", + "dispatch.tests.ReceiverTestCase.test_receiver_signal_list", + "dispatch.tests.ReceiverTestCase.test_receiver_single_signal", + "field_deconstruction.tests.FieldDeconstructionTests.test_auto_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_big_integer_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_binary_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_boolean_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_char_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_char_field_choices", + "field_deconstruction.tests.FieldDeconstructionTests.test_csi_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_date_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_datetime_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_db_tablespace", + "field_deconstruction.tests.FieldDeconstructionTests.test_decimal_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_decimal_field_0_decimal_places", + "field_deconstruction.tests.FieldDeconstructionTests.test_email_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_file_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_file_path_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_float_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_foreign_key", + "field_deconstruction.tests.FieldDeconstructionTests.test_foreign_key_swapped", + "field_deconstruction.tests.FieldDeconstructionTests.test_generic_ip_address_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_image_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_integer_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_ip_address_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_many_to_many_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_many_to_many_field_swapped", + "field_deconstruction.tests.FieldDeconstructionTests.test_name", + "field_deconstruction.tests.FieldDeconstructionTests.test_null_boolean_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_one_to_one", + "field_deconstruction.tests.FieldDeconstructionTests.test_positive_integer_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_positive_small_integer_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_slug_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_small_integer_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_text_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_time_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_url_field", + "field_subclassing.tests.TestDbType.test_db_parameters_respects_db_type", + "file_storage.test_generate_filename.GenerateFilenameStorageTests.test_filefield_awss3_storage", + "file_storage.test_generate_filename.GenerateFilenameStorageTests.test_filefield_generate_filename", + "file_storage.test_generate_filename.GenerateFilenameStorageTests.test_filefield_generate_filename_with_upload_to", + "files.tests.ContentFileTestCase.test_content_file_custom_name", + "files.tests.ContentFileTestCase.test_content_file_default_name", + "files.tests.ContentFileTestCase.test_content_file_input_type", + "files.tests.ContentFileTestCase.test_open_resets_file_to_start_and_returns_context_manager", + "files.tests.ContentFileTestCase.test_size_changing_after_writing", + "files.tests.DimensionClosingBug.test_closing_of_filenames", + "files.tests.DimensionClosingBug.test_not_closing_of_files", + "files.tests.FileMoveSafeTests.test_file_move_copystat_cifs", + "files.tests.FileMoveSafeTests.test_file_move_overwrite", + "files.tests.FileTests.test_context_manager", + "files.tests.FileTests.test_file_iteration", + "files.tests.FileTests.test_file_iteration_mac_newlines", + "files.tests.FileTests.test_file_iteration_mixed_newlines", + "files.tests.FileTests.test_file_iteration_windows_newlines", + "files.tests.FileTests.test_file_iteration_with_mac_newline_at_chunk_boundary", + "files.tests.FileTests.test_file_iteration_with_text", + "files.tests.FileTests.test_file_iteration_with_unix_newline_at_chunk_boundary", + "files.tests.FileTests.test_file_iteration_with_windows_newline_at_chunk_boundary", + "files.tests.FileTests.test_file_mode", + "files.tests.FileTests.test_io_wrapper", + "files.tests.FileTests.test_namedtemporaryfile_closes", + "files.tests.FileTests.test_open_reopens_closed_file_and_returns_context_manager", + "files.tests.FileTests.test_open_resets_opened_file_to_start_and_returns_context_manager", + "files.tests.FileTests.test_readable", + "files.tests.FileTests.test_seekable", + "files.tests.FileTests.test_unicode_file_name", + "files.tests.FileTests.test_unicode_uploadedfile_name", + "files.tests.FileTests.test_writable", + "files.tests.GetImageDimensionsTests.test_invalid_image", + "files.tests.GetImageDimensionsTests.test_valid_image", + "files.tests.GetImageDimensionsTests.test_webp", + "files.tests.InMemoryUploadedFileTests.test_open_resets_file_to_start_and_returns_context_manager", + "files.tests.InconsistentGetImageDimensionsBug.test_bug_19457", + "files.tests.InconsistentGetImageDimensionsBug.test_multiple_calls", + "files.tests.NoNameFileTestCase.test_noname_file_default_name", + "files.tests.NoNameFileTestCase.test_noname_file_get_size", + "files.tests.SpooledTempTests.test_in_memory_spooled_temp", + "files.tests.SpooledTempTests.test_written_spooled_temp", + "files.tests.TemporaryUploadedFileTests.test_extension_kept", + "fixtures_model_package.tests.FixtureTestCase.test_loaddata", + "fixtures_model_package.tests.SampleTestCase.testClassFixtures", + "flatpages_tests.test_sitemaps.FlatpagesSitemapTests.test_flatpage_sitemap", + "forms_tests.field_tests.test_base.BasicFieldsTests.test_cooperative_multiple_inheritance", + "forms_tests.field_tests.test_base.BasicFieldsTests.test_field_deepcopies_widget_instance", + "forms_tests.field_tests.test_base.BasicFieldsTests.test_field_sets_widget_is_required", + "forms_tests.field_tests.test_base.DisabledFieldTests.test_disabled_field_has_changed_always_false", + "forms_tests.field_tests.test_booleanfield.BooleanFieldTest.test_boolean_picklable", + "forms_tests.field_tests.test_booleanfield.BooleanFieldTest.test_booleanfield_changed", + "forms_tests.field_tests.test_booleanfield.BooleanFieldTest.test_booleanfield_clean_1", + "forms_tests.field_tests.test_booleanfield.BooleanFieldTest.test_booleanfield_clean_2", + "forms_tests.field_tests.test_booleanfield.BooleanFieldTest.test_disabled_has_changed", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_1", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_2", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_3", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_4", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_5", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_disabled", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_length_not_int", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_strip", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_widget_attrs", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_clean_non_string", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_null_characters_prohibited", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_strip_before_checking_empty", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_1", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_2", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_3", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_4", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_callable", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_callable_may_evaluate_to_different_values", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_choices_default", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_disabled", + "forms_tests.field_tests.test_combofield.ComboFieldTest.test_combofield_1", + "forms_tests.field_tests.test_combofield.ComboFieldTest.test_combofield_2", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_1", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_2", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_3", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_4", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_5", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_changed", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_strptime", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_form_field", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_form_label_association", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_l10n_date_changed", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_l10n_invalid_date_in", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_1", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_2", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_3", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_4", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_5", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_changed", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_1", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_2", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_3", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_4", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_5", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_6", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_changed", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_localized", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_scientific", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_support_decimal_separator", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_support_thousands_separator", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_widget_attrs", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_enter_a_number_error", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_durationfield_clean", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_durationfield_integer_value", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_durationfield_prepare_value", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_durationfield_render", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_overflow", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_overflow_translation", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_email_regexp_for_performance", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_emailfield_1", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_emailfield_min_max_length", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_emailfield_not_required", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_emailfield_strip_on_none_value", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_emailfield_unable_to_set_strip_kwarg", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_disabled_has_changed", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_file_picklable", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_filefield_1", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_filefield_2", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_filefield_3", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_filefield_changed", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_allow_folders", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_clean", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_fix_os_paths", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_match", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_no_options", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_recursive", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_recursive_folders_without_files", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_recursive_no_folders_or_files", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_decimalfield_support_decimal_separator", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_decimalfield_support_thousands_separator", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_1", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_2", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_3", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_changed", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_localized", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_widget_attrs", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_as_generic", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_as_generic_not_required", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_as_ipv4_only", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_as_ipv6_only", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_invalid_arguments", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_normalization", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_file_extension_validation", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_imagefield_annotate_with_bitmap_image_after_clean", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_imagefield_annotate_with_image_after_clean", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_widge_attrs_accept_false", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_widge_attrs_accept_specified", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_widget_attrs_default_accept", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_1", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_2", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_3", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_4", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_5", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_big_num", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_float", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_localized", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_subclass", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_unicode_number", + "forms_tests.field_tests.test_multiplechoicefield.MultipleChoiceFieldTest.test_disabled_has_changed", + "forms_tests.field_tests.test_multiplechoicefield.MultipleChoiceFieldTest.test_multiplechoicefield_1", + "forms_tests.field_tests.test_multiplechoicefield.MultipleChoiceFieldTest.test_multiplechoicefield_2", + "forms_tests.field_tests.test_multiplechoicefield.MultipleChoiceFieldTest.test_multiplechoicefield_3", + "forms_tests.field_tests.test_multiplechoicefield.MultipleChoiceFieldTest.test_multiplechoicefield_changed", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_bad_choice", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_clean", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_clean_disabled_multivalue", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_disabled_has_changed", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_form_as_table", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_form_as_table_data", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_form_cleaned_data", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_has_changed_first_widget", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_has_changed_last_widget", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_has_changed_no_initial", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_has_changed_same", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_no_value", + "forms_tests.field_tests.test_nullbooleanfield.NullBooleanFieldTest.test_nullbooleanfield_2", + "forms_tests.field_tests.test_nullbooleanfield.NullBooleanFieldTest.test_nullbooleanfield_3", + "forms_tests.field_tests.test_nullbooleanfield.NullBooleanFieldTest.test_nullbooleanfield_4", + "forms_tests.field_tests.test_nullbooleanfield.NullBooleanFieldTest.test_nullbooleanfield_changed", + "forms_tests.field_tests.test_nullbooleanfield.NullBooleanFieldTest.test_nullbooleanfield_clean", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_change_regex_after_init", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_regexfield_1", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_regexfield_2", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_regexfield_3", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_regexfield_4", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_regexfield_unicode_characters", + "forms_tests.field_tests.test_slugfield.SlugFieldTest.test_slugfield_normalization", + "forms_tests.field_tests.test_slugfield.SlugFieldTest.test_slugfield_unicode_normalization", + "forms_tests.field_tests.test_splitdatetimefield.SplitDateTimeFieldTest.test_splitdatetimefield_1", + "forms_tests.field_tests.test_splitdatetimefield.SplitDateTimeFieldTest.test_splitdatetimefield_2", + "forms_tests.field_tests.test_splitdatetimefield.SplitDateTimeFieldTest.test_splitdatetimefield_changed", + "forms_tests.field_tests.test_timefield.TimeFieldTest.test_timefield_1", + "forms_tests.field_tests.test_timefield.TimeFieldTest.test_timefield_2", + "forms_tests.field_tests.test_timefield.TimeFieldTest.test_timefield_3", + "forms_tests.field_tests.test_timefield.TimeFieldTest.test_timefield_changed", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_1", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_2", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_3", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_4", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_5", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_6", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_has_changed", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_special_coerce", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_1", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_2", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_3", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_4", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_5", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_6", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_7", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_has_changed", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_special_coerce", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_url_regex_ticket11198", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_1", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_10", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_2", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_5", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_6", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_7", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_9", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_normalization", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_not_string", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_strip_on_none_value", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_unable_to_set_strip_kwarg", + "forms_tests.field_tests.test_uuidfield.UUIDFieldTest.test_clean_value_with_dashes", + "forms_tests.field_tests.test_uuidfield.UUIDFieldTest.test_uuidfield_1", + "forms_tests.field_tests.test_uuidfield.UUIDFieldTest.test_uuidfield_2", + "forms_tests.field_tests.test_uuidfield.UUIDFieldTest.test_uuidfield_3", + "forms_tests.field_tests.test_uuidfield.UUIDFieldTest.test_uuidfield_4", + "forms_tests.tests.test_forms.FormsTestCase.test_accessing_clean", + "forms_tests.tests.test_forms.FormsTestCase.test_auto_id", + "forms_tests.tests.test_forms.FormsTestCase.test_auto_id_false", + "forms_tests.tests.test_forms.FormsTestCase.test_auto_id_on_form_and_field", + "forms_tests.tests.test_forms.FormsTestCase.test_auto_id_true", + "forms_tests.tests.test_forms.FormsTestCase.test_baseform_repr", + "forms_tests.tests.test_forms.FormsTestCase.test_baseform_repr_dont_trigger_validation", + "forms_tests.tests.test_forms.FormsTestCase.test_basic_processing_in_view", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_bool", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_empty_label", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_id_for_label", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_id_for_label_override_by_attrs", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_initial_called_once", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_label_tag", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_label_tag_custom_widget_id_for_label", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_label_tag_no_id", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_slice", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_value_disabled_callable_initial", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_values", + "forms_tests.tests.test_forms.FormsTestCase.test_callable_initial_data", + "forms_tests.tests.test_forms.FormsTestCase.test_changed_data", + "forms_tests.tests.test_forms.FormsTestCase.test_changing_cleaned_data_in_clean", + "forms_tests.tests.test_forms.FormsTestCase.test_changing_cleaned_data_nothing_returned", + "forms_tests.tests.test_forms.FormsTestCase.test_checkbox_auto_id", + "forms_tests.tests.test_forms.FormsTestCase.test_class_prefix", + "forms_tests.tests.test_forms.FormsTestCase.test_cleaned_data_only_fields", + "forms_tests.tests.test_forms.FormsTestCase.test_custom_boundfield", + "forms_tests.tests.test_forms.FormsTestCase.test_custom_empty_values", + "forms_tests.tests.test_forms.FormsTestCase.test_datetime_changed_data_callable_with_microseconds", + "forms_tests.tests.test_forms.FormsTestCase.test_datetime_clean_initial_callable_disabled", + "forms_tests.tests.test_forms.FormsTestCase.test_dynamic_construction", + "forms_tests.tests.test_forms.FormsTestCase.test_dynamic_initial_data", + "forms_tests.tests.test_forms.FormsTestCase.test_empty_dict", + "forms_tests.tests.test_forms.FormsTestCase.test_empty_permitted", + "forms_tests.tests.test_forms.FormsTestCase.test_empty_permitted_and_use_required_attribute", + "forms_tests.tests.test_forms.FormsTestCase.test_empty_querydict_args", + "forms_tests.tests.test_forms.FormsTestCase.test_error_dict", + "forms_tests.tests.test_forms.FormsTestCase.test_error_dict_as_json_escape_html", + "forms_tests.tests.test_forms.FormsTestCase.test_error_escaping", + "forms_tests.tests.test_forms.FormsTestCase.test_error_html_required_html_classes", + "forms_tests.tests.test_forms.FormsTestCase.test_error_list", + "forms_tests.tests.test_forms.FormsTestCase.test_error_list_class_has_one_class_specified", + "forms_tests.tests.test_forms.FormsTestCase.test_error_list_class_not_specified", + "forms_tests.tests.test_forms.FormsTestCase.test_error_list_with_hidden_field_errors_has_correct_class", + "forms_tests.tests.test_forms.FormsTestCase.test_error_list_with_non_field_errors_has_correct_class", + "forms_tests.tests.test_forms.FormsTestCase.test_errorlist_override", + "forms_tests.tests.test_forms.FormsTestCase.test_escaping", + "forms_tests.tests.test_forms.FormsTestCase.test_explicit_field_order", + "forms_tests.tests.test_forms.FormsTestCase.test_extracting_hidden_and_visible", + "forms_tests.tests.test_forms.FormsTestCase.test_field_name", + "forms_tests.tests.test_forms.FormsTestCase.test_field_name_with_hidden_input", + "forms_tests.tests.test_forms.FormsTestCase.test_field_name_with_hidden_input_and_non_matching_row_ender", + "forms_tests.tests.test_forms.FormsTestCase.test_field_named_data", + "forms_tests.tests.test_forms.FormsTestCase.test_field_order", + "forms_tests.tests.test_forms.FormsTestCase.test_field_with_css_class", + "forms_tests.tests.test_forms.FormsTestCase.test_field_without_css_classes", + "forms_tests.tests.test_forms.FormsTestCase.test_filefield_initial_callable", + "forms_tests.tests.test_forms.FormsTestCase.test_form", + "forms_tests.tests.test_forms.FormsTestCase.test_form_html_attributes", + "forms_tests.tests.test_forms.FormsTestCase.test_form_with_disabled_fields", + "forms_tests.tests.test_forms.FormsTestCase.test_form_with_iterable_boundfield", + "forms_tests.tests.test_forms.FormsTestCase.test_form_with_iterable_boundfield_id", + "forms_tests.tests.test_forms.FormsTestCase.test_form_with_noniterable_boundfield", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_choices", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_file_fields", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_multiple_choice", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_null_boolean", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_prefixes", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_radio", + "forms_tests.tests.test_forms.FormsTestCase.test_get_initial_for_field", + "forms_tests.tests.test_forms.FormsTestCase.test_has_error", + "forms_tests.tests.test_forms.FormsTestCase.test_help_text", + "forms_tests.tests.test_forms.FormsTestCase.test_hidden_data", + "forms_tests.tests.test_forms.FormsTestCase.test_hidden_initial_gets_id", + "forms_tests.tests.test_forms.FormsTestCase.test_hidden_widget", + "forms_tests.tests.test_forms.FormsTestCase.test_html_safe", + "forms_tests.tests.test_forms.FormsTestCase.test_id_on_field", + "forms_tests.tests.test_forms.FormsTestCase.test_initial_data", + "forms_tests.tests.test_forms.FormsTestCase.test_initial_datetime_values", + "forms_tests.tests.test_forms.FormsTestCase.test_iterable_boundfield_select", + "forms_tests.tests.test_forms.FormsTestCase.test_label_has_required_css_class", + "forms_tests.tests.test_forms.FormsTestCase.test_label_split_datetime_not_displayed", + "forms_tests.tests.test_forms.FormsTestCase.test_label_suffix", + "forms_tests.tests.test_forms.FormsTestCase.test_label_tag_override", + "forms_tests.tests.test_forms.FormsTestCase.test_multipart_encoded_form", + "forms_tests.tests.test_forms.FormsTestCase.test_multiple_choice_checkbox", + "forms_tests.tests.test_forms.FormsTestCase.test_multiple_choice_list_data", + "forms_tests.tests.test_forms.FormsTestCase.test_multiple_hidden", + "forms_tests.tests.test_forms.FormsTestCase.test_multivalue_deep_copy", + "forms_tests.tests.test_forms.FormsTestCase.test_multivalue_field_validation", + "forms_tests.tests.test_forms.FormsTestCase.test_multivalue_initial_data", + "forms_tests.tests.test_forms.FormsTestCase.test_multivalue_optional_subfields", + "forms_tests.tests.test_forms.FormsTestCase.test_only_hidden_fields", + "forms_tests.tests.test_forms.FormsTestCase.test_optional_data", + "forms_tests.tests.test_forms.FormsTestCase.test_specifying_labels", + "forms_tests.tests.test_forms.FormsTestCase.test_subclassing_forms", + "forms_tests.tests.test_forms.FormsTestCase.test_templates_with_forms", + "forms_tests.tests.test_forms.FormsTestCase.test_unbound_form", + "forms_tests.tests.test_forms.FormsTestCase.test_unicode_values", + "forms_tests.tests.test_forms.FormsTestCase.test_update_error_dict", + "forms_tests.tests.test_forms.FormsTestCase.test_use_required_attribute_false", + "forms_tests.tests.test_forms.FormsTestCase.test_use_required_attribute_true", + "forms_tests.tests.test_forms.FormsTestCase.test_validating_multiple_fields", + "forms_tests.tests.test_forms.FormsTestCase.test_validators_independence", + "forms_tests.tests.test_forms.FormsTestCase.test_various_boolean_values", + "forms_tests.tests.test_forms.FormsTestCase.test_widget_output", + "forms_tests.tests.test_forms.RendererTests.test_attribute_class", + "forms_tests.tests.test_forms.RendererTests.test_attribute_instance", + "forms_tests.tests.test_forms.RendererTests.test_attribute_override", + "forms_tests.tests.test_forms.RendererTests.test_default", + "forms_tests.tests.test_forms.RendererTests.test_kwarg_class", + "forms_tests.tests.test_forms.RendererTests.test_kwarg_instance", + "forms_tests.tests.test_formsets.AllValidTests.test_invalid", + "forms_tests.tests.test_formsets.AllValidTests.test_valid", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_basic_formset", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_blank_form_unfilled", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_clean_hook", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_delete_prefilled_data", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_displaying_more_than_one_blank_form", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_empty_ordered_fields", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_form_kwargs_empty_form", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_form_kwargs_formset", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_form_kwargs_formset_dynamic", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_calls_forms_is_valid", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_error_class", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_has_changed", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_initial_data", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_iteration", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_nonzero", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_splitdatetimefield", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_total_error_count", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_total_error_count_with_non_form_errors", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validate_max_flag", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validate_min_excludes_empty_forms", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validate_min_flag", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validate_min_unchanged_forms", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validation", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validation_count", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_with_deletion", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_with_deletion_invalid_deleted_form", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_with_deletion_remove_deletion_flag", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_with_ordering_and_deletion", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formsets_with_ordering", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_hard_limit_on_instantiated_forms", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_html_safe", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_increase_hard_limit", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_invalid_deleted_form_with_ordering", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_limited_max_forms_two", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_limiting_extra_lest_than_max_num", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_limiting_max_forms", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_management_form_prefix", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_max_num_with_initial_data", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_max_num_zero", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_max_num_zero_with_initial", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_min_num_displaying_more_than_one_blank_form", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_min_num_displaying_more_than_one_blank_form_with_zero_extra", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_more_initial_data", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_more_initial_form_result_in_one", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_more_initial_than_max_num", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_non_form_errors", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_non_form_errors_run_full_clean", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_ordering_blank_fieldsets", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_second_form_partially_filled", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_second_form_partially_filled_2", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_single_form_completed", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_validate_max_ignores_forms_marked_for_deletion", + "forms_tests.tests.test_formsets.FormsetAsFooTests.test_as_p", + "forms_tests.tests.test_formsets.FormsetAsFooTests.test_as_table", + "forms_tests.tests.test_formsets.FormsetAsFooTests.test_as_ul", + "forms_tests.tests.test_formsets.TestEmptyFormSet.test_empty_formset_is_multipart", + "forms_tests.tests.test_formsets.TestEmptyFormSet.test_empty_formset_is_valid", + "forms_tests.tests.test_formsets.TestEmptyFormSet.test_empty_formset_media", + "forms_tests.tests.test_formsets.TestIsBoundBehavior.test_empty_forms_are_unbound", + "forms_tests.tests.test_formsets.TestIsBoundBehavior.test_form_errors_are_caught_by_formset", + "forms_tests.tests.test_formsets.TestIsBoundBehavior.test_no_data_raises_validation_error", + "forms_tests.tests.test_formsets.TestIsBoundBehavior.test_with_management_data_attrs_work_fine", + "forms_tests.tests.test_i18n.FormsI18nTests.test_lazy_labels", + "forms_tests.tests.test_i18n.FormsI18nTests.test_non_ascii_choices", + "forms_tests.tests.test_i18n.FormsI18nTests.test_non_ascii_label", + "forms_tests.tests.test_i18n.FormsI18nTests.test_select_translated_text", + "forms_tests.tests.test_input_formats.CustomDateInputFormatsTests.test_dateField", + "forms_tests.tests.test_input_formats.CustomDateInputFormatsTests.test_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.CustomDateInputFormatsTests.test_localized_dateField", + "forms_tests.tests.test_input_formats.CustomDateInputFormatsTests.test_localized_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.CustomDateTimeInputFormatsTests.test_dateTimeField", + "forms_tests.tests.test_input_formats.CustomDateTimeInputFormatsTests.test_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.CustomDateTimeInputFormatsTests.test_localized_dateTimeField", + "forms_tests.tests.test_input_formats.CustomDateTimeInputFormatsTests.test_localized_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.CustomTimeInputFormatsTests.test_localized_timeField", + "forms_tests.tests.test_input_formats.CustomTimeInputFormatsTests.test_localized_timeField_with_inputformat", + "forms_tests.tests.test_input_formats.CustomTimeInputFormatsTests.test_timeField", + "forms_tests.tests.test_input_formats.CustomTimeInputFormatsTests.test_timeField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedDateTests.test_dateField", + "forms_tests.tests.test_input_formats.LocalizedDateTests.test_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedDateTests.test_localized_dateField", + "forms_tests.tests.test_input_formats.LocalizedDateTests.test_localized_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedDateTimeTests.test_dateTimeField", + "forms_tests.tests.test_input_formats.LocalizedDateTimeTests.test_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedDateTimeTests.test_localized_dateTimeField", + "forms_tests.tests.test_input_formats.LocalizedDateTimeTests.test_localized_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedTimeTests.test_localized_timeField", + "forms_tests.tests.test_input_formats.LocalizedTimeTests.test_localized_timeField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedTimeTests.test_timeField", + "forms_tests.tests.test_input_formats.LocalizedTimeTests.test_timeField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleDateFormatTests.test_dateField", + "forms_tests.tests.test_input_formats.SimpleDateFormatTests.test_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleDateFormatTests.test_localized_dateField", + "forms_tests.tests.test_input_formats.SimpleDateFormatTests.test_localized_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleDateTimeFormatTests.test_dateTimeField", + "forms_tests.tests.test_input_formats.SimpleDateTimeFormatTests.test_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleDateTimeFormatTests.test_localized_dateTimeField", + "forms_tests.tests.test_input_formats.SimpleDateTimeFormatTests.test_localized_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleTimeFormatTests.test_localized_timeField", + "forms_tests.tests.test_input_formats.SimpleTimeFormatTests.test_localized_timeField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleTimeFormatTests.test_timeField", + "forms_tests.tests.test_input_formats.SimpleTimeFormatTests.test_timeField_with_inputformat", + "forms_tests.tests.test_media.FormsMediaTestCase.test_combine_media", + "forms_tests.tests.test_media.FormsMediaTestCase.test_construction", + "forms_tests.tests.test_media.FormsMediaTestCase.test_form_media", + "forms_tests.tests.test_media.FormsMediaTestCase.test_html_safe", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_deduplication", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_dsl", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_inheritance", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_inheritance_extends", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_inheritance_from_property", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_inheritance_single_type", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_property", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_property_parent_references", + "forms_tests.tests.test_media.FormsMediaTestCase.test_merge", + "forms_tests.tests.test_media.FormsMediaTestCase.test_merge_css_three_way", + "forms_tests.tests.test_media.FormsMediaTestCase.test_merge_js_three_way", + "forms_tests.tests.test_media.FormsMediaTestCase.test_merge_js_three_way2", + "forms_tests.tests.test_media.FormsMediaTestCase.test_merge_warning", + "forms_tests.tests.test_media.FormsMediaTestCase.test_multi_media", + "forms_tests.tests.test_media.FormsMediaTestCase.test_multi_widget", + "forms_tests.tests.test_renderers.BaseTemplateRendererTests.test_get_renderer", + "forms_tests.tests.test_renderers.DjangoTemplatesTests.test_installed_apps_template_found", + "forms_tests.tests.test_renderers.Jinja2Tests.test_installed_apps_template_found", + "forms_tests.tests.test_renderers.TemplatesSettingTests.test_installed_apps_template_found", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_error_dict_copy", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_error_dict_html_safe", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_error_list_html_safe", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_flatatt", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_flatatt_no_side_effects", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_validation_error", + "forms_tests.tests.test_validators.TestFieldWithValidators.test_all_errors_get_reported", + "forms_tests.tests.test_validators.TestFieldWithValidators.test_field_validators_can_be_any_iterable", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_check_exception", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_check_test", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_empty", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_false", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_int", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_none", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_true", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_value", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_value_from_datadict", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_value_from_datadict_string_int", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_doesnt_localize_input_value", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_label", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_nested_choices", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_nested_choices_without_id", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_render_none", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_render_value", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_render_value_multiple", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_separate_ids", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_separate_ids_constructor", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_use_required_attribute", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_clear_input_checked_returns_false", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_clear_input_checked_returns_false_only_if_not_required", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_clear_input_renders", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_clear_input_renders_only_if_initial", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_clear_input_renders_only_if_not_required", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_html_does_not_mask_exceptions", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_html_escaped", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_render_as_subwidget", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_return_false_if_url_does_not_exists", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_url_as_property", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_use_required_attribute", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_dateinput.DateInputTest.test_format", + "forms_tests.widget_tests.test_dateinput.DateInputTest.test_l10n", + "forms_tests.widget_tests.test_dateinput.DateInputTest.test_render_none", + "forms_tests.widget_tests.test_dateinput.DateInputTest.test_render_value", + "forms_tests.widget_tests.test_dateinput.DateInputTest.test_string", + "forms_tests.widget_tests.test_datetimeinput.DateTimeInputTest.test_l10n", + "forms_tests.widget_tests.test_datetimeinput.DateTimeInputTest.test_locale_aware", + "forms_tests.widget_tests.test_datetimeinput.DateTimeInputTest.test_render_formatted", + "forms_tests.widget_tests.test_datetimeinput.DateTimeInputTest.test_render_none", + "forms_tests.widget_tests.test_datetimeinput.DateTimeInputTest.test_render_value", + "forms_tests.widget_tests.test_fileinput.FileInputTest.test_render", + "forms_tests.widget_tests.test_fileinput.FileInputTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_hiddeninput.HiddenInputTest.test_render", + "forms_tests.widget_tests.test_hiddeninput.HiddenInputTest.test_use_required_attribute", + "forms_tests.widget_tests.test_input.InputTests.test_attrs_with_type", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_attrs", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_attrs_constructor", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_attrs_multiple", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_empty", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_increment_id", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_multiple", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_none", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_single", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_constructor_attrs", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_constructor_attrs_with_type", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_deepcopy", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_needs_multipart_false", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_needs_multipart_true", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_nested_multiwidget", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_no_whitespace_between_widgets", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_text_inputs", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_l10n", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_false", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_none", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_true", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_1", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_2", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_3", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_false", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_true", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_unknown", + "forms_tests.widget_tests.test_numberinput.NumberInputTests.test_attrs_not_localized", + "forms_tests.widget_tests.test_passwordinput.PasswordInputTest.test_render", + "forms_tests.widget_tests.test_passwordinput.PasswordInputTest.test_render_ignore_value", + "forms_tests.widget_tests.test_passwordinput.PasswordInputTest.test_render_value_true", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_class_attrs", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_constructor_attrs", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_doesnt_localize_input_value", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_nested_choices", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_render", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_render_as_subwidget", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_render_attrs", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_constructor_generator", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_constuctor", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_escaping", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_optgroup", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_select_inner", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_select_outer", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_unicode", + "forms_tests.widget_tests.test_select.SelectTest.test_compare_to_str", + "forms_tests.widget_tests.test_select.SelectTest.test_constructor_attrs", + "forms_tests.widget_tests.test_select.SelectTest.test_deepcopy", + "forms_tests.widget_tests.test_select.SelectTest.test_doesnt_localize_option_value", + "forms_tests.widget_tests.test_select.SelectTest.test_doesnt_render_required_when_impossible_to_select_empty_field", + "forms_tests.widget_tests.test_select.SelectTest.test_doesnt_render_required_when_no_choices_are_available", + "forms_tests.widget_tests.test_select.SelectTest.test_optgroups", + "forms_tests.widget_tests.test_select.SelectTest.test_optgroups_integer_choices", + "forms_tests.widget_tests.test_select.SelectTest.test_options", + "forms_tests.widget_tests.test_select.SelectTest.test_render", + "forms_tests.widget_tests.test_select.SelectTest.test_render_label_value", + "forms_tests.widget_tests.test_select.SelectTest.test_render_none", + "forms_tests.widget_tests.test_select.SelectTest.test_render_selected", + "forms_tests.widget_tests.test_select.SelectTest.test_renders_required_when_possible_to_select_empty_field_list", + "forms_tests.widget_tests.test_select.SelectTest.test_renders_required_when_possible_to_select_empty_field_none", + "forms_tests.widget_tests.test_select.SelectTest.test_renders_required_when_possible_to_select_empty_field_str", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_custom_months", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_format_value", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_l10n", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_render_datetime", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_render_empty", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_render_invalid_date", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_render_none", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_render_string", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_selectdate_empty_label", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_selectdate_required", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_value_from_datadict", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_years_rendered_without_separator", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_compare_string", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_format_value", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_multiple_options_same_value", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_multiple_values_invalid", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_optgroup_select_multiple", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_render_multiple_selected", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_render_none", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_render_selected", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_render_value_label", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_constructor_attrs", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_constructor_different_attrs", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_formatting", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_render_date_and_time", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_render_datetime", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_render_empty", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_render_none", + "forms_tests.widget_tests.test_splithiddendatetimewidget.SplitHiddenDateTimeWidgetTest.test_constructor_different_attrs", + "forms_tests.widget_tests.test_splithiddendatetimewidget.SplitHiddenDateTimeWidgetTest.test_l10n", + "forms_tests.widget_tests.test_splithiddendatetimewidget.SplitHiddenDateTimeWidgetTest.test_render_empty", + "forms_tests.widget_tests.test_splithiddendatetimewidget.SplitHiddenDateTimeWidgetTest.test_render_value", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_escaping", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_mark_safe", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_render", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_render_empty", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_render_none", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_render_required", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_attrs_precedence", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_attrs_safestring", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_constructor_attrs", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_boolean", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_custom_attrs", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_none", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_quoted", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_unicode", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_value", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_use_required_attribute", + "forms_tests.widget_tests.test_timeinput.TimeInputTest.test_format", + "forms_tests.widget_tests.test_timeinput.TimeInputTest.test_l10n", + "forms_tests.widget_tests.test_timeinput.TimeInputTest.test_render_none", + "forms_tests.widget_tests.test_timeinput.TimeInputTest.test_render_value", + "forms_tests.widget_tests.test_timeinput.TimeInputTest.test_string", + "forms_tests.widget_tests.test_widget.WidgetTests.test_attr_false_not_rendered", + "forms_tests.widget_tests.test_widget.WidgetTests.test_format_value", + "forms_tests.widget_tests.test_widget.WidgetTests.test_no_trailing_newline_in_attrs", + "forms_tests.widget_tests.test_widget.WidgetTests.test_value_omitted_from_data", + "gis_tests.gis_migrations.test_commands.MigrateTests.test_migrate_gis", + "gis_tests.test_gis_tests_utils.FuncTestMixinTests.test_mutated_attribute", + "gis_tests.test_gis_tests_utils.FuncTestMixinTests.test_mutated_expression", + "gis_tests.test_gis_tests_utils.FuncTestMixinTests.test_mutated_expression_deep", + "gis_tests.test_gis_tests_utils.FuncTestMixinTests.test_mutated_expressions", + "gis_tests.test_gis_tests_utils.FuncTestMixinTests.test_not_mutated", + "gis_tests.test_measure.AreaTest.testAccess", + "gis_tests.test_measure.AreaTest.testAccessInvaliA", + "gis_tests.test_measure.AreaTest.testAddition", + "gis_tests.test_measure.AreaTest.testComparisons", + "gis_tests.test_measure.AreaTest.testInit", + "gis_tests.test_measure.AreaTest.testInitInvaliA", + "gis_tests.test_measure.AreaTest.testMultiplication", + "gis_tests.test_measure.AreaTest.testUnitConversions", + "gis_tests.test_measure.AreaTest.testUnitsStr", + "gis_tests.test_measure.DistanceTest.testAccess", + "gis_tests.test_measure.DistanceTest.testAccessInvalid", + "gis_tests.test_measure.DistanceTest.testAddition", + "gis_tests.test_measure.DistanceTest.testComparisons", + "gis_tests.test_measure.DistanceTest.testInit", + "gis_tests.test_measure.DistanceTest.testInitInvalid", + "gis_tests.test_measure.DistanceTest.testMultiplication", + "gis_tests.test_measure.DistanceTest.testUnitAttName", + "gis_tests.test_measure.DistanceTest.testUnitConversions", + "gis_tests.test_measure.DistanceTest.testUnitsStr", + "gis_tests.test_ptr.CPointerBaseTests.test", + "gis_tests.test_ptr.CPointerBaseTests.test_destructor_catches_importerror", + "gis_tests.test_spatialrefsys.SpatialRefSysTest.test_add_entry", + "gis_tests.test_spatialrefsys.SpatialRefSysTest.test_ellipsoid", + "gis_tests.test_spatialrefsys.SpatialRefSysTest.test_get_units", + "gis_tests.test_spatialrefsys.SpatialRefSysTest.test_osr", + "gis_tests.test_spatialrefsys.SpatialRefSysTest.test_retrieve", + "handlers.test_exception.ExceptionHandlerTests.test_data_upload_max_memory_size_exceeded", + "handlers.test_exception.ExceptionHandlerTests.test_data_upload_max_number_fields_exceeded", + "handlers.tests.HandlerRequestTests.test_environ_path_info_type", + "handlers.tests.HandlerRequestTests.test_handle_accepts_httpstatus_enum_value", + "handlers.tests.HandlerRequestTests.test_invalid_urls", + "handlers.tests.HandlerRequestTests.test_middleware_returns_none", + "handlers.tests.HandlerRequestTests.test_no_response", + "handlers.tests.HandlerRequestTests.test_suspiciousop_in_view_returns_400", + "handlers.tests.HandlerTests.test_bad_path_info", + "handlers.tests.HandlerTests.test_invalid_multipart_boundary", + "handlers.tests.HandlerTests.test_invalid_unicode_cookie", + "handlers.tests.HandlerTests.test_middleware_initialized", + "handlers.tests.HandlerTests.test_non_ascii_cookie", + "handlers.tests.HandlerTests.test_non_ascii_query_string", + "handlers.tests.ScriptNameTests.test_get_script_name", + "handlers.tests.ScriptNameTests.test_get_script_name_double_slashes", + "handlers.tests.SignalsTests.test_request_signals", + "handlers.tests.SignalsTests.test_request_signals_streaming_response", + "handlers.tests.TransactionsPerRequestTests.test_auto_transaction", + "handlers.tests.TransactionsPerRequestTests.test_no_auto_transaction", + "handlers.tests.TransactionsPerRequestTests.test_no_transaction", + "handlers.tests_custom_error_handlers.CustomErrorHandlerTests.test_handler_renders_template_response", + "httpwrappers.tests.CookieTests.test_cookie_edgecases", + "httpwrappers.tests.CookieTests.test_decode", + "httpwrappers.tests.CookieTests.test_encode", + "httpwrappers.tests.CookieTests.test_httponly_after_load", + "httpwrappers.tests.CookieTests.test_invalid_cookies", + "httpwrappers.tests.CookieTests.test_load_dict", + "httpwrappers.tests.CookieTests.test_nonstandard_keys", + "httpwrappers.tests.CookieTests.test_pickle", + "httpwrappers.tests.CookieTests.test_python_cookies", + "httpwrappers.tests.CookieTests.test_repeated_nonstandard_keys", + "httpwrappers.tests.CookieTests.test_samesite", + "httpwrappers.tests.FileCloseTests.test_response", + "httpwrappers.tests.FileCloseTests.test_streaming_response", + "httpwrappers.tests.HttpResponseSubclassesTests.test_invalid_redirect_repr", + "httpwrappers.tests.HttpResponseSubclassesTests.test_not_allowed", + "httpwrappers.tests.HttpResponseSubclassesTests.test_not_allowed_repr", + "httpwrappers.tests.HttpResponseSubclassesTests.test_not_allowed_repr_no_content_type", + "httpwrappers.tests.HttpResponseSubclassesTests.test_not_modified", + "httpwrappers.tests.HttpResponseSubclassesTests.test_not_modified_repr", + "httpwrappers.tests.HttpResponseSubclassesTests.test_redirect", + "httpwrappers.tests.HttpResponseSubclassesTests.test_redirect_lazy", + "httpwrappers.tests.HttpResponseSubclassesTests.test_redirect_repr", + "httpwrappers.tests.HttpResponseTests.test_dict_behavior", + "httpwrappers.tests.HttpResponseTests.test_file_interface", + "httpwrappers.tests.HttpResponseTests.test_headers_type", + "httpwrappers.tests.HttpResponseTests.test_iter_content", + "httpwrappers.tests.HttpResponseTests.test_iterator_isnt_rewound", + "httpwrappers.tests.HttpResponseTests.test_lazy_content", + "httpwrappers.tests.HttpResponseTests.test_long_line", + "httpwrappers.tests.HttpResponseTests.test_newlines_in_headers", + "httpwrappers.tests.HttpResponseTests.test_non_string_content", + "httpwrappers.tests.HttpResponseTests.test_stream_interface", + "httpwrappers.tests.HttpResponseTests.test_unsafe_redirect", + "httpwrappers.tests.JsonResponseTests.test_json_response_custom_encoder", + "httpwrappers.tests.JsonResponseTests.test_json_response_list", + "httpwrappers.tests.JsonResponseTests.test_json_response_non_ascii", + "httpwrappers.tests.JsonResponseTests.test_json_response_passing_arguments_to_json_dumps", + "httpwrappers.tests.JsonResponseTests.test_json_response_raises_type_error_with_default_setting", + "httpwrappers.tests.JsonResponseTests.test_json_response_text", + "httpwrappers.tests.JsonResponseTests.test_json_response_uuid", + "httpwrappers.tests.QueryDictTests.test_basic_mutable_operations", + "httpwrappers.tests.QueryDictTests.test_create_with_no_args", + "httpwrappers.tests.QueryDictTests.test_duplicates_in_fromkeys_iterable", + "httpwrappers.tests.QueryDictTests.test_fromkeys_empty_iterable", + "httpwrappers.tests.QueryDictTests.test_fromkeys_is_immutable_by_default", + "httpwrappers.tests.QueryDictTests.test_fromkeys_mutable_override", + "httpwrappers.tests.QueryDictTests.test_fromkeys_noniterable", + "httpwrappers.tests.QueryDictTests.test_fromkeys_with_nondefault_encoding", + "httpwrappers.tests.QueryDictTests.test_fromkeys_with_nonempty_value", + "httpwrappers.tests.QueryDictTests.test_immutability", + "httpwrappers.tests.QueryDictTests.test_immutable_basic_operations", + "httpwrappers.tests.QueryDictTests.test_immutable_get_with_default", + "httpwrappers.tests.QueryDictTests.test_missing_key", + "httpwrappers.tests.QueryDictTests.test_multiple_keys", + "httpwrappers.tests.QueryDictTests.test_mutable_copy", + "httpwrappers.tests.QueryDictTests.test_mutable_delete", + "httpwrappers.tests.QueryDictTests.test_non_default_encoding", + "httpwrappers.tests.QueryDictTests.test_pickle", + "httpwrappers.tests.QueryDictTests.test_querydict_fromkeys", + "httpwrappers.tests.QueryDictTests.test_single_key_value", + "httpwrappers.tests.QueryDictTests.test_update_from_querydict", + "httpwrappers.tests.QueryDictTests.test_urlencode", + "httpwrappers.tests.QueryDictTests.test_urlencode_int", + "httpwrappers.tests.StreamingHttpResponseTests.test_streaming_response", + "humanize_tests.tests.HumanizeTests.test_apnumber", + "humanize_tests.tests.HumanizeTests.test_i18n_html_ordinal", + "humanize_tests.tests.HumanizeTests.test_i18n_intcomma", + "humanize_tests.tests.HumanizeTests.test_i18n_intword", + "humanize_tests.tests.HumanizeTests.test_inflection_for_timedelta", + "humanize_tests.tests.HumanizeTests.test_intcomma", + "humanize_tests.tests.HumanizeTests.test_intcomma_without_number_grouping", + "humanize_tests.tests.HumanizeTests.test_intword", + "humanize_tests.tests.HumanizeTests.test_l10n_intcomma", + "humanize_tests.tests.HumanizeTests.test_naturalday", + "humanize_tests.tests.HumanizeTests.test_naturalday_tz", + "humanize_tests.tests.HumanizeTests.test_naturalday_uses_localtime", + "humanize_tests.tests.HumanizeTests.test_naturaltime", + "humanize_tests.tests.HumanizeTests.test_naturaltime_as_documented", + "humanize_tests.tests.HumanizeTests.test_ordinal", + "i18n.contenttypes.tests.ContentTypeTests.test_verbose_name", + "i18n.patterns.tests.PathUnusedTests.test_no_lang_activate", + "i18n.patterns.tests.RequestURLConfTests.test_request_urlconf_considered", + "i18n.patterns.tests.URLDisabledTests.test_prefixed_i18n_disabled", + "i18n.patterns.tests.URLNamespaceTests.test_account_register", + "i18n.patterns.tests.URLPrefixTests.test_invalid_prefix_use", + "i18n.patterns.tests.URLPrefixTests.test_not_prefixed", + "i18n.patterns.tests.URLPrefixTests.test_prefixed", + "i18n.patterns.tests.URLRedirectTests.test_custom_redirect_class", + "i18n.patterns.tests.URLRedirectTests.test_en_redirect", + "i18n.patterns.tests.URLRedirectTests.test_en_redirect_wrong_url", + "i18n.patterns.tests.URLRedirectTests.test_nl_redirect", + "i18n.patterns.tests.URLRedirectTests.test_nl_redirect_wrong_url", + "i18n.patterns.tests.URLRedirectTests.test_no_prefix_response", + "i18n.patterns.tests.URLRedirectTests.test_pl_pl_redirect", + "i18n.patterns.tests.URLRedirectTests.test_pt_br_redirect", + "i18n.patterns.tests.URLRedirectWithScriptAliasTests.test_language_prefix_with_script_prefix", + "i18n.patterns.tests.URLRedirectWithoutTrailingSlashSettingTests.test_en_redirect", + "i18n.patterns.tests.URLRedirectWithoutTrailingSlashSettingTests.test_not_prefixed_redirect", + "i18n.patterns.tests.URLRedirectWithoutTrailingSlashTests.test_en_redirect", + "i18n.patterns.tests.URLRedirectWithoutTrailingSlashTests.test_not_prefixed_redirect", + "i18n.patterns.tests.URLResponseTests.test_en_path", + "i18n.patterns.tests.URLResponseTests.test_en_url", + "i18n.patterns.tests.URLResponseTests.test_nl_path", + "i18n.patterns.tests.URLResponseTests.test_nl_url", + "i18n.patterns.tests.URLResponseTests.test_not_prefixed_with_prefix", + "i18n.patterns.tests.URLResponseTests.test_pt_br_url", + "i18n.patterns.tests.URLResponseTests.test_wrong_en_prefix", + "i18n.patterns.tests.URLResponseTests.test_wrong_nl_prefix", + "i18n.patterns.tests.URLTagTests.test_args", + "i18n.patterns.tests.URLTagTests.test_context", + "i18n.patterns.tests.URLTagTests.test_kwargs", + "i18n.patterns.tests.URLTagTests.test_strings_only", + "i18n.patterns.tests.URLTranslationTests.test_no_prefix_translated", + "i18n.patterns.tests.URLTranslationTests.test_translate_url_utility", + "i18n.patterns.tests.URLTranslationTests.test_users_url", + "i18n.patterns.tests.URLVaryAcceptLanguageTests.test_en_redirect", + "i18n.patterns.tests.URLVaryAcceptLanguageTests.test_no_prefix_response", + "i18n.test_compilation.AppCompilationTest.test_app_locale_compiled", + "i18n.test_compilation.CompilationErrorHandling.test_error_reported_by_msgfmt", + "i18n.test_compilation.CompilationErrorHandling.test_msgfmt_error_including_non_ascii", + "i18n.test_compilation.ExcludedLocaleCompilationTests.test_command_help", + "i18n.test_compilation.ExcludedLocaleCompilationTests.test_multiple_locales_excluded", + "i18n.test_compilation.ExcludedLocaleCompilationTests.test_multiple_locales_excluded_with_locale", + "i18n.test_compilation.ExcludedLocaleCompilationTests.test_one_locale_excluded", + "i18n.test_compilation.ExcludedLocaleCompilationTests.test_one_locale_excluded_with_locale", + "i18n.test_compilation.FuzzyTranslationTest.test_fuzzy_compiling", + "i18n.test_compilation.FuzzyTranslationTest.test_nofuzzy_compiling", + "i18n.test_compilation.MultipleLocaleCompilationTests.test_multiple_locales", + "i18n.test_compilation.MultipleLocaleCompilationTests.test_one_locale", + "i18n.test_compilation.PoFileContentsTests.test_percent_symbol_in_po_file", + "i18n.test_compilation.PoFileTests.test_bom_rejection", + "i18n.test_compilation.PoFileTests.test_no_write_access", + "i18n.test_extraction.BasicExtractorTests.test_blocktrans_trimmed", + "i18n.test_extraction.BasicExtractorTests.test_comments_extractor", + "i18n.test_extraction.BasicExtractorTests.test_context_in_single_quotes", + "i18n.test_extraction.BasicExtractorTests.test_extraction_error", + "i18n.test_extraction.BasicExtractorTests.test_extraction_warning", + "i18n.test_extraction.BasicExtractorTests.test_makemessages_find_files", + "i18n.test_extraction.BasicExtractorTests.test_makemessages_gettext_version", + "i18n.test_extraction.BasicExtractorTests.test_po_file_encoding_when_updating", + "i18n.test_extraction.BasicExtractorTests.test_pot_charset_header_is_utf8", + "i18n.test_extraction.BasicExtractorTests.test_special_char_extracted", + "i18n.test_extraction.BasicExtractorTests.test_template_comments", + "i18n.test_extraction.BasicExtractorTests.test_template_message_context_extractor", + "i18n.test_extraction.BasicExtractorTests.test_unicode_decode_error", + "i18n.test_extraction.BasicExtractorTests.test_unicode_file_name", + "i18n.test_extraction.BasicExtractorTests.test_use_i18n_false", + "i18n.test_extraction.CopyPluralFormsExtractorTests.test_copy_plural_forms", + "i18n.test_extraction.CopyPluralFormsExtractorTests.test_override_plural_forms", + "i18n.test_extraction.CopyPluralFormsExtractorTests.test_trans_and_plural_blocktrans_collision", + "i18n.test_extraction.CustomLayoutExtractionTests.test_no_locale_raises", + "i18n.test_extraction.CustomLayoutExtractionTests.test_project_locale_paths", + "i18n.test_extraction.ExcludedLocaleExtractionTests.test_command_help", + "i18n.test_extraction.ExcludedLocaleExtractionTests.test_multiple_locales_excluded", + "i18n.test_extraction.ExcludedLocaleExtractionTests.test_multiple_locales_excluded_with_locale", + "i18n.test_extraction.ExcludedLocaleExtractionTests.test_one_locale_excluded", + "i18n.test_extraction.ExcludedLocaleExtractionTests.test_one_locale_excluded_with_locale", + "i18n.test_extraction.IgnoredExtractorTests.test_ignore_directory", + "i18n.test_extraction.IgnoredExtractorTests.test_ignore_file_patterns", + "i18n.test_extraction.IgnoredExtractorTests.test_ignore_subdirectory", + "i18n.test_extraction.IgnoredExtractorTests.test_media_static_dirs_ignored", + "i18n.test_extraction.JavascriptExtractorTests.test_default_root_settings", + "i18n.test_extraction.JavascriptExtractorTests.test_javascript_literals", + "i18n.test_extraction.JavascriptExtractorTests.test_media_static_dirs_ignored", + "i18n.test_extraction.KeepPotFileExtractorTests.test_keep_pot_disabled_by_default", + "i18n.test_extraction.KeepPotFileExtractorTests.test_keep_pot_enabled", + "i18n.test_extraction.KeepPotFileExtractorTests.test_keep_pot_explicitly_disabled", + "i18n.test_extraction.LocationCommentsTests.test_add_location_file", + "i18n.test_extraction.LocationCommentsTests.test_add_location_full", + "i18n.test_extraction.LocationCommentsTests.test_add_location_gettext_version_check", + "i18n.test_extraction.LocationCommentsTests.test_add_location_never", + "i18n.test_extraction.LocationCommentsTests.test_location_comments_for_templatized_files", + "i18n.test_extraction.LocationCommentsTests.test_no_location_disabled", + "i18n.test_extraction.LocationCommentsTests.test_no_location_enabled", + "i18n.test_extraction.MultipleLocaleExtractionTests.test_all_locales", + "i18n.test_extraction.MultipleLocaleExtractionTests.test_multiple_locales", + "i18n.test_extraction.NoSettingsExtractionTests.test_makemessages_no_settings", + "i18n.test_extraction.NoWrapExtractorTests.test_no_wrap_disabled", + "i18n.test_extraction.NoWrapExtractorTests.test_no_wrap_enabled", + "i18n.test_extraction.SymlinkExtractorTests.test_symlink", + "i18n.test_management.TranslatableFileTests.test_eq", + "i18n.test_management.TranslatableFileTests.test_repr", + "i18n.test_percents.ExtractingStringsWithPercentSigns.test_adds_python_format_to_all_percent_signs", + "i18n.test_percents.ExtractingStringsWithPercentSigns.test_trans_tag_with_percent_symbol_at_the_end", + "i18n.test_percents.ExtractingStringsWithPercentSigns.test_trans_tag_with_percent_symbol_in_the_middle", + "i18n.test_percents.ExtractingStringsWithPercentSigns.test_trans_tag_with_string_that_look_like_fmt_spec", + "i18n.test_percents.RenderingTemplatesWithPercentSigns.test_translates_multiple_percent_signs", + "i18n.test_percents.RenderingTemplatesWithPercentSigns.test_translates_with_a_percent_symbol_at_the_end", + "i18n.test_percents.RenderingTemplatesWithPercentSigns.test_translates_with_percent_symbol_in_the_middle", + "i18n.test_percents.RenderingTemplatesWithPercentSigns.test_translates_with_percent_symbol_using_context", + "i18n.test_percents.RenderingTemplatesWithPercentSigns.test_translates_with_string_that_look_like_fmt_spec_with_trans", + "invalid_models_tests.test_backend_specific.BackendSpecificChecksTests.test_check_field", + "invalid_models_tests.test_custom_fields.CustomFieldTest.test_none_column", + "invalid_models_tests.test_deprecated_fields.DeprecatedFieldsTests.test_CommaSeparatedIntegerField_deprecated", + "invalid_models_tests.test_deprecated_fields.DeprecatedFieldsTests.test_IPAddressField_deprecated", + "invalid_models_tests.test_models.ConstraintsTests.test_check_constraints", + "invalid_models_tests.test_models.FieldNamesTests.test_M2M_long_column_name", + "invalid_models_tests.test_models.FieldNamesTests.test_db_column_clash", + "invalid_models_tests.test_models.FieldNamesTests.test_ending_with_underscore", + "invalid_models_tests.test_models.FieldNamesTests.test_including_separator", + "invalid_models_tests.test_models.FieldNamesTests.test_local_field_long_column_name", + "invalid_models_tests.test_models.FieldNamesTests.test_pk", + "invalid_models_tests.test_models.IndexTogetherTests.test_list_containing_non_iterable", + "invalid_models_tests.test_models.IndexTogetherTests.test_non_iterable", + "invalid_models_tests.test_models.IndexTogetherTests.test_non_list", + "invalid_models_tests.test_models.IndexTogetherTests.test_pointing_to_m2m_field", + "invalid_models_tests.test_models.IndexTogetherTests.test_pointing_to_missing_field", + "invalid_models_tests.test_models.IndexTogetherTests.test_pointing_to_non_local_field", + "invalid_models_tests.test_models.IndexesTests.test_pointing_to_m2m_field", + "invalid_models_tests.test_models.IndexesTests.test_pointing_to_missing_field", + "invalid_models_tests.test_models.IndexesTests.test_pointing_to_non_local_field", + "invalid_models_tests.test_models.OtherModelTests.test_just_order_with_respect_to_no_errors", + "invalid_models_tests.test_models.OtherModelTests.test_just_ordering_no_errors", + "invalid_models_tests.test_models.OtherModelTests.test_lazy_reference_checks", + "invalid_models_tests.test_models.OtherModelTests.test_m2m_autogenerated_table_name_clash", + "invalid_models_tests.test_models.OtherModelTests.test_m2m_field_table_name_clash", + "invalid_models_tests.test_models.OtherModelTests.test_m2m_table_name_clash", + "invalid_models_tests.test_models.OtherModelTests.test_m2m_to_concrete_and_proxy_allowed", + "invalid_models_tests.test_models.OtherModelTests.test_m2m_unmanaged_shadow_models_not_checked", + "invalid_models_tests.test_models.OtherModelTests.test_missing_parent_link", + "invalid_models_tests.test_models.OtherModelTests.test_name_beginning_with_underscore", + "invalid_models_tests.test_models.OtherModelTests.test_name_contains_double_underscores", + "invalid_models_tests.test_models.OtherModelTests.test_name_ending_with_underscore", + "invalid_models_tests.test_models.OtherModelTests.test_non_valid", + "invalid_models_tests.test_models.OtherModelTests.test_ordering_non_iterable", + "invalid_models_tests.test_models.OtherModelTests.test_ordering_pointing_to_foreignkey_field", + "invalid_models_tests.test_models.OtherModelTests.test_ordering_pointing_to_missing_field", + "invalid_models_tests.test_models.OtherModelTests.test_ordering_pointing_to_missing_foreignkey_field", + "invalid_models_tests.test_models.OtherModelTests.test_ordering_with_order_with_respect_to", + "invalid_models_tests.test_models.OtherModelTests.test_property_and_related_field_accessor_clash", + "invalid_models_tests.test_models.OtherModelTests.test_single_primary_key", + "invalid_models_tests.test_models.OtherModelTests.test_swappable_missing_app", + "invalid_models_tests.test_models.OtherModelTests.test_swappable_missing_app_name", + "invalid_models_tests.test_models.OtherModelTests.test_two_m2m_through_same_model_with_different_through_fields", + "invalid_models_tests.test_models.OtherModelTests.test_two_m2m_through_same_relationship", + "invalid_models_tests.test_models.OtherModelTests.test_unique_primary_key", + "invalid_models_tests.test_models.ShadowingFieldsTests.test_field_name_clash_with_child_accessor", + "invalid_models_tests.test_models.ShadowingFieldsTests.test_id_clash", + "invalid_models_tests.test_models.ShadowingFieldsTests.test_inheritance_clash", + "invalid_models_tests.test_models.ShadowingFieldsTests.test_multigeneration_inheritance", + "invalid_models_tests.test_models.ShadowingFieldsTests.test_multiinheritance_clash", + "invalid_models_tests.test_models.UniqueTogetherTests.test_list_containing_non_iterable", + "invalid_models_tests.test_models.UniqueTogetherTests.test_non_iterable", + "invalid_models_tests.test_models.UniqueTogetherTests.test_non_list", + "invalid_models_tests.test_models.UniqueTogetherTests.test_pointing_to_m2m", + "invalid_models_tests.test_models.UniqueTogetherTests.test_pointing_to_missing_field", + "invalid_models_tests.test_models.UniqueTogetherTests.test_valid_model", + "invalid_models_tests.test_ordinary_fields.AutoFieldTests.test_primary_key", + "invalid_models_tests.test_ordinary_fields.AutoFieldTests.test_valid_case", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_bad_db_index_value", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_bad_max_length_value", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_bad_validators", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_containing_lazy", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_containing_non_pairs", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_named_group", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_named_group_bad_structure", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_named_group_lazy", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_named_group_non_pairs", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_iterable_of_iterable_choices", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_lazy_choices", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_missing_max_length", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_negative_max_length", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_non_iterable_choices", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_non_iterable_choices_two_letters", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_str_max_length_type", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_str_max_length_value", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_too_long_char_field_under_mysql", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_valid_field", + "invalid_models_tests.test_ordinary_fields.DateFieldTests.test_auto_now_and_auto_now_add_raise_error", + "invalid_models_tests.test_ordinary_fields.DateFieldTests.test_fix_default_value", + "invalid_models_tests.test_ordinary_fields.DateFieldTests.test_fix_default_value_tz", + "invalid_models_tests.test_ordinary_fields.DateTimeFieldTests.test_fix_default_value", + "invalid_models_tests.test_ordinary_fields.DateTimeFieldTests.test_fix_default_value_tz", + "invalid_models_tests.test_ordinary_fields.DecimalFieldTests.test_bad_values_of_max_digits_and_decimal_places", + "invalid_models_tests.test_ordinary_fields.DecimalFieldTests.test_decimal_places_greater_than_max_digits", + "invalid_models_tests.test_ordinary_fields.DecimalFieldTests.test_negative_max_digits_and_decimal_places", + "invalid_models_tests.test_ordinary_fields.DecimalFieldTests.test_required_attributes", + "invalid_models_tests.test_ordinary_fields.DecimalFieldTests.test_valid_field", + "invalid_models_tests.test_ordinary_fields.FileFieldTests.test_primary_key", + "invalid_models_tests.test_ordinary_fields.FileFieldTests.test_upload_to_callable_not_checked", + "invalid_models_tests.test_ordinary_fields.FileFieldTests.test_upload_to_starts_with_slash", + "invalid_models_tests.test_ordinary_fields.FileFieldTests.test_valid_case", + "invalid_models_tests.test_ordinary_fields.FileFieldTests.test_valid_default_case", + "invalid_models_tests.test_ordinary_fields.FilePathFieldTests.test_forbidden_files_and_folders", + "invalid_models_tests.test_ordinary_fields.GenericIPAddressFieldTests.test_non_nullable_blank", + "invalid_models_tests.test_ordinary_fields.ImageFieldTests.test_pillow_installed", + "invalid_models_tests.test_ordinary_fields.IntegerFieldTests.test_max_length_warning", + "invalid_models_tests.test_ordinary_fields.TextFieldTests.test_max_length_warning", + "invalid_models_tests.test_ordinary_fields.TimeFieldTests.test_fix_default_value", + "invalid_models_tests.test_ordinary_fields.TimeFieldTests.test_fix_default_value_tz", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_clash_between_accessors", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_fk_to_fk", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_fk_to_integer", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_fk_to_m2m", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_m2m_to_fk", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_m2m_to_integer", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_m2m_to_m2m", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_m2m_to_m2m_with_inheritance", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_no_clash_for_hidden_related_name", + "invalid_models_tests.test_relative_fields.ComplexClashTests.test_complex_clash", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_fk_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_fk_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_fk_to_m2m", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_m2m_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_m2m_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_m2m_to_m2m", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_fk_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_fk_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_fk_to_m2m", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_fk_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_fk_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_fk_to_m2m", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_m2m_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_m2m_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_m2m_to_m2m", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_m2m_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_m2m_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_m2m_to_m2m", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_explicit_field_names", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_intersection_foreign_object", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_invalid_field", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_invalid_order", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_m2m_field_argument_validation", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_superset_foreign_object", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_ambiguous_relationship_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_key_to_abstract_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_key_to_isolate_apps_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_key_to_missing_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_key_to_non_unique_field", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_key_to_non_unique_field_under_explicit_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_object_to_non_unique_fields", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_invalid_related_query_name", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_m2m_to_abstract_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_many_to_many_through_isolate_apps_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_many_to_many_to_isolate_apps_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_many_to_many_to_missing_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_many_to_many_with_limit_choices_auto_created_no_warning", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_many_to_many_with_useless_options", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_missing_relationship_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_missing_relationship_model_on_model_check", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_not_swapped_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_nullable_primary_key", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_on_delete_set_default_without_default_value", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_on_delete_set_null_on_non_nullable_field", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_referencing_to_swapped_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_related_field_has_invalid_related_name", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_related_field_has_valid_related_name", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_relationship_model_missing_foreign_key", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_relationship_model_with_foreign_key_to_wrong_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_symmetric_self_reference_with_intermediate_table", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_symmetric_self_reference_with_intermediate_table_and_through_fields", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_symmetrical_self_referential_field", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_to_fields_exist", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_to_fields_not_checked_if_related_model_doesnt_exist", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_too_many_foreign_keys_in_self_referential_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_unique_m2m", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_valid_foreign_key_without_accessor", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_fk_to_fk", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_fk_to_integer", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_fk_to_m2m", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_m2m_to_fk", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_m2m_to_integer", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_m2m_to_m2m", + "invalid_models_tests.test_relative_fields.SelfReferentialFKClashTests.test_accessor_clash", + "invalid_models_tests.test_relative_fields.SelfReferentialFKClashTests.test_clash_under_explicit_related_name", + "invalid_models_tests.test_relative_fields.SelfReferentialFKClashTests.test_reverse_query_name_clash", + "invalid_models_tests.test_relative_fields.SelfReferentialM2MClashTests.test_accessor_clash", + "invalid_models_tests.test_relative_fields.SelfReferentialM2MClashTests.test_clash_between_accessors", + "invalid_models_tests.test_relative_fields.SelfReferentialM2MClashTests.test_clash_under_explicit_related_name", + "invalid_models_tests.test_relative_fields.SelfReferentialM2MClashTests.test_reverse_query_name_clash", + "invalid_models_tests.test_relative_fields.SelfReferentialM2MClashTests.test_valid_model", + "logging_tests.tests.AdminEmailHandlerTest.test_accepts_args", + "logging_tests.tests.AdminEmailHandlerTest.test_accepts_args_and_request", + "logging_tests.tests.AdminEmailHandlerTest.test_customize_send_mail_method", + "logging_tests.tests.AdminEmailHandlerTest.test_disallowed_host_doesnt_crash", + "logging_tests.tests.AdminEmailHandlerTest.test_emit_non_ascii", + "logging_tests.tests.AdminEmailHandlerTest.test_fail_silently", + "logging_tests.tests.AdminEmailHandlerTest.test_subject_accepts_newlines", + "logging_tests.tests.AdminEmailHandlerTest.test_uses_custom_email_backend", + "logging_tests.tests.CallbackFilterTest.test_passes_on_record", + "logging_tests.tests.CallbackFilterTest.test_sense", + "logging_tests.tests.DefaultLoggingTests.test_django_logger", + "logging_tests.tests.DefaultLoggingTests.test_django_logger_debug", + "logging_tests.tests.DefaultLoggingTests.test_django_logger_info", + "logging_tests.tests.DefaultLoggingTests.test_django_logger_warning", + "logging_tests.tests.HandlerLoggingTests.test_internal_server_error", + "logging_tests.tests.HandlerLoggingTests.test_internal_server_error_599", + "logging_tests.tests.HandlerLoggingTests.test_multi_part_parser_error", + "logging_tests.tests.HandlerLoggingTests.test_page_found_no_warning", + "logging_tests.tests.HandlerLoggingTests.test_page_not_found_raised", + "logging_tests.tests.HandlerLoggingTests.test_page_not_found_warning", + "logging_tests.tests.HandlerLoggingTests.test_permission_denied", + "logging_tests.tests.HandlerLoggingTests.test_redirect_no_warning", + "logging_tests.tests.HandlerLoggingTests.test_uncaught_exception", + "logging_tests.tests.I18nLoggingTests.test_i18n_page_found_no_warning", + "logging_tests.tests.I18nLoggingTests.test_i18n_page_not_found_warning", + "logging_tests.tests.LogFormattersTests.test_server_formatter_default_format", + "logging_tests.tests.LogFormattersTests.test_server_formatter_styles", + "logging_tests.tests.LoggingFiltersTest.test_require_debug_false_filter", + "logging_tests.tests.LoggingFiltersTest.test_require_debug_true_filter", + "logging_tests.tests.SecurityLoggerTest.test_suspicious_email_admins", + "logging_tests.tests.SecurityLoggerTest.test_suspicious_operation_creates_log_message", + "logging_tests.tests.SecurityLoggerTest.test_suspicious_operation_uses_sublogger", + "logging_tests.tests.SettingsConfigTest.test_circular_dependency", + "logging_tests.tests.SettingsCustomLoggingTest.test_custom_logging", + "logging_tests.tests.SetupConfigureLogging.test_configure_initializes_logging", + "lookup.test_lookups.YearComparisonLookupTests.test_get_bound", + "mail.test_sendtestemail.SendTestEmailManagementCommand.test_admin_receivers", + "mail.test_sendtestemail.SendTestEmailManagementCommand.test_manager_and_admin_receivers", + "mail.test_sendtestemail.SendTestEmailManagementCommand.test_manager_receivers", + "mail.test_sendtestemail.SendTestEmailManagementCommand.test_multiple_receivers", + "mail.test_sendtestemail.SendTestEmailManagementCommand.test_single_receiver", + "mail.tests.ConsoleBackendTests.test_close_connection", + "mail.tests.ConsoleBackendTests.test_console_stream_kwarg", + "mail.tests.ConsoleBackendTests.test_empty_admins", + "mail.tests.ConsoleBackendTests.test_html_mail_admins", + "mail.tests.ConsoleBackendTests.test_html_mail_managers", + "mail.tests.ConsoleBackendTests.test_html_send_mail", + "mail.tests.ConsoleBackendTests.test_idn_send", + "mail.tests.ConsoleBackendTests.test_lazy_addresses", + "mail.tests.ConsoleBackendTests.test_manager_and_admin_mail_prefix", + "mail.tests.ConsoleBackendTests.test_message_cc_header", + "mail.tests.ConsoleBackendTests.test_plaintext_send_mail", + "mail.tests.ConsoleBackendTests.test_recipient_without_domain", + "mail.tests.ConsoleBackendTests.test_send", + "mail.tests.ConsoleBackendTests.test_send_long_lines", + "mail.tests.ConsoleBackendTests.test_send_many", + "mail.tests.ConsoleBackendTests.test_send_unicode", + "mail.tests.ConsoleBackendTests.test_send_verbose_name", + "mail.tests.ConsoleBackendTests.test_use_as_contextmanager", + "mail.tests.FileBackendTests.test_close_connection", + "mail.tests.FileBackendTests.test_empty_admins", + "mail.tests.FileBackendTests.test_file_sessions", + "mail.tests.FileBackendTests.test_html_mail_admins", + "mail.tests.FileBackendTests.test_html_mail_managers", + "mail.tests.FileBackendTests.test_html_send_mail", + "mail.tests.FileBackendTests.test_idn_send", + "mail.tests.FileBackendTests.test_lazy_addresses", + "mail.tests.FileBackendTests.test_manager_and_admin_mail_prefix", + "mail.tests.FileBackendTests.test_message_cc_header", + "mail.tests.FileBackendTests.test_plaintext_send_mail", + "mail.tests.FileBackendTests.test_recipient_without_domain", + "mail.tests.FileBackendTests.test_send", + "mail.tests.FileBackendTests.test_send_long_lines", + "mail.tests.FileBackendTests.test_send_many", + "mail.tests.FileBackendTests.test_send_unicode", + "mail.tests.FileBackendTests.test_send_verbose_name", + "mail.tests.FileBackendTests.test_use_as_contextmanager", + "mail.tests.LocmemBackendTests.test_close_connection", + "mail.tests.LocmemBackendTests.test_empty_admins", + "mail.tests.LocmemBackendTests.test_html_mail_admins", + "mail.tests.LocmemBackendTests.test_html_mail_managers", + "mail.tests.LocmemBackendTests.test_html_send_mail", + "mail.tests.LocmemBackendTests.test_idn_send", + "mail.tests.LocmemBackendTests.test_lazy_addresses", + "mail.tests.LocmemBackendTests.test_locmem_shared_messages", + "mail.tests.LocmemBackendTests.test_manager_and_admin_mail_prefix", + "mail.tests.LocmemBackendTests.test_message_cc_header", + "mail.tests.LocmemBackendTests.test_plaintext_send_mail", + "mail.tests.LocmemBackendTests.test_recipient_without_domain", + "mail.tests.LocmemBackendTests.test_send", + "mail.tests.LocmemBackendTests.test_send_long_lines", + "mail.tests.LocmemBackendTests.test_send_many", + "mail.tests.LocmemBackendTests.test_send_unicode", + "mail.tests.LocmemBackendTests.test_send_verbose_name", + "mail.tests.LocmemBackendTests.test_use_as_contextmanager", + "mail.tests.LocmemBackendTests.test_validate_multiline_headers", + "mail.tests.MailTests.test_arbitrary_keyword", + "mail.tests.MailTests.test_ascii", + "mail.tests.MailTests.test_attach_file", + "mail.tests.MailTests.test_attach_non_utf8_text_as_bytes", + "mail.tests.MailTests.test_attach_text_as_bytes", + "mail.tests.MailTests.test_attach_utf8_text_as_bytes", + "mail.tests.MailTests.test_attachments", + "mail.tests.MailTests.test_attachments_MIMEText", + "mail.tests.MailTests.test_attachments_two_tuple", + "mail.tests.MailTests.test_backend_arg", + "mail.tests.MailTests.test_cc", + "mail.tests.MailTests.test_cc_headers", + "mail.tests.MailTests.test_cc_in_headers_only", + "mail.tests.MailTests.test_connection_arg", + "mail.tests.MailTests.test_custom_backend", + "mail.tests.MailTests.test_custom_utf8_encoding", + "mail.tests.MailTests.test_dont_base64_encode", + "mail.tests.MailTests.test_dont_base64_encode_message_rfc822", + "mail.tests.MailTests.test_dont_mangle_from_in_body", + "mail.tests.MailTests.test_dummy_backend", + "mail.tests.MailTests.test_encoding", + "mail.tests.MailTests.test_from_header", + "mail.tests.MailTests.test_header_injection", + "mail.tests.MailTests.test_header_omitted_for_no_to_recipients", + "mail.tests.MailTests.test_message_header_overrides", + "mail.tests.MailTests.test_multiple_message_call", + "mail.tests.MailTests.test_multiple_recipients", + "mail.tests.MailTests.test_non_ascii_attachment_filename", + "mail.tests.MailTests.test_none_body", + "mail.tests.MailTests.test_recipients_as_string", + "mail.tests.MailTests.test_recipients_as_tuple", + "mail.tests.MailTests.test_recipients_with_empty_strings", + "mail.tests.MailTests.test_reply_to", + "mail.tests.MailTests.test_reply_to_header", + "mail.tests.MailTests.test_reply_to_in_headers_only", + "mail.tests.MailTests.test_safe_mime_multipart", + "mail.tests.MailTests.test_safe_mime_multipart_with_attachments", + "mail.tests.MailTests.test_sanitize_address", + "mail.tests.MailTests.test_space_continuation", + "mail.tests.MailTests.test_to_header", + "mail.tests.MailTests.test_to_in_headers_only", + "mail.tests.MailTests.test_unicode_address_header", + "mail.tests.MailTests.test_unicode_headers", + "mail.tests.MailTimeZoneTests.test_date_header_localtime", + "mail.tests.MailTimeZoneTests.test_date_header_utc", + "mail.tests.PythonGlobalState.test_7bit", + "mail.tests.PythonGlobalState.test_8bit_latin", + "mail.tests.PythonGlobalState.test_8bit_non_latin", + "mail.tests.PythonGlobalState.test_utf8", + "mail.tests.SMTPBackendStoppedServerTests.test_fail_silently_on_connection_error", + "mail.tests.SMTPBackendStoppedServerTests.test_server_stopped", + "mail.tests.SMTPBackendTests.test_auth_attempted", + "mail.tests.SMTPBackendTests.test_close_connection", + "mail.tests.SMTPBackendTests.test_connection_timeout_custom", + "mail.tests.SMTPBackendTests.test_connection_timeout_default", + "mail.tests.SMTPBackendTests.test_email_authentication_override_settings", + "mail.tests.SMTPBackendTests.test_email_authentication_use_settings", + "mail.tests.SMTPBackendTests.test_email_disabled_authentication", + "mail.tests.SMTPBackendTests.test_email_msg_uses_crlf", + "mail.tests.SMTPBackendTests.test_email_ssl_attempts_ssl_connection", + "mail.tests.SMTPBackendTests.test_email_ssl_certfile_default_disabled", + "mail.tests.SMTPBackendTests.test_email_ssl_certfile_override_settings", + "mail.tests.SMTPBackendTests.test_email_ssl_certfile_use_settings", + "mail.tests.SMTPBackendTests.test_email_ssl_default_disabled", + "mail.tests.SMTPBackendTests.test_email_ssl_keyfile_default_disabled", + "mail.tests.SMTPBackendTests.test_email_ssl_keyfile_override_settings", + "mail.tests.SMTPBackendTests.test_email_ssl_keyfile_use_settings", + "mail.tests.SMTPBackendTests.test_email_ssl_override_settings", + "mail.tests.SMTPBackendTests.test_email_ssl_use_settings", + "mail.tests.SMTPBackendTests.test_email_timeout_override_settings", + "mail.tests.SMTPBackendTests.test_email_tls_attempts_starttls", + "mail.tests.SMTPBackendTests.test_email_tls_default_disabled", + "mail.tests.SMTPBackendTests.test_email_tls_override_settings", + "mail.tests.SMTPBackendTests.test_email_tls_use_settings", + "mail.tests.SMTPBackendTests.test_empty_admins", + "mail.tests.SMTPBackendTests.test_html_mail_admins", + "mail.tests.SMTPBackendTests.test_html_mail_managers", + "mail.tests.SMTPBackendTests.test_html_send_mail", + "mail.tests.SMTPBackendTests.test_idn_send", + "mail.tests.SMTPBackendTests.test_lazy_addresses", + "mail.tests.SMTPBackendTests.test_manager_and_admin_mail_prefix", + "mail.tests.SMTPBackendTests.test_message_cc_header", + "mail.tests.SMTPBackendTests.test_plaintext_send_mail", + "mail.tests.SMTPBackendTests.test_recipient_without_domain", + "mail.tests.SMTPBackendTests.test_reopen_connection", + "mail.tests.SMTPBackendTests.test_send", + "mail.tests.SMTPBackendTests.test_send_long_lines", + "mail.tests.SMTPBackendTests.test_send_many", + "mail.tests.SMTPBackendTests.test_send_messages_after_open_failed", + "mail.tests.SMTPBackendTests.test_send_messages_empty_list", + "mail.tests.SMTPBackendTests.test_send_messages_zero_sent", + "mail.tests.SMTPBackendTests.test_send_unicode", + "mail.tests.SMTPBackendTests.test_send_verbose_name", + "mail.tests.SMTPBackendTests.test_server_login", + "mail.tests.SMTPBackendTests.test_server_open", + "mail.tests.SMTPBackendTests.test_ssl_tls_mutually_exclusive", + "mail.tests.SMTPBackendTests.test_use_as_contextmanager", + "messages_tests.test_api.ApiTests.test_middleware_missing", + "messages_tests.test_api.ApiTests.test_middleware_missing_silently", + "messages_tests.test_api.ApiTests.test_ok", + "messages_tests.test_api.ApiTests.test_request_is_none", + "messages_tests.test_api.CustomRequestApiTests.test_middleware_missing", + "messages_tests.test_api.CustomRequestApiTests.test_middleware_missing_silently", + "messages_tests.test_api.CustomRequestApiTests.test_ok", + "messages_tests.test_api.CustomRequestApiTests.test_request_is_none", + "messages_tests.test_cookie.CookieTests.test_add", + "messages_tests.test_cookie.CookieTests.test_add_lazy_translation", + "messages_tests.test_cookie.CookieTests.test_add_update", + "messages_tests.test_cookie.CookieTests.test_context_processor_message_levels", + "messages_tests.test_cookie.CookieTests.test_cookie_setings", + "messages_tests.test_cookie.CookieTests.test_custom_tags", + "messages_tests.test_cookie.CookieTests.test_default_level", + "messages_tests.test_cookie.CookieTests.test_existing_add", + "messages_tests.test_cookie.CookieTests.test_existing_add_read_update", + "messages_tests.test_cookie.CookieTests.test_existing_read", + "messages_tests.test_cookie.CookieTests.test_existing_read_add_update", + "messages_tests.test_cookie.CookieTests.test_full_request_response_cycle", + "messages_tests.test_cookie.CookieTests.test_get", + "messages_tests.test_cookie.CookieTests.test_get_bad_cookie", + "messages_tests.test_cookie.CookieTests.test_high_level", + "messages_tests.test_cookie.CookieTests.test_json_encoder_decoder", + "messages_tests.test_cookie.CookieTests.test_level_tag", + "messages_tests.test_cookie.CookieTests.test_low_level", + "messages_tests.test_cookie.CookieTests.test_max_cookie_length", + "messages_tests.test_cookie.CookieTests.test_middleware_disabled", + "messages_tests.test_cookie.CookieTests.test_middleware_disabled_fail_silently", + "messages_tests.test_cookie.CookieTests.test_multiple_posts", + "messages_tests.test_cookie.CookieTests.test_no_update", + "messages_tests.test_cookie.CookieTests.test_pre_1_5_message_format", + "messages_tests.test_cookie.CookieTests.test_safedata", + "messages_tests.test_cookie.CookieTests.test_settings_level", + "messages_tests.test_cookie.CookieTests.test_tags", + "messages_tests.test_cookie.CookieTests.test_with_template_response", + "messages_tests.test_fallback.FallbackTests.test_add", + "messages_tests.test_fallback.FallbackTests.test_add_lazy_translation", + "messages_tests.test_fallback.FallbackTests.test_add_update", + "messages_tests.test_fallback.FallbackTests.test_context_processor_message_levels", + "messages_tests.test_fallback.FallbackTests.test_custom_tags", + "messages_tests.test_fallback.FallbackTests.test_default_level", + "messages_tests.test_fallback.FallbackTests.test_existing_add", + "messages_tests.test_fallback.FallbackTests.test_existing_add_read_update", + "messages_tests.test_fallback.FallbackTests.test_existing_read", + "messages_tests.test_fallback.FallbackTests.test_existing_read_add_update", + "messages_tests.test_fallback.FallbackTests.test_flush_used_backends", + "messages_tests.test_fallback.FallbackTests.test_full_request_response_cycle", + "messages_tests.test_fallback.FallbackTests.test_get", + "messages_tests.test_fallback.FallbackTests.test_get_empty", + "messages_tests.test_fallback.FallbackTests.test_get_fallback", + "messages_tests.test_fallback.FallbackTests.test_get_fallback_only", + "messages_tests.test_fallback.FallbackTests.test_high_level", + "messages_tests.test_fallback.FallbackTests.test_level_tag", + "messages_tests.test_fallback.FallbackTests.test_low_level", + "messages_tests.test_fallback.FallbackTests.test_middleware_disabled", + "messages_tests.test_fallback.FallbackTests.test_middleware_disabled_fail_silently", + "messages_tests.test_fallback.FallbackTests.test_multiple_posts", + "messages_tests.test_fallback.FallbackTests.test_no_fallback", + "messages_tests.test_fallback.FallbackTests.test_no_update", + "messages_tests.test_fallback.FallbackTests.test_session_fallback", + "messages_tests.test_fallback.FallbackTests.test_session_fallback_only", + "messages_tests.test_fallback.FallbackTests.test_settings_level", + "messages_tests.test_fallback.FallbackTests.test_tags", + "messages_tests.test_fallback.FallbackTests.test_with_template_response", + "messages_tests.test_middleware.MiddlewareTests.test_response_without_messages", + "messages_tests.test_mixins.SuccessMessageMixinTests.test_set_messages_success", + "messages_tests.test_session.SessionTests.test_add", + "messages_tests.test_session.SessionTests.test_add_lazy_translation", + "messages_tests.test_session.SessionTests.test_add_update", + "messages_tests.test_session.SessionTests.test_context_processor_message_levels", + "messages_tests.test_session.SessionTests.test_custom_tags", + "messages_tests.test_session.SessionTests.test_default_level", + "messages_tests.test_session.SessionTests.test_existing_add", + "messages_tests.test_session.SessionTests.test_existing_add_read_update", + "messages_tests.test_session.SessionTests.test_existing_read", + "messages_tests.test_session.SessionTests.test_existing_read_add_update", + "messages_tests.test_session.SessionTests.test_full_request_response_cycle", + "messages_tests.test_session.SessionTests.test_get", + "messages_tests.test_session.SessionTests.test_high_level", + "messages_tests.test_session.SessionTests.test_level_tag", + "messages_tests.test_session.SessionTests.test_low_level", + "messages_tests.test_session.SessionTests.test_middleware_disabled", + "messages_tests.test_session.SessionTests.test_middleware_disabled_fail_silently", + "messages_tests.test_session.SessionTests.test_multiple_posts", + "messages_tests.test_session.SessionTests.test_no_update", + "messages_tests.test_session.SessionTests.test_safedata", + "messages_tests.test_session.SessionTests.test_settings_level", + "messages_tests.test_session.SessionTests.test_tags", + "messages_tests.test_session.SessionTests.test_with_template_response", + "middleware.test_security.SecurityMiddlewareTest.test_content_type_already_present", + "middleware.test_security.SecurityMiddlewareTest.test_content_type_off", + "middleware.test_security.SecurityMiddlewareTest.test_content_type_on", + "middleware.test_security.SecurityMiddlewareTest.test_no_redirect_ssl", + "middleware.test_security.SecurityMiddlewareTest.test_redirect_exempt", + "middleware.test_security.SecurityMiddlewareTest.test_redirect_ssl_host", + "middleware.test_security.SecurityMiddlewareTest.test_ssl_redirect_off", + "middleware.test_security.SecurityMiddlewareTest.test_ssl_redirect_on", + "middleware.test_security.SecurityMiddlewareTest.test_sts_already_present", + "middleware.test_security.SecurityMiddlewareTest.test_sts_include_subdomains", + "middleware.test_security.SecurityMiddlewareTest.test_sts_no_include_subdomains", + "middleware.test_security.SecurityMiddlewareTest.test_sts_no_preload", + "middleware.test_security.SecurityMiddlewareTest.test_sts_off", + "middleware.test_security.SecurityMiddlewareTest.test_sts_on", + "middleware.test_security.SecurityMiddlewareTest.test_sts_only_if_secure", + "middleware.test_security.SecurityMiddlewareTest.test_sts_preload", + "middleware.test_security.SecurityMiddlewareTest.test_sts_subdomains_and_preload", + "middleware.test_security.SecurityMiddlewareTest.test_xss_filter_already_present", + "middleware.test_security.SecurityMiddlewareTest.test_xss_filter_off", + "middleware.test_security.SecurityMiddlewareTest.test_xss_filter_on", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_404_error_reporting", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_404_error_reporting_ignored_url", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_404_error_reporting_no_referer", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_custom_request_checker", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_referer_equal_to_requested_url", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_referer_equal_to_requested_url_on_another_domain", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_referer_equal_to_requested_url_without_trailing_slash_when_append_slash_is_set", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_referer_equal_to_requested_url_without_trailing_slash_when_append_slash_is_unset", + "middleware.tests.CommonMiddlewareTest.test_append_slash_disabled", + "middleware.tests.CommonMiddlewareTest.test_append_slash_disabled_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_have_slash", + "middleware.tests.CommonMiddlewareTest.test_append_slash_have_slash_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_leading_slashes", + "middleware.tests.CommonMiddlewareTest.test_append_slash_no_redirect_on_POST_in_DEBUG", + "middleware.tests.CommonMiddlewareTest.test_append_slash_no_redirect_on_POST_in_DEBUG_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_quoted", + "middleware.tests.CommonMiddlewareTest.test_append_slash_quoted_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_redirect", + "middleware.tests.CommonMiddlewareTest.test_append_slash_redirect_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_redirect_querystring", + "middleware.tests.CommonMiddlewareTest.test_append_slash_redirect_querystring_have_slash", + "middleware.tests.CommonMiddlewareTest.test_append_slash_slashless_resource", + "middleware.tests.CommonMiddlewareTest.test_append_slash_slashless_resource_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_slashless_unknown", + "middleware.tests.CommonMiddlewareTest.test_append_slash_slashless_unknown_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_content_length_header_added", + "middleware.tests.CommonMiddlewareTest.test_content_length_header_not_added_for_streaming_response", + "middleware.tests.CommonMiddlewareTest.test_content_length_header_not_changed", + "middleware.tests.CommonMiddlewareTest.test_disallowed_user_agents", + "middleware.tests.CommonMiddlewareTest.test_non_ascii_query_string_does_not_crash", + "middleware.tests.CommonMiddlewareTest.test_prepend_www", + "middleware.tests.CommonMiddlewareTest.test_prepend_www_append_slash_have_slash", + "middleware.tests.CommonMiddlewareTest.test_prepend_www_append_slash_have_slash_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_prepend_www_append_slash_slashless", + "middleware.tests.CommonMiddlewareTest.test_prepend_www_append_slash_slashless_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_prepend_www_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_response_redirect_class", + "middleware.tests.CommonMiddlewareTest.test_response_redirect_class_subclass", + "middleware.tests.ConditionalGetMiddlewareTest.test_etag_extended_cache_control", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_client_error", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_last_modified_in_the_future", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_last_modified_in_the_past", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_no_last_modified", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_redirect", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_same_last_modified", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_none_match_and_client_error", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_none_match_and_different_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_none_match_and_no_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_none_match_and_redirect", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_none_match_and_same_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_middleware_calculates_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_middleware_wont_overwrite_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_etag_no_store_cache", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_etag_streaming_response", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_head", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_if_modified_since_and_last_modified", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_if_none_match_and_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_unsafe", + "middleware.tests.ConditionalGetMiddlewareTest.test_not_modified_headers", + "middleware.tests.ETagGZipMiddlewareTest.test_etag_match", + "middleware.tests.ETagGZipMiddlewareTest.test_strong_etag_modified", + "middleware.tests.ETagGZipMiddlewareTest.test_weak_etag_not_modified", + "middleware.tests.GZipMiddlewareTest.test_compress_deterministic", + "middleware.tests.GZipMiddlewareTest.test_compress_file_response", + "middleware.tests.GZipMiddlewareTest.test_compress_non_200_response", + "middleware.tests.GZipMiddlewareTest.test_compress_response", + "middleware.tests.GZipMiddlewareTest.test_compress_streaming_response", + "middleware.tests.GZipMiddlewareTest.test_compress_streaming_response_unicode", + "middleware.tests.GZipMiddlewareTest.test_no_compress_compressed_response", + "middleware.tests.GZipMiddlewareTest.test_no_compress_incompressible_response", + "middleware.tests.GZipMiddlewareTest.test_no_compress_short_response", + "middleware.tests.XFrameOptionsMiddlewareTest.test_defaults_sameorigin", + "middleware.tests.XFrameOptionsMiddlewareTest.test_deny", + "middleware.tests.XFrameOptionsMiddlewareTest.test_dont_set_if_set", + "middleware.tests.XFrameOptionsMiddlewareTest.test_is_extendable", + "middleware.tests.XFrameOptionsMiddlewareTest.test_response_exempt", + "middleware.tests.XFrameOptionsMiddlewareTest.test_same_origin", + "middleware_exceptions.tests.MiddlewareNotUsedTests.test_do_not_log_when_debug_is_false", + "middleware_exceptions.tests.MiddlewareNotUsedTests.test_log", + "middleware_exceptions.tests.MiddlewareNotUsedTests.test_log_custom_message", + "middleware_exceptions.tests.MiddlewareNotUsedTests.test_raise_exception", + "middleware_exceptions.tests.MiddlewareTests.test_exception_in_middleware_converted_before_prior_middleware", + "middleware_exceptions.tests.MiddlewareTests.test_exception_in_render_passed_to_process_exception", + "middleware_exceptions.tests.MiddlewareTests.test_process_template_response", + "middleware_exceptions.tests.MiddlewareTests.test_process_template_response_returns_none", + "middleware_exceptions.tests.MiddlewareTests.test_process_view_return_none", + "middleware_exceptions.tests.MiddlewareTests.test_process_view_return_response", + "middleware_exceptions.tests.MiddlewareTests.test_response_from_process_exception_short_circuits_remainder", + "middleware_exceptions.tests.MiddlewareTests.test_templateresponse_from_process_view_passed_to_process_template_response", + "middleware_exceptions.tests.MiddlewareTests.test_templateresponse_from_process_view_rendered", + "middleware_exceptions.tests.MiddlewareTests.test_view_exception_converted_before_middleware", + "middleware_exceptions.tests.MiddlewareTests.test_view_exception_handled_by_process_exception", + "middleware_exceptions.tests.RootUrlconfTests.test_missing_root_urlconf", + "migrations.test_deprecated_fields.Tests.test_migrate", + "migrations.test_exceptions.ExceptionTests.test_node_not_found_error_repr", + "migrations.test_graph.GraphTests.test_circular_graph", + "migrations.test_graph.GraphTests.test_circular_graph_2", + "migrations.test_graph.GraphTests.test_complex_graph", + "migrations.test_graph.GraphTests.test_infinite_loop", + "migrations.test_graph.GraphTests.test_iterative_dfs", + "migrations.test_graph.GraphTests.test_iterative_dfs_complexity", + "migrations.test_graph.GraphTests.test_missing_child_nodes", + "migrations.test_graph.GraphTests.test_missing_parent_nodes", + "migrations.test_graph.GraphTests.test_plan_invalid_node", + "migrations.test_graph.GraphTests.test_remove_replaced_nodes", + "migrations.test_graph.GraphTests.test_remove_replacement_node", + "migrations.test_graph.GraphTests.test_simple_graph", + "migrations.test_graph.GraphTests.test_stringify", + "migrations.test_graph.GraphTests.test_validate_consistency_dummy", + "migrations.test_graph.GraphTests.test_validate_consistency_missing_child", + "migrations.test_graph.GraphTests.test_validate_consistency_missing_parent", + "migrations.test_graph.GraphTests.test_validate_consistency_no_error", + "migrations.test_graph.NodeTests.test_dummynode_repr", + "migrations.test_graph.NodeTests.test_node_repr", + "migrations.test_loader.LoaderTests.test_check_consistent_history", + "migrations.test_loader.LoaderTests.test_check_consistent_history_squashed", + "migrations.test_loader.LoaderTests.test_explicit_missing_module", + "migrations.test_loader.LoaderTests.test_first", + "migrations.test_loader.LoaderTests.test_ignore_files", + "migrations.test_loader.LoaderTests.test_load", + "migrations.test_loader.LoaderTests.test_load_empty_dir", + "migrations.test_loader.LoaderTests.test_load_import_error", + "migrations.test_loader.LoaderTests.test_load_module_file", + "migrations.test_loader.LoaderTests.test_load_unmigrated_dependency", + "migrations.test_loader.LoaderTests.test_loading_squashed", + "migrations.test_loader.LoaderTests.test_loading_squashed_complex", + "migrations.test_loader.LoaderTests.test_loading_squashed_complex_multi_apps", + "migrations.test_loader.LoaderTests.test_loading_squashed_complex_multi_apps_partially_applied", + "migrations.test_loader.LoaderTests.test_loading_squashed_erroneous", + "migrations.test_loader.LoaderTests.test_loading_squashed_ref_squashed", + "migrations.test_loader.LoaderTests.test_marked_as_migrated", + "migrations.test_loader.LoaderTests.test_marked_as_unmigrated", + "migrations.test_loader.LoaderTests.test_name_match", + "migrations.test_loader.LoaderTests.test_plan_handles_repeated_migrations", + "migrations.test_loader.LoaderTests.test_run_before", + "migrations.test_loader.PycLoaderTests.test_invalid", + "migrations.test_loader.PycLoaderTests.test_valid", + "migrations.test_loader.RecorderTests.test_apply", + "migrations.test_questioner.QuestionerTests.test_ask_initial_with_disabled_migrations", + "migrations.test_questioner.QuestionerTests.test_timedelta_default", + "model_fields.test_promises.PromiseTest.test_AutoField", + "model_fields.test_promises.PromiseTest.test_BinaryField", + "model_fields.test_promises.PromiseTest.test_BooleanField", + "model_fields.test_promises.PromiseTest.test_CharField", + "model_fields.test_promises.PromiseTest.test_DateField", + "model_fields.test_promises.PromiseTest.test_DateTimeField", + "model_fields.test_promises.PromiseTest.test_DecimalField", + "model_fields.test_promises.PromiseTest.test_EmailField", + "model_fields.test_promises.PromiseTest.test_FileField", + "model_fields.test_promises.PromiseTest.test_FilePathField", + "model_fields.test_promises.PromiseTest.test_FloatField", + "model_fields.test_promises.PromiseTest.test_GenericIPAddressField", + "model_fields.test_promises.PromiseTest.test_IPAddressField", + "model_fields.test_promises.PromiseTest.test_ImageField", + "model_fields.test_promises.PromiseTest.test_IntegerField", + "model_fields.test_promises.PromiseTest.test_NullBooleanField", + "model_fields.test_promises.PromiseTest.test_PositiveIntegerField", + "model_fields.test_promises.PromiseTest.test_PositiveSmallIntegerField", + "model_fields.test_promises.PromiseTest.test_SlugField", + "model_fields.test_promises.PromiseTest.test_SmallIntegerField", + "model_fields.test_promises.PromiseTest.test_TextField", + "model_fields.test_promises.PromiseTest.test_TimeField", + "model_fields.test_promises.PromiseTest.test_URLField", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_abstract_model_with_regular_python_mixin_mro", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_cannot_override_indirect_abstract_field", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_multi_inheritance_field_clashes", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_multiple_inheritance_cannot_shadow_concrete_inherited_field", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_multiple_parents_mro", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_override_field_with_attr", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_override_one2one_relation_auto_field_clashes", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_overriding_field_removed_by_concrete_model", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_reverse_foreign_key", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_shadow_related_name_when_set_to_none", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_shadowed_fkey_id", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_single_parent", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_virtual_field", + "model_meta.test_manager_inheritance_from_future.TestManagerInheritanceFromFuture.test_defined", + "model_regress.test_pickle.ModelPickleTests.test_missing_django_version_unpickling", + "model_regress.test_pickle.ModelPickleTests.test_unsupported_unpickle", + "model_regress.test_pickle.ModelPickleTests.test_with_getstate", + "model_regress.test_state.ModelStateTests.test_fields_cache_descriptor", + "no_models.tests.NoModelTests.test_no_models", + "postgres_tests.test_apps.PostgresConfigTests.test_register_serializer_for_migrations", + "postgres_tests.test_apps.PostgresConfigTests.test_register_type_handlers_connection", + "postgres_tests.test_integration.PostgresIntegrationTests.test_check", + "postgres_tests.test_introspection.InspectDBTests.test_json_field", + "postgres_tests.test_introspection.InspectDBTests.test_range_fields", + "postgres_tests.test_signals.OIDTests.test_citext_cache", + "postgres_tests.test_signals.OIDTests.test_citext_values", + "postgres_tests.test_signals.OIDTests.test_hstore_cache", + "postgres_tests.test_signals.OIDTests.test_hstore_values", + "postgres_tests.test_signals.OIDTests.test_register_type_handlers_no_db", + "project_template.test_settings.TestStartProjectSettings.test_middleware_headers", + "queries.test_q.QTests.test_combine_and_both_empty", + "queries.test_q.QTests.test_combine_and_empty", + "queries.test_q.QTests.test_combine_not_q_object", + "queries.test_q.QTests.test_combine_or_both_empty", + "queries.test_q.QTests.test_combine_or_empty", + "queries.test_q.QTests.test_deconstruct", + "queries.test_q.QTests.test_deconstruct_and", + "queries.test_q.QTests.test_deconstruct_multiple_kwargs", + "queries.test_q.QTests.test_deconstruct_negated", + "queries.test_q.QTests.test_deconstruct_nested", + "queries.test_q.QTests.test_deconstruct_or", + "queries.test_q.QTests.test_reconstruct", + "queries.test_q.QTests.test_reconstruct_and", + "queries.test_q.QTests.test_reconstruct_negated", + "queries.test_q.QTests.test_reconstruct_or", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeFormPostTests.test_no_limit", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeFormPostTests.test_size_exceeded", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeFormPostTests.test_size_not_exceeded", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeGetTests.test_data_upload_max_memory_size_exceeded", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeGetTests.test_empty_content_length", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeGetTests.test_no_limit", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeGetTests.test_size_not_exceeded", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeMultipartPostTests.test_file_passes", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeMultipartPostTests.test_no_limit", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeMultipartPostTests.test_size_exceeded", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeMultipartPostTests.test_size_not_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsFormPost.test_no_limit", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsFormPost.test_number_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsFormPost.test_number_not_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsGet.test_get_max_fields_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsGet.test_get_max_fields_not_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsMultipartPost.test_no_limit", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsMultipartPost.test_number_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsMultipartPost.test_number_not_exceeded", + "requests.tests.BuildAbsoluteURITests.test_absolute_url", + "requests.tests.BuildAbsoluteURITests.test_host_retrieval", + "requests.tests.BuildAbsoluteURITests.test_request_path_begins_with_two_slashes", + "requests.tests.HostValidationTests.test_get_host_suggestion_of_allowed_host", + "requests.tests.HostValidationTests.test_get_port", + "requests.tests.HostValidationTests.test_get_port_with_x_forwarded_port", + "requests.tests.HostValidationTests.test_host_validation_in_debug_mode", + "requests.tests.HostValidationTests.test_http_get_host", + "requests.tests.HostValidationTests.test_http_get_host_with_x_forwarded_host", + "requests.tests.HostValidationTests.test_split_domain_port_removes_trailing_dot", + "requests.tests.HttpHeadersTests.test_basic", + "requests.tests.HttpHeadersTests.test_parse_header_name", + "requests.tests.RequestHeadersTests.test_base_request_headers", + "requests.tests.RequestHeadersTests.test_wsgi_request_headers", + "requests.tests.RequestHeadersTests.test_wsgi_request_headers_get", + "requests.tests.RequestHeadersTests.test_wsgi_request_headers_getitem", + "requests.tests.RequestsTests.test_FILES_connection_error", + "requests.tests.RequestsTests.test_POST_after_body_read", + "requests.tests.RequestsTests.test_POST_after_body_read_and_stream_read", + "requests.tests.RequestsTests.test_POST_after_body_read_and_stream_read_multipart", + "requests.tests.RequestsTests.test_POST_binary_only", + "requests.tests.RequestsTests.test_POST_connection_error", + "requests.tests.RequestsTests.test_POST_immutable_for_mutipart", + "requests.tests.RequestsTests.test_POST_multipart_with_content_length_zero", + "requests.tests.RequestsTests.test_alternate_charset_POST", + "requests.tests.RequestsTests.test_body_after_POST_multipart_form_data", + "requests.tests.RequestsTests.test_body_after_POST_multipart_related", + "requests.tests.RequestsTests.test_get_raw_uri", + "requests.tests.RequestsTests.test_httprequest", + "requests.tests.RequestsTests.test_httprequest_full_path", + "requests.tests.RequestsTests.test_httprequest_full_path_with_query_string_and_fragment", + "requests.tests.RequestsTests.test_httprequest_repr", + "requests.tests.RequestsTests.test_httprequest_repr_invalid_method_and_path", + "requests.tests.RequestsTests.test_limited_stream", + "requests.tests.RequestsTests.test_non_ascii_POST", + "requests.tests.RequestsTests.test_read_after_value", + "requests.tests.RequestsTests.test_read_by_lines", + "requests.tests.RequestsTests.test_set_encoding_clears_GET", + "requests.tests.RequestsTests.test_set_encoding_clears_POST", + "requests.tests.RequestsTests.test_stream", + "requests.tests.RequestsTests.test_value_after_read", + "requests.tests.RequestsTests.test_wsgirequest", + "requests.tests.RequestsTests.test_wsgirequest_path_info", + "requests.tests.RequestsTests.test_wsgirequest_path_with_force_script_name_trailing_slash", + "requests.tests.RequestsTests.test_wsgirequest_repr", + "requests.tests.RequestsTests.test_wsgirequest_script_url_double_slashes", + "requests.tests.RequestsTests.test_wsgirequest_with_force_script_name", + "requests.tests.RequestsTests.test_wsgirequest_with_script_name", + "responses.test_cookie.DeleteCookieTests.test_default", + "responses.test_cookie.DeleteCookieTests.test_delete_cookie_secure_prefix", + "responses.test_cookie.SetCookieTests.test_aware_expiration", + "responses.test_cookie.SetCookieTests.test_create_cookie_after_deleting_cookie", + "responses.test_cookie.SetCookieTests.test_far_expiration", + "responses.test_cookie.SetCookieTests.test_httponly_cookie", + "responses.test_cookie.SetCookieTests.test_invalid_samesite", + "responses.test_cookie.SetCookieTests.test_max_age_expiration", + "responses.test_cookie.SetCookieTests.test_near_expiration", + "responses.test_cookie.SetCookieTests.test_samesite", + "responses.test_cookie.SetCookieTests.test_unicode_cookie", + "responses.test_fileresponse.FileResponseTests.test_compressed_response", + "responses.test_fileresponse.FileResponseTests.test_file_from_buffer_response", + "responses.test_fileresponse.FileResponseTests.test_file_from_disk_as_attachment", + "responses.test_fileresponse.FileResponseTests.test_file_from_disk_response", + "responses.test_fileresponse.FileResponseTests.test_file_from_named_pipe_response", + "responses.test_fileresponse.FileResponseTests.test_unicode_attachment", + "responses.tests.HttpResponseBaseTests.test_closed", + "responses.tests.HttpResponseBaseTests.test_setdefault", + "responses.tests.HttpResponseBaseTests.test_tell", + "responses.tests.HttpResponseBaseTests.test_write", + "responses.tests.HttpResponseTests.test_change_status_code", + "responses.tests.HttpResponseTests.test_charset_detection", + "responses.tests.HttpResponseTests.test_generator_cache", + "responses.tests.HttpResponseTests.test_invalid_status_code", + "responses.tests.HttpResponseTests.test_reason_phrase", + "responses.tests.HttpResponseTests.test_repr", + "responses.tests.HttpResponseTests.test_repr_no_content_type", + "responses.tests.HttpResponseTests.test_response_content_charset", + "responses.tests.HttpResponseTests.test_status_code", + "responses.tests.HttpResponseTests.test_valid_status_code_string", + "responses.tests.HttpResponseTests.test_wrap_textiowrapper", + "schema.test_logging.SchemaLoggerTests.test_extra_args", + "servers.test_basehttp.WSGIRequestHandlerTestCase.test_https", + "servers.test_basehttp.WSGIRequestHandlerTestCase.test_log_message", + "servers.test_basehttp.WSGIRequestHandlerTestCase.test_strips_underscore_headers", + "servers.test_liveserverthread.LiveServerThreadTest.test_closes_connections", + "settings_tests.test_file_charset.DeprecationTests.test_access", + "settings_tests.test_file_charset.DeprecationTests.test_access_warning", + "settings_tests.test_file_charset.DeprecationTests.test_override_settings_warning", + "settings_tests.test_file_charset.DeprecationTests.test_settings_init_warning", + "settings_tests.tests.ChildDecoratedTestCase.test_override_settings_inheritance", + "settings_tests.tests.ClassDecoratedTestCase.test_max_recursion_error", + "settings_tests.tests.ClassDecoratedTestCase.test_method_override", + "settings_tests.tests.ClassDecoratedTestCase.test_override", + "settings_tests.tests.ClassDecoratedTestCase.test_setupclass_override", + "settings_tests.tests.ClassDecoratedTestCaseSuper.test_max_recursion_error", + "settings_tests.tests.FullyDecoratedTestCase.test_method_override", + "settings_tests.tests.FullyDecoratedTestCase.test_override", + "settings_tests.tests.FullyDecoratedTranTestCase.test_decorated_testcase_module", + "settings_tests.tests.FullyDecoratedTranTestCase.test_decorated_testcase_name", + "settings_tests.tests.FullyDecoratedTranTestCase.test_method_list_override", + "settings_tests.tests.FullyDecoratedTranTestCase.test_method_list_override_nested_order", + "settings_tests.tests.FullyDecoratedTranTestCase.test_method_list_override_no_ops", + "settings_tests.tests.FullyDecoratedTranTestCase.test_method_list_override_strings", + "settings_tests.tests.FullyDecoratedTranTestCase.test_method_override", + "settings_tests.tests.FullyDecoratedTranTestCase.test_override", + "settings_tests.tests.IsOverriddenTest.test_configure", + "settings_tests.tests.IsOverriddenTest.test_evaluated_lazysettings_repr", + "settings_tests.tests.IsOverriddenTest.test_module", + "settings_tests.tests.IsOverriddenTest.test_override", + "settings_tests.tests.IsOverriddenTest.test_settings_repr", + "settings_tests.tests.IsOverriddenTest.test_unevaluated_lazysettings_repr", + "settings_tests.tests.IsOverriddenTest.test_usersettingsholder_repr", + "settings_tests.tests.OverrideSettingsIsolationOnExceptionTests.test_override_settings_both", + "settings_tests.tests.OverrideSettingsIsolationOnExceptionTests.test_override_settings_enter", + "settings_tests.tests.OverrideSettingsIsolationOnExceptionTests.test_override_settings_exit", + "settings_tests.tests.OverrideSettingsIsolationOnExceptionTests.test_override_settings_reusable_on_enter", + "settings_tests.tests.SecureProxySslHeaderTest.test_none", + "settings_tests.tests.SecureProxySslHeaderTest.test_set_with_xheader_right", + "settings_tests.tests.SecureProxySslHeaderTest.test_set_with_xheader_wrong", + "settings_tests.tests.SecureProxySslHeaderTest.test_set_without_xheader", + "settings_tests.tests.SettingsTests.test_already_configured", + "settings_tests.tests.SettingsTests.test_class_decorator", + "settings_tests.tests.SettingsTests.test_context_manager", + "settings_tests.tests.SettingsTests.test_decorator", + "settings_tests.tests.SettingsTests.test_incorrect_timezone", + "settings_tests.tests.SettingsTests.test_no_secret_key", + "settings_tests.tests.SettingsTests.test_no_settings_module", + "settings_tests.tests.SettingsTests.test_override", + "settings_tests.tests.SettingsTests.test_override_change", + "settings_tests.tests.SettingsTests.test_override_doesnt_leak", + "settings_tests.tests.SettingsTests.test_override_settings_delete", + "settings_tests.tests.SettingsTests.test_override_settings_nested", + "settings_tests.tests.SettingsTests.test_settings_delete", + "settings_tests.tests.SettingsTests.test_settings_delete_wrapped", + "settings_tests.tests.SettingsTests.test_signal_callback_context_manager", + "settings_tests.tests.SettingsTests.test_signal_callback_decorator", + "settings_tests.tests.TestComplexSettingOverride.test_complex_override_warning", + "settings_tests.tests.TestListSettings.test_tuple_settings", + "shell.tests.ShellCommandTestCase.test_command_option", + "shell.tests.ShellCommandTestCase.test_shell_with_bpython_not_installed", + "shell.tests.ShellCommandTestCase.test_shell_with_ipython_not_installed", + "shell.tests.ShellCommandTestCase.test_stdin_read", + "shortcuts.test_render_to_response.RenderToResponseTests.test_render_to_response", + "shortcuts.test_render_to_response.RenderToResponseTests.test_render_to_response_with_content_type", + "shortcuts.test_render_to_response.RenderToResponseTests.test_render_to_response_with_multiple_templates", + "shortcuts.test_render_to_response.RenderToResponseTests.test_render_to_response_with_status", + "shortcuts.test_render_to_response.RenderToResponseTests.test_render_to_response_with_using", + "shortcuts.tests.RenderTests.test_render", + "shortcuts.tests.RenderTests.test_render_with_content_type", + "shortcuts.tests.RenderTests.test_render_with_multiple_templates", + "shortcuts.tests.RenderTests.test_render_with_status", + "shortcuts.tests.RenderTests.test_render_with_using", + "signed_cookies_tests.tests.SignedCookieTest.test_can_set_and_read_signed_cookies", + "signed_cookies_tests.tests.SignedCookieTest.test_can_use_salt", + "signed_cookies_tests.tests.SignedCookieTest.test_default_argument_suppresses_exceptions", + "signed_cookies_tests.tests.SignedCookieTest.test_detects_tampering", + "signed_cookies_tests.tests.SignedCookieTest.test_max_age_argument", + "signed_cookies_tests.tests.SignedCookieTest.test_signed_cookies_with_binary_key", + "signing.tests.TestSigner.test_decode_detects_tampering", + "signing.tests.TestSigner.test_dumps_loads", + "signing.tests.TestSigner.test_invalid_sep", + "signing.tests.TestSigner.test_sign_unsign", + "signing.tests.TestSigner.test_signature", + "signing.tests.TestSigner.test_signature_with_salt", + "signing.tests.TestSigner.test_unsign_detects_tampering", + "signing.tests.TestSigner.test_valid_sep", + "signing.tests.TestSigner.test_works_with_non_ascii_keys", + "signing.tests.TestTimestampSigner.test_timestamp_signer", + "sites_tests.tests.CreateDefaultSiteTests.test_basic", + "sites_tests.tests.CreateDefaultSiteTests.test_custom_site_id", + "sites_tests.tests.CreateDefaultSiteTests.test_multi_db", + "sites_tests.tests.CreateDefaultSiteTests.test_multi_db_with_router", + "sites_tests.tests.CreateDefaultSiteTests.test_no_site_id", + "sites_tests.tests.CreateDefaultSiteTests.test_save_another", + "sites_tests.tests.CreateDefaultSiteTests.test_signal", + "sites_tests.tests.CreateDefaultSiteTests.test_unavailable_site_model", + "sites_tests.tests.MiddlewareTest.test_old_style_request", + "sites_tests.tests.MiddlewareTest.test_request", + "sites_tests.tests.RequestSiteTests.test_delete", + "sites_tests.tests.RequestSiteTests.test_init_attributes", + "sites_tests.tests.RequestSiteTests.test_save", + "sites_tests.tests.RequestSiteTests.test_str", + "sites_tests.tests.SitesFrameworkTests.test_clear_site_cache", + "sites_tests.tests.SitesFrameworkTests.test_clear_site_cache_domain", + "sites_tests.tests.SitesFrameworkTests.test_delete_all_sites_clears_cache", + "sites_tests.tests.SitesFrameworkTests.test_domain_name_with_whitespaces", + "sites_tests.tests.SitesFrameworkTests.test_get_current_site", + "sites_tests.tests.SitesFrameworkTests.test_get_current_site_host_with_trailing_dot", + "sites_tests.tests.SitesFrameworkTests.test_get_current_site_no_site_id", + "sites_tests.tests.SitesFrameworkTests.test_get_current_site_no_site_id_and_handle_port_fallback", + "sites_tests.tests.SitesFrameworkTests.test_site_cache", + "sites_tests.tests.SitesFrameworkTests.test_site_manager", + "sites_tests.tests.SitesFrameworkTests.test_site_natural_key", + "sites_tests.tests.SitesFrameworkTests.test_unique_domain", + "staticfiles_tests.test_checks.FindersCheckTests.test_base_finder_check_not_implemented", + "staticfiles_tests.test_checks.FindersCheckTests.test_check_finders", + "staticfiles_tests.test_checks.FindersCheckTests.test_dirs_contains_static_root", + "staticfiles_tests.test_checks.FindersCheckTests.test_dirs_contains_static_root_in_tuple", + "staticfiles_tests.test_checks.FindersCheckTests.test_dirs_not_tuple_or_list", + "staticfiles_tests.test_checks.FindersCheckTests.test_no_errors_with_test_settings", + "staticfiles_tests.test_checks.FindersCheckTests.test_prefix_contains_trailing_slash", + "staticfiles_tests.test_finders.TestAppDirectoriesFinder.test_find_all", + "staticfiles_tests.test_finders.TestAppDirectoriesFinder.test_find_first", + "staticfiles_tests.test_finders.TestDefaultStorageFinder.test_find_all", + "staticfiles_tests.test_finders.TestDefaultStorageFinder.test_find_first", + "staticfiles_tests.test_finders.TestFileSystemFinder.test_find_all", + "staticfiles_tests.test_finders.TestFileSystemFinder.test_find_first", + "staticfiles_tests.test_finders.TestMiscFinder.test_cache", + "staticfiles_tests.test_finders.TestMiscFinder.test_get_finder", + "staticfiles_tests.test_finders.TestMiscFinder.test_get_finder_bad_classname", + "staticfiles_tests.test_finders.TestMiscFinder.test_get_finder_bad_module", + "staticfiles_tests.test_finders.TestMiscFinder.test_location_empty", + "staticfiles_tests.test_finders.TestMiscFinder.test_searched_locations", + "staticfiles_tests.test_forms.StaticFilesFormsMediaTestCase.test_absolute_url", + "staticfiles_tests.test_liveserver.StaticLiveServerChecks.test_test_test", + "staticfiles_tests.test_liveserver.StaticLiveServerView.test_collectstatic_emulation", + "staticfiles_tests.test_management.TestCollection.test_app_files", + "staticfiles_tests.test_management.TestCollection.test_camelcase_filenames", + "staticfiles_tests.test_management.TestCollection.test_common_ignore_patterns", + "staticfiles_tests.test_management.TestCollection.test_filename_with_percent_sign", + "staticfiles_tests.test_management.TestCollection.test_ignore", + "staticfiles_tests.test_management.TestCollection.test_nonascii_filenames", + "staticfiles_tests.test_management.TestCollection.test_staticfiles_dirs", + "staticfiles_tests.test_management.TestCollection.test_staticfiles_dirs_priority", + "staticfiles_tests.test_management.TestCollection.test_staticfiles_dirs_subdir", + "staticfiles_tests.test_management.TestCollectionClear.test_cleared_not_found", + "staticfiles_tests.test_management.TestCollectionClear.test_dir_not_exists", + "staticfiles_tests.test_management.TestCollectionClear.test_handle_path_notimplemented", + "staticfiles_tests.test_management.TestCollectionCustomIgnorePatterns.test_custom_ignore_patterns", + "staticfiles_tests.test_management.TestCollectionDryRun.test_no_files_created", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_app_files", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_camelcase_filenames", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_filename_with_percent_sign", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_no_common_ignore_patterns", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_nonascii_filenames", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_staticfiles_dirs", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_staticfiles_dirs_priority", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_staticfiles_dirs_subdir", + "staticfiles_tests.test_management.TestCollectionFilesOverride.test_ordering_override", + "staticfiles_tests.test_management.TestCollectionHelpSubcommand.test_missing_settings_dont_prevent_help", + "staticfiles_tests.test_management.TestCollectionLinks.test_app_files", + "staticfiles_tests.test_management.TestCollectionLinks.test_broken_symlink", + "staticfiles_tests.test_management.TestCollectionLinks.test_camelcase_filenames", + "staticfiles_tests.test_management.TestCollectionLinks.test_clear_broken_symlink", + "staticfiles_tests.test_management.TestCollectionLinks.test_filename_with_percent_sign", + "staticfiles_tests.test_management.TestCollectionLinks.test_links_created", + "staticfiles_tests.test_management.TestCollectionLinks.test_no_remote_link", + "staticfiles_tests.test_management.TestCollectionLinks.test_nonascii_filenames", + "staticfiles_tests.test_management.TestCollectionLinks.test_staticfiles_dirs", + "staticfiles_tests.test_management.TestCollectionLinks.test_staticfiles_dirs_priority", + "staticfiles_tests.test_management.TestCollectionLinks.test_staticfiles_dirs_subdir", + "staticfiles_tests.test_management.TestCollectionLinks.test_symlinks_and_files_replaced", + "staticfiles_tests.test_management.TestCollectionNeverCopyStorage.test_skips_newer_files_in_remote_storage", + "staticfiles_tests.test_management.TestCollectionNonLocalStorage.test_no_files_created", + "staticfiles_tests.test_management.TestCollectionNonLocalStorage.test_storage_properties", + "staticfiles_tests.test_management.TestCollectionOverwriteWarning.test_no_warning", + "staticfiles_tests.test_management.TestCollectionOverwriteWarning.test_warning", + "staticfiles_tests.test_management.TestCollectionVerbosity.test_verbosity_0", + "staticfiles_tests.test_management.TestCollectionVerbosity.test_verbosity_1", + "staticfiles_tests.test_management.TestCollectionVerbosity.test_verbosity_1_with_post_process", + "staticfiles_tests.test_management.TestCollectionVerbosity.test_verbosity_2", + "staticfiles_tests.test_management.TestCollectionVerbosity.test_verbosity_2_with_post_process", + "staticfiles_tests.test_management.TestConfiguration.test_local_storage_detection_helper", + "staticfiles_tests.test_management.TestConfiguration.test_location_empty", + "staticfiles_tests.test_management.TestFindStatic.test_all_files", + "staticfiles_tests.test_management.TestFindStatic.test_all_files_less_verbose", + "staticfiles_tests.test_management.TestFindStatic.test_all_files_more_verbose", + "staticfiles_tests.test_management.TestFindStatic.test_app_files", + "staticfiles_tests.test_management.TestFindStatic.test_camelcase_filenames", + "staticfiles_tests.test_management.TestFindStatic.test_filename_with_percent_sign", + "staticfiles_tests.test_management.TestFindStatic.test_nonascii_filenames", + "staticfiles_tests.test_management.TestFindStatic.test_staticfiles_dirs", + "staticfiles_tests.test_management.TestFindStatic.test_staticfiles_dirs_priority", + "staticfiles_tests.test_management.TestFindStatic.test_staticfiles_dirs_subdir", + "staticfiles_tests.test_management.TestInteractiveMessages.test_cancelled", + "staticfiles_tests.test_management.TestInteractiveMessages.test_no_warning_for_empty_staticdir", + "staticfiles_tests.test_management.TestInteractiveMessages.test_no_warning_when_staticdir_does_not_exist", + "staticfiles_tests.test_management.TestInteractiveMessages.test_warning_when_clearing_staticdir", + "staticfiles_tests.test_management.TestInteractiveMessages.test_warning_when_overwriting_files_in_staticdir", + "staticfiles_tests.test_management.TestRunserver.test_404_response", + "staticfiles_tests.test_management.TestRunserver.test_middleware_loaded_only_once", + "staticfiles_tests.test_storage.TestCachedStaticFilesStorageDeprecation.test_warning", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_cache_invalidation", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_cache_key_memcache_validation", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_corrupt_intermediate_files", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_css_import_case_insensitive", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_import_loop", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_import_replacement", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_path_ignored_completely", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_path_with_fragment", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_path_with_querystring", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_path_with_querystring_and_fragment", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_post_processing", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_post_processing_failure", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_absolute", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_absolute_root", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_deep_relative", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_relative", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_return", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_simple_content", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_url", + "staticfiles_tests.test_storage.TestCollectionHashedFilesCache.test_file_change_after_collectstatic", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_clear_empties_manifest", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_css_import_case_insensitive", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_import_loop", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_import_replacement", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_loaded_cache", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_manifest_exists", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_missing_entry", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_parse_cache", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_path_ignored_completely", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_path_with_fragment", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_path_with_querystring", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_path_with_querystring_and_fragment", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_post_processing", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_post_processing_failure", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_absolute", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_absolute_root", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_deep_relative", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_relative", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_return", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_simple_content", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_url", + "staticfiles_tests.test_storage.TestCollectionSimpleStorage.test_template_tag_return", + "staticfiles_tests.test_storage.TestCollectionSimpleStorage.test_template_tag_simple_content", + "staticfiles_tests.test_storage.TestExtraPatternsStorage.test_multi_extension_patterns", + "staticfiles_tests.test_storage.TestStaticFilePermissions.test_collect_static_files_default_permissions", + "staticfiles_tests.test_storage.TestStaticFilePermissions.test_collect_static_files_permissions", + "staticfiles_tests.test_storage.TestStaticFilePermissions.test_collect_static_files_subclass_of_static_storage", + "staticfiles_tests.test_templatetag_deprecation.StaticDeprecationTests.test_static_deprecated", + "staticfiles_tests.test_templatetag_deprecation.StaticDeprecationTests.test_templatetag_deprecated", + "staticfiles_tests.test_templatetags.TestTemplateTag.test_template_tag", + "staticfiles_tests.test_templatetags.TestTemplateTag.test_template_tag_escapes", + "staticfiles_tests.test_utils.CheckSettingsTests.test_media_url_in_static_url", + "staticfiles_tests.test_views.TestServeDisabled.test_disabled_serving", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_app_files", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_camelcase_filenames", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_filename_with_percent_sign", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_nonascii_filenames", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_staticfiles_dirs", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_staticfiles_dirs_priority", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_staticfiles_dirs_subdir", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_app_files", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_camelcase_filenames", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_filename_with_percent_sign", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_nonascii_filenames", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_staticfiles_dirs", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_staticfiles_dirs_priority", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_staticfiles_dirs_subdir", + "template_backends.test_django.DjangoTemplatesTests.test_autoescape_default", + "template_backends.test_django.DjangoTemplatesTests.test_autoescape_off", + "template_backends.test_django.DjangoTemplatesTests.test_builtins_discovery", + "template_backends.test_django.DjangoTemplatesTests.test_context_has_priority_over_template_context_processors", + "template_backends.test_django.DjangoTemplatesTests.test_csrf_token", + "template_backends.test_django.DjangoTemplatesTests.test_debug_default_template_loaders", + "template_backends.test_django.DjangoTemplatesTests.test_django_html_escaping", + "template_backends.test_django.DjangoTemplatesTests.test_from_string", + "template_backends.test_django.DjangoTemplatesTests.test_get_template", + "template_backends.test_django.DjangoTemplatesTests.test_get_template_nonexistent", + "template_backends.test_django.DjangoTemplatesTests.test_get_template_syntax_error", + "template_backends.test_django.DjangoTemplatesTests.test_html_escaping", + "template_backends.test_django.DjangoTemplatesTests.test_no_directory_traversal", + "template_backends.test_django.DjangoTemplatesTests.test_non_ascii_characters", + "template_backends.test_django.DjangoTemplatesTests.test_non_debug_default_template_loaders", + "template_backends.test_django.DjangoTemplatesTests.test_render_requires_dict", + "template_backends.test_django.DjangoTemplatesTests.test_templatetag_discovery", + "template_backends.test_django.DjangoTemplatesTests.test_templatetag_discovery_import_error", + "template_backends.test_dummy.TemplateStringsTests.test_csrf_token", + "template_backends.test_dummy.TemplateStringsTests.test_django_html_escaping", + "template_backends.test_dummy.TemplateStringsTests.test_from_string", + "template_backends.test_dummy.TemplateStringsTests.test_get_template", + "template_backends.test_dummy.TemplateStringsTests.test_get_template_nonexistent", + "template_backends.test_dummy.TemplateStringsTests.test_get_template_syntax_error", + "template_backends.test_dummy.TemplateStringsTests.test_html_escaping", + "template_backends.test_dummy.TemplateStringsTests.test_no_directory_traversal", + "template_backends.test_dummy.TemplateStringsTests.test_non_ascii_characters", + "template_backends.test_jinja2.Jinja2Tests.test_context_processors", + "template_backends.test_jinja2.Jinja2Tests.test_csrf_token", + "template_backends.test_jinja2.Jinja2Tests.test_django_html_escaping", + "template_backends.test_jinja2.Jinja2Tests.test_exception_debug_info_max_context", + "template_backends.test_jinja2.Jinja2Tests.test_exception_debug_info_min_context", + "template_backends.test_jinja2.Jinja2Tests.test_from_string", + "template_backends.test_jinja2.Jinja2Tests.test_get_template", + "template_backends.test_jinja2.Jinja2Tests.test_get_template_nonexistent", + "template_backends.test_jinja2.Jinja2Tests.test_get_template_syntax_error", + "template_backends.test_jinja2.Jinja2Tests.test_html_escaping", + "template_backends.test_jinja2.Jinja2Tests.test_no_directory_traversal", + "template_backends.test_jinja2.Jinja2Tests.test_non_ascii_characters", + "template_backends.test_jinja2.Jinja2Tests.test_origin", + "template_backends.test_jinja2.Jinja2Tests.test_origin_from_string", + "template_backends.test_jinja2.Jinja2Tests.test_self_context", + "template_backends.test_utils.TemplateUtilsTests.test_backend_import_error", + "template_backends.test_utils.TemplateUtilsTests.test_backend_improperly_configured", + "template_backends.test_utils.TemplateUtilsTests.test_backend_names_must_be_unique", + "template_loader.tests.TemplateLoaderTests.test_get_template_first_engine", + "template_loader.tests.TemplateLoaderTests.test_get_template_not_found", + "template_loader.tests.TemplateLoaderTests.test_get_template_second_engine", + "template_loader.tests.TemplateLoaderTests.test_get_template_using_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_first_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_not_found", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_second_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_using_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_empty", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_first_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_not_found", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_second_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_tries_all_engines_before_names", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_using_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_request", + "template_loader.tests.TemplateLoaderTests.test_select_template_empty", + "template_loader.tests.TemplateLoaderTests.test_select_template_first_engine", + "template_loader.tests.TemplateLoaderTests.test_select_template_not_found", + "template_loader.tests.TemplateLoaderTests.test_select_template_second_engine", + "template_loader.tests.TemplateLoaderTests.test_select_template_string", + "template_loader.tests.TemplateLoaderTests.test_select_template_tries_all_engines_before_names", + "template_loader.tests.TemplateLoaderTests.test_select_template_using_engine", + "template_tests.filter_tests.test_add.AddTests.test_add01", + "template_tests.filter_tests.test_add.AddTests.test_add02", + "template_tests.filter_tests.test_add.AddTests.test_add03", + "template_tests.filter_tests.test_add.AddTests.test_add04", + "template_tests.filter_tests.test_add.AddTests.test_add05", + "template_tests.filter_tests.test_add.AddTests.test_add06", + "template_tests.filter_tests.test_add.AddTests.test_add07", + "template_tests.filter_tests.test_add.FunctionTests.test_add", + "template_tests.filter_tests.test_addslashes.AddslashesTests.test_addslashes01", + "template_tests.filter_tests.test_addslashes.AddslashesTests.test_addslashes02", + "template_tests.filter_tests.test_addslashes.FunctionTests.test_backslashes", + "template_tests.filter_tests.test_addslashes.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_addslashes.FunctionTests.test_quotes", + "template_tests.filter_tests.test_autoescape.AutoescapeStringfilterTests.test_autoescape_stringfilter01", + "template_tests.filter_tests.test_autoescape.AutoescapeStringfilterTests.test_autoescape_stringfilter02", + "template_tests.filter_tests.test_autoescape.AutoescapeStringfilterTests.test_autoescape_stringfilter03", + "template_tests.filter_tests.test_autoescape.AutoescapeStringfilterTests.test_autoescape_stringfilter04", + "template_tests.filter_tests.test_capfirst.CapfirstTests.test_capfirst01", + "template_tests.filter_tests.test_capfirst.CapfirstTests.test_capfirst02", + "template_tests.filter_tests.test_capfirst.FunctionTests.test_capfirst", + "template_tests.filter_tests.test_center.CenterTests.test_center01", + "template_tests.filter_tests.test_center.CenterTests.test_center02", + "template_tests.filter_tests.test_center.FunctionTests.test_center", + "template_tests.filter_tests.test_center.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining01", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining02", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining03", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining04", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining05", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining06", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining07", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining08", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining09", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining10", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining11", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining12", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining13", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining14", + "template_tests.filter_tests.test_cut.CutTests.test_cut01", + "template_tests.filter_tests.test_cut.CutTests.test_cut02", + "template_tests.filter_tests.test_cut.CutTests.test_cut03", + "template_tests.filter_tests.test_cut.CutTests.test_cut04", + "template_tests.filter_tests.test_cut.CutTests.test_cut05", + "template_tests.filter_tests.test_cut.CutTests.test_cut06", + "template_tests.filter_tests.test_cut.FunctionTests.test_character", + "template_tests.filter_tests.test_cut.FunctionTests.test_characters", + "template_tests.filter_tests.test_cut.FunctionTests.test_non_matching_string", + "template_tests.filter_tests.test_cut.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_date.DateTests.test_date01", + "template_tests.filter_tests.test_date.DateTests.test_date02", + "template_tests.filter_tests.test_date.DateTests.test_date02_l10n", + "template_tests.filter_tests.test_date.DateTests.test_date03", + "template_tests.filter_tests.test_date.DateTests.test_date04", + "template_tests.filter_tests.test_date.DateTests.test_date05", + "template_tests.filter_tests.test_date.DateTests.test_date06", + "template_tests.filter_tests.test_date.DateTests.test_date07", + "template_tests.filter_tests.test_date.DateTests.test_date08", + "template_tests.filter_tests.test_date.DateTests.test_date09", + "template_tests.filter_tests.test_date.FunctionTests.test_date", + "template_tests.filter_tests.test_date.FunctionTests.test_escape_characters", + "template_tests.filter_tests.test_date.FunctionTests.test_no_args", + "template_tests.filter_tests.test_default.DefaultIfNoneTests.test_default_if_none01", + "template_tests.filter_tests.test_default.DefaultIfNoneTests.test_default_if_none02", + "template_tests.filter_tests.test_default.DefaultTests.test_default01", + "template_tests.filter_tests.test_default.DefaultTests.test_default02", + "template_tests.filter_tests.test_default.DefaultTests.test_default03", + "template_tests.filter_tests.test_default.DefaultTests.test_default04", + "template_tests.filter_tests.test_default.FunctionTests.test_empty_string", + "template_tests.filter_tests.test_default.FunctionTests.test_none", + "template_tests.filter_tests.test_default.FunctionTests.test_value", + "template_tests.filter_tests.test_default_if_none.FunctionTests.test_empty_string", + "template_tests.filter_tests.test_default_if_none.FunctionTests.test_none", + "template_tests.filter_tests.test_default_if_none.FunctionTests.test_value", + "template_tests.filter_tests.test_dictsort.FunctionTests.test_dictsort_complex_sorting_key", + "template_tests.filter_tests.test_dictsort.FunctionTests.test_invalid_values", + "template_tests.filter_tests.test_dictsort.FunctionTests.test_sort", + "template_tests.filter_tests.test_dictsort.FunctionTests.test_sort_list_of_tuple_like_dicts", + "template_tests.filter_tests.test_dictsort.FunctionTests.test_sort_list_of_tuples", + "template_tests.filter_tests.test_dictsortreversed.FunctionTests.test_invalid_values", + "template_tests.filter_tests.test_dictsortreversed.FunctionTests.test_sort", + "template_tests.filter_tests.test_dictsortreversed.FunctionTests.test_sort_list_of_tuple_like_dicts", + "template_tests.filter_tests.test_dictsortreversed.FunctionTests.test_sort_list_of_tuples", + "template_tests.filter_tests.test_divisibleby.FunctionTests.test_false", + "template_tests.filter_tests.test_divisibleby.FunctionTests.test_true", + "template_tests.filter_tests.test_escape.EscapeTests.test_escape01", + "template_tests.filter_tests.test_escape.EscapeTests.test_escape02", + "template_tests.filter_tests.test_escape.EscapeTests.test_escape03", + "template_tests.filter_tests.test_escape.EscapeTests.test_escape04", + "template_tests.filter_tests.test_escape.EscapeTests.test_escape_lazy_string", + "template_tests.filter_tests.test_escape.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_escapejs.EscapejsTests.test_escapejs01", + "template_tests.filter_tests.test_escapejs.EscapejsTests.test_escapejs02", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_backslashes", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_lazy_string", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_paragraph_separator", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_quotes", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_script", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_whitespace", + "template_tests.filter_tests.test_filesizeformat.FunctionTests.test_formats", + "template_tests.filter_tests.test_filesizeformat.FunctionTests.test_localized_formats", + "template_tests.filter_tests.test_filesizeformat.FunctionTests.test_negative_numbers", + "template_tests.filter_tests.test_first.FirstTests.test_first01", + "template_tests.filter_tests.test_first.FirstTests.test_first02", + "template_tests.filter_tests.test_first.FunctionTests.test_empty_string", + "template_tests.filter_tests.test_first.FunctionTests.test_list", + "template_tests.filter_tests.test_first.FunctionTests.test_string", + "template_tests.filter_tests.test_floatformat.FloatformatTests.test_floatformat01", + "template_tests.filter_tests.test_floatformat.FloatformatTests.test_floatformat02", + "template_tests.filter_tests.test_floatformat.FunctionTests.test_float_dunder_method", + "template_tests.filter_tests.test_floatformat.FunctionTests.test_infinity", + "template_tests.filter_tests.test_floatformat.FunctionTests.test_inputs", + "template_tests.filter_tests.test_floatformat.FunctionTests.test_low_decimal_precision", + "template_tests.filter_tests.test_floatformat.FunctionTests.test_zero_values", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape01", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape02", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape03", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape04", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape05", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape06", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape07", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape08", + "template_tests.filter_tests.test_force_escape.FunctionTests.test_escape", + "template_tests.filter_tests.test_force_escape.FunctionTests.test_unicode", + "template_tests.filter_tests.test_get_digit.FunctionTests.test_string", + "template_tests.filter_tests.test_get_digit.FunctionTests.test_values", + "template_tests.filter_tests.test_iriencode.FunctionTests.test_unicode", + "template_tests.filter_tests.test_iriencode.FunctionTests.test_urlencoded", + "template_tests.filter_tests.test_iriencode.IriencodeTests.test_iriencode01", + "template_tests.filter_tests.test_iriencode.IriencodeTests.test_iriencode02", + "template_tests.filter_tests.test_iriencode.IriencodeTests.test_iriencode03", + "template_tests.filter_tests.test_iriencode.IriencodeTests.test_iriencode04", + "template_tests.filter_tests.test_join.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_join.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_join.FunctionTests.test_list", + "template_tests.filter_tests.test_join.FunctionTests.test_noniterable_arg", + "template_tests.filter_tests.test_join.FunctionTests.test_noniterable_arg_autoescape_off", + "template_tests.filter_tests.test_join.JoinTests.test_join01", + "template_tests.filter_tests.test_join.JoinTests.test_join02", + "template_tests.filter_tests.test_join.JoinTests.test_join03", + "template_tests.filter_tests.test_join.JoinTests.test_join04", + "template_tests.filter_tests.test_join.JoinTests.test_join05", + "template_tests.filter_tests.test_join.JoinTests.test_join06", + "template_tests.filter_tests.test_join.JoinTests.test_join07", + "template_tests.filter_tests.test_join.JoinTests.test_join08", + "template_tests.filter_tests.test_json_script.JsonScriptTests.test_basic", + "template_tests.filter_tests.test_last.LastTests.test_empty_list", + "template_tests.filter_tests.test_last.LastTests.test_last01", + "template_tests.filter_tests.test_last.LastTests.test_last02", + "template_tests.filter_tests.test_length.FunctionTests.test_list", + "template_tests.filter_tests.test_length.FunctionTests.test_safestring", + "template_tests.filter_tests.test_length.FunctionTests.test_string", + "template_tests.filter_tests.test_length.LengthTests.test_length01", + "template_tests.filter_tests.test_length.LengthTests.test_length02", + "template_tests.filter_tests.test_length.LengthTests.test_length03", + "template_tests.filter_tests.test_length.LengthTests.test_length04", + "template_tests.filter_tests.test_length.LengthTests.test_length05", + "template_tests.filter_tests.test_length.LengthTests.test_length06", + "template_tests.filter_tests.test_length.LengthTests.test_length07", + "template_tests.filter_tests.test_length_is.FunctionTests.test_empty_list", + "template_tests.filter_tests.test_length_is.FunctionTests.test_string", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is01", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is02", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is03", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is04", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is05", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is06", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is07", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is08", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is09", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is10", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is11", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_carriage", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_carriage_newline", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_lazy_string_input", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_line", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_newline", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_linebreaks.LinebreaksTests.test_linebreaks01", + "template_tests.filter_tests.test_linebreaks.LinebreaksTests.test_linebreaks02", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_carriage", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_carriage_newline", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_newline", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_linebreaksbr.LinebreaksbrTests.test_linebreaksbr01", + "template_tests.filter_tests.test_linebreaksbr.LinebreaksbrTests.test_linebreaksbr02", + "template_tests.filter_tests.test_linenumbers.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_linenumbers.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_linenumbers.FunctionTests.test_linenumbers", + "template_tests.filter_tests.test_linenumbers.FunctionTests.test_linenumbers2", + "template_tests.filter_tests.test_linenumbers.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_linenumbers.LinenumbersTests.test_linenumbers01", + "template_tests.filter_tests.test_linenumbers.LinenumbersTests.test_linenumbers02", + "template_tests.filter_tests.test_ljust.FunctionTests.test_less_than_string_length", + "template_tests.filter_tests.test_ljust.FunctionTests.test_ljust", + "template_tests.filter_tests.test_ljust.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_ljust.LjustTests.test_ljust01", + "template_tests.filter_tests.test_ljust.LjustTests.test_ljust02", + "template_tests.filter_tests.test_lower.FunctionTests.test_lower", + "template_tests.filter_tests.test_lower.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_lower.FunctionTests.test_unicode", + "template_tests.filter_tests.test_lower.LowerTests.test_lower01", + "template_tests.filter_tests.test_lower.LowerTests.test_lower02", + "template_tests.filter_tests.test_make_list.FunctionTests.test_integer", + "template_tests.filter_tests.test_make_list.FunctionTests.test_string", + "template_tests.filter_tests.test_make_list.MakeListTests.test_make_list01", + "template_tests.filter_tests.test_make_list.MakeListTests.test_make_list02", + "template_tests.filter_tests.test_make_list.MakeListTests.test_make_list03", + "template_tests.filter_tests.test_make_list.MakeListTests.test_make_list04", + "template_tests.filter_tests.test_phone2numeric.FunctionTests.test_phone2numeric", + "template_tests.filter_tests.test_phone2numeric.Phone2numericTests.test_phone2numeric01", + "template_tests.filter_tests.test_phone2numeric.Phone2numericTests.test_phone2numeric02", + "template_tests.filter_tests.test_phone2numeric.Phone2numericTests.test_phone2numeric03", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_decimals", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_floats", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_integers", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_lists", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_no_len_type", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_suffixes", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_value_error", + "template_tests.filter_tests.test_pluralize.PluralizeTests.test_no_arguments", + "template_tests.filter_tests.test_pluralize.PluralizeTests.test_singular_and_plural_suffix", + "template_tests.filter_tests.test_pluralize.PluralizeTests.test_suffix", + "template_tests.filter_tests.test_random.RandomTests.test_random01", + "template_tests.filter_tests.test_random.RandomTests.test_random02", + "template_tests.filter_tests.test_rjust.FunctionTests.test_less_than_string_length", + "template_tests.filter_tests.test_rjust.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_rjust.FunctionTests.test_rjust", + "template_tests.filter_tests.test_rjust.RjustTests.test_rjust01", + "template_tests.filter_tests.test_rjust.RjustTests.test_rjust02", + "template_tests.filter_tests.test_safe.SafeTests.test_safe01", + "template_tests.filter_tests.test_safe.SafeTests.test_safe02", + "template_tests.filter_tests.test_safeseq.SafeseqTests.test_safeseq01", + "template_tests.filter_tests.test_safeseq.SafeseqTests.test_safeseq02", + "template_tests.filter_tests.test_slice.FunctionTests.test_fail_silently", + "template_tests.filter_tests.test_slice.FunctionTests.test_index", + "template_tests.filter_tests.test_slice.FunctionTests.test_index_integer", + "template_tests.filter_tests.test_slice.FunctionTests.test_negative_index", + "template_tests.filter_tests.test_slice.FunctionTests.test_range", + "template_tests.filter_tests.test_slice.FunctionTests.test_range_multiple", + "template_tests.filter_tests.test_slice.FunctionTests.test_range_step", + "template_tests.filter_tests.test_slice.FunctionTests.test_zero_length", + "template_tests.filter_tests.test_slice.SliceTests.test_slice01", + "template_tests.filter_tests.test_slice.SliceTests.test_slice02", + "template_tests.filter_tests.test_slugify.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_slugify.FunctionTests.test_slugify", + "template_tests.filter_tests.test_slugify.FunctionTests.test_slugify_lazy_string", + "template_tests.filter_tests.test_slugify.FunctionTests.test_unicode", + "template_tests.filter_tests.test_slugify.SlugifyTests.test_slugify01", + "template_tests.filter_tests.test_slugify.SlugifyTests.test_slugify02", + "template_tests.filter_tests.test_stringformat.FunctionTests.test_format", + "template_tests.filter_tests.test_stringformat.FunctionTests.test_invalid", + "template_tests.filter_tests.test_stringformat.StringformatTests.test_stringformat01", + "template_tests.filter_tests.test_stringformat.StringformatTests.test_stringformat02", + "template_tests.filter_tests.test_striptags.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_striptags.FunctionTests.test_strip", + "template_tests.filter_tests.test_striptags.FunctionTests.test_strip_lazy_string", + "template_tests.filter_tests.test_striptags.StriptagsTests.test_striptags01", + "template_tests.filter_tests.test_striptags.StriptagsTests.test_striptags02", + "template_tests.filter_tests.test_time.FunctionTests.test_inputs", + "template_tests.filter_tests.test_time.FunctionTests.test_no_args", + "template_tests.filter_tests.test_time.TimeTests.test_time00", + "template_tests.filter_tests.test_time.TimeTests.test_time00_l10n", + "template_tests.filter_tests.test_time.TimeTests.test_time01", + "template_tests.filter_tests.test_time.TimeTests.test_time02", + "template_tests.filter_tests.test_time.TimeTests.test_time03", + "template_tests.filter_tests.test_time.TimeTests.test_time04", + "template_tests.filter_tests.test_time.TimeTests.test_time05", + "template_tests.filter_tests.test_time.TimeTests.test_time06", + "template_tests.filter_tests.test_timesince.FunctionTests.test_explicit_date", + "template_tests.filter_tests.test_timesince.FunctionTests.test_no_args", + "template_tests.filter_tests.test_timesince.FunctionTests.test_since_now", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince01", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince02", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince03", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince04", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince05", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince06", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince07", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince08", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince09", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince10", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince11", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince12", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince13", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince14", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince15", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince16", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince17", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince18", + "template_tests.filter_tests.test_timeuntil.FunctionTests.test_explicit_date", + "template_tests.filter_tests.test_timeuntil.FunctionTests.test_no_args", + "template_tests.filter_tests.test_timeuntil.FunctionTests.test_until_now", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_aware_naive_type_error", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_naive_aware_type_error", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil01", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil02", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil03", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil04", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil05", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil06", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil07", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil08", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil09", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil10", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil11", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil12", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil13", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil14", + "template_tests.filter_tests.test_title.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_title.FunctionTests.test_title", + "template_tests.filter_tests.test_title.FunctionTests.test_unicode", + "template_tests.filter_tests.test_title.TitleTests.test_title1", + "template_tests.filter_tests.test_title.TitleTests.test_title2", + "template_tests.filter_tests.test_truncatechars.TruncatecharsTests.test_fail_silently_incorrect_arg", + "template_tests.filter_tests.test_truncatechars.TruncatecharsTests.test_truncatechars01", + "template_tests.filter_tests.test_truncatechars.TruncatecharsTests.test_truncatechars02", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_invalid_arg", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate2", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate3", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate_something", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate_unicode", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate_zero", + "template_tests.filter_tests.test_truncatewords.FunctionTests.test_invalid_number", + "template_tests.filter_tests.test_truncatewords.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_truncatewords.FunctionTests.test_overtruncate", + "template_tests.filter_tests.test_truncatewords.FunctionTests.test_truncate", + "template_tests.filter_tests.test_truncatewords.FunctionTests.test_truncate2", + "template_tests.filter_tests.test_truncatewords.TruncatewordsTests.test_truncatewords01", + "template_tests.filter_tests.test_truncatewords.TruncatewordsTests.test_truncatewords02", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_invalid_arg", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate2", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate3", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate4", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate_complex", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate_unicode", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate_zero", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_list", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_list_gettext", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested2", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested3", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested_generators", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested_multiple", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested_multiple2", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_ulitem", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_ulitem_autoescape_off", + "template_tests.filter_tests.test_unordered_list.UnorderedListTests.test_unordered_list01", + "template_tests.filter_tests.test_unordered_list.UnorderedListTests.test_unordered_list02", + "template_tests.filter_tests.test_unordered_list.UnorderedListTests.test_unordered_list03", + "template_tests.filter_tests.test_unordered_list.UnorderedListTests.test_unordered_list04", + "template_tests.filter_tests.test_unordered_list.UnorderedListTests.test_unordered_list05", + "template_tests.filter_tests.test_upper.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_upper.FunctionTests.test_unicode", + "template_tests.filter_tests.test_upper.FunctionTests.test_upper", + "template_tests.filter_tests.test_upper.UpperTests.test_upper01", + "template_tests.filter_tests.test_upper.UpperTests.test_upper02", + "template_tests.filter_tests.test_urlencode.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_urlencode.FunctionTests.test_urlencode", + "template_tests.filter_tests.test_urlencode.UrlencodeTests.test_urlencode01", + "template_tests.filter_tests.test_urlencode.UrlencodeTests.test_urlencode02", + "template_tests.filter_tests.test_urlize.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_urlize.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_urlize.FunctionTests.test_brackets", + "template_tests.filter_tests.test_urlize.FunctionTests.test_email", + "template_tests.filter_tests.test_urlize.FunctionTests.test_exclamation_marks", + "template_tests.filter_tests.test_urlize.FunctionTests.test_https", + "template_tests.filter_tests.test_urlize.FunctionTests.test_idn", + "template_tests.filter_tests.test_urlize.FunctionTests.test_invalid_email", + "template_tests.filter_tests.test_urlize.FunctionTests.test_ipv4", + "template_tests.filter_tests.test_urlize.FunctionTests.test_ipv6", + "template_tests.filter_tests.test_urlize.FunctionTests.test_lazystring", + "template_tests.filter_tests.test_urlize.FunctionTests.test_malformed", + "template_tests.filter_tests.test_urlize.FunctionTests.test_nofollow", + "template_tests.filter_tests.test_urlize.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_urlize.FunctionTests.test_parenthesis", + "template_tests.filter_tests.test_urlize.FunctionTests.test_quotation_marks", + "template_tests.filter_tests.test_urlize.FunctionTests.test_quote_commas", + "template_tests.filter_tests.test_urlize.FunctionTests.test_quoting", + "template_tests.filter_tests.test_urlize.FunctionTests.test_tlds", + "template_tests.filter_tests.test_urlize.FunctionTests.test_trailing_multiple_punctuation", + "template_tests.filter_tests.test_urlize.FunctionTests.test_trailing_period", + "template_tests.filter_tests.test_urlize.FunctionTests.test_unicode", + "template_tests.filter_tests.test_urlize.FunctionTests.test_uppercase", + "template_tests.filter_tests.test_urlize.FunctionTests.test_url_split_chars", + "template_tests.filter_tests.test_urlize.FunctionTests.test_urlencoded", + "template_tests.filter_tests.test_urlize.FunctionTests.test_urls", + "template_tests.filter_tests.test_urlize.FunctionTests.test_word_with_dot", + "template_tests.filter_tests.test_urlize.FunctionTests.test_wrapping_characters", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize01", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize02", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize03", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize04", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize05", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize06", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize07", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize08", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize09", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_overtruncate", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_query_string", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_truncate", + "template_tests.filter_tests.test_urlizetrunc.UrlizetruncTests.test_urlizetrunc01", + "template_tests.filter_tests.test_urlizetrunc.UrlizetruncTests.test_urlizetrunc02", + "template_tests.filter_tests.test_wordcount.FunctionTests.test_count_multiple", + "template_tests.filter_tests.test_wordcount.FunctionTests.test_count_one", + "template_tests.filter_tests.test_wordcount.FunctionTests.test_empty_string", + "template_tests.filter_tests.test_wordcount.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_wordcount.WordcountTests.test_wordcount01", + "template_tests.filter_tests.test_wordcount.WordcountTests.test_wordcount02", + "template_tests.filter_tests.test_wordwrap.FunctionTests.test_indent", + "template_tests.filter_tests.test_wordwrap.FunctionTests.test_indent2", + "template_tests.filter_tests.test_wordwrap.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_wordwrap.FunctionTests.test_wrap", + "template_tests.filter_tests.test_wordwrap.FunctionTests.test_wrap_lazy_string", + "template_tests.filter_tests.test_wordwrap.WordwrapTests.test_wordwrap01", + "template_tests.filter_tests.test_wordwrap.WordwrapTests.test_wordwrap02", + "template_tests.filter_tests.test_yesno.FunctionTests.test_false", + "template_tests.filter_tests.test_yesno.FunctionTests.test_false_arguments", + "template_tests.filter_tests.test_yesno.FunctionTests.test_invalid_value", + "template_tests.filter_tests.test_yesno.FunctionTests.test_none", + "template_tests.filter_tests.test_yesno.FunctionTests.test_none_three_arguments", + "template_tests.filter_tests.test_yesno.FunctionTests.test_none_two_arguments", + "template_tests.filter_tests.test_yesno.FunctionTests.test_true", + "template_tests.filter_tests.test_yesno.FunctionTests.test_true_arguments", + "template_tests.filter_tests.test_yesno.YesNoTests.test_true", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_blocktrans_syntax_error_missing_assignment", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_blocktrans_tag_using_a_string_that_looks_like_str_fmt", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_count", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n03", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n04", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n05", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n07", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n08", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n17", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n18", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n19", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n21", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n26", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n27", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n28", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n34", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n34_2", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n34_3", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n37", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n39", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n40", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n41", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n04", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n07", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n08", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n17", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n18", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n26", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n27", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n28", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_no_args_with", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_plural_bad_syntax", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_variable_twice", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_with_block", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_with_for", + "template_tests.syntax_tests.i18n.test_blocktrans.MiscTests.test_percent_formatting_in_blocktrans", + "template_tests.syntax_tests.i18n.test_blocktrans.MiscTests.test_percent_in_translatable_block", + "template_tests.syntax_tests.i18n.test_blocktrans.MultipleLocaleActivationBlockTransTests.test_multiple_locale_btrans", + "template_tests.syntax_tests.i18n.test_blocktrans.MultipleLocaleActivationBlockTransTests.test_multiple_locale_deactivate_btrans", + "template_tests.syntax_tests.i18n.test_blocktrans.MultipleLocaleActivationBlockTransTests.test_multiple_locale_direct_switch_btrans", + "template_tests.syntax_tests.i18n.test_blocktrans.MultipleLocaleActivationBlockTransTests.test_single_locale_activation", + "template_tests.syntax_tests.i18n.test_blocktrans.TranslationBlockTransTagTests.test_bad_placeholder_1", + "template_tests.syntax_tests.i18n.test_blocktrans.TranslationBlockTransTagTests.test_bad_placeholder_2", + "template_tests.syntax_tests.i18n.test_blocktrans.TranslationBlockTransTagTests.test_template_tags_pgettext", + "template_tests.syntax_tests.i18n.test_filters.I18nFiltersTests.test_i18n32", + "template_tests.syntax_tests.i18n.test_filters.I18nFiltersTests.test_i18n33", + "template_tests.syntax_tests.i18n.test_filters.I18nFiltersTests.test_i18n38_2", + "template_tests.syntax_tests.i18n.test_get_available_languages.GetAvailableLanguagesTagTests.test_i18n12", + "template_tests.syntax_tests.i18n.test_get_available_languages.GetAvailableLanguagesTagTests.test_no_as_var", + "template_tests.syntax_tests.i18n.test_get_current_language.I18nGetCurrentLanguageTagTests.test_no_as_var", + "template_tests.syntax_tests.i18n.test_get_current_language_bidi.I18nGetCurrentLanguageBidiTagTests.test_no_as_var", + "template_tests.syntax_tests.i18n.test_get_language_info.I18nGetLanguageInfoTagTests.test_i18n28_2", + "template_tests.syntax_tests.i18n.test_get_language_info.I18nGetLanguageInfoTagTests.test_i18n29", + "template_tests.syntax_tests.i18n.test_get_language_info.I18nGetLanguageInfoTagTests.test_i18n38", + "template_tests.syntax_tests.i18n.test_get_language_info.I18nGetLanguageInfoTagTests.test_no_for_as", + "template_tests.syntax_tests.i18n.test_get_language_info_list.GetLanguageInfoListTests.test_i18n30", + "template_tests.syntax_tests.i18n.test_get_language_info_list.GetLanguageInfoListTests.test_i18n31", + "template_tests.syntax_tests.i18n.test_get_language_info_list.GetLanguageInfoListTests.test_i18n38_2", + "template_tests.syntax_tests.i18n.test_get_language_info_list.GetLanguageInfoListTests.test_no_for_as", + "template_tests.syntax_tests.i18n.test_language.I18nLanguageTagTests.test_no_arg", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n01", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n02", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n06", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n09", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n20", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n22", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n23", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n24", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n25", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n35", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n36", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_bad_option", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_context_as", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_context_noop", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_duplicate_option", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_missing_assignment", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_missing_context", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_no_arguments", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_trans_tag_using_a_string_that_looks_like_str_fmt", + "template_tests.syntax_tests.i18n.test_trans.LocalizeNodeTests.test_repr", + "template_tests.syntax_tests.i18n.test_trans.MultipleLocaleActivationTransTagTests.test_multiple_locale_deactivate_trans", + "template_tests.syntax_tests.i18n.test_trans.MultipleLocaleActivationTransTagTests.test_multiple_locale_direct_switch_trans", + "template_tests.syntax_tests.i18n.test_trans.MultipleLocaleActivationTransTagTests.test_multiple_locale_trans", + "template_tests.syntax_tests.i18n.test_trans.MultipleLocaleActivationTransTagTests.test_single_locale_activation", + "template_tests.syntax_tests.i18n.test_trans.TranslationTransTagTests.test_template_tags_pgettext", + "template_tests.syntax_tests.i18n.test_underscore_syntax.I18nStringLiteralTests.test_i18n13", + "template_tests.syntax_tests.i18n.test_underscore_syntax.I18nStringLiteralTests.test_i18n14", + "template_tests.syntax_tests.i18n.test_underscore_syntax.I18nStringLiteralTests.test_i18n15", + "template_tests.syntax_tests.i18n.test_underscore_syntax.I18nStringLiteralTests.test_i18n16", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_deactivate", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_direct_switch", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_filter", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_filter_deactivate", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_filter_direct_switch", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_loadi18n", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_loadi18n_deactivate", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_loadi18n_direct_switch", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_single_locale_activation", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_filters01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_filters02", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_filtertag01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_ifequal01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_literals01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_lookup01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_stringiterations01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag02", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag03", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag04", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag05", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag06", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag07", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag08", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag09", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag10", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_invalid_arg", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_no_arg", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax01", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax02", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax03", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax04", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax06", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax07", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax08", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax09", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax10", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax11", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax12", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax13", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax14", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax15", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax16", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax17", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax18", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax19", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax20", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax20b", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax21", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax22", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax23", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax24", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax25", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax26", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax27", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax28", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax29", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax30", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax31", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax32", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax33", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax34", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax35", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax36", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax37", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax38", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_ignores_strings_that_look_like_format_interpolation", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_unclosed_block", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_unclosed_block2", + "template_tests.syntax_tests.test_builtins.BuiltinsTests.test_builtins01", + "template_tests.syntax_tests.test_builtins.BuiltinsTests.test_builtins02", + "template_tests.syntax_tests.test_builtins.BuiltinsTests.test_builtins03", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache03", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache04", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache05", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache06", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache07", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache08", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache11", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache12", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache13", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache14", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache15", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache16", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache17", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache18", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_none_timeout", + "template_tests.syntax_tests.test_cache.CacheTests.test_cache_fragment_cache", + "template_tests.syntax_tests.test_cache.CacheTests.test_cache_missing_backend", + "template_tests.syntax_tests.test_cache.CacheTests.test_cache_regression_20130", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax01", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax02", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax03", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax04", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax05", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax06", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax07", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax08", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax09", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax10", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax11", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax12", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_tag01", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_tag02", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_tag03", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_tag04", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_tag05", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle01", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle05", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle07", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle10", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle11", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle12", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle13", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle14", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle15", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle16", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle17", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle18", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle19", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle20", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle21", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle22", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle23", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle24", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle25", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle26", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle27", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle28", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle29", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle30", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle_undefined", + "template_tests.syntax_tests.test_exceptions.ExceptionsTests.test_exception01", + "template_tests.syntax_tests.test_exceptions.ExceptionsTests.test_exception02", + "template_tests.syntax_tests.test_exceptions.ExceptionsTests.test_exception03", + "template_tests.syntax_tests.test_exceptions.ExceptionsTests.test_exception04", + "template_tests.syntax_tests.test_exceptions.ExceptionsTests.test_exception05", + "template_tests.syntax_tests.test_extends.ExtendsNodeTests.test_extends_node_repr", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_duplicate_block", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_extends_duplicate", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance01", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance02", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance03", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance04", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance05", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance06", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance07", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance08", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance09", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance10", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance11", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance12", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance13", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance14", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance15", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance16", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance17", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance18", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance19", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance20", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance21", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance22", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance23", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance24", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance25", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance26", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance27", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance29", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance30", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance31", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance32", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance33", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance34", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance35", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance36", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance37", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance38", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance39", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance40", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance41", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance42", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance_28", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance_empty", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax01", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax02", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax03", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax04", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax05", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax06", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax07", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax08", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax08_multi_line", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax09", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax10", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax11", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax13", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax14", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax15", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax16", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax17", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax18", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax19", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax20", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax21", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax22", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax23", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax24", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax25", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_type_error_attribute", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter01", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter02", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter03", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter04", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter05", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter05bis", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter06", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter06bis", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_all_false_arguments_asvar", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof01", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof02", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof03", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof04", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof05", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof06", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof07", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof08", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof09", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof10", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof11", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof12", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof13", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof14", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof15", + "template_tests.syntax_tests.test_for.ForNodeTests.test_repr", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag01", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag02", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_context", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_empty01", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_empty02", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_empty03", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_filter_ws", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack01", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack03", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack04", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack05", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack06", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack07", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack08", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack09", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack10", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack11", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack12", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack13", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack14", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack_strs", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars01", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars02", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars03", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars04", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars05", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars06", + "template_tests.syntax_tests.test_for.ForTagTests.test_invalid_arg", + "template_tests.syntax_tests.test_for.ForTagTests.test_invalid_in_keyword", + "template_tests.syntax_tests.test_for.ForTagTests.test_unpack_double_quote", + "template_tests.syntax_tests.test_for.ForTagTests.test_unpack_single_quote", + "template_tests.syntax_tests.test_for.ForTagTests.test_unpack_vertical_bar", + "template_tests.syntax_tests.test_if.IfNodeTests.test_repr", + "template_tests.syntax_tests.test_if.IfTagTests.test_else_if_tag_error01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_both_variables_missing", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_match", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_no_match", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_not_both_variables_missing", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_not_match", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_not_no_match", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_not_variable_missing", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_variable_missing", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag06", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag07", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag08", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag09", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag10", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag11", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag12", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag13", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and06", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and07", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and08", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_badarg01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_badarg02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_badarg03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_badarg04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_eq01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_eq02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_eq03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_eq04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_eq05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error06", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error07", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error08", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error09", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error10", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error11", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error12", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_filter01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_filter02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_gt_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_gt_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_gte_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_gte_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_in_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_in_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_lt_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_lt_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_lte_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_lte_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not06", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not07", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not08", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not09", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not10", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not11", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not12", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not13", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not14", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not15", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not16", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not17", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not18", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not19", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not20", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not21", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not22", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not23", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not24", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not25", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not26", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not27", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not28", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not29", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not30", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not31", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not32", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not33", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not34", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not35", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not_in_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not_in_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_noteq01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_noteq02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_noteq03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_noteq04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_noteq05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or06", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or07", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or08", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or09", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_shortcircuit01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_shortcircuit02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_single_eq", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged01", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged02", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged03", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged04", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged05", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged06", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged07", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged08", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_else01", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_else02", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_else03", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_else04", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_filter_ws", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_param01", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_param02", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_param03", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_param04", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_param05", + "template_tests.syntax_tests.test_if_changed.IfChangedTests.test_ifchanged_concurrency", + "template_tests.syntax_tests.test_if_changed.IfChangedTests.test_ifchanged_render_once", + "template_tests.syntax_tests.test_if_changed.IfChangedTests.test_include", + "template_tests.syntax_tests.test_if_changed.IfChangedTests.test_include_state", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal01", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal02", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal03", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal04", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal05", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal06", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal07", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal08", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal09", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal10", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_filter01", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_filter02", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_filter03", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_filter04", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_filter05", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric01", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric02", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric03", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric04", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric05", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric06", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric07", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric08", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric09", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric10", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric11", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric12", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split01", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split02", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split03", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split04", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split05", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split06", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split07", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split08", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split09", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split10", + "template_tests.syntax_tests.test_if_equal.IfEqualTests.test_repr", + "template_tests.syntax_tests.test_if_equal.IfNotEqualTagTests.test_ifnotequal01", + "template_tests.syntax_tests.test_if_equal.IfNotEqualTagTests.test_ifnotequal02", + "template_tests.syntax_tests.test_if_equal.IfNotEqualTagTests.test_ifnotequal03", + "template_tests.syntax_tests.test_if_equal.IfNotEqualTagTests.test_ifnotequal04", + "template_tests.syntax_tests.test_if_equal.IfNotEqualTagTests.test_one_var", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include01", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include02", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include03", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include04", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include06", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include07", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include08", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include09", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include10", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include11", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include12", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include13", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include14", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_empty", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error01", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error02", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error03", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error04", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error05", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error06", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error07", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error08", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error09", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error10", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_fail1", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_fail2", + "template_tests.syntax_tests.test_include.IncludeTests.test_extends_include_missing_baseloader", + "template_tests.syntax_tests.test_include.IncludeTests.test_extends_include_missing_cachedloader", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_cache", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_from_loader_get_template", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_immediate_missing", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_missing_template", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_recursive", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_template_argument", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr01", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr02", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr03", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr04", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr04_2", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr05", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr06", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr07", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index01", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index02", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index03", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index04", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index05", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index06", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index07", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load01", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load02", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load03", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load04", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load05", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load06", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load07", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load08", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load09", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load10", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load12", + "template_tests.syntax_tests.test_lorem.LoremTagTests.test_lorem1", + "template_tests.syntax_tests.test_lorem.LoremTagTests.test_lorem_random", + "template_tests.syntax_tests.test_multiline.MultilineTests.test_multiline01", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks01", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks02", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks03", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks04", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks05", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks06", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks07", + "template_tests.syntax_tests.test_now.NowTagTests.test_now01", + "template_tests.syntax_tests.test_now.NowTagTests.test_now02", + "template_tests.syntax_tests.test_now.NowTagTests.test_now03", + "template_tests.syntax_tests.test_now.NowTagTests.test_now04", + "template_tests.syntax_tests.test_now.NowTagTests.test_now05", + "template_tests.syntax_tests.test_now.NowTagTests.test_now06", + "template_tests.syntax_tests.test_now.NowTagTests.test_now07", + "template_tests.syntax_tests.test_now.NowTagTests.test_now_args", + "template_tests.syntax_tests.test_numpy.NumpyTests.test_numpy_array_index01", + "template_tests.syntax_tests.test_numpy.NumpyTests.test_numpy_array_index02", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup01", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup02", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup03", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup04", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup05", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup06", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup07", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup08", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup_unpack", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle01", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle02", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle03", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle04", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle05", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle06", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle07", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle08", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle09", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle10", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle11", + "template_tests.syntax_tests.test_setup.SetupTests.test_setup", + "template_tests.syntax_tests.test_simple_tag.SimpleTagTests.test_simpletag_renamed01", + "template_tests.syntax_tests.test_simple_tag.SimpleTagTests.test_simpletag_renamed02", + "template_tests.syntax_tests.test_simple_tag.SimpleTagTests.test_simpletag_renamed03", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless01", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless02", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless03", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless04", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless05", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless06", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_prefixtag01", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_prefixtag02", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_prefixtag03", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_prefixtag04", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_prefixtag_without_as", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_quotes_urls", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_statictag01", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_statictag02", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_statictag03", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_statictag04", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_statictag_without_path", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag01", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag02", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag03", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag04", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag05", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag06", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag07", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag08", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag09", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag10", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag11", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag12", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url01", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url02", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url02a", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url02b", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url02c", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url03", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url04", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url05", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url06", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url08", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url09", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url10", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url11", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url12", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url13", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url14", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url15", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url18", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url19", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url20", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url21", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_asvar01", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_asvar02", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_asvar03", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail01", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail02", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail03", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail04", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail05", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail06", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail07", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail08", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail09", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail11", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail12", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail13", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail14", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail15", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail16", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail17", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail18", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail19", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_namespace01", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_namespace02", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_namespace03", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_namespace_explicit_current_app", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_namespace_no_current_app", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag01", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag02", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag03", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag04", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag05", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag06", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_typeerror_as_var", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio01", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio02", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio03", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio04", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio05", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio06", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio07", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio08", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio09", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio10", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio11", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio12a", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio12b", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio13a", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio13b", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio14a", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio14b", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio15", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio16", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio17", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio18", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio19", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio20", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio21", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_zerodivisionerror_as_var", + "template_tests.syntax_tests.test_with.WithNodeTests.test_repr", + "template_tests.syntax_tests.test_with.WithTagTests.test_legacywith01", + "template_tests.syntax_tests.test_with.WithTagTests.test_legacywith02", + "template_tests.syntax_tests.test_with.WithTagTests.test_with01", + "template_tests.syntax_tests.test_with.WithTagTests.test_with02", + "template_tests.syntax_tests.test_with.WithTagTests.test_with03", + "template_tests.syntax_tests.test_with.WithTagTests.test_with_error01", + "template_tests.syntax_tests.test_with.WithTagTests.test_with_error02", + "template_tests.test_base.TemplateTests.test_lazy_template_string", + "template_tests.test_base.VariableDoesNotExistTests.test_str", + "template_tests.test_base.VariableTests.test_integer_literals", + "template_tests.test_base.VariableTests.test_nonliterals", + "template_tests.test_callables.CallableVariablesTests.test_alters_data", + "template_tests.test_callables.CallableVariablesTests.test_callable", + "template_tests.test_callables.CallableVariablesTests.test_do_not_call", + "template_tests.test_callables.CallableVariablesTests.test_do_not_call_and_alters_data", + "template_tests.test_context.ContextTests.test_context", + "template_tests.test_context.ContextTests.test_context_comparable", + "template_tests.test_context.ContextTests.test_copy_request_context_twice", + "template_tests.test_context.ContextTests.test_flatten_context", + "template_tests.test_context.ContextTests.test_flatten_context_with_context", + "template_tests.test_context.ContextTests.test_push_context_manager", + "template_tests.test_context.ContextTests.test_push_context_manager_with_context_object", + "template_tests.test_context.ContextTests.test_push_proper_layering", + "template_tests.test_context.ContextTests.test_render_context", + "template_tests.test_context.ContextTests.test_resolve_on_context_method", + "template_tests.test_context.ContextTests.test_set_upward", + "template_tests.test_context.ContextTests.test_set_upward_empty_context", + "template_tests.test_context.ContextTests.test_set_upward_with_push", + "template_tests.test_context.ContextTests.test_set_upward_with_push_no_match", + "template_tests.test_context.ContextTests.test_setdefault", + "template_tests.test_context.ContextTests.test_update_context_manager", + "template_tests.test_context.ContextTests.test_update_context_manager_with_context_object", + "template_tests.test_context.ContextTests.test_update_proper_layering", + "template_tests.test_context.RequestContextTests.test_context_comparable", + "template_tests.test_context.RequestContextTests.test_include_only", + "template_tests.test_context.RequestContextTests.test_modify_context_and_render", + "template_tests.test_context.RequestContextTests.test_stack_size", + "template_tests.test_engine.GetDefaultTests.test_multiple_engines_configured", + "template_tests.test_engine.GetDefaultTests.test_no_engines_configured", + "template_tests.test_engine.GetDefaultTests.test_single_engine_configured", + "template_tests.test_engine.LoaderTests.test_cached_loader_priority", + "template_tests.test_engine.LoaderTests.test_loader_priority", + "template_tests.test_engine.LoaderTests.test_origin", + "template_tests.test_engine.RenderToStringTest.test_basic_context", + "template_tests.test_extends.ExtendsBehaviorTests.test_block_override_in_extended_included_template", + "template_tests.test_extends.ExtendsBehaviorTests.test_extend_cached", + "template_tests.test_extends.ExtendsBehaviorTests.test_extend_missing", + "template_tests.test_extends.ExtendsBehaviorTests.test_extend_recursive", + "template_tests.test_extends.ExtendsBehaviorTests.test_extend_self_error", + "template_tests.test_extends.ExtendsBehaviorTests.test_normal_extend", + "template_tests.test_extends.ExtendsBehaviorTests.test_recursive_multiple_loaders", + "template_tests.test_extends.ExtendsBehaviorTests.test_unique_history_per_loader", + "template_tests.test_extends_relative.ExtendsMixedBehaviorTests.test_mixing1", + "template_tests.test_extends_relative.ExtendsMixedBehaviorTests.test_mixing2", + "template_tests.test_extends_relative.ExtendsMixedBehaviorTests.test_mixing_loop", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_dir1_extend", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_dir1_extend1", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_dir1_extend2", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_dir1_extend3", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_dir2_extend", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_extend_error", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_normal_extend", + "template_tests.test_extends_relative.IncludeRelativeBehaviorTests.test_dir2_include", + "template_tests.test_extends_relative.IncludeRelativeBehaviorTests.test_include_error", + "template_tests.test_extends_relative.IncludeRelativeBehaviorTests.test_normal_include", + "template_tests.test_library.FilterRegistrationTests.test_filter", + "template_tests.test_library.FilterRegistrationTests.test_filter_call", + "template_tests.test_library.FilterRegistrationTests.test_filter_invalid", + "template_tests.test_library.FilterRegistrationTests.test_filter_name_arg", + "template_tests.test_library.FilterRegistrationTests.test_filter_name_kwarg", + "template_tests.test_library.FilterRegistrationTests.test_filter_parens", + "template_tests.test_library.InclusionTagRegistrationTests.test_inclusion_tag", + "template_tests.test_library.InclusionTagRegistrationTests.test_inclusion_tag_name", + "template_tests.test_library.SimpleTagRegistrationTests.test_simple_tag", + "template_tests.test_library.SimpleTagRegistrationTests.test_simple_tag_invalid", + "template_tests.test_library.SimpleTagRegistrationTests.test_simple_tag_name_kwarg", + "template_tests.test_library.SimpleTagRegistrationTests.test_simple_tag_parens", + "template_tests.test_library.TagRegistrationTests.test_tag", + "template_tests.test_library.TagRegistrationTests.test_tag_call", + "template_tests.test_library.TagRegistrationTests.test_tag_invalid", + "template_tests.test_library.TagRegistrationTests.test_tag_name_arg", + "template_tests.test_library.TagRegistrationTests.test_tag_name_kwarg", + "template_tests.test_library.TagRegistrationTests.test_tag_parens", + "template_tests.test_loaders.AppDirectoriesLoaderTests.test_get_template", + "template_tests.test_loaders.AppDirectoriesLoaderTests.test_not_installed", + "template_tests.test_loaders.CachedLoaderTests.test_cached_exception_no_traceback", + "template_tests.test_loaders.CachedLoaderTests.test_get_template", + "template_tests.test_loaders.CachedLoaderTests.test_get_template_missing_debug_off", + "template_tests.test_loaders.CachedLoaderTests.test_get_template_missing_debug_on", + "template_tests.test_loaders.CachedLoaderTests.test_template_name_lazy_string", + "template_tests.test_loaders.CachedLoaderTests.test_template_name_leading_dash_caching", + "template_tests.test_loaders.FileSystemLoaderTests.test_bytestring", + "template_tests.test_loaders.FileSystemLoaderTests.test_case_sensitivity", + "template_tests.test_loaders.FileSystemLoaderTests.test_directory_security", + "template_tests.test_loaders.FileSystemLoaderTests.test_file_does_not_exist", + "template_tests.test_loaders.FileSystemLoaderTests.test_get_template", + "template_tests.test_loaders.FileSystemLoaderTests.test_loaders_dirs", + "template_tests.test_loaders.FileSystemLoaderTests.test_loaders_dirs_empty", + "template_tests.test_loaders.FileSystemLoaderTests.test_notafile_error", + "template_tests.test_loaders.FileSystemLoaderTests.test_permissions_error", + "template_tests.test_loaders.FileSystemLoaderTests.test_unicode_dir_name", + "template_tests.test_loaders.FileSystemLoaderTests.test_unicode_template_name", + "template_tests.test_loaders.LocmemLoaderTests.test_get_template", + "template_tests.test_logging.VariableResolveLoggingTests.test_log_on_variable_does_not_exist_not_silent", + "template_tests.test_logging.VariableResolveLoggingTests.test_log_on_variable_does_not_exist_silent", + "template_tests.test_logging.VariableResolveLoggingTests.test_no_log_when_variable_exists", + "template_tests.test_nodelist.ErrorIndexTest.test_correct_exception_index", + "template_tests.test_nodelist.NodelistTest.test_for", + "template_tests.test_nodelist.NodelistTest.test_if", + "template_tests.test_nodelist.NodelistTest.test_ifchanged", + "template_tests.test_nodelist.NodelistTest.test_ifequal", + "template_tests.test_nodelist.TextNodeTest.test_textnode_repr", + "template_tests.test_origin.OriginTestCase.test_origin_compares_equal", + "template_tests.test_origin.OriginTestCase.test_origin_compares_not_equal", + "template_tests.test_parser.ParserTests.test_filter_args_count", + "template_tests.test_parser.ParserTests.test_filter_parsing", + "template_tests.test_parser.ParserTests.test_token_smart_split", + "template_tests.test_parser.ParserTests.test_variable_parsing", + "template_tests.test_response.CacheMiddlewareTest.test_middleware_caching", + "template_tests.test_response.CustomURLConfTest.test_custom_urlconf", + "template_tests.test_response.SimpleTemplateResponseTest.test_args", + "template_tests.test_response.SimpleTemplateResponseTest.test_content_access_rendered", + "template_tests.test_response.SimpleTemplateResponseTest.test_content_access_unrendered", + "template_tests.test_response.SimpleTemplateResponseTest.test_dict_context", + "template_tests.test_response.SimpleTemplateResponseTest.test_explicit_baking", + "template_tests.test_response.SimpleTemplateResponseTest.test_iteration_rendered", + "template_tests.test_response.SimpleTemplateResponseTest.test_iteration_unrendered", + "template_tests.test_response.SimpleTemplateResponseTest.test_kwargs", + "template_tests.test_response.SimpleTemplateResponseTest.test_pickling", + "template_tests.test_response.SimpleTemplateResponseTest.test_pickling_cookie", + "template_tests.test_response.SimpleTemplateResponseTest.test_post_callbacks", + "template_tests.test_response.SimpleTemplateResponseTest.test_render", + "template_tests.test_response.SimpleTemplateResponseTest.test_repickling", + "template_tests.test_response.SimpleTemplateResponseTest.test_set_content", + "template_tests.test_response.SimpleTemplateResponseTest.test_template_resolving", + "template_tests.test_response.SimpleTemplateResponseTest.test_using", + "template_tests.test_response.TemplateResponseTest.test_args", + "template_tests.test_response.TemplateResponseTest.test_context_processor_priority", + "template_tests.test_response.TemplateResponseTest.test_kwargs", + "template_tests.test_response.TemplateResponseTest.test_pickling", + "template_tests.test_response.TemplateResponseTest.test_render", + "template_tests.test_response.TemplateResponseTest.test_render_with_requestcontext", + "template_tests.test_response.TemplateResponseTest.test_repickling", + "template_tests.test_response.TemplateResponseTest.test_using", + "template_tests.test_smartif.SmartIfTests.test_in", + "template_tests.test_smartif.SmartIfTests.test_not", + "template_tests.test_smartif.SmartIfTests.test_not_in", + "template_tests.test_smartif.SmartIfTests.test_or", + "template_tests.test_smartif.SmartIfTests.test_precedence", + "template_tests.tests.TemplateTests.test_compile_filter_expression_error", + "template_tests.tests.TemplateTests.test_compile_tag_error", + "template_tests.tests.TemplateTests.test_compile_tag_error_27584", + "template_tests.tests.TemplateTests.test_compile_tag_error_27956", + "template_tests.tests.TemplateTests.test_debug_tag_non_ascii", + "template_tests.tests.TemplateTests.test_extends_generic_template", + "template_tests.tests.TemplateTests.test_invalid_block_suggestion", + "template_tests.tests.TemplateTests.test_no_wrapped_exception", + "template_tests.tests.TemplateTests.test_node_origin", + "template_tests.tests.TemplateTests.test_string_origin", + "template_tests.tests.TemplateTests.test_super_errors", + "template_tests.tests.TemplateTests.test_unknown_block_tag", + "template_tests.tests.TemplateTests.test_url_reverse_no_settings_module", + "template_tests.tests.TemplateTests.test_url_reverse_view_name", + "test_client.test_conditional_content_removal.ConditionalContentTests.test_conditional_content_removal", + "test_client.tests.CSRFEnabledClientTests.test_csrf_enabled_client", + "test_client.tests.ClientTest.test_empty_post", + "test_client.tests.ClientTest.test_exception_following_nested_client_request", + "test_client.tests.ClientTest.test_external_redirect", + "test_client.tests.ClientTest.test_external_redirect_with_fetch_error_msg", + "test_client.tests.ClientTest.test_follow_307_and_308_preserves_get_params", + "test_client.tests.ClientTest.test_follow_307_and_308_preserves_post_data", + "test_client.tests.ClientTest.test_follow_307_and_308_preserves_put_body", + "test_client.tests.ClientTest.test_follow_307_and_308_redirect", + "test_client.tests.ClientTest.test_follow_redirect", + "test_client.tests.ClientTest.test_follow_relative_redirect", + "test_client.tests.ClientTest.test_follow_relative_redirect_no_trailing_slash", + "test_client.tests.ClientTest.test_force_login_with_backend", + "test_client.tests.ClientTest.test_force_login_with_backend_missing_get_user", + "test_client.tests.ClientTest.test_force_login_without_backend", + "test_client.tests.ClientTest.test_form_error", + "test_client.tests.ClientTest.test_form_error_with_template", + "test_client.tests.ClientTest.test_get_data_none", + "test_client.tests.ClientTest.test_get_post_view", + "test_client.tests.ClientTest.test_get_view", + "test_client.tests.ClientTest.test_incomplete_data_form", + "test_client.tests.ClientTest.test_incomplete_data_form_with_template", + "test_client.tests.ClientTest.test_insecure", + "test_client.tests.ClientTest.test_json_encoder_argument", + "test_client.tests.ClientTest.test_json_serialization", + "test_client.tests.ClientTest.test_logout", + "test_client.tests.ClientTest.test_logout_cookie_sessions", + "test_client.tests.ClientTest.test_logout_with_force_login", + "test_client.tests.ClientTest.test_mail_sending", + "test_client.tests.ClientTest.test_mass_mail_sending", + "test_client.tests.ClientTest.test_notfound_response", + "test_client.tests.ClientTest.test_permanent_redirect", + "test_client.tests.ClientTest.test_post", + "test_client.tests.ClientTest.test_post_data_none", + "test_client.tests.ClientTest.test_put", + "test_client.tests.ClientTest.test_query_string_encoding", + "test_client.tests.ClientTest.test_raw_post", + "test_client.tests.ClientTest.test_redirect", + "test_client.tests.ClientTest.test_redirect_http", + "test_client.tests.ClientTest.test_redirect_https", + "test_client.tests.ClientTest.test_redirect_to_strange_location", + "test_client.tests.ClientTest.test_redirect_with_query", + "test_client.tests.ClientTest.test_redirect_with_query_ordering", + "test_client.tests.ClientTest.test_relative_redirect", + "test_client.tests.ClientTest.test_relative_redirect_no_trailing_slash", + "test_client.tests.ClientTest.test_response_attached_request", + "test_client.tests.ClientTest.test_response_headers", + "test_client.tests.ClientTest.test_response_raises_multi_arg_exception", + "test_client.tests.ClientTest.test_response_resolver_match", + "test_client.tests.ClientTest.test_response_resolver_match_redirect_follow", + "test_client.tests.ClientTest.test_response_resolver_match_regular_view", + "test_client.tests.ClientTest.test_reverse_lazy_decodes", + "test_client.tests.ClientTest.test_secure", + "test_client.tests.ClientTest.test_session_engine_is_invalid", + "test_client.tests.ClientTest.test_session_modifying_view", + "test_client.tests.ClientTest.test_sessions_app_is_not_installed", + "test_client.tests.ClientTest.test_temporary_redirect", + "test_client.tests.ClientTest.test_trace", + "test_client.tests.ClientTest.test_unknown_page", + "test_client.tests.ClientTest.test_uploading_named_temp_file", + "test_client.tests.ClientTest.test_uploading_temp_file", + "test_client.tests.ClientTest.test_url_parameters", + "test_client.tests.ClientTest.test_valid_form", + "test_client.tests.ClientTest.test_valid_form_with_hints", + "test_client.tests.ClientTest.test_valid_form_with_template", + "test_client.tests.ClientTest.test_view_with_bad_login", + "test_client.tests.ClientTest.test_view_with_exception", + "test_client.tests.ClientTest.test_view_with_force_login", + "test_client.tests.ClientTest.test_view_with_force_login_and_custom_redirect", + "test_client.tests.ClientTest.test_view_with_inactive_force_login", + "test_client.tests.ClientTest.test_view_with_inactive_login", + "test_client.tests.ClientTest.test_view_with_login", + "test_client.tests.ClientTest.test_view_with_login_and_custom_redirect", + "test_client.tests.ClientTest.test_view_with_login_when_sessions_app_is_not_installed", + "test_client.tests.ClientTest.test_view_with_method_force_login", + "test_client.tests.ClientTest.test_view_with_method_login", + "test_client.tests.ClientTest.test_view_with_method_permissions", + "test_client.tests.ClientTest.test_view_with_permissions", + "test_client.tests.ClientTest.test_view_with_permissions_exception", + "test_client.tests.CustomTestClientTest.test_custom_test_client", + "test_client.tests.RequestFactoryTest.test_get_request_from_factory", + "test_client.tests.RequestFactoryTest.test_request_factory", + "test_client.tests.RequestFactoryTest.test_trace_request_from_factory", + "test_client_regress.tests.AssertContainsTests.test_assert_contains_renders_template_response", + "test_client_regress.tests.AssertContainsTests.test_assert_contains_using_non_template_response", + "test_client_regress.tests.AssertContainsTests.test_assert_not_contains_renders_template_response", + "test_client_regress.tests.AssertContainsTests.test_assert_not_contains_using_non_template_response", + "test_client_regress.tests.AssertContainsTests.test_binary_contains", + "test_client_regress.tests.AssertContainsTests.test_binary_not_contains", + "test_client_regress.tests.AssertContainsTests.test_contains", + "test_client_regress.tests.AssertContainsTests.test_nontext_contains", + "test_client_regress.tests.AssertContainsTests.test_nontext_not_contains", + "test_client_regress.tests.AssertContainsTests.test_unicode_contains", + "test_client_regress.tests.AssertContainsTests.test_unicode_not_contains", + "test_client_regress.tests.AssertFormErrorTests.test_noerror_field", + "test_client_regress.tests.AssertFormErrorTests.test_unknown_error", + "test_client_regress.tests.AssertFormErrorTests.test_unknown_field", + "test_client_regress.tests.AssertFormErrorTests.test_unknown_form", + "test_client_regress.tests.AssertFormErrorTests.test_unknown_nonfield_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_field_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_no_error_field", + "test_client_regress.tests.AssertFormsetErrorTests.test_no_nonfield_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_no_nonform_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_nonfield_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_nonform_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_unknown_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_unknown_field", + "test_client_regress.tests.AssertFormsetErrorTests.test_unknown_formset", + "test_client_regress.tests.AssertFormsetErrorTests.test_unknown_nonfield_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_unknown_nonform_error", + "test_client_regress.tests.AssertRedirectsTests.test_circular_redirect", + "test_client_regress.tests.AssertRedirectsTests.test_incorrect_target", + "test_client_regress.tests.AssertRedirectsTests.test_lost_query", + "test_client_regress.tests.AssertRedirectsTests.test_multiple_redirect_chain", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_delete", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_head", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_on_non_redirect_page", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_options", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_post", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_put", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_to_non_existent", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_to_self", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_on_non_redirect_page", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_page", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_scheme", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_to_different_host", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_to_self_with_changing_query", + "test_client_regress.tests.AssertRedirectsTests.test_target_page", + "test_client_regress.tests.AssertTemplateUsedTests.test_multiple_context", + "test_client_regress.tests.AssertTemplateUsedTests.test_no_context", + "test_client_regress.tests.AssertTemplateUsedTests.test_single_context", + "test_client_regress.tests.AssertTemplateUsedTests.test_template_rendered_multiple_times", + "test_client_regress.tests.ContextTests.test_15368", + "test_client_regress.tests.ContextTests.test_contextlist_get", + "test_client_regress.tests.ContextTests.test_contextlist_keys", + "test_client_regress.tests.ContextTests.test_inherited_context", + "test_client_regress.tests.ContextTests.test_nested_requests", + "test_client_regress.tests.ContextTests.test_single_context", + "test_client_regress.tests.ExceptionTests.test_exception_cleared", + "test_client_regress.tests.LoginTests.test_login_different_client", + "test_client_regress.tests.PayloadEncodingTests.test_non_utf_payload", + "test_client_regress.tests.PayloadEncodingTests.test_simple_payload", + "test_client_regress.tests.PayloadEncodingTests.test_utf16_payload", + "test_client_regress.tests.PayloadEncodingTests.test_utf8_payload", + "test_client_regress.tests.QueryStringTests.test_get_like_requests", + "test_client_regress.tests.QueryStringTests.test_post_like_requests", + "test_client_regress.tests.ReadLimitedStreamTest.test_body_from_empty_request", + "test_client_regress.tests.ReadLimitedStreamTest.test_read_from_empty_request", + "test_client_regress.tests.ReadLimitedStreamTest.test_read_from_nonempty_request", + "test_client_regress.tests.ReadLimitedStreamTest.test_read_numbytes_from_empty_request", + "test_client_regress.tests.ReadLimitedStreamTest.test_read_numbytes_from_nonempty_request", + "test_client_regress.tests.RequestFactoryEnvironmentTests.test_cookies", + "test_client_regress.tests.RequestFactoryEnvironmentTests.test_should_set_correct_env_variables", + "test_client_regress.tests.RequestFactoryStateTest.test_request", + "test_client_regress.tests.RequestFactoryStateTest.test_request_after_client", + "test_client_regress.tests.RequestFactoryStateTest.test_request_after_client_2", + "test_client_regress.tests.RequestHeadersTest.test_client_headers", + "test_client_regress.tests.RequestHeadersTest.test_client_headers_redirect", + "test_client_regress.tests.RequestMethodStringDataTests.test_empty_string_data", + "test_client_regress.tests.RequestMethodStringDataTests.test_json", + "test_client_regress.tests.RequestMethodStringDataTests.test_json_bytes", + "test_client_regress.tests.RequestMethodStringDataTests.test_json_multiple_access", + "test_client_regress.tests.RequestMethodStringDataTests.test_json_structured_suffixes", + "test_client_regress.tests.RequestMethodStringDataTests.test_json_wrong_header", + "test_client_regress.tests.RequestMethodStringDataTests.test_patch", + "test_client_regress.tests.RequestMethodStringDataTests.test_post", + "test_client_regress.tests.RequestMethodStringDataTests.test_put", + "test_client_regress.tests.RequestMethodTests.test_delete", + "test_client_regress.tests.RequestMethodTests.test_get", + "test_client_regress.tests.RequestMethodTests.test_head", + "test_client_regress.tests.RequestMethodTests.test_options", + "test_client_regress.tests.RequestMethodTests.test_patch", + "test_client_regress.tests.RequestMethodTests.test_post", + "test_client_regress.tests.RequestMethodTests.test_put", + "test_client_regress.tests.SessionEngineTests.test_login", + "test_client_regress.tests.SessionTests.test_login_with_user", + "test_client_regress.tests.SessionTests.test_login_without_signal", + "test_client_regress.tests.SessionTests.test_logout", + "test_client_regress.tests.SessionTests.test_logout_with_custom_auth_backend", + "test_client_regress.tests.SessionTests.test_logout_with_custom_user", + "test_client_regress.tests.SessionTests.test_logout_with_user", + "test_client_regress.tests.SessionTests.test_logout_without_user", + "test_client_regress.tests.SessionTests.test_session", + "test_client_regress.tests.SessionTests.test_session_initiated", + "test_client_regress.tests.TemplateExceptionTests.test_bad_404_template", + "test_client_regress.tests.URLEscapingTests.test_argument_with_space_get", + "test_client_regress.tests.URLEscapingTests.test_argument_with_space_post", + "test_client_regress.tests.URLEscapingTests.test_simple_argument_get", + "test_client_regress.tests.URLEscapingTests.test_simple_argument_post", + "test_client_regress.tests.UploadedFileEncodingTest.test_file_encoding", + "test_client_regress.tests.UploadedFileEncodingTest.test_guesses_content_type_on_file_encoding", + "test_client_regress.tests.UrlconfSubstitutionTests.test_urlconf_was_changed", + "test_client_regress.tests.zzUrlconfSubstitutionTests.test_urlconf_was_reverted", + "test_exceptions.test_validation_error.TestValidationError.test_messages_concatenates_error_dict_values", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_all", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_default_and_other", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_default_only", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_mixed", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_no_databases_required", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_other_only", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_add_arguments_debug_mode", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_discovery_on_package", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_dotted_test_class_django_testcase", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_dotted_test_class_vanilla_unittest", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_dotted_test_method_django_testcase", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_dotted_test_module", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_duplicates_ignored", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_empty_label", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_empty_test_case", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_exclude_tags", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_excluded_tags_displayed", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_file_path", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_ignore_adjacent", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_included_tags_displayed", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_init_debug_mode", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_overridable_get_test_runner_kwargs", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_overridable_test_loader", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_overridable_test_runner", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_overridable_test_suite", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_pattern", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_reverse", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_tag_inheritance", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_tags", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_testcase_ordering", + "test_runner.test_parallel.ParallelTestRunnerTest.test_subtest", + "test_runner.test_parallel.RemoteTestResultTest.test_add_failing_subtests", + "test_runner.test_parallel.RemoteTestResultTest.test_pickle_errors_detection", + "test_runner_apps.databases.tests.AllDatabasesTests.test_nothing", + "test_runner_apps.databases.tests.DefaultDatabaseTests.test_nothing", + "test_runner_apps.databases.tests.NoDatabaseTests.test_nothing", + "test_runner_apps.databases.tests.OtherDatabaseTests.test_nothing", + "test_runner_apps.sample.doctests.factorial", + "test_runner_apps.sample.tests.tests.Test.test_sample", + "test_runner_apps.sample.tests_sample.TestDjangoTestCase.test_sample", + "test_runner_apps.sample.tests_sample.TestVanillaUnittest.test_sample", + "test_runner_apps.sample.tests_sample.TestZimpleTestCase.test_sample", + "test_runner_apps.simple.tests.DjangoCase1.test_1", + "test_runner_apps.simple.tests.DjangoCase1.test_2", + "test_runner_apps.simple.tests.DjangoCase2.test_1", + "test_runner_apps.simple.tests.DjangoCase2.test_2", + "test_runner_apps.simple.tests.SimpleCase1.test_1", + "test_runner_apps.simple.tests.SimpleCase1.test_2", + "test_runner_apps.simple.tests.SimpleCase2.test_1", + "test_runner_apps.simple.tests.SimpleCase2.test_2", + "test_runner_apps.simple.tests.UnittestCase1.test_1", + "test_runner_apps.simple.tests.UnittestCase1.test_2", + "test_runner_apps.simple.tests.UnittestCase2.test_1", + "test_runner_apps.simple.tests.UnittestCase2.test_2", + "test_runner_apps.tagged.tests.TaggedTestCase.test_multiple_tags", + "test_runner_apps.tagged.tests.TaggedTestCase.test_single_tag", + "test_runner_apps.tagged.tests_inheritance.Foo.test_new_func_tag", + "test_runner_apps.tagged.tests_inheritance.Foo.test_no_new_tags", + "test_runner_apps.tagged.tests_inheritance.FooBar.test_new_class_and_func_tags", + "test_runner_apps.tagged.tests_inheritance.FooBar.test_new_class_tag_only", + "unittest.loader._FailedTest.admin_changelist.test_date_hierarchy", + "unittest.loader._FailedTest.admin_changelist.tests", + "unittest.loader._FailedTest.admin_checks.tests", + "unittest.loader._FailedTest.admin_custom_urls.tests", + "unittest.loader._FailedTest.admin_docs.test_views", + "unittest.loader._FailedTest.admin_filters.tests", + "unittest.loader._FailedTest.admin_inlines.tests", + "unittest.loader._FailedTest.admin_ordering.tests", + "unittest.loader._FailedTest.admin_registration.tests", + "unittest.loader._FailedTest.admin_utils.test_logentry", + "unittest.loader._FailedTest.admin_utils.tests", + "unittest.loader._FailedTest.admin_views.test_actions", + "unittest.loader._FailedTest.admin_views.test_adminsite", + "unittest.loader._FailedTest.admin_views.test_autocomplete_view", + "unittest.loader._FailedTest.admin_views.test_multidb", + "unittest.loader._FailedTest.admin_views.test_templatetags", + "unittest.loader._FailedTest.admin_views.tests", + "unittest.loader._FailedTest.admin_widgets.test_autocomplete_widget", + "unittest.loader._FailedTest.admin_widgets.tests", + "unittest.loader._FailedTest.aggregation.test_filter_argument", + "unittest.loader._FailedTest.aggregation.tests", + "unittest.loader._FailedTest.aggregation_regress.tests", + "unittest.loader._FailedTest.annotations.tests", + "unittest.loader._FailedTest.apps.tests", + "unittest.loader._FailedTest.auth_tests.models", + "unittest.loader._FailedTest.auth_tests.test_auth_backends", + "unittest.loader._FailedTest.auth_tests.test_basic", + "unittest.loader._FailedTest.auth_tests.test_checks", + "unittest.loader._FailedTest.auth_tests.test_decorators", + "unittest.loader._FailedTest.auth_tests.test_forms", + "unittest.loader._FailedTest.auth_tests.test_handlers", + "unittest.loader._FailedTest.auth_tests.test_management", + "unittest.loader._FailedTest.auth_tests.test_migrations", + "unittest.loader._FailedTest.auth_tests.test_models", + "unittest.loader._FailedTest.auth_tests.test_signals", + "unittest.loader._FailedTest.auth_tests.test_views", + "unittest.loader._FailedTest.backends.base.test_base", + "unittest.loader._FailedTest.backends.oracle.test_introspection", + "unittest.loader._FailedTest.backends.oracle.tests", + "unittest.loader._FailedTest.backends.postgresql.test_introspection", + "unittest.loader._FailedTest.backends.postgresql.test_server_side_cursors", + "unittest.loader._FailedTest.backends.sqlite.tests", + "unittest.loader._FailedTest.backends.tests", + "unittest.loader._FailedTest.basic.tests", + "unittest.loader._FailedTest.bulk_create.tests", + "unittest.loader._FailedTest.cache.tests", + "unittest.loader._FailedTest.check_framework.tests", + "unittest.loader._FailedTest.choices.tests", + "unittest.loader._FailedTest.constraints.tests", + "unittest.loader._FailedTest.contenttypes_tests.test_fields", + "unittest.loader._FailedTest.contenttypes_tests.test_management", + "unittest.loader._FailedTest.contenttypes_tests.test_models", + "unittest.loader._FailedTest.contenttypes_tests.test_order_with_respect_to", + "unittest.loader._FailedTest.contenttypes_tests.test_views", + "unittest.loader._FailedTest.custom_columns.tests", + "unittest.loader._FailedTest.custom_lookups.tests", + "unittest.loader._FailedTest.custom_managers.tests", + "unittest.loader._FailedTest.custom_methods.tests", + "unittest.loader._FailedTest.custom_pk.tests", + "unittest.loader._FailedTest.datatypes.tests", + "unittest.loader._FailedTest.dates.tests", + "unittest.loader._FailedTest.datetimes.tests", + "unittest.loader._FailedTest.db_functions.comparison.test_cast", + "unittest.loader._FailedTest.db_functions.comparison.test_coalesce", + "unittest.loader._FailedTest.db_functions.comparison.test_greatest", + "unittest.loader._FailedTest.db_functions.comparison.test_least", + "unittest.loader._FailedTest.db_functions.comparison.test_nullif", + "unittest.loader._FailedTest.db_functions.datetime.test_extract_trunc", + "unittest.loader._FailedTest.db_functions.datetime.test_now", + "unittest.loader._FailedTest.db_functions.math.test_abs", + "unittest.loader._FailedTest.db_functions.math.test_acos", + "unittest.loader._FailedTest.db_functions.math.test_asin", + "unittest.loader._FailedTest.db_functions.math.test_atan", + "unittest.loader._FailedTest.db_functions.math.test_atan2", + "unittest.loader._FailedTest.db_functions.math.test_ceil", + "unittest.loader._FailedTest.db_functions.math.test_cos", + "unittest.loader._FailedTest.db_functions.math.test_cot", + "unittest.loader._FailedTest.db_functions.math.test_degrees", + "unittest.loader._FailedTest.db_functions.math.test_exp", + "unittest.loader._FailedTest.db_functions.math.test_floor", + "unittest.loader._FailedTest.db_functions.math.test_ln", + "unittest.loader._FailedTest.db_functions.math.test_log", + "unittest.loader._FailedTest.db_functions.math.test_mod", + "unittest.loader._FailedTest.db_functions.math.test_pi", + "unittest.loader._FailedTest.db_functions.math.test_power", + "unittest.loader._FailedTest.db_functions.math.test_radians", + "unittest.loader._FailedTest.db_functions.math.test_round", + "unittest.loader._FailedTest.db_functions.math.test_sin", + "unittest.loader._FailedTest.db_functions.math.test_sqrt", + "unittest.loader._FailedTest.db_functions.math.test_tan", + "unittest.loader._FailedTest.db_functions.tests", + "unittest.loader._FailedTest.db_functions.text.test_chr", + "unittest.loader._FailedTest.db_functions.text.test_concat", + "unittest.loader._FailedTest.db_functions.text.test_left", + "unittest.loader._FailedTest.db_functions.text.test_length", + "unittest.loader._FailedTest.db_functions.text.test_lower", + "unittest.loader._FailedTest.db_functions.text.test_ord", + "unittest.loader._FailedTest.db_functions.text.test_pad", + "unittest.loader._FailedTest.db_functions.text.test_repeat", + "unittest.loader._FailedTest.db_functions.text.test_replace", + "unittest.loader._FailedTest.db_functions.text.test_reverse", + "unittest.loader._FailedTest.db_functions.text.test_right", + "unittest.loader._FailedTest.db_functions.text.test_strindex", + "unittest.loader._FailedTest.db_functions.text.test_substr", + "unittest.loader._FailedTest.db_functions.text.test_trim", + "unittest.loader._FailedTest.db_functions.text.test_upper", + "unittest.loader._FailedTest.defer.tests", + "unittest.loader._FailedTest.defer_regress.tests", + "unittest.loader._FailedTest.delete.tests", + "unittest.loader._FailedTest.delete_regress.tests", + "unittest.loader._FailedTest.distinct_on_fields.tests", + "unittest.loader._FailedTest.empty.tests", + "unittest.loader._FailedTest.expressions.test_queryset_values", + "unittest.loader._FailedTest.expressions.tests", + "unittest.loader._FailedTest.expressions_case.tests", + "unittest.loader._FailedTest.expressions_window.tests", + "unittest.loader._FailedTest.extra_regress.tests", + "unittest.loader._FailedTest.field_defaults.tests", + "unittest.loader._FailedTest.file_storage.tests", + "unittest.loader._FailedTest.file_uploads.tests", + "unittest.loader._FailedTest.filtered_relation.tests", + "unittest.loader._FailedTest.fixtures.tests", + "unittest.loader._FailedTest.fixtures_regress.tests", + "unittest.loader._FailedTest.flatpages_tests.test_csrf", + "unittest.loader._FailedTest.flatpages_tests.test_forms", + "unittest.loader._FailedTest.flatpages_tests.test_middleware", + "unittest.loader._FailedTest.flatpages_tests.test_models", + "unittest.loader._FailedTest.flatpages_tests.test_templatetags", + "unittest.loader._FailedTest.flatpages_tests.test_views", + "unittest.loader._FailedTest.force_insert_update.tests", + "unittest.loader._FailedTest.foreign_object.models", + "unittest.loader._FailedTest.foreign_object.test_agnostic_order_trimjoin", + "unittest.loader._FailedTest.foreign_object.test_empty_join", + "unittest.loader._FailedTest.foreign_object.test_forms", + "unittest.loader._FailedTest.foreign_object.tests", + "unittest.loader._FailedTest.forms_tests.tests.test_error_messages", + "unittest.loader._FailedTest.forms_tests.tests.test_widgets", + "unittest.loader._FailedTest.forms_tests.tests.tests", + "unittest.loader._FailedTest.from_db_value.test_deprecated", + "unittest.loader._FailedTest.from_db_value.tests", + "unittest.loader._FailedTest.generic_inline_admin.tests", + "unittest.loader._FailedTest.generic_relations.test_forms", + "unittest.loader._FailedTest.generic_relations.tests", + "unittest.loader._FailedTest.generic_relations_regress.tests", + "unittest.loader._FailedTest.generic_views.test_base", + "unittest.loader._FailedTest.generic_views.test_dates", + "unittest.loader._FailedTest.generic_views.test_detail", + "unittest.loader._FailedTest.generic_views.test_edit", + "unittest.loader._FailedTest.generic_views.test_list", + "unittest.loader._FailedTest.get_earliest_or_latest.tests", + "unittest.loader._FailedTest.get_object_or_404.tests", + "unittest.loader._FailedTest.get_or_create.tests", + "unittest.loader._FailedTest.gis_tests.distapp.tests", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_driver", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_ds", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_envelope", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_geom", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_raster", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_srs", + "unittest.loader._FailedTest.gis_tests.geo3d.tests", + "unittest.loader._FailedTest.gis_tests.geoadmin.tests", + "unittest.loader._FailedTest.gis_tests.geoapp.test_expressions", + "unittest.loader._FailedTest.gis_tests.geoapp.test_feeds", + "unittest.loader._FailedTest.gis_tests.geoapp.test_functions", + "unittest.loader._FailedTest.gis_tests.geoapp.test_regress", + "unittest.loader._FailedTest.gis_tests.geoapp.test_serializers", + "unittest.loader._FailedTest.gis_tests.geoapp.test_sitemaps", + "unittest.loader._FailedTest.gis_tests.geoapp.tests", + "unittest.loader._FailedTest.gis_tests.geogapp.tests", + "unittest.loader._FailedTest.gis_tests.geos_tests.test_coordseq", + "unittest.loader._FailedTest.gis_tests.geos_tests.test_geos", + "unittest.loader._FailedTest.gis_tests.geos_tests.test_geos_mutation", + "unittest.loader._FailedTest.gis_tests.geos_tests.test_io", + "unittest.loader._FailedTest.gis_tests.geos_tests.test_mutable_list", + "unittest.loader._FailedTest.gis_tests.gis_migrations.test_operations", + "unittest.loader._FailedTest.gis_tests.inspectapp.tests", + "unittest.loader._FailedTest.gis_tests.layermap.tests", + "unittest.loader._FailedTest.gis_tests.rasterapp.test_rasterfield", + "unittest.loader._FailedTest.gis_tests.relatedapp.tests", + "unittest.loader._FailedTest.gis_tests.test_fields", + "unittest.loader._FailedTest.gis_tests.test_geoforms", + "unittest.loader._FailedTest.gis_tests.test_geoip2", + "unittest.loader._FailedTest.gis_tests.tests", + "unittest.loader._FailedTest.i18n.tests", + "unittest.loader._FailedTest.import_error_package", + "unittest.loader._FailedTest.indexes.tests", + "unittest.loader._FailedTest.inline_formsets.tests", + "unittest.loader._FailedTest.inspectdb.tests", + "unittest.loader._FailedTest.introspection.tests", + "unittest.loader._FailedTest.known_related_objects.tests", + "unittest.loader._FailedTest.lookup.test_decimalfield", + "unittest.loader._FailedTest.lookup.test_timefield", + "unittest.loader._FailedTest.lookup.tests", + "unittest.loader._FailedTest.m2m_and_m2o.tests", + "unittest.loader._FailedTest.m2m_intermediary.tests", + "unittest.loader._FailedTest.m2m_multiple.tests", + "unittest.loader._FailedTest.m2m_recursive.tests", + "unittest.loader._FailedTest.m2m_regress.tests", + "unittest.loader._FailedTest.m2m_signals.tests", + "unittest.loader._FailedTest.m2m_through.tests", + "unittest.loader._FailedTest.m2m_through_regress.test_multitable", + "unittest.loader._FailedTest.m2m_through_regress.tests", + "unittest.loader._FailedTest.m2o_recursive.tests", + "unittest.loader._FailedTest.managers_regress.tests", + "unittest.loader._FailedTest.many_to_many.tests", + "unittest.loader._FailedTest.many_to_one.tests", + "unittest.loader._FailedTest.many_to_one_null.tests", + "unittest.loader._FailedTest.max_lengths.tests", + "unittest.loader._FailedTest.migrate_signals.tests", + "unittest.loader._FailedTest.migration_test_data_persistence.tests", + "unittest.loader._FailedTest.migrations.test_autodetector", + "unittest.loader._FailedTest.migrations.test_commands", + "unittest.loader._FailedTest.migrations.test_executor", + "unittest.loader._FailedTest.migrations.test_multidb", + "unittest.loader._FailedTest.migrations.test_operations", + "unittest.loader._FailedTest.migrations.test_optimizer", + "unittest.loader._FailedTest.migrations.test_state", + "unittest.loader._FailedTest.migrations.test_writer", + "unittest.loader._FailedTest.model_fields.test_binaryfield", + "unittest.loader._FailedTest.model_fields.test_booleanfield", + "unittest.loader._FailedTest.model_fields.test_charfield", + "unittest.loader._FailedTest.model_fields.test_datetimefield", + "unittest.loader._FailedTest.model_fields.test_decimalfield", + "unittest.loader._FailedTest.model_fields.test_durationfield", + "unittest.loader._FailedTest.model_fields.test_field_flags", + "unittest.loader._FailedTest.model_fields.test_filefield", + "unittest.loader._FailedTest.model_fields.test_floatfield", + "unittest.loader._FailedTest.model_fields.test_foreignkey", + "unittest.loader._FailedTest.model_fields.test_genericipaddressfield", + "unittest.loader._FailedTest.model_fields.test_imagefield", + "unittest.loader._FailedTest.model_fields.test_integerfield", + "unittest.loader._FailedTest.model_fields.test_manytomanyfield", + "unittest.loader._FailedTest.model_fields.test_slugfield", + "unittest.loader._FailedTest.model_fields.test_textfield", + "unittest.loader._FailedTest.model_fields.test_uuid", + "unittest.loader._FailedTest.model_fields.tests", + "unittest.loader._FailedTest.model_forms.test_modelchoicefield", + "unittest.loader._FailedTest.model_forms.test_uuid", + "unittest.loader._FailedTest.model_forms.tests", + "unittest.loader._FailedTest.model_formsets.test_uuid", + "unittest.loader._FailedTest.model_formsets.tests", + "unittest.loader._FailedTest.model_formsets_regress.tests", + "unittest.loader._FailedTest.model_indexes.tests", + "unittest.loader._FailedTest.model_inheritance.tests", + "unittest.loader._FailedTest.model_inheritance_regress.tests", + "unittest.loader._FailedTest.model_meta.tests", + "unittest.loader._FailedTest.model_options.test_default_related_name", + "unittest.loader._FailedTest.model_options.test_tablespaces", + "unittest.loader._FailedTest.model_package.models", + "unittest.loader._FailedTest.model_package.tests", + "unittest.loader._FailedTest.model_regress.tests", + "unittest.loader._FailedTest.modeladmin.test_actions", + "unittest.loader._FailedTest.modeladmin.test_checks", + "unittest.loader._FailedTest.modeladmin.test_has_add_permission_obj_deprecation", + "unittest.loader._FailedTest.modeladmin.tests", + "unittest.loader._FailedTest.multiple_database.tests", + "unittest.loader._FailedTest.mutually_referential.tests", + "unittest.loader._FailedTest.nested_foreign_keys.tests", + "unittest.loader._FailedTest.null_fk.tests", + "unittest.loader._FailedTest.null_fk_ordering.tests", + "unittest.loader._FailedTest.null_queries.tests", + "unittest.loader._FailedTest.one_to_one.tests", + "unittest.loader._FailedTest.or_lookups.tests", + "unittest.loader._FailedTest.order_with_respect_to.tests", + "unittest.loader._FailedTest.ordering.tests", + "unittest.loader._FailedTest.pagination.tests", + "unittest.loader._FailedTest.postgres_tests.test_aggregates", + "unittest.loader._FailedTest.postgres_tests.test_array", + "unittest.loader._FailedTest.postgres_tests.test_bulk_update", + "unittest.loader._FailedTest.postgres_tests.test_citext", + "unittest.loader._FailedTest.postgres_tests.test_constraints", + "unittest.loader._FailedTest.postgres_tests.test_functions", + "unittest.loader._FailedTest.postgres_tests.test_hstore", + "unittest.loader._FailedTest.postgres_tests.test_indexes", + "unittest.loader._FailedTest.postgres_tests.test_json", + "unittest.loader._FailedTest.postgres_tests.test_ranges", + "unittest.loader._FailedTest.postgres_tests.test_search", + "unittest.loader._FailedTest.postgres_tests.test_trigram", + "unittest.loader._FailedTest.postgres_tests.test_unaccent", + "unittest.loader._FailedTest.prefetch_related.test_prefetch_related_objects", + "unittest.loader._FailedTest.prefetch_related.test_uuid", + "unittest.loader._FailedTest.prefetch_related.tests", + "unittest.loader._FailedTest.properties.tests", + "unittest.loader._FailedTest.proxy_model_inheritance.tests", + "unittest.loader._FailedTest.proxy_models.tests", + "unittest.loader._FailedTest.queries.test_bulk_update", + "unittest.loader._FailedTest.queries.test_explain", + "unittest.loader._FailedTest.queries.test_iterator", + "unittest.loader._FailedTest.queries.test_qs_combinators", + "unittest.loader._FailedTest.queries.test_query", + "unittest.loader._FailedTest.queries.tests", + "unittest.loader._FailedTest.queryset_pickle.tests", + "unittest.loader._FailedTest.raw_query.tests", + "unittest.loader._FailedTest.redirects_tests.tests", + "unittest.loader._FailedTest.reserved_names.tests", + "unittest.loader._FailedTest.resolve_url.tests", + "unittest.loader._FailedTest.reverse_lookup.tests", + "unittest.loader._FailedTest.save_delete_hooks.tests", + "unittest.loader._FailedTest.schema.tests", + "unittest.loader._FailedTest.select_for_update.tests", + "unittest.loader._FailedTest.select_related.tests", + "unittest.loader._FailedTest.select_related_onetoone.tests", + "unittest.loader._FailedTest.select_related_regress.tests", + "unittest.loader._FailedTest.serializers.models", + "unittest.loader._FailedTest.serializers.test_data", + "unittest.loader._FailedTest.serializers.test_deserializedobject", + "unittest.loader._FailedTest.serializers.test_json", + "unittest.loader._FailedTest.serializers.test_natural", + "unittest.loader._FailedTest.serializers.test_xml", + "unittest.loader._FailedTest.serializers.test_yaml", + "unittest.loader._FailedTest.serializers.tests", + "unittest.loader._FailedTest.servers.tests", + "unittest.loader._FailedTest.sessions_tests.tests", + "unittest.loader._FailedTest.signals.tests", + "unittest.loader._FailedTest.sitemaps_tests.test_generic", + "unittest.loader._FailedTest.sitemaps_tests.test_http", + "unittest.loader._FailedTest.sitemaps_tests.test_https", + "unittest.loader._FailedTest.sitemaps_tests.test_management", + "unittest.loader._FailedTest.sitemaps_tests.test_utils", + "unittest.loader._FailedTest.sites_framework.tests", + "unittest.loader._FailedTest.str.tests", + "unittest.loader._FailedTest.string_lookup.tests", + "unittest.loader._FailedTest.swappable_models.tests", + "unittest.loader._FailedTest.syndication_tests.tests", + "unittest.loader._FailedTest.template_tests.test_custom", + "unittest.loader._FailedTest.test_runner.test_debug_sql", + "unittest.loader._FailedTest.test_runner.tests", + "unittest.loader._FailedTest.test_utils.test_deprecated_features", + "unittest.loader._FailedTest.test_utils.test_testcase", + "unittest.loader._FailedTest.test_utils.test_transactiontestcase", + "unittest.loader._FailedTest.test_utils.tests", + "unittest.loader._FailedTest.timezones.tests", + "unittest.loader._FailedTest.transaction_hooks.tests", + "unittest.loader._FailedTest.transactions.tests", + "unittest.loader._FailedTest.unmanaged_models.tests", + "unittest.loader._FailedTest.update.tests", + "unittest.loader._FailedTest.update_only_fields.tests", + "unittest.loader._FailedTest.utils_tests.test_lazyobject", + "unittest.loader._FailedTest.validation.test_custom_messages", + "unittest.loader._FailedTest.validation.test_unique", + "unittest.loader._FailedTest.validation.test_validators", + "unittest.loader._FailedTest.validation.tests", + "unittest.loader._FailedTest.view_tests.tests.test_defaults", + "urlpatterns.test_resolvers.RegexPatternTests.test_str", + "urlpatterns.test_resolvers.RoutePatternTests.test_str", + "urlpatterns.tests.ConversionExceptionTests.test_resolve_type_error_propagates", + "urlpatterns.tests.ConversionExceptionTests.test_resolve_value_error_means_no_match", + "urlpatterns.tests.ConversionExceptionTests.test_reverse_value_error_propagates", + "urlpatterns.tests.ConverterTests.test_matching_urls", + "urlpatterns.tests.ConverterTests.test_nonmatching_urls", + "urlpatterns.tests.ParameterRestrictionTests.test_allows_non_ascii_but_valid_identifiers", + "urlpatterns.tests.ParameterRestrictionTests.test_non_identifier_parameter_name_causes_exception", + "urlpatterns.tests.SimplifiedURLTests.test_converter_resolve", + "urlpatterns.tests.SimplifiedURLTests.test_converter_reverse", + "urlpatterns.tests.SimplifiedURLTests.test_converter_reverse_with_second_layer_instance_namespace", + "urlpatterns.tests.SimplifiedURLTests.test_invalid_converter", + "urlpatterns.tests.SimplifiedURLTests.test_path_inclusion_is_matchable", + "urlpatterns.tests.SimplifiedURLTests.test_path_inclusion_is_reversable", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_with_double_inclusion", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_with_empty_string_inclusion", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_with_inclusion", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_with_multiple_paramaters", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_with_typed_parameters", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_without_parameters", + "urlpatterns.tests.SimplifiedURLTests.test_path_reverse_with_parameter", + "urlpatterns.tests.SimplifiedURLTests.test_path_reverse_without_parameter", + "urlpatterns.tests.SimplifiedURLTests.test_re_path", + "urlpatterns.tests.SimplifiedURLTests.test_two_variable_at_start_of_path_pattern", + "urlpatterns_reverse.test_localeregexdescriptor.LocaleRegexDescriptorTests.test_access_locale_regex_descriptor", + "urlpatterns_reverse.test_localeregexdescriptor.LocaleRegexDescriptorTests.test_nontranslated_regex_compiled_once", + "urlpatterns_reverse.test_localeregexdescriptor.LocaleRegexDescriptorTests.test_regex_compile_error", + "urlpatterns_reverse.test_localeregexdescriptor.LocaleRegexDescriptorTests.test_translated_regex_compiled_per_language", + "urlpatterns_reverse.tests.DefaultErrorHandlerTests.test_default_handler", + "urlpatterns_reverse.tests.ErroneousViewTests.test_invalid_regex", + "urlpatterns_reverse.tests.ErroneousViewTests.test_noncallable_view", + "urlpatterns_reverse.tests.ErrorHandlerResolutionTests.test_callable_handlers", + "urlpatterns_reverse.tests.ErrorHandlerResolutionTests.test_named_handlers", + "urlpatterns_reverse.tests.IncludeTests.test_include_2_tuple", + "urlpatterns_reverse.tests.IncludeTests.test_include_2_tuple_namespace", + "urlpatterns_reverse.tests.IncludeTests.test_include_3_tuple", + "urlpatterns_reverse.tests.IncludeTests.test_include_3_tuple_namespace", + "urlpatterns_reverse.tests.IncludeTests.test_include_4_tuple", + "urlpatterns_reverse.tests.IncludeTests.test_include_app_name", + "urlpatterns_reverse.tests.IncludeTests.test_include_app_name_namespace", + "urlpatterns_reverse.tests.IncludeTests.test_include_namespace", + "urlpatterns_reverse.tests.IncludeTests.test_include_urls", + "urlpatterns_reverse.tests.LookaheadTests.test_invalid_resolve", + "urlpatterns_reverse.tests.LookaheadTests.test_invalid_reverse", + "urlpatterns_reverse.tests.LookaheadTests.test_valid_resolve", + "urlpatterns_reverse.tests.LookaheadTests.test_valid_reverse", + "urlpatterns_reverse.tests.NamespaceTests.test_ambiguous_object", + "urlpatterns_reverse.tests.NamespaceTests.test_ambiguous_urlpattern", + "urlpatterns_reverse.tests.NamespaceTests.test_app_lookup_object", + "urlpatterns_reverse.tests.NamespaceTests.test_app_lookup_object_with_default", + "urlpatterns_reverse.tests.NamespaceTests.test_app_lookup_object_without_default", + "urlpatterns_reverse.tests.NamespaceTests.test_app_name_pattern", + "urlpatterns_reverse.tests.NamespaceTests.test_app_object", + "urlpatterns_reverse.tests.NamespaceTests.test_app_object_default_namespace", + "urlpatterns_reverse.tests.NamespaceTests.test_current_app_no_partial_match", + "urlpatterns_reverse.tests.NamespaceTests.test_embedded_namespace_object", + "urlpatterns_reverse.tests.NamespaceTests.test_multiple_namespace_pattern", + "urlpatterns_reverse.tests.NamespaceTests.test_namespace_object", + "urlpatterns_reverse.tests.NamespaceTests.test_namespace_pattern", + "urlpatterns_reverse.tests.NamespaceTests.test_namespace_pattern_with_variable_prefix", + "urlpatterns_reverse.tests.NamespaceTests.test_namespaces_with_variables", + "urlpatterns_reverse.tests.NamespaceTests.test_nested_app_lookup", + "urlpatterns_reverse.tests.NamespaceTests.test_nested_namespace_pattern", + "urlpatterns_reverse.tests.NamespaceTests.test_non_existent_namespace", + "urlpatterns_reverse.tests.NamespaceTests.test_normal_name", + "urlpatterns_reverse.tests.NamespaceTests.test_simple_included_name", + "urlpatterns_reverse.tests.NamespaceTests.test_special_chars_namespace", + "urlpatterns_reverse.tests.NoRootUrlConfTests.test_no_handler_exception", + "urlpatterns_reverse.tests.NoURLPatternsTests.test_no_urls_exception", + "urlpatterns_reverse.tests.RequestURLconfTests.test_reverse_inner_in_response_middleware", + "urlpatterns_reverse.tests.RequestURLconfTests.test_reverse_inner_in_streaming", + "urlpatterns_reverse.tests.RequestURLconfTests.test_reverse_outer_in_response_middleware", + "urlpatterns_reverse.tests.RequestURLconfTests.test_reverse_outer_in_streaming", + "urlpatterns_reverse.tests.RequestURLconfTests.test_urlconf", + "urlpatterns_reverse.tests.RequestURLconfTests.test_urlconf_is_reset_after_request", + "urlpatterns_reverse.tests.RequestURLconfTests.test_urlconf_overridden", + "urlpatterns_reverse.tests.RequestURLconfTests.test_urlconf_overridden_with_null", + "urlpatterns_reverse.tests.ResolverMatchTests.test_repr", + "urlpatterns_reverse.tests.ResolverMatchTests.test_resolver_match_on_request", + "urlpatterns_reverse.tests.ResolverMatchTests.test_resolver_match_on_request_before_resolution", + "urlpatterns_reverse.tests.ResolverMatchTests.test_urlpattern_resolve", + "urlpatterns_reverse.tests.ResolverTests.test_404_tried_urls_have_names", + "urlpatterns_reverse.tests.ResolverTests.test_namespaced_view_detail", + "urlpatterns_reverse.tests.ResolverTests.test_non_regex", + "urlpatterns_reverse.tests.ResolverTests.test_populate_concurrency", + "urlpatterns_reverse.tests.ResolverTests.test_resolver_repr", + "urlpatterns_reverse.tests.ResolverTests.test_resolver_reverse", + "urlpatterns_reverse.tests.ResolverTests.test_resolver_reverse_conflict", + "urlpatterns_reverse.tests.ResolverTests.test_reverse_lazy_object_coercion_by_resolve", + "urlpatterns_reverse.tests.ResolverTests.test_view_detail_as_method", + "urlpatterns_reverse.tests.ReverseLazySettingsTest.test_lazy_in_settings", + "urlpatterns_reverse.tests.ReverseLazyTest.test_inserting_reverse_lazy_into_string", + "urlpatterns_reverse.tests.ReverseLazyTest.test_redirect_with_lazy_reverse", + "urlpatterns_reverse.tests.ReverseLazyTest.test_user_permission_with_lazy_reverse", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_no_illegal_imports", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_redirect_to_object", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_redirect_to_url", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_redirect_to_view_name", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_redirect_view_object", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_reverse_by_path_nested", + "urlpatterns_reverse.tests.URLPatternReverse.test_illegal_args_message", + "urlpatterns_reverse.tests.URLPatternReverse.test_illegal_kwargs_message", + "urlpatterns_reverse.tests.URLPatternReverse.test_mixing_args_and_kwargs", + "urlpatterns_reverse.tests.URLPatternReverse.test_no_args_message", + "urlpatterns_reverse.tests.URLPatternReverse.test_non_urlsafe_prefix_with_args", + "urlpatterns_reverse.tests.URLPatternReverse.test_patterns_reported", + "urlpatterns_reverse.tests.URLPatternReverse.test_prefix_braces", + "urlpatterns_reverse.tests.URLPatternReverse.test_prefix_format_char", + "urlpatterns_reverse.tests.URLPatternReverse.test_prefix_parenthesis", + "urlpatterns_reverse.tests.URLPatternReverse.test_reverse_none", + "urlpatterns_reverse.tests.URLPatternReverse.test_script_name_escaping", + "urlpatterns_reverse.tests.URLPatternReverse.test_urlpattern_reverse", + "urlpatterns_reverse.tests.URLPatternReverse.test_view_not_found_message", + "urlpatterns_reverse.tests.ViewLoadingTests.test_attributeerror_not_hidden", + "urlpatterns_reverse.tests.ViewLoadingTests.test_module_does_not_exist", + "urlpatterns_reverse.tests.ViewLoadingTests.test_non_string_value", + "urlpatterns_reverse.tests.ViewLoadingTests.test_not_callable", + "urlpatterns_reverse.tests.ViewLoadingTests.test_parent_module_does_not_exist", + "urlpatterns_reverse.tests.ViewLoadingTests.test_string_without_dot", + "urlpatterns_reverse.tests.ViewLoadingTests.test_view_does_not_exist", + "urlpatterns_reverse.tests.ViewLoadingTests.test_view_loading", + "user_commands.tests.CommandRunTests.test_disallowed_abbreviated_options", + "user_commands.tests.CommandRunTests.test_script_prefix_set_in_commands", + "user_commands.tests.CommandTests.test_call_command_no_checks", + "user_commands.tests.CommandTests.test_call_command_option_parsing", + "user_commands.tests.CommandTests.test_call_command_option_parsing_non_string_arg", + "user_commands.tests.CommandTests.test_call_command_unrecognized_option", + "user_commands.tests.CommandTests.test_call_command_with_required_parameters_in_mixed_options", + "user_commands.tests.CommandTests.test_call_command_with_required_parameters_in_options", + "user_commands.tests.CommandTests.test_calling_a_command_with_no_app_labels_and_parameters_should_raise_a_command_error", + "user_commands.tests.CommandTests.test_calling_a_command_with_only_empty_parameter_should_ends_gracefully", + "user_commands.tests.CommandTests.test_calling_command_with_app_labels_and_parameters_should_be_ok", + "user_commands.tests.CommandTests.test_calling_command_with_parameters_and_app_labels_at_the_end_should_be_ok", + "user_commands.tests.CommandTests.test_check_migrations", + "user_commands.tests.CommandTests.test_command", + "user_commands.tests.CommandTests.test_command_add_arguments_after_common_arguments", + "user_commands.tests.CommandTests.test_command_style", + "user_commands.tests.CommandTests.test_create_parser_kwargs", + "user_commands.tests.CommandTests.test_discover_commands_in_eggs", + "user_commands.tests.CommandTests.test_explode", + "user_commands.tests.CommandTests.test_find_command_without_PATH", + "user_commands.tests.CommandTests.test_language_preserved", + "user_commands.tests.CommandTests.test_no_translations_deactivate_translations", + "user_commands.tests.CommandTests.test_output_transaction", + "user_commands.tests.CommandTests.test_subparser", + "user_commands.tests.CommandTests.test_subparser_invalid_option", + "user_commands.tests.CommandTests.test_system_exit", + "user_commands.tests.UtilsTests.test_get_random_secret_key", + "user_commands.tests.UtilsTests.test_no_existent_external_program", + "utils_tests.test_archive.TestBzip2Tar.test_extract_file_permissions", + "utils_tests.test_archive.TestBzip2Tar.test_extract_function", + "utils_tests.test_archive.TestBzip2Tar.test_extract_function_no_to_path", + "utils_tests.test_archive.TestBzip2Tar.test_extract_function_with_leadpath", + "utils_tests.test_archive.TestBzip2Tar.test_extract_method", + "utils_tests.test_archive.TestBzip2Tar.test_extract_method_no_to_path", + "utils_tests.test_archive.TestGzipTar.test_extract_file_permissions", + "utils_tests.test_archive.TestGzipTar.test_extract_function", + "utils_tests.test_archive.TestGzipTar.test_extract_function_no_to_path", + "utils_tests.test_archive.TestGzipTar.test_extract_function_with_leadpath", + "utils_tests.test_archive.TestGzipTar.test_extract_method", + "utils_tests.test_archive.TestGzipTar.test_extract_method_no_to_path", + "utils_tests.test_archive.TestTar.test_extract_file_permissions", + "utils_tests.test_archive.TestTar.test_extract_function", + "utils_tests.test_archive.TestTar.test_extract_function_no_to_path", + "utils_tests.test_archive.TestTar.test_extract_function_with_leadpath", + "utils_tests.test_archive.TestTar.test_extract_method", + "utils_tests.test_archive.TestTar.test_extract_method_no_to_path", + "utils_tests.test_archive.TestZip.test_extract_file_permissions", + "utils_tests.test_archive.TestZip.test_extract_function", + "utils_tests.test_archive.TestZip.test_extract_function_no_to_path", + "utils_tests.test_archive.TestZip.test_extract_function_with_leadpath", + "utils_tests.test_archive.TestZip.test_extract_method", + "utils_tests.test_archive.TestZip.test_extract_method_no_to_path", + "utils_tests.test_autoreload.BaseReloaderTests.test_run_loop_catches_stopiteration", + "utils_tests.test_autoreload.BaseReloaderTests.test_run_loop_stop_and_return", + "utils_tests.test_autoreload.BaseReloaderTests.test_wait_for_apps_ready_checks_for_exception", + "utils_tests.test_autoreload.BaseReloaderTests.test_wait_for_apps_ready_without_exception", + "utils_tests.test_autoreload.BaseReloaderTests.test_watch_files_with_recursive_glob", + "utils_tests.test_autoreload.BaseReloaderTests.test_watch_with_glob", + "utils_tests.test_autoreload.BaseReloaderTests.test_watch_with_single_file", + "utils_tests.test_autoreload.BaseReloaderTests.test_watch_without_absolute", + "utils_tests.test_autoreload.GetReloaderTests.test_watchman_available", + "utils_tests.test_autoreload.GetReloaderTests.test_watchman_unavailable", + "utils_tests.test_autoreload.RestartWithReloaderTests.test_manage_py", + "utils_tests.test_autoreload.RestartWithReloaderTests.test_python_m_django", + "utils_tests.test_autoreload.RunWithReloaderTests.test_calls_start_django", + "utils_tests.test_autoreload.RunWithReloaderTests.test_calls_sys_exit", + "utils_tests.test_autoreload.RunWithReloaderTests.test_swallows_keyboard_interrupt", + "utils_tests.test_autoreload.StartDjangoTests.test_check_errors_called", + "utils_tests.test_autoreload.StartDjangoTests.test_echo_on_called", + "utils_tests.test_autoreload.StartDjangoTests.test_starts_thread_with_args", + "utils_tests.test_autoreload.StartDjangoTests.test_watchman_becomes_unavailable", + "utils_tests.test_autoreload.StatReloaderTests.test_does_not_fire_without_changes", + "utils_tests.test_autoreload.StatReloaderTests.test_file", + "utils_tests.test_autoreload.StatReloaderTests.test_fires_when_created", + "utils_tests.test_autoreload.StatReloaderTests.test_fires_with_changes", + "utils_tests.test_autoreload.StatReloaderTests.test_glob", + "utils_tests.test_autoreload.StatReloaderTests.test_glob_non_existing_directory", + "utils_tests.test_autoreload.StatReloaderTests.test_glob_recursive", + "utils_tests.test_autoreload.StatReloaderTests.test_multiple_globs", + "utils_tests.test_autoreload.StatReloaderTests.test_multiple_recursive_globs", + "utils_tests.test_autoreload.StatReloaderTests.test_nested_glob_recursive", + "utils_tests.test_autoreload.StatReloaderTests.test_nonexistent_file", + "utils_tests.test_autoreload.StatReloaderTests.test_nonexistent_file_in_non_existing_directory", + "utils_tests.test_autoreload.StatReloaderTests.test_overlapping_glob_recursive", + "utils_tests.test_autoreload.StatReloaderTests.test_overlapping_globs", + "utils_tests.test_autoreload.StatReloaderTests.test_snapshot_files_ignores_missing_files", + "utils_tests.test_autoreload.StatReloaderTests.test_snapshot_files_updates", + "utils_tests.test_autoreload.TestCheckErrors.test_mutates_error_files", + "utils_tests.test_autoreload.TestCommonRoots.test_common_roots", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_bytecode_conversion_to_source", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_check_errors", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_check_errors_catches_all_exceptions", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_file_added", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_module_without_spec", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_paths_are_pathlib_instances", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_weakref_in_sys_module", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_zip_reload", + "utils_tests.test_autoreload.TestRaiseLastException.test_no_exception", + "utils_tests.test_autoreload.TestRaiseLastException.test_raises_exception", + "utils_tests.test_autoreload.TestSysPathDirectories.test_sys_paths_absolute", + "utils_tests.test_autoreload.TestSysPathDirectories.test_sys_paths_directories", + "utils_tests.test_autoreload.TestSysPathDirectories.test_sys_paths_non_existing", + "utils_tests.test_autoreload.TestSysPathDirectories.test_sys_paths_with_directories", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_check_availability", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_check_availability_lower_version", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_check_server_status", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_check_server_status_raises_error", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_file", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_glob", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_glob_non_existing_directory", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_glob_recursive", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_multiple_globs", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_multiple_recursive_globs", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_nested_glob_recursive", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_nonexistent_file", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_nonexistent_file_in_non_existing_directory", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_overlapping_glob_recursive", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_overlapping_globs", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_pywatchman_not_available", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_update_watches_raises_exceptions", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watch_glob_ignores_non_existing_directories_two_levels", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watch_glob_multiple_patterns", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watch_glob_uses_existing_parent_directories", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watched_roots_contains_directory_globs", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watched_roots_contains_files", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watched_roots_contains_sys_path", + "utils_tests.test_baseconv.TestBaseConv.test_base11", + "utils_tests.test_baseconv.TestBaseConv.test_base20", + "utils_tests.test_baseconv.TestBaseConv.test_base64", + "utils_tests.test_baseconv.TestBaseConv.test_base7", + "utils_tests.test_baseconv.TestBaseConv.test_baseconv", + "utils_tests.test_baseconv.TestBaseConv.test_exception", + "utils_tests.test_baseconv.TestBaseConv.test_repr", + "utils_tests.test_crypto.TestUtilsCryptoMisc.test_constant_time_compare", + "utils_tests.test_crypto.TestUtilsCryptoPBKDF2.test_default_hmac_alg", + "utils_tests.test_crypto.TestUtilsCryptoPBKDF2.test_public_vectors", + "utils_tests.test_crypto.TestUtilsCryptoPBKDF2.test_regression_vectors", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_copy", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_create_with_invalid_key", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_create_with_invalid_values", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_del", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_dict", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_equal", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_getitem", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_in", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_items", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_list", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_repr", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_set", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_str", + "utils_tests.test_datastructures.DictWrapperTests.test_dictwrapper", + "utils_tests.test_datastructures.ImmutableListTests.test_custom_warning", + "utils_tests.test_datastructures.ImmutableListTests.test_sort", + "utils_tests.test_datastructures.MultiValueDictTests.test_appendlist", + "utils_tests.test_datastructures.MultiValueDictTests.test_copy", + "utils_tests.test_datastructures.MultiValueDictTests.test_dict_translation", + "utils_tests.test_datastructures.MultiValueDictTests.test_getlist_default", + "utils_tests.test_datastructures.MultiValueDictTests.test_getlist_doesnt_mutate", + "utils_tests.test_datastructures.MultiValueDictTests.test_getlist_none_empty_values", + "utils_tests.test_datastructures.MultiValueDictTests.test_internal_getlist_does_mutate", + "utils_tests.test_datastructures.MultiValueDictTests.test_multivaluedict", + "utils_tests.test_datastructures.OrderedSetTests.test_bool", + "utils_tests.test_datastructures.OrderedSetTests.test_len", + "utils_tests.test_dateformat.DateFormatTests.test_am_pm", + "utils_tests.test_dateformat.DateFormatTests.test_date", + "utils_tests.test_dateformat.DateFormatTests.test_date_formats", + "utils_tests.test_dateformat.DateFormatTests.test_dateformat", + "utils_tests.test_dateformat.DateFormatTests.test_datetime_with_local_tzinfo", + "utils_tests.test_dateformat.DateFormatTests.test_datetime_with_tzinfo", + "utils_tests.test_dateformat.DateFormatTests.test_empty_format", + "utils_tests.test_dateformat.DateFormatTests.test_epoch", + "utils_tests.test_dateformat.DateFormatTests.test_futuredates", + "utils_tests.test_dateformat.DateFormatTests.test_invalid_time_format_specifiers", + "utils_tests.test_dateformat.DateFormatTests.test_microsecond", + "utils_tests.test_dateformat.DateFormatTests.test_naive_ambiguous_datetime", + "utils_tests.test_dateformat.DateFormatTests.test_naive_datetime", + "utils_tests.test_dateformat.DateFormatTests.test_time_formats", + "utils_tests.test_dateformat.DateFormatTests.test_timezones", + "utils_tests.test_dateparse.DateParseTests.test_parse_date", + "utils_tests.test_dateparse.DateParseTests.test_parse_datetime", + "utils_tests.test_dateparse.DateParseTests.test_parse_time", + "utils_tests.test_dateparse.DurationParseTests.test_days", + "utils_tests.test_dateparse.DurationParseTests.test_fractions_of_seconds", + "utils_tests.test_dateparse.DurationParseTests.test_hours_minutes_seconds", + "utils_tests.test_dateparse.DurationParseTests.test_iso_8601", + "utils_tests.test_dateparse.DurationParseTests.test_minutes_seconds", + "utils_tests.test_dateparse.DurationParseTests.test_negative", + "utils_tests.test_dateparse.DurationParseTests.test_parse_postgresql_format", + "utils_tests.test_dateparse.DurationParseTests.test_parse_python_format", + "utils_tests.test_dateparse.DurationParseTests.test_seconds", + "utils_tests.test_datetime_safe.DatetimeTests.test_compare_datetimes", + "utils_tests.test_datetime_safe.DatetimeTests.test_safe_strftime", + "utils_tests.test_datetime_safe.DatetimeTests.test_zero_padding", + "utils_tests.test_decorators.ClassPropertyTest.test_getter", + "utils_tests.test_decorators.ClassPropertyTest.test_override_getter", + "utils_tests.test_decorators.DecoratorFromMiddlewareTests.test_callable_process_view_middleware", + "utils_tests.test_decorators.DecoratorFromMiddlewareTests.test_full_dec_normal", + "utils_tests.test_decorators.DecoratorFromMiddlewareTests.test_full_dec_templateresponse", + "utils_tests.test_decorators.DecoratorFromMiddlewareTests.test_process_view_middleware", + "utils_tests.test_duration.TestDurationMicroseconds.test", + "utils_tests.test_duration.TestDurationString.test_days", + "utils_tests.test_duration.TestDurationString.test_microseconds", + "utils_tests.test_duration.TestDurationString.test_negative", + "utils_tests.test_duration.TestDurationString.test_simple", + "utils_tests.test_duration.TestISODurationString.test_days", + "utils_tests.test_duration.TestISODurationString.test_microseconds", + "utils_tests.test_duration.TestISODurationString.test_negative", + "utils_tests.test_duration.TestISODurationString.test_simple", + "utils_tests.test_duration.TestParseDurationRoundtrip.test_days", + "utils_tests.test_duration.TestParseDurationRoundtrip.test_microseconds", + "utils_tests.test_duration.TestParseDurationRoundtrip.test_negative", + "utils_tests.test_duration.TestParseDurationRoundtrip.test_simple", + "utils_tests.test_duration.TestParseISODurationRoundtrip.test_days", + "utils_tests.test_duration.TestParseISODurationRoundtrip.test_microseconds", + "utils_tests.test_duration.TestParseISODurationRoundtrip.test_negative", + "utils_tests.test_duration.TestParseISODurationRoundtrip.test_simple", + "utils_tests.test_encoding.TestEncodingUtils.test_force_bytes_encoding", + "utils_tests.test_encoding.TestEncodingUtils.test_force_bytes_exception", + "utils_tests.test_encoding.TestEncodingUtils.test_force_bytes_memory_view", + "utils_tests.test_encoding.TestEncodingUtils.test_force_bytes_strings_only", + "utils_tests.test_encoding.TestEncodingUtils.test_force_text_DjangoUnicodeDecodeError", + "utils_tests.test_encoding.TestEncodingUtils.test_force_text_exception", + "utils_tests.test_encoding.TestEncodingUtils.test_force_text_lazy", + "utils_tests.test_encoding.TestEncodingUtils.test_get_default_encoding", + "utils_tests.test_encoding.TestEncodingUtils.test_smart_bytes", + "utils_tests.test_encoding.TestEncodingUtils.test_smart_text", + "utils_tests.test_encoding.TestRFC3987IEncodingUtils.test_complementarity", + "utils_tests.test_encoding.TestRFC3987IEncodingUtils.test_escape_uri_path", + "utils_tests.test_encoding.TestRFC3987IEncodingUtils.test_filepath_to_uri", + "utils_tests.test_encoding.TestRFC3987IEncodingUtils.test_iri_to_uri", + "utils_tests.test_encoding.TestRFC3987IEncodingUtils.test_uri_to_iri", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_atom1_mime_type", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_atom_add_item", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_deterministic_attribute_order", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_feed_with_feed_url_gets_rendered_with_atom_link", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_feed_without_feed_url_gets_rendered_without_atom_link", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_get_tag_uri", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_get_tag_uri_with_port", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_latest_post_date_returns_utc_time", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc2822_date", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc2822_date_with_timezone", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc2822_date_without_time", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc3339_date", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc3339_date_with_timezone", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc3339_date_without_time", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rss_mime_type", + "utils_tests.test_functional.FunctionalTests.test_cached_property", + "utils_tests.test_functional.FunctionalTests.test_cached_property_auto_name", + "utils_tests.test_functional.FunctionalTests.test_cached_property_mangled_error", + "utils_tests.test_functional.FunctionalTests.test_cached_property_name_validation", + "utils_tests.test_functional.FunctionalTests.test_cached_property_reuse_different_names", + "utils_tests.test_functional.FunctionalTests.test_cached_property_reuse_same_name", + "utils_tests.test_functional.FunctionalTests.test_cached_property_set_name_not_called", + "utils_tests.test_functional.FunctionalTests.test_lazy", + "utils_tests.test_functional.FunctionalTests.test_lazy_base_class", + "utils_tests.test_functional.FunctionalTests.test_lazy_base_class_override", + "utils_tests.test_functional.FunctionalTests.test_lazy_equality", + "utils_tests.test_functional.FunctionalTests.test_lazy_object_to_string", + "utils_tests.test_functional.FunctionalTests.test_lazy_repr_bytes", + "utils_tests.test_functional.FunctionalTests.test_lazy_repr_int", + "utils_tests.test_functional.FunctionalTests.test_lazy_repr_text", + "utils_tests.test_hashable.TestHashable.test_count_equal", + "utils_tests.test_hashable.TestHashable.test_equal", + "utils_tests.test_hashable.TestHashable.test_unhashable", + "utils_tests.test_html.TestUtilsHtml.test_conditional_escape", + "utils_tests.test_html.TestUtilsHtml.test_escape", + "utils_tests.test_html.TestUtilsHtml.test_escapejs", + "utils_tests.test_html.TestUtilsHtml.test_format_html", + "utils_tests.test_html.TestUtilsHtml.test_html_safe", + "utils_tests.test_html.TestUtilsHtml.test_html_safe_defines_html_error", + "utils_tests.test_html.TestUtilsHtml.test_html_safe_doesnt_define_str", + "utils_tests.test_html.TestUtilsHtml.test_html_safe_subclass", + "utils_tests.test_html.TestUtilsHtml.test_json_script", + "utils_tests.test_html.TestUtilsHtml.test_linebreaks", + "utils_tests.test_html.TestUtilsHtml.test_smart_urlquote", + "utils_tests.test_html.TestUtilsHtml.test_strip_spaces_between_tags", + "utils_tests.test_html.TestUtilsHtml.test_strip_tags", + "utils_tests.test_html.TestUtilsHtml.test_strip_tags_files", + "utils_tests.test_html.TestUtilsHtml.test_urlize", + "utils_tests.test_html.TestUtilsHtml.test_urlize_unchanged_inputs", + "utils_tests.test_http.Base36IntTests.test_input_too_large", + "utils_tests.test_http.Base36IntTests.test_invalid_literal", + "utils_tests.test_http.Base36IntTests.test_negative_input", + "utils_tests.test_http.Base36IntTests.test_roundtrip", + "utils_tests.test_http.Base36IntTests.test_to_base36_errors", + "utils_tests.test_http.Base36IntTests.test_to_int_errors", + "utils_tests.test_http.Base36IntTests.test_values", + "utils_tests.test_http.ETagProcessingTests.test_parsing", + "utils_tests.test_http.ETagProcessingTests.test_quoting", + "utils_tests.test_http.EscapeLeadingSlashesTests.test", + "utils_tests.test_http.HttpDateProcessingTests.test_cookie_date", + "utils_tests.test_http.HttpDateProcessingTests.test_http_date", + "utils_tests.test_http.HttpDateProcessingTests.test_parsing_asctime", + "utils_tests.test_http.HttpDateProcessingTests.test_parsing_rfc1123", + "utils_tests.test_http.HttpDateProcessingTests.test_parsing_rfc850", + "utils_tests.test_http.HttpDateProcessingTests.test_parsing_year_less_than_70", + "utils_tests.test_http.IsSafeURLTests.test_allowed_hosts_str", + "utils_tests.test_http.IsSafeURLTests.test_bad_urls", + "utils_tests.test_http.IsSafeURLTests.test_basic_auth", + "utils_tests.test_http.IsSafeURLTests.test_good_urls", + "utils_tests.test_http.IsSafeURLTests.test_no_allowed_hosts", + "utils_tests.test_http.IsSafeURLTests.test_secure_param_https_urls", + "utils_tests.test_http.IsSafeURLTests.test_secure_param_non_https_urls", + "utils_tests.test_http.IsSameDomainTests.test_bad", + "utils_tests.test_http.IsSameDomainTests.test_good", + "utils_tests.test_http.URLEncodeTests.test_dict", + "utils_tests.test_http.URLEncodeTests.test_dict_containing_empty_sequence_doseq", + "utils_tests.test_http.URLEncodeTests.test_dict_containing_sequence_doseq", + "utils_tests.test_http.URLEncodeTests.test_dict_containing_sequence_not_doseq", + "utils_tests.test_http.URLEncodeTests.test_dict_with_bytearray", + "utils_tests.test_http.URLEncodeTests.test_dict_with_bytes_values", + "utils_tests.test_http.URLEncodeTests.test_dict_with_sequence_of_bytes", + "utils_tests.test_http.URLEncodeTests.test_generator", + "utils_tests.test_http.URLEncodeTests.test_multivaluedict", + "utils_tests.test_http.URLEncodeTests.test_none", + "utils_tests.test_http.URLEncodeTests.test_none_in_generator", + "utils_tests.test_http.URLEncodeTests.test_none_in_sequence", + "utils_tests.test_http.URLEncodeTests.test_tuples", + "utils_tests.test_http.URLQuoteTests.test_quote", + "utils_tests.test_http.URLQuoteTests.test_quote_plus", + "utils_tests.test_http.URLQuoteTests.test_unquote", + "utils_tests.test_http.URLQuoteTests.test_unquote_plus", + "utils_tests.test_http.URLSafeBase64Tests.test_roundtrip", + "utils_tests.test_inspect.TestInspectMethods.test_func_accepts_var_args_has_var_args", + "utils_tests.test_inspect.TestInspectMethods.test_func_accepts_var_args_no_var_args", + "utils_tests.test_inspect.TestInspectMethods.test_get_func_full_args_all_arguments", + "utils_tests.test_inspect.TestInspectMethods.test_get_func_full_args_no_arguments", + "utils_tests.test_inspect.TestInspectMethods.test_get_func_full_args_one_argument", + "utils_tests.test_inspect.TestInspectMethods.test_method_has_no_args", + "utils_tests.test_ipv6.TestUtilsIPv6.test_cleans_plain_address", + "utils_tests.test_ipv6.TestUtilsIPv6.test_cleans_with_v4_mapping", + "utils_tests.test_ipv6.TestUtilsIPv6.test_unpacks_ipv4", + "utils_tests.test_ipv6.TestUtilsIPv6.test_validates_correct_plain_address", + "utils_tests.test_ipv6.TestUtilsIPv6.test_validates_correct_with_v4mapping", + "utils_tests.test_ipv6.TestUtilsIPv6.test_validates_incorrect_plain_address", + "utils_tests.test_ipv6.TestUtilsIPv6.test_validates_incorrect_with_v4mapping", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_0", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_1", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_2", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_3", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_4", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_5", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_6", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_7", + "utils_tests.test_jslex.JsTokensTest.test_case_0", + "utils_tests.test_jslex.JsTokensTest.test_case_1", + "utils_tests.test_jslex.JsTokensTest.test_case_10", + "utils_tests.test_jslex.JsTokensTest.test_case_11", + "utils_tests.test_jslex.JsTokensTest.test_case_12", + "utils_tests.test_jslex.JsTokensTest.test_case_13", + "utils_tests.test_jslex.JsTokensTest.test_case_14", + "utils_tests.test_jslex.JsTokensTest.test_case_15", + "utils_tests.test_jslex.JsTokensTest.test_case_16", + "utils_tests.test_jslex.JsTokensTest.test_case_17", + "utils_tests.test_jslex.JsTokensTest.test_case_18", + "utils_tests.test_jslex.JsTokensTest.test_case_19", + "utils_tests.test_jslex.JsTokensTest.test_case_2", + "utils_tests.test_jslex.JsTokensTest.test_case_20", + "utils_tests.test_jslex.JsTokensTest.test_case_21", + "utils_tests.test_jslex.JsTokensTest.test_case_22", + "utils_tests.test_jslex.JsTokensTest.test_case_23", + "utils_tests.test_jslex.JsTokensTest.test_case_24", + "utils_tests.test_jslex.JsTokensTest.test_case_25", + "utils_tests.test_jslex.JsTokensTest.test_case_26", + "utils_tests.test_jslex.JsTokensTest.test_case_27", + "utils_tests.test_jslex.JsTokensTest.test_case_28", + "utils_tests.test_jslex.JsTokensTest.test_case_29", + "utils_tests.test_jslex.JsTokensTest.test_case_3", + "utils_tests.test_jslex.JsTokensTest.test_case_30", + "utils_tests.test_jslex.JsTokensTest.test_case_31", + "utils_tests.test_jslex.JsTokensTest.test_case_32", + "utils_tests.test_jslex.JsTokensTest.test_case_4", + "utils_tests.test_jslex.JsTokensTest.test_case_5", + "utils_tests.test_jslex.JsTokensTest.test_case_6", + "utils_tests.test_jslex.JsTokensTest.test_case_7", + "utils_tests.test_jslex.JsTokensTest.test_case_8", + "utils_tests.test_jslex.JsTokensTest.test_case_9", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_common_large_number_of_words", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_common_words_in_string", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_more_words_than_common", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_negative_words", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_not_common_words", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_paragraph", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_paragraphs", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_paragraphs_not_common", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_same_or_less_common_words", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_sentence", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_sentence_ending", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_sentence_starts_with_capital", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_found", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_found_but_bad_module", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_not_found", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_several_found", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_several_found_with_registry", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_several_one_bad_module", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_validate_registry_keeps_intact", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_validate_registry_resets_after_erroneous_module", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_validate_registry_resets_after_missing_module", + "utils_tests.test_module_loading.CustomLoader.test_deep_loader", + "utils_tests.test_module_loading.CustomLoader.test_shallow_loader", + "utils_tests.test_module_loading.DefaultLoader.test_has_sumbodule_with_dotted_path", + "utils_tests.test_module_loading.DefaultLoader.test_loader", + "utils_tests.test_module_loading.EggLoader.test_deep_loader", + "utils_tests.test_module_loading.EggLoader.test_shallow_loader", + "utils_tests.test_module_loading.ModuleImportTests.test_import_string", + "utils_tests.test_numberformat.TestNumberFormat.test_decimal_numbers", + "utils_tests.test_numberformat.TestNumberFormat.test_decimal_subclass", + "utils_tests.test_numberformat.TestNumberFormat.test_float_numbers", + "utils_tests.test_numberformat.TestNumberFormat.test_format_number", + "utils_tests.test_numberformat.TestNumberFormat.test_format_string", + "utils_tests.test_numberformat.TestNumberFormat.test_large_number", + "utils_tests.test_os_utils.SafeJoinTests.test_base_path_ends_with_sep", + "utils_tests.test_os_utils.SafeJoinTests.test_parent_path", + "utils_tests.test_os_utils.SafeJoinTests.test_root_path", + "utils_tests.test_regex_helper.NormalizeTests.test_empty", + "utils_tests.test_regex_helper.NormalizeTests.test_escape", + "utils_tests.test_regex_helper.NormalizeTests.test_group_backreference", + "utils_tests.test_regex_helper.NormalizeTests.test_group_named", + "utils_tests.test_regex_helper.NormalizeTests.test_group_noncapturing", + "utils_tests.test_regex_helper.NormalizeTests.test_group_positional", + "utils_tests.test_safestring.SafeStringTest.test_add_lazy_safe_text_and_safe_text", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_as_decorator", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_decorator_does_not_affect_dunder_html", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_decorator_does_not_affect_promises", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_lazy", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_lazy_result_implements_dunder_html", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_object_implementing_dunder_html", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_object_implementing_dunder_str", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_result_implements_dunder_html", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_str", + "utils_tests.test_simplelazyobject.TestUtilsSimpleLazyObjectDjangoTestCase.test_pickle", + "utils_tests.test_termcolors.TermColorTests.test_bad_color", + "utils_tests.test_termcolors.TermColorTests.test_bad_option", + "utils_tests.test_termcolors.TermColorTests.test_bad_palette", + "utils_tests.test_termcolors.TermColorTests.test_bad_role", + "utils_tests.test_termcolors.TermColorTests.test_color_case", + "utils_tests.test_termcolors.TermColorTests.test_colorize_empty_text", + "utils_tests.test_termcolors.TermColorTests.test_empty_definition", + "utils_tests.test_termcolors.TermColorTests.test_empty_options", + "utils_tests.test_termcolors.TermColorTests.test_empty_string", + "utils_tests.test_termcolors.TermColorTests.test_fg", + "utils_tests.test_termcolors.TermColorTests.test_fg_bg", + "utils_tests.test_termcolors.TermColorTests.test_fg_bg_opts", + "utils_tests.test_termcolors.TermColorTests.test_fg_opts", + "utils_tests.test_termcolors.TermColorTests.test_multiple_roles", + "utils_tests.test_termcolors.TermColorTests.test_opts_case", + "utils_tests.test_termcolors.TermColorTests.test_override_nocolor", + "utils_tests.test_termcolors.TermColorTests.test_override_palette", + "utils_tests.test_termcolors.TermColorTests.test_override_with_multiple_roles", + "utils_tests.test_termcolors.TermColorTests.test_reverse_override", + "utils_tests.test_termcolors.TermColorTests.test_role_case", + "utils_tests.test_termcolors.TermColorTests.test_simple_palette", + "utils_tests.test_text.TestUtilsText.test_compress_sequence", + "utils_tests.test_text.TestUtilsText.test_format_lazy", + "utils_tests.test_text.TestUtilsText.test_get_text_list", + "utils_tests.test_text.TestUtilsText.test_get_valid_filename", + "utils_tests.test_text.TestUtilsText.test_normalize_newlines", + "utils_tests.test_text.TestUtilsText.test_phone2numeric", + "utils_tests.test_text.TestUtilsText.test_slugify", + "utils_tests.test_text.TestUtilsText.test_smart_split", + "utils_tests.test_text.TestUtilsText.test_truncate_chars", + "utils_tests.test_text.TestUtilsText.test_truncate_html_words", + "utils_tests.test_text.TestUtilsText.test_truncate_words", + "utils_tests.test_text.TestUtilsText.test_unescape_entities", + "utils_tests.test_text.TestUtilsText.test_unescape_string_literal", + "utils_tests.test_text.TestUtilsText.test_wrap", + "utils_tests.test_timesince.TimesinceTests.test_both_date_objects", + "utils_tests.test_timesince.TimesinceTests.test_date_objects", + "utils_tests.test_timesince.TimesinceTests.test_different_timezones", + "utils_tests.test_timesince.TimesinceTests.test_display_first_unit", + "utils_tests.test_timesince.TimesinceTests.test_display_second_before_first", + "utils_tests.test_timesince.TimesinceTests.test_equal_datetimes", + "utils_tests.test_timesince.TimesinceTests.test_ignore_microseconds_and_seconds", + "utils_tests.test_timesince.TimesinceTests.test_leap_year", + "utils_tests.test_timesince.TimesinceTests.test_leap_year_new_years_eve", + "utils_tests.test_timesince.TimesinceTests.test_multiple_units", + "utils_tests.test_timesince.TimesinceTests.test_naive_datetime_with_tzinfo_attribute", + "utils_tests.test_timesince.TimesinceTests.test_other_units", + "utils_tests.test_timesince.TimesinceTests.test_thousand_years_ago", + "utils_tests.test_timezone.TimezoneTests.test_activate_invalid_timezone", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_deprecation", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_dst", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_negative_timedelta", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_pickle", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_timedelta", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_utcoffset", + "utils_tests.test_timezone.TimezoneTests.test_get_default_timezone", + "utils_tests.test_timezone.TimezoneTests.test_get_default_timezone_utc", + "utils_tests.test_timezone.TimezoneTests.test_is_aware", + "utils_tests.test_timezone.TimezoneTests.test_is_naive", + "utils_tests.test_timezone.TimezoneTests.test_localdate", + "utils_tests.test_timezone.TimezoneTests.test_make_aware", + "utils_tests.test_timezone.TimezoneTests.test_make_aware2", + "utils_tests.test_timezone.TimezoneTests.test_make_aware_no_tz", + "utils_tests.test_timezone.TimezoneTests.test_make_aware_pytz", + "utils_tests.test_timezone.TimezoneTests.test_make_aware_pytz_ambiguous", + "utils_tests.test_timezone.TimezoneTests.test_make_aware_pytz_non_existent", + "utils_tests.test_timezone.TimezoneTests.test_make_naive", + "utils_tests.test_timezone.TimezoneTests.test_make_naive_no_tz", + "utils_tests.test_timezone.TimezoneTests.test_now", + "utils_tests.test_timezone.TimezoneTests.test_override", + "utils_tests.test_timezone.TimezoneTests.test_override_decorator", + "utils_tests.test_timezone.TimezoneTests.test_override_fixed_offset", + "utils_tests.test_timezone.TimezoneTests.test_override_string_tz", + "utils_tests.test_topological_sort.TopologicalSortTests.test_basic", + "utils_tests.test_topological_sort.TopologicalSortTests.test_cyclic_dependency", + "utils_tests.test_tree.NodeTests.test_add", + "utils_tests.test_tree.NodeTests.test_bool", + "utils_tests.test_tree.NodeTests.test_contains", + "utils_tests.test_tree.NodeTests.test_deepcopy", + "utils_tests.test_tree.NodeTests.test_eq_children", + "utils_tests.test_tree.NodeTests.test_eq_connector", + "utils_tests.test_tree.NodeTests.test_eq_negated", + "utils_tests.test_tree.NodeTests.test_hash", + "utils_tests.test_tree.NodeTests.test_len", + "utils_tests.test_tree.NodeTests.test_negate", + "utils_tests.test_tree.NodeTests.test_repr", + "utils_tests.test_tree.NodeTests.test_str", + "validation.test_error_messages.ValidationMessagesTest.test_autofield_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_boolean_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_date_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_datetime_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_decimal_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_float_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_integer_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_null_boolean_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_nullable_boolean_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_time_field_raises_error_message", + "validation.test_picklable.PickableValidationErrorTestCase.test_validationerror_is_picklable", + "validators.tests.TestValidatorEquality.test_basic_equality", + "validators.tests.TestValidatorEquality.test_decimal_equality", + "validators.tests.TestValidatorEquality.test_email_equality", + "validators.tests.TestValidatorEquality.test_file_extension_equality", + "validators.tests.TestValidatorEquality.test_prohibit_null_characters_validator_equality", + "validators.tests.TestValidatorEquality.test_regex_equality", + "validators.tests.TestValidatorEquality.test_regex_equality_blank", + "validators.tests.TestValidatorEquality.test_regex_equality_nocache", + "validators.tests.TestValidators.test_max_length_validator_message", + "validators.tests.TestValidators.test_message_dict", + "validators.tests.TestValidators.test_message_list", + "validators.tests.TestValidators.test_regex_validator_flags", + "validators.tests.TestValidators.test_single_message", + "validators.tests.TestValidators.test_validators", + "version.tests.VersionTests.test_development", + "version.tests.VersionTests.test_get_version_tuple", + "version.tests.VersionTests.test_releases", + "view_tests.tests.test_csrf.CsrfViewTests.test_custom_template", + "view_tests.tests.test_csrf.CsrfViewTests.test_custom_template_does_not_exist", + "view_tests.tests.test_csrf.CsrfViewTests.test_no_cookies", + "view_tests.tests.test_csrf.CsrfViewTests.test_no_django_template_engine", + "view_tests.tests.test_csrf.CsrfViewTests.test_no_referer", + "view_tests.tests.test_csrf.CsrfViewTests.test_translation", + "view_tests.tests.test_debug.AjaxResponseExceptionReporterFilter.test_ajax_response_encoding", + "view_tests.tests.test_debug.AjaxResponseExceptionReporterFilter.test_custom_exception_reporter_filter", + "view_tests.tests.test_debug.AjaxResponseExceptionReporterFilter.test_non_sensitive_request", + "view_tests.tests.test_debug.AjaxResponseExceptionReporterFilter.test_paranoid_request", + "view_tests.tests.test_debug.AjaxResponseExceptionReporterFilter.test_sensitive_request", + "view_tests.tests.test_debug.CallableSettingWrapperTests.test_repr", + "view_tests.tests.test_debug.DebugViewQueriesAllowedTests.test_handle_db_exception", + "view_tests.tests.test_debug.DebugViewTests.test_400", + "view_tests.tests.test_debug.DebugViewTests.test_403", + "view_tests.tests.test_debug.DebugViewTests.test_403_template", + "view_tests.tests.test_debug.DebugViewTests.test_404", + "view_tests.tests.test_debug.DebugViewTests.test_404_empty_path_not_in_urls", + "view_tests.tests.test_debug.DebugViewTests.test_404_not_in_urls", + "view_tests.tests.test_debug.DebugViewTests.test_classbased_technical_404", + "view_tests.tests.test_debug.DebugViewTests.test_default_urlconf_template", + "view_tests.tests.test_debug.DebugViewTests.test_files", + "view_tests.tests.test_debug.DebugViewTests.test_no_template_source_loaders", + "view_tests.tests.test_debug.DebugViewTests.test_non_l10ned_numeric_ids", + "view_tests.tests.test_debug.DebugViewTests.test_regression_21530", + "view_tests.tests.test_debug.DebugViewTests.test_technical_404", + "view_tests.tests.test_debug.DebugViewTests.test_template_exceptions", + "view_tests.tests.test_debug.DebugViewTests.test_template_loader_postmortem", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_callable_settings", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_callable_settings_forbidding_to_set_attributes", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_custom_exception_reporter_filter", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_dict_setting_with_non_str_key", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_multivalue_dict_key_error", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_non_sensitive_request", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_paranoid_request", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_sensitive_function_arguments", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_sensitive_function_keyword_arguments", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_sensitive_method", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_sensitive_request", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_sensitive_settings", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_settings_with_sensitive_keys", + "view_tests.tests.test_debug.ExceptionReporterTests.test_disallowed_host", + "view_tests.tests.test_debug.ExceptionReporterTests.test_encoding_error", + "view_tests.tests.test_debug.ExceptionReporterTests.test_eol_support", + "view_tests.tests.test_debug.ExceptionReporterTests.test_exception_fetching_user", + "view_tests.tests.test_debug.ExceptionReporterTests.test_ignore_traceback_evaluation_exceptions", + "view_tests.tests.test_debug.ExceptionReporterTests.test_local_variable_escaping", + "view_tests.tests.test_debug.ExceptionReporterTests.test_message_only", + "view_tests.tests.test_debug.ExceptionReporterTests.test_no_exception", + "view_tests.tests.test_debug.ExceptionReporterTests.test_no_request", + "view_tests.tests.test_debug.ExceptionReporterTests.test_non_utf8_values_handling", + "view_tests.tests.test_debug.ExceptionReporterTests.test_reporting_frames_without_source", + "view_tests.tests.test_debug.ExceptionReporterTests.test_reporting_of_nested_exceptions", + "view_tests.tests.test_debug.ExceptionReporterTests.test_request_and_exception", + "view_tests.tests.test_debug.ExceptionReporterTests.test_request_and_message", + "view_tests.tests.test_debug.ExceptionReporterTests.test_request_with_items_key", + "view_tests.tests.test_debug.ExceptionReporterTests.test_too_large_values_handling", + "view_tests.tests.test_debug.ExceptionReporterTests.test_unfrozen_importlib", + "view_tests.tests.test_debug.ExceptionReporterTests.test_unprintable_values_handling", + "view_tests.tests.test_debug.HelperFunctionTests.test_cleanse_setting_basic", + "view_tests.tests.test_debug.HelperFunctionTests.test_cleanse_setting_ignore_case", + "view_tests.tests.test_debug.HelperFunctionTests.test_cleanse_setting_recurses_in_dictionary", + "view_tests.tests.test_debug.NonDjangoTemplatesDebugViewTests.test_400", + "view_tests.tests.test_debug.NonDjangoTemplatesDebugViewTests.test_403", + "view_tests.tests.test_debug.NonDjangoTemplatesDebugViewTests.test_404", + "view_tests.tests.test_debug.NonDjangoTemplatesDebugViewTests.test_template_not_found_error", + "view_tests.tests.test_debug.PlainTextReportTests.test_disallowed_host", + "view_tests.tests.test_debug.PlainTextReportTests.test_message_only", + "view_tests.tests.test_debug.PlainTextReportTests.test_no_exception", + "view_tests.tests.test_debug.PlainTextReportTests.test_no_request", + "view_tests.tests.test_debug.PlainTextReportTests.test_request_and_exception", + "view_tests.tests.test_debug.PlainTextReportTests.test_request_and_message", + "view_tests.tests.test_debug.PlainTextReportTests.test_request_with_items_key", + "view_tests.tests.test_debug.PlainTextReportTests.test_template_exception", + "view_tests.tests.test_default_content_type.DefaultContentTypeTests.test_access", + "view_tests.tests.test_default_content_type.DefaultContentTypeTests.test_access_warning", + "view_tests.tests.test_default_content_type.DefaultContentTypeTests.test_default_content_type_is_text_html", + "view_tests.tests.test_default_content_type.DefaultContentTypeTests.test_override_settings_warning", + "view_tests.tests.test_default_content_type.DefaultContentTypeTests.test_settings_init_warning", + "view_tests.tests.test_i18n.I18NViewTests.test_escaping", + "view_tests.tests.test_i18n.I18NViewTests.test_get_formats", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_different_non_english_languages", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_english_variant", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_fallback_language_plural", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_language_english_default", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_language_non_english_default", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_language_non_english_fallback", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_unknown_package_error", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_with_locale_paths", + "view_tests.tests.test_i18n.I18NViewTests.test_jsi18n", + "view_tests.tests.test_i18n.I18NViewTests.test_jsi18n_USE_I18N_False", + "view_tests.tests.test_i18n.I18NViewTests.test_jsi18n_fallback_language", + "view_tests.tests.test_i18n.I18NViewTests.test_jsi18n_with_missing_en_files", + "view_tests.tests.test_i18n.I18NViewTests.test_jsoni18n", + "view_tests.tests.test_i18n.I18NViewTests.test_jsoni18n_with_missing_en_files", + "view_tests.tests.test_i18n.I18NViewTests.test_non_BMP_char", + "view_tests.tests.test_i18n.I18NViewTests.test_non_english_default_english_userpref", + "view_tests.tests.test_i18n.I18nSeleniumTests.test_javascript_gettext", + "view_tests.tests.test_i18n.I18nSeleniumTests.test_multiple_catalogs", + "view_tests.tests.test_i18n.SetLanguageTests.test_lang_from_translated_i18n_pattern", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_cookie", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_decodes_http_referer_url", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_default_redirect", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_doesnt_perform_a_default_redirect_for_ajax", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_doesnt_perform_a_redirect_to_referer_for_ajax", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_http_next", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_performs_redirect_for_ajax_if_explicitly_requested", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_redirect_to_referer", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_reversal", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_unsafe_next", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_unsafe_next_for_ajax", + "view_tests.tests.test_json.JsonResponseTests.test_json_response", + "view_tests.tests.test_specials.URLHandling.test_nonascii_redirect", + "view_tests.tests.test_specials.URLHandling.test_permanent_nonascii_redirect", + "view_tests.tests.test_static.StaticHelperTest.test_404", + "view_tests.tests.test_static.StaticHelperTest.test_chunked", + "view_tests.tests.test_static.StaticHelperTest.test_copes_with_empty_path_component", + "view_tests.tests.test_static.StaticHelperTest.test_debug_off", + "view_tests.tests.test_static.StaticHelperTest.test_empty_prefix", + "view_tests.tests.test_static.StaticHelperTest.test_index", + "view_tests.tests.test_static.StaticHelperTest.test_index_custom_template", + "view_tests.tests.test_static.StaticHelperTest.test_index_subdir", + "view_tests.tests.test_static.StaticHelperTest.test_invalid_if_modified_since", + "view_tests.tests.test_static.StaticHelperTest.test_invalid_if_modified_since2", + "view_tests.tests.test_static.StaticHelperTest.test_is_modified_since", + "view_tests.tests.test_static.StaticHelperTest.test_not_modified_since", + "view_tests.tests.test_static.StaticHelperTest.test_prefix", + "view_tests.tests.test_static.StaticHelperTest.test_serve", + "view_tests.tests.test_static.StaticHelperTest.test_special_prefix", + "view_tests.tests.test_static.StaticHelperTest.test_unknown_mime_type", + "view_tests.tests.test_static.StaticTests.test_404", + "view_tests.tests.test_static.StaticTests.test_chunked", + "view_tests.tests.test_static.StaticTests.test_copes_with_empty_path_component", + "view_tests.tests.test_static.StaticTests.test_index", + "view_tests.tests.test_static.StaticTests.test_index_custom_template", + "view_tests.tests.test_static.StaticTests.test_index_subdir", + "view_tests.tests.test_static.StaticTests.test_invalid_if_modified_since", + "view_tests.tests.test_static.StaticTests.test_invalid_if_modified_since2", + "view_tests.tests.test_static.StaticTests.test_is_modified_since", + "view_tests.tests.test_static.StaticTests.test_not_modified_since", + "view_tests.tests.test_static.StaticTests.test_serve", + "view_tests.tests.test_static.StaticTests.test_unknown_mime_type", + "view_tests.tests.test_static.StaticUtilsTests.test_was_modified_since_fp", + "wsgi.tests.GetInternalWSGIApplicationTest.test_bad_module", + "wsgi.tests.GetInternalWSGIApplicationTest.test_bad_name", + "wsgi.tests.GetInternalWSGIApplicationTest.test_default", + "wsgi.tests.GetInternalWSGIApplicationTest.test_success", + "wsgi.tests.WSGITest.test_file_wrapper", + "wsgi.tests.WSGITest.test_get_wsgi_application", + "absolute_url_overrides.tests.AbsoluteUrlOverrideTests.test_get_absolute_url", + "absolute_url_overrides.tests.AbsoluteUrlOverrideTests.test_insert_get_absolute_url", + "absolute_url_overrides.tests.AbsoluteUrlOverrideTests.test_override_get_absolute_url", + "admin_autodiscover.tests.AdminAutoDiscoverTests.test_double_call_autodiscover", + "admin_default_site.tests.CustomAdminSiteTests.test_use_custom_admin_site", + "admin_default_site.tests.DefaultAdminSiteTests.test_use_default_admin_site", + "admin_docs.test_middleware.XViewMiddlewareTest.test_callable_object_view", + "admin_docs.test_middleware.XViewMiddlewareTest.test_xview_class", + "admin_docs.test_middleware.XViewMiddlewareTest.test_xview_func", + "admin_docs.test_utils.TestUtils.test_description_output", + "admin_docs.test_utils.TestUtils.test_initial_header_level", + "admin_docs.test_utils.TestUtils.test_parse_docstring", + "admin_docs.test_utils.TestUtils.test_parse_rst", + "admin_docs.test_utils.TestUtils.test_publish_parts", + "admin_docs.test_utils.TestUtils.test_title_output", + "admin_docs.test_utils.TestUtils.test_trim_docstring", + "admin_inlines.test_templates.TestTemplates.test_javascript_escaping", + "admin_scripts.tests.ArgumentOrder.test_option_then_setting", + "admin_scripts.tests.ArgumentOrder.test_option_then_setting_then_option", + "admin_scripts.tests.ArgumentOrder.test_setting_then_option", + "admin_scripts.tests.ArgumentOrder.test_setting_then_short_option", + "admin_scripts.tests.ArgumentOrder.test_short_option_then_setting", + "admin_scripts.tests.CommandTypes.test_app_command", + "admin_scripts.tests.CommandTypes.test_app_command_invalid_app_label", + "admin_scripts.tests.CommandTypes.test_app_command_multiple_apps", + "admin_scripts.tests.CommandTypes.test_app_command_no_apps", + "admin_scripts.tests.CommandTypes.test_app_command_some_invalid_app_labels", + "admin_scripts.tests.CommandTypes.test_base_command", + "admin_scripts.tests.CommandTypes.test_base_command_multiple_label", + "admin_scripts.tests.CommandTypes.test_base_command_no_label", + "admin_scripts.tests.CommandTypes.test_base_command_with_option", + "admin_scripts.tests.CommandTypes.test_base_command_with_options", + "admin_scripts.tests.CommandTypes.test_base_command_with_wrong_option", + "admin_scripts.tests.CommandTypes.test_base_run_from_argv", + "admin_scripts.tests.CommandTypes.test_color_style", + "admin_scripts.tests.CommandTypes.test_command_color", + "admin_scripts.tests.CommandTypes.test_command_no_color", + "admin_scripts.tests.CommandTypes.test_custom_stderr", + "admin_scripts.tests.CommandTypes.test_custom_stdout", + "admin_scripts.tests.CommandTypes.test_force_color_command_init", + "admin_scripts.tests.CommandTypes.test_force_color_execute", + "admin_scripts.tests.CommandTypes.test_help", + "admin_scripts.tests.CommandTypes.test_help_alternative", + "admin_scripts.tests.CommandTypes.test_help_commands", + "admin_scripts.tests.CommandTypes.test_help_short_altert", + "admin_scripts.tests.CommandTypes.test_label_command", + "admin_scripts.tests.CommandTypes.test_label_command_multiple_label", + "admin_scripts.tests.CommandTypes.test_label_command_no_label", + "admin_scripts.tests.CommandTypes.test_no_color_force_color_mutually_exclusive_command_init", + "admin_scripts.tests.CommandTypes.test_no_color_force_color_mutually_exclusive_execute", + "admin_scripts.tests.CommandTypes.test_noargs", + "admin_scripts.tests.CommandTypes.test_noargs_with_args", + "admin_scripts.tests.CommandTypes.test_run_from_argv_closes_connections", + "admin_scripts.tests.CommandTypes.test_run_from_argv_non_ascii_error", + "admin_scripts.tests.CommandTypes.test_specific_help", + "admin_scripts.tests.CommandTypes.test_version", + "admin_scripts.tests.CommandTypes.test_version_alternative", + "admin_scripts.tests.DiffSettings.test_all", + "admin_scripts.tests.DiffSettings.test_basic", + "admin_scripts.tests.DiffSettings.test_custom_default", + "admin_scripts.tests.DiffSettings.test_settings_configured", + "admin_scripts.tests.DiffSettings.test_unified", + "admin_scripts.tests.DiffSettings.test_unified_all", + "admin_scripts.tests.Discovery.test_precedence", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_custom_command", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_custom_command_with_environment", + "admin_scripts.tests.DjangoAdminAlternateSettings.test_custom_command_with_settings", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_custom_command", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_custom_command_with_environment", + "admin_scripts.tests.DjangoAdminDefaultSettings.test_custom_command_with_settings", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_custom_command", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_custom_command_with_environment", + "admin_scripts.tests.DjangoAdminFullPathDefaultSettings.test_custom_command_with_settings", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_custom_command", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_custom_command_with_environment", + "admin_scripts.tests.DjangoAdminMinimalSettings.test_custom_command_with_settings", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_custom_command", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_custom_command_with_environment", + "admin_scripts.tests.DjangoAdminMultipleSettings.test_custom_command_with_settings", + "admin_scripts.tests.DjangoAdminNoSettings.test_builtin_command", + "admin_scripts.tests.DjangoAdminNoSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminNoSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminNoSettings.test_commands_with_invalid_settings", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_builtin_command", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_builtin_with_bad_environment", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_builtin_with_bad_settings", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_builtin_with_environment", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_builtin_with_settings", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_custom_command", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_setup_environ", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_setup_environ_custom_template", + "admin_scripts.tests.DjangoAdminSettingsDirectory.test_startapp_unicode_name", + "admin_scripts.tests.DjangoAdminSuggestions.test_no_suggestions", + "admin_scripts.tests.DjangoAdminSuggestions.test_suggestions", + "admin_scripts.tests.Dumpdata.test_pks_parsing", + "admin_scripts.tests.MainModule.test_program_name_in_help", + "admin_scripts.tests.MainModule.test_runs_django_admin", + "admin_scripts.tests.ManageAlternateSettings.test_builtin_command", + "admin_scripts.tests.ManageAlternateSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageAlternateSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageAlternateSettings.test_builtin_with_environment", + "admin_scripts.tests.ManageAlternateSettings.test_builtin_with_settings", + "admin_scripts.tests.ManageAlternateSettings.test_custom_command", + "admin_scripts.tests.ManageAlternateSettings.test_custom_command_output_color", + "admin_scripts.tests.ManageAlternateSettings.test_custom_command_with_environment", + "admin_scripts.tests.ManageAlternateSettings.test_custom_command_with_settings", + "admin_scripts.tests.ManageCheck.test_app_with_import", + "admin_scripts.tests.ManageCheck.test_broken_app", + "admin_scripts.tests.ManageCheck.test_complex_app", + "admin_scripts.tests.ManageCheck.test_nonexistent_app", + "admin_scripts.tests.ManageCheck.test_output_format", + "admin_scripts.tests.ManageCheck.test_warning_does_not_halt", + "admin_scripts.tests.ManageDefaultSettings.test_builtin_command", + "admin_scripts.tests.ManageDefaultSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageDefaultSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageDefaultSettings.test_builtin_with_environment", + "admin_scripts.tests.ManageDefaultSettings.test_builtin_with_settings", + "admin_scripts.tests.ManageDefaultSettings.test_custom_command", + "admin_scripts.tests.ManageDefaultSettings.test_custom_command_with_environment", + "admin_scripts.tests.ManageDefaultSettings.test_custom_command_with_settings", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_builtin_command", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_builtin_with_environment", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_builtin_with_settings", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_custom_command", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_custom_command_with_environment", + "admin_scripts.tests.ManageFullPathDefaultSettings.test_custom_command_with_settings", + "admin_scripts.tests.ManageMinimalSettings.test_builtin_command", + "admin_scripts.tests.ManageMinimalSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageMinimalSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageMinimalSettings.test_builtin_with_environment", + "admin_scripts.tests.ManageMinimalSettings.test_builtin_with_settings", + "admin_scripts.tests.ManageMinimalSettings.test_custom_command", + "admin_scripts.tests.ManageMinimalSettings.test_custom_command_with_environment", + "admin_scripts.tests.ManageMinimalSettings.test_custom_command_with_settings", + "admin_scripts.tests.ManageMultipleSettings.test_builtin_command", + "admin_scripts.tests.ManageMultipleSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageMultipleSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageMultipleSettings.test_builtin_with_environment", + "admin_scripts.tests.ManageMultipleSettings.test_builtin_with_settings", + "admin_scripts.tests.ManageMultipleSettings.test_custom_command", + "admin_scripts.tests.ManageMultipleSettings.test_custom_command_with_environment", + "admin_scripts.tests.ManageMultipleSettings.test_custom_command_with_settings", + "admin_scripts.tests.ManageNoSettings.test_builtin_command", + "admin_scripts.tests.ManageNoSettings.test_builtin_with_bad_environment", + "admin_scripts.tests.ManageNoSettings.test_builtin_with_bad_settings", + "admin_scripts.tests.ManageRunserver.test_no_database", + "admin_scripts.tests.ManageRunserver.test_readonly_database", + "admin_scripts.tests.ManageRunserver.test_runner_addrport_ipv6", + "admin_scripts.tests.ManageRunserver.test_runner_ambiguous", + "admin_scripts.tests.ManageRunserver.test_runner_custom_defaults", + "admin_scripts.tests.ManageRunserver.test_runner_custom_defaults_ipv6", + "admin_scripts.tests.ManageRunserver.test_runner_hostname", + "admin_scripts.tests.ManageRunserver.test_runner_hostname_ipv6", + "admin_scripts.tests.ManageRunserver.test_runserver_addrport", + "admin_scripts.tests.ManageRunserverEmptyAllowedHosts.test_empty_allowed_hosts_error", + "admin_scripts.tests.ManageRunserverMigrationWarning.test_migration_warning_multiple_apps", + "admin_scripts.tests.ManageRunserverMigrationWarning.test_migration_warning_one_app", + "admin_scripts.tests.ManageSettingsWithSettingsErrors.test_attribute_error", + "admin_scripts.tests.ManageSettingsWithSettingsErrors.test_help", + "admin_scripts.tests.ManageSettingsWithSettingsErrors.test_import_error", + "admin_scripts.tests.ManageSettingsWithSettingsErrors.test_key_error", + "admin_scripts.tests.ManageTestserver.test_params_to_runserver", + "admin_scripts.tests.ManageTestserver.test_testserver_handle_params", + "admin_scripts.tests.StartApp.test_importable_name", + "admin_scripts.tests.StartApp.test_invalid_name", + "admin_scripts.tests.StartProject.test_custom_project_destination_missing", + "admin_scripts.tests.StartProject.test_custom_project_template", + "admin_scripts.tests.StartProject.test_custom_project_template_context_variables", + "admin_scripts.tests.StartProject.test_custom_project_template_from_tarball_by_path", + "admin_scripts.tests.StartProject.test_custom_project_template_from_tarball_by_url", + "admin_scripts.tests.StartProject.test_custom_project_template_from_tarball_to_alternative_location", + "admin_scripts.tests.StartProject.test_custom_project_template_with_non_ascii_templates", + "admin_scripts.tests.StartProject.test_file_without_extension", + "admin_scripts.tests.StartProject.test_importable_project_name", + "admin_scripts.tests.StartProject.test_invalid_project_name", + "admin_scripts.tests.StartProject.test_no_escaping_of_project_variables", + "admin_scripts.tests.StartProject.test_project_template_tarball_url", + "admin_scripts.tests.StartProject.test_simple_project", + "admin_scripts.tests.StartProject.test_simple_project_different_directory", + "admin_scripts.tests.StartProject.test_template_dir_with_trailing_slash", + "admin_scripts.tests.StartProject.test_wrong_args", + "admin_views.test_forms.AdminAuthenticationFormTests.test_inactive_user", + "admin_views.test_static_deprecation.AdminStaticDeprecationTests.test", + "app_loading.tests.EggLoadingTest.test_egg1", + "app_loading.tests.EggLoadingTest.test_egg2", + "app_loading.tests.EggLoadingTest.test_egg3", + "app_loading.tests.EggLoadingTest.test_egg4", + "app_loading.tests.EggLoadingTest.test_egg5", + "app_loading.tests.GetModelsTest.test_get_model_only_returns_installed_models", + "app_loading.tests.GetModelsTest.test_get_models_only_returns_installed_models", + "auth_tests.test_admin_multidb.MultiDatabaseTests.test_add_view", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_message_attrs", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_perm_in_perms_attrs", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_perms_attrs", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_session_is_accessed", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_session_not_accessed", + "auth_tests.test_context_processors.AuthContextProcessorTests.test_user_attrs", + "auth_tests.test_context_processors.PermWrapperTests.test_iter", + "auth_tests.test_context_processors.PermWrapperTests.test_permlookupdict_in", + "auth_tests.test_context_processors.PermWrapperTests.test_permwrapper_in", + "auth_tests.test_hashers.BasePasswordHasherTests.test_attributes", + "auth_tests.test_hashers.BasePasswordHasherTests.test_encode", + "auth_tests.test_hashers.BasePasswordHasherTests.test_harden_runtime", + "auth_tests.test_hashers.BasePasswordHasherTests.test_load_library_importerror", + "auth_tests.test_hashers.BasePasswordHasherTests.test_load_library_no_algorithm", + "auth_tests.test_hashers.BasePasswordHasherTests.test_must_update", + "auth_tests.test_hashers.BasePasswordHasherTests.test_safe_summary", + "auth_tests.test_hashers.BasePasswordHasherTests.test_verify", + "auth_tests.test_hashers.TestUtilsHashPass.test_bad_algorithm", + "auth_tests.test_hashers.TestUtilsHashPass.test_bcrypt", + "auth_tests.test_hashers.TestUtilsHashPass.test_bcrypt_harden_runtime", + "auth_tests.test_hashers.TestUtilsHashPass.test_bcrypt_sha256", + "auth_tests.test_hashers.TestUtilsHashPass.test_bcrypt_upgrade", + "auth_tests.test_hashers.TestUtilsHashPass.test_check_password_calls_harden_runtime", + "auth_tests.test_hashers.TestUtilsHashPass.test_crypt", + "auth_tests.test_hashers.TestUtilsHashPass.test_is_password_usable", + "auth_tests.test_hashers.TestUtilsHashPass.test_low_level_pbkdf2", + "auth_tests.test_hashers.TestUtilsHashPass.test_low_level_pbkdf2_sha1", + "auth_tests.test_hashers.TestUtilsHashPass.test_md5", + "auth_tests.test_hashers.TestUtilsHashPass.test_no_upgrade", + "auth_tests.test_hashers.TestUtilsHashPass.test_no_upgrade_on_incorrect_pass", + "auth_tests.test_hashers.TestUtilsHashPass.test_pbkdf2", + "auth_tests.test_hashers.TestUtilsHashPass.test_pbkdf2_harden_runtime", + "auth_tests.test_hashers.TestUtilsHashPass.test_pbkdf2_upgrade", + "auth_tests.test_hashers.TestUtilsHashPass.test_pbkdf2_upgrade_new_hasher", + "auth_tests.test_hashers.TestUtilsHashPass.test_sha1", + "auth_tests.test_hashers.TestUtilsHashPass.test_simple", + "auth_tests.test_hashers.TestUtilsHashPass.test_unsalted_md5", + "auth_tests.test_hashers.TestUtilsHashPass.test_unsalted_sha1", + "auth_tests.test_hashers.TestUtilsHashPass.test_unspecified_password", + "auth_tests.test_hashers.TestUtilsHashPass.test_unusable", + "auth_tests.test_hashers.TestUtilsHashPass.test_upgrade", + "auth_tests.test_hashers.TestUtilsHashPassArgon2.test_argon2", + "auth_tests.test_hashers.TestUtilsHashPassArgon2.test_argon2_upgrade", + "auth_tests.test_hashers.TestUtilsHashPassArgon2.test_argon2_version_upgrade", + "auth_tests.test_middleware.TestAuthenticationMiddleware.test_changed_password_invalidates_session", + "auth_tests.test_middleware.TestAuthenticationMiddleware.test_no_password_change_doesnt_invalidate_session", + "auth_tests.test_mixins.AccessMixinTests.test_access_mixin_permission_denied_response", + "auth_tests.test_mixins.AccessMixinTests.test_stacked_mixins_missing_permission", + "auth_tests.test_mixins.AccessMixinTests.test_stacked_mixins_not_logged_in", + "auth_tests.test_mixins.AccessMixinTests.test_stacked_mixins_success", + "auth_tests.test_mixins.LoginRequiredMixinTests.test_login_required", + "auth_tests.test_mixins.PermissionsRequiredMixinTests.test_many_permissions_pass", + "auth_tests.test_mixins.PermissionsRequiredMixinTests.test_permissioned_denied_exception_raised", + "auth_tests.test_mixins.PermissionsRequiredMixinTests.test_permissioned_denied_redirect", + "auth_tests.test_mixins.PermissionsRequiredMixinTests.test_single_permission_pass", + "auth_tests.test_mixins.UserPassesTestTests.test_custom_redirect_parameter", + "auth_tests.test_mixins.UserPassesTestTests.test_custom_redirect_url", + "auth_tests.test_mixins.UserPassesTestTests.test_default", + "auth_tests.test_mixins.UserPassesTestTests.test_no_redirect_parameter", + "auth_tests.test_mixins.UserPassesTestTests.test_raise_exception", + "auth_tests.test_mixins.UserPassesTestTests.test_raise_exception_custom_message", + "auth_tests.test_mixins.UserPassesTestTests.test_raise_exception_custom_message_function", + "auth_tests.test_mixins.UserPassesTestTests.test_user_passes", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_header_disappears", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_inactive_user", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_known_user", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_last_login", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_no_remote_user", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_unknown_user", + "auth_tests.test_remote_user.AllowAllUsersRemoteUserBackendTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_header_disappears", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_inactive_user", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_known_user", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_last_login", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_no_remote_user", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_unknown_user", + "auth_tests.test_remote_user.CustomHeaderRemoteUserTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_header_disappears", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_inactive_user", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_known_user", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_last_login", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_no_remote_user", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_unknown_user", + "auth_tests.test_remote_user.PersistentRemoteUserTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_header_disappears", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_inactive_user", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_known_user", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_last_login", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_no_remote_user", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_unknown_user", + "auth_tests.test_remote_user.RemoteUserCustomTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_header_disappears", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_inactive_user", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_known_user", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_last_login", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_no_remote_user", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_unknown_user", + "auth_tests.test_remote_user.RemoteUserNoCreateTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user.RemoteUserTest.test_header_disappears", + "auth_tests.test_remote_user.RemoteUserTest.test_inactive_user", + "auth_tests.test_remote_user.RemoteUserTest.test_known_user", + "auth_tests.test_remote_user.RemoteUserTest.test_last_login", + "auth_tests.test_remote_user.RemoteUserTest.test_no_remote_user", + "auth_tests.test_remote_user.RemoteUserTest.test_unknown_user", + "auth_tests.test_remote_user.RemoteUserTest.test_user_switch_forces_new_login", + "auth_tests.test_remote_user_deprecation.RemoteUserCustomTest.test_configure_user_deprecation_warning", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordChangeDoneView", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetChangeView", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetCompleteView", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetConfirmView_invalid_token", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetConfirmView_valid_token", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetDoneView", + "auth_tests.test_templates.AuthTemplateTests.test_PasswordResetView", + "auth_tests.test_tokens.TokenGeneratorTest.test_10265", + "auth_tests.test_tokens.TokenGeneratorTest.test_check_token_with_nonexistent_token_and_user", + "auth_tests.test_tokens.TokenGeneratorTest.test_make_token", + "auth_tests.test_tokens.TokenGeneratorTest.test_timeout", + "auth_tests.test_tokens.TokenGeneratorTest.test_token_with_different_secret", + "auth_tests.test_validators.CommonPasswordValidatorTest.test_help_text", + "auth_tests.test_validators.CommonPasswordValidatorTest.test_validate", + "auth_tests.test_validators.CommonPasswordValidatorTest.test_validate_custom_list", + "auth_tests.test_validators.CommonPasswordValidatorTest.test_validate_django_supplied_file", + "auth_tests.test_validators.MinimumLengthValidatorTest.test_help_text", + "auth_tests.test_validators.MinimumLengthValidatorTest.test_validate", + "auth_tests.test_validators.NumericPasswordValidatorTest.test_help_text", + "auth_tests.test_validators.NumericPasswordValidatorTest.test_validate", + "auth_tests.test_validators.PasswordValidationTest.test_empty_password_validator_help_text_html", + "auth_tests.test_validators.PasswordValidationTest.test_get_default_password_validators", + "auth_tests.test_validators.PasswordValidationTest.test_get_password_validators_custom", + "auth_tests.test_validators.PasswordValidationTest.test_password_changed", + "auth_tests.test_validators.PasswordValidationTest.test_password_changed_with_custom_validator", + "auth_tests.test_validators.PasswordValidationTest.test_password_validators_help_text_html", + "auth_tests.test_validators.PasswordValidationTest.test_password_validators_help_text_html_escaping", + "auth_tests.test_validators.PasswordValidationTest.test_password_validators_help_texts", + "auth_tests.test_validators.PasswordValidationTest.test_validate_password", + "auth_tests.test_validators.UserAttributeSimilarityValidatorTest.test_help_text", + "auth_tests.test_validators.UserAttributeSimilarityValidatorTest.test_validate", + "auth_tests.test_validators.UserAttributeSimilarityValidatorTest.test_validate_property", + "auth_tests.test_validators.UsernameValidatorsTests.test_ascii_validator", + "auth_tests.test_validators.UsernameValidatorsTests.test_unicode_validator", + "backends.base.test_creation.TestDbSignatureTests.test_custom_test_name", + "backends.base.test_creation.TestDbSignatureTests.test_custom_test_name_with_test_prefix", + "backends.base.test_creation.TestDbSignatureTests.test_default_name", + "backends.base.test_features.TestDatabaseFeatures.test_nonexistent_feature", + "backends.base.test_operations.DatabaseOperationTests.test_distinct_on_fields", + "backends.base.test_operations.DatabaseOperationTests.test_subtract_temporals", + "backends.base.test_operations.DatabaseOperationTests.test_window_frame_raise_not_supported_error", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_datetimefield_value", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_timefield_value", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_timefield_value_none", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_timefield_value_unaware", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_unknown_value_date", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_unknown_value_decimal", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_adapt_unknown_value_time", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_date_extract_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_date_interval_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_date_trunc_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_datetime_cast_date_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_datetime_cast_time_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_datetime_extract_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_datetime_trunc_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_deferrable_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_end_transaction_rollback", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_no_limit_value", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_pk_default_value", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_quote_name", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_regex_lookup", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_sequence_reset_by_name_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_set_time_zone_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_sql_flush", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_tablespace_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_time_extract_sql", + "backends.base.test_operations.SimpleDatabaseOperationTests.test_time_trunc_sql", + "backends.base.test_schema.SchemaEditorTests.test_effective_default_callable", + "backends.mysql.test_creation.DatabaseCreationTests.test_clone_test_db_database_exists", + "backends.mysql.test_creation.DatabaseCreationTests.test_create_test_db_database_exists", + "backends.mysql.test_creation.DatabaseCreationTests.test_create_test_db_unexpected_error", + "backends.mysql.test_features.TestFeatures.test_skip_locked_no_wait", + "backends.mysql.test_features.TestFeatures.test_supports_transactions", + "backends.mysql.test_schema.SchemaEditorTests.test_quote_value", + "backends.mysql.tests.IsolationLevelTests.test_auto_is_null_auto_config", + "backends.mysql.tests.IsolationLevelTests.test_connect_isolation_level", + "backends.mysql.tests.IsolationLevelTests.test_default_isolation_level", + "backends.mysql.tests.IsolationLevelTests.test_isolation_level_validation", + "backends.mysql.tests.IsolationLevelTests.test_setting_isolation_level", + "backends.mysql.tests.IsolationLevelTests.test_uppercase_isolation_level", + "backends.oracle.test_creation.DatabaseCreationTests.test_create_test_db", + "backends.oracle.test_creation.DatabaseCreationTests.test_create_test_user", + "backends.oracle.test_creation.DatabaseCreationTests.test_oracle_managed_files", + "backends.oracle.test_operations.OperationsTests.test_bulk_batch_size", + "backends.oracle.test_operations.OperationsTests.test_sequence_name_truncation", + "backends.postgresql.test_creation.DatabaseCreationTests.test_create_test_db", + "backends.postgresql.test_creation.DatabaseCreationTests.test_sql_table_creation_suffix_with_encoding", + "backends.postgresql.test_creation.DatabaseCreationTests.test_sql_table_creation_suffix_with_encoding_and_template", + "backends.postgresql.test_creation.DatabaseCreationTests.test_sql_table_creation_suffix_with_none_settings", + "backends.postgresql.test_creation.DatabaseCreationTests.test_sql_table_creation_suffix_with_template", + "backends.postgresql.tests.Tests.test_connect_and_rollback", + "backends.postgresql.tests.Tests.test_connect_isolation_level", + "backends.postgresql.tests.Tests.test_connect_no_is_usable_checks", + "backends.postgresql.tests.Tests.test_connect_non_autocommit", + "backends.postgresql.tests.Tests.test_correct_extraction_psycopg2_version", + "backends.postgresql.tests.Tests.test_database_name_too_long", + "backends.postgresql.tests.Tests.test_lookup_cast", + "backends.postgresql.tests.Tests.test_nodb_connection", + "backends.postgresql.tests.Tests.test_select_ascii_array", + "backends.postgresql.tests.Tests.test_select_unicode_array", + "backends.sqlite.test_introspection.IntrospectionTests.test_get_primary_key_column", + "backends.sqlite.test_introspection.ParsingTests.test_check_and_unique_column", + "backends.sqlite.test_introspection.ParsingTests.test_check_column", + "backends.sqlite.test_introspection.ParsingTests.test_check_column_with_operators_and_functions", + "backends.sqlite.test_introspection.ParsingTests.test_check_constraint", + "backends.sqlite.test_introspection.ParsingTests.test_unique_column", + "backends.sqlite.test_introspection.ParsingTests.test_unique_constraint", + "backends.sqlite.test_introspection.ParsingTests.test_unique_constraint_multicolumn", + "backends.test_ddl_references.ColumnsTests.test_references_column", + "backends.test_ddl_references.ColumnsTests.test_references_table", + "backends.test_ddl_references.ColumnsTests.test_rename_column_references", + "backends.test_ddl_references.ColumnsTests.test_rename_table_references", + "backends.test_ddl_references.ColumnsTests.test_repr", + "backends.test_ddl_references.ColumnsTests.test_str", + "backends.test_ddl_references.ForeignKeyNameTests.test_references_column", + "backends.test_ddl_references.ForeignKeyNameTests.test_references_table", + "backends.test_ddl_references.ForeignKeyNameTests.test_rename_column_references", + "backends.test_ddl_references.ForeignKeyNameTests.test_rename_table_references", + "backends.test_ddl_references.ForeignKeyNameTests.test_repr", + "backends.test_ddl_references.ForeignKeyNameTests.test_str", + "backends.test_ddl_references.IndexNameTests.test_references_column", + "backends.test_ddl_references.IndexNameTests.test_references_table", + "backends.test_ddl_references.IndexNameTests.test_rename_column_references", + "backends.test_ddl_references.IndexNameTests.test_rename_table_references", + "backends.test_ddl_references.IndexNameTests.test_repr", + "backends.test_ddl_references.IndexNameTests.test_str", + "backends.test_ddl_references.StatementTests.test_references_column", + "backends.test_ddl_references.StatementTests.test_references_table", + "backends.test_ddl_references.StatementTests.test_rename_column_references", + "backends.test_ddl_references.StatementTests.test_rename_table_references", + "backends.test_ddl_references.StatementTests.test_repr", + "backends.test_ddl_references.StatementTests.test_str", + "backends.test_ddl_references.TableTests.test_references_table", + "backends.test_ddl_references.TableTests.test_rename_table_references", + "backends.test_ddl_references.TableTests.test_repr", + "backends.test_ddl_references.TableTests.test_str", + "backends.test_utils.CursorWrapperTests.test_callproc_kparams", + "backends.test_utils.CursorWrapperTests.test_callproc_with_int_params", + "backends.test_utils.CursorWrapperTests.test_callproc_without_params", + "backends.test_utils.CursorWrapperTests.test_unsupported_callproc_kparams_raises_error", + "backends.test_utils.TestUtils.test_format_number", + "backends.test_utils.TestUtils.test_split_identifier", + "backends.test_utils.TestUtils.test_truncate_name", + "bash_completion.tests.BashCompletionTests.test_app_completion", + "bash_completion.tests.BashCompletionTests.test_completed_subcommand", + "bash_completion.tests.BashCompletionTests.test_custom_command", + "bash_completion.tests.BashCompletionTests.test_django_admin_py", + "bash_completion.tests.BashCompletionTests.test_help", + "bash_completion.tests.BashCompletionTests.test_manage_py", + "bash_completion.tests.BashCompletionTests.test_subcommands", + "builtin_server.tests.ServerHandlerChunksProperly.test_chunked_data", + "builtin_server.tests.WSGIFileWrapperTests.test_file_wrapper_no_sendfile", + "builtin_server.tests.WSGIFileWrapperTests.test_file_wrapper_uses_sendfile", + "check_framework.test_caches.CheckCacheSettingsAppDirsTest.test_default_cache_included", + "check_framework.test_caches.CheckCacheSettingsAppDirsTest.test_default_cache_not_included", + "check_framework.test_database.DatabaseCheckTests.test_database_checks_called", + "check_framework.test_database.DatabaseCheckTests.test_database_checks_not_run_by_default", + "check_framework.test_database.DatabaseCheckTests.test_mysql_strict_mode", + "check_framework.test_model_checks.DuplicateDBTableTests.test_collision_across_apps", + "check_framework.test_model_checks.DuplicateDBTableTests.test_collision_in_same_app", + "check_framework.test_model_checks.DuplicateDBTableTests.test_no_collision_for_proxy_models", + "check_framework.test_model_checks.DuplicateDBTableTests.test_no_collision_for_unmanaged_models", + "check_framework.test_model_field_deprecation.TestDeprecatedField.test_default_details", + "check_framework.test_model_field_deprecation.TestDeprecatedField.test_user_specified_details", + "check_framework.test_model_field_deprecation.TestRemovedField.test_default_details", + "check_framework.test_model_field_deprecation.TestRemovedField.test_user_specified_details", + "check_framework.test_multi_db.TestMultiDBChecks.test_checks_called_on_the_default_database", + "check_framework.test_multi_db.TestMultiDBChecks.test_checks_called_on_the_other_database", + "check_framework.test_security.CheckAllowedHostsTest.test_allowed_hosts_empty", + "check_framework.test_security.CheckAllowedHostsTest.test_allowed_hosts_set", + "check_framework.test_security.CheckCSRFCookieSecureTest.test_use_sessions_with_csrf_cookie_secure_false", + "check_framework.test_security.CheckCSRFCookieSecureTest.test_with_csrf_cookie_secure_false", + "check_framework.test_security.CheckCSRFCookieSecureTest.test_with_csrf_cookie_secure_false_no_middleware", + "check_framework.test_security.CheckCSRFCookieSecureTest.test_with_csrf_cookie_secure_true", + "check_framework.test_security.CheckCSRFMiddlewareTest.test_no_csrf_middleware", + "check_framework.test_security.CheckCSRFMiddlewareTest.test_with_csrf_middleware", + "check_framework.test_security.CheckContentTypeNosniffTest.test_no_content_type_nosniff", + "check_framework.test_security.CheckContentTypeNosniffTest.test_no_content_type_nosniff_no_middleware", + "check_framework.test_security.CheckContentTypeNosniffTest.test_with_content_type_nosniff", + "check_framework.test_security.CheckDebugTest.test_debug_false", + "check_framework.test_security.CheckDebugTest.test_debug_true", + "check_framework.test_security.CheckSSLRedirectTest.test_no_ssl_redirect", + "check_framework.test_security.CheckSSLRedirectTest.test_no_ssl_redirect_no_middleware", + "check_framework.test_security.CheckSSLRedirectTest.test_with_ssl_redirect", + "check_framework.test_security.CheckSecretKeyTest.test_empty_secret_key", + "check_framework.test_security.CheckSecretKeyTest.test_low_entropy_secret_key", + "check_framework.test_security.CheckSecretKeyTest.test_low_length_secret_key", + "check_framework.test_security.CheckSecretKeyTest.test_missing_secret_key", + "check_framework.test_security.CheckSecretKeyTest.test_none_secret_key", + "check_framework.test_security.CheckSecretKeyTest.test_okay_secret_key", + "check_framework.test_security.CheckSecurityMiddlewareTest.test_no_security_middleware", + "check_framework.test_security.CheckSecurityMiddlewareTest.test_with_security_middleware", + "check_framework.test_security.CheckSessionCookieHttpOnlyTest.test_session_cookie_httponly_both", + "check_framework.test_security.CheckSessionCookieHttpOnlyTest.test_session_cookie_httponly_true", + "check_framework.test_security.CheckSessionCookieHttpOnlyTest.test_session_cookie_httponly_with_installed_app", + "check_framework.test_security.CheckSessionCookieHttpOnlyTest.test_session_cookie_httponly_with_middleware", + "check_framework.test_security.CheckSessionCookieSecureTest.test_session_cookie_secure_both", + "check_framework.test_security.CheckSessionCookieSecureTest.test_session_cookie_secure_true", + "check_framework.test_security.CheckSessionCookieSecureTest.test_session_cookie_secure_with_installed_app", + "check_framework.test_security.CheckSessionCookieSecureTest.test_session_cookie_secure_with_middleware", + "check_framework.test_security.CheckStrictTransportSecurityPreloadTest.test_no_sts_preload", + "check_framework.test_security.CheckStrictTransportSecurityPreloadTest.test_no_sts_preload_no_middleware", + "check_framework.test_security.CheckStrictTransportSecurityPreloadTest.test_no_sts_preload_no_seconds", + "check_framework.test_security.CheckStrictTransportSecurityPreloadTest.test_with_sts_preload", + "check_framework.test_security.CheckStrictTransportSecuritySubdomainsTest.test_no_sts_subdomains", + "check_framework.test_security.CheckStrictTransportSecuritySubdomainsTest.test_no_sts_subdomains_no_middleware", + "check_framework.test_security.CheckStrictTransportSecuritySubdomainsTest.test_no_sts_subdomains_no_seconds", + "check_framework.test_security.CheckStrictTransportSecuritySubdomainsTest.test_with_sts_subdomains", + "check_framework.test_security.CheckStrictTransportSecurityTest.test_no_sts", + "check_framework.test_security.CheckStrictTransportSecurityTest.test_no_sts_no_middleware", + "check_framework.test_security.CheckStrictTransportSecurityTest.test_with_sts", + "check_framework.test_security.CheckXFrameOptionsDenyTest.test_middleware_not_installed", + "check_framework.test_security.CheckXFrameOptionsDenyTest.test_x_frame_options_not_deny", + "check_framework.test_security.CheckXFrameOptionsDenyTest.test_xframe_deny", + "check_framework.test_security.CheckXFrameOptionsMiddlewareTest.test_middleware_installed", + "check_framework.test_security.CheckXFrameOptionsMiddlewareTest.test_middleware_not_installed", + "check_framework.test_security.CheckXssFilterTest.test_no_xss_filter", + "check_framework.test_security.CheckXssFilterTest.test_no_xss_filter_no_middleware", + "check_framework.test_security.CheckXssFilterTest.test_with_xss_filter", + "check_framework.test_templates.CheckTemplateSettingsAppDirsTest.test_app_dirs_and_loaders", + "check_framework.test_templates.CheckTemplateSettingsAppDirsTest.test_app_dirs_removed", + "check_framework.test_templates.CheckTemplateSettingsAppDirsTest.test_loaders_removed", + "check_framework.test_templates.CheckTemplateStringIfInvalidTest.test_string_if_invalid_both_are_strings", + "check_framework.test_templates.CheckTemplateStringIfInvalidTest.test_string_if_invalid_first_is_string", + "check_framework.test_templates.CheckTemplateStringIfInvalidTest.test_string_if_invalid_not_specified", + "check_framework.test_templates.CheckTemplateStringIfInvalidTest.test_string_if_invalid_not_string", + "check_framework.test_translation.TranslationCheckTests.test_invalid_language_code", + "check_framework.test_translation.TranslationCheckTests.test_valid_language_code", + "check_framework.test_urls.CheckCustomErrorHandlersTests.test_bad_handlers", + "check_framework.test_urls.CheckCustomErrorHandlersTests.test_good_handlers", + "check_framework.test_urls.CheckURLSettingsTests.test_empty_string_no_errors", + "check_framework.test_urls.CheckURLSettingsTests.test_media_url_no_slash", + "check_framework.test_urls.CheckURLSettingsTests.test_slash_no_errors", + "check_framework.test_urls.CheckURLSettingsTests.test_static_url_double_slash_allowed", + "check_framework.test_urls.CheckURLSettingsTests.test_static_url_no_slash", + "check_framework.test_urls.CheckUrlConfigTests.test_beginning_with_slash", + "check_framework.test_urls.CheckUrlConfigTests.test_beginning_with_slash_append_slash", + "check_framework.test_urls.CheckUrlConfigTests.test_check_non_unique_namespaces", + "check_framework.test_urls.CheckUrlConfigTests.test_check_resolver_recursive", + "check_framework.test_urls.CheckUrlConfigTests.test_check_unique_namespaces", + "check_framework.test_urls.CheckUrlConfigTests.test_contains_included_tuple", + "check_framework.test_urls.CheckUrlConfigTests.test_contains_tuple_not_url_instance", + "check_framework.test_urls.CheckUrlConfigTests.test_get_warning_for_invalid_pattern_other", + "check_framework.test_urls.CheckUrlConfigTests.test_get_warning_for_invalid_pattern_string", + "check_framework.test_urls.CheckUrlConfigTests.test_get_warning_for_invalid_pattern_tuple", + "check_framework.test_urls.CheckUrlConfigTests.test_include_with_dollar", + "check_framework.test_urls.CheckUrlConfigTests.test_name_with_colon", + "check_framework.test_urls.CheckUrlConfigTests.test_no_root_urlconf_in_settings", + "check_framework.test_urls.CheckUrlConfigTests.test_no_warnings", + "check_framework.test_urls.CheckUrlConfigTests.test_no_warnings_i18n", + "check_framework.test_urls.UpdatedToPathTests.test_beginning_with_caret", + "check_framework.test_urls.UpdatedToPathTests.test_contains_re_named_group", + "check_framework.test_urls.UpdatedToPathTests.test_ending_with_dollar", + "conditional_processing.tests.ConditionalGet.test_all_if_match", + "conditional_processing.tests.ConditionalGet.test_all_if_none_match", + "conditional_processing.tests.ConditionalGet.test_both_headers", + "conditional_processing.tests.ConditionalGet.test_both_headers_2", + "conditional_processing.tests.ConditionalGet.test_if_match", + "conditional_processing.tests.ConditionalGet.test_if_modified_since", + "conditional_processing.tests.ConditionalGet.test_if_none_match", + "conditional_processing.tests.ConditionalGet.test_if_unmodified_since", + "conditional_processing.tests.ConditionalGet.test_invalid_etag", + "conditional_processing.tests.ConditionalGet.test_single_condition_1", + "conditional_processing.tests.ConditionalGet.test_single_condition_2", + "conditional_processing.tests.ConditionalGet.test_single_condition_3", + "conditional_processing.tests.ConditionalGet.test_single_condition_4", + "conditional_processing.tests.ConditionalGet.test_single_condition_5", + "conditional_processing.tests.ConditionalGet.test_single_condition_6", + "conditional_processing.tests.ConditionalGet.test_single_condition_7", + "conditional_processing.tests.ConditionalGet.test_single_condition_8", + "conditional_processing.tests.ConditionalGet.test_single_condition_9", + "conditional_processing.tests.ConditionalGet.test_single_condition_head", + "conditional_processing.tests.ConditionalGet.test_unquoted", + "conditional_processing.tests.ConditionalGet.test_unquoted_if_none_match", + "conditional_processing.tests.ConditionalGet.test_weak_if_match", + "conditional_processing.tests.ConditionalGet.test_weak_if_none_match", + "conditional_processing.tests.ConditionalGet.test_without_conditions", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_content_type_field_pointing_to_wrong_model", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_field_name_ending_with_underscore", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_generic_foreign_key_checks_are_performed", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_invalid_content_type_field", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_missing_content_type_field", + "contenttypes_tests.test_checks.GenericForeignKeyTests.test_missing_object_id_field", + "contenttypes_tests.test_checks.GenericRelationTests.test_field_name_ending_with_underscore", + "contenttypes_tests.test_checks.GenericRelationTests.test_missing_generic_foreign_key", + "contenttypes_tests.test_checks.GenericRelationTests.test_pointing_to_missing_model", + "contenttypes_tests.test_checks.GenericRelationTests.test_pointing_to_swapped_model", + "contenttypes_tests.test_checks.GenericRelationTests.test_valid_generic_relationship", + "contenttypes_tests.test_checks.GenericRelationTests.test_valid_generic_relationship_with_explicit_fields", + "contenttypes_tests.test_checks.GenericRelationTests.test_valid_self_referential_generic_relationship", + "contenttypes_tests.test_checks.ModelCheckTests.test_model_name_max_length", + "contenttypes_tests.test_checks.ModelCheckTests.test_model_name_too_long", + "contenttypes_tests.test_operations.ContentTypeOperationsTests.test_content_type_rename_conflict", + "contenttypes_tests.test_operations.ContentTypeOperationsTests.test_existing_content_type_rename", + "contenttypes_tests.test_operations.ContentTypeOperationsTests.test_missing_content_type_rename_ignore", + "context_processors.tests.DebugContextProcessorTests.test_debug", + "context_processors.tests.DebugContextProcessorTests.test_sql_queries", + "context_processors.tests.RequestContextProcessorTests.test_request_attributes", + "csrf_tests.test_context_processor.TestContextProcessor.test_force_token_to_string", + "csrf_tests.tests.CsrfInErrorHandlingViewsTests.test_csrf_token_on_404_stays_constant", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_bare_secret_accepted_and_replaced", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_cookie_not_reset_on_accepted_request", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_csrf_cookie_age", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_csrf_cookie_age_none", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_csrf_cookie_samesite", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_csrf_token_in_header", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_csrf_token_in_header_with_customized_name", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_ensures_csrf_cookie_no_logging", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_ensures_csrf_cookie_no_middleware", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_ensures_csrf_cookie_with_middleware", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_get_token_for_exempt_view", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_get_token_for_requires_csrf_token_view", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_bad_referer", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_csrf_trusted_origin_allowed", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_csrf_wildcard_trusted_origin_allowed", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_good_referer", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_good_referer_2", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_good_referer_behind_proxy", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_good_referer_matches_cookie_domain", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_good_referer_matches_cookie_domain_with_different_port", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_malformed_host", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_malformed_referer", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_https_reject_insecure_referer", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_post_data_read_failure", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_request_csrf_cookie_and_token", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_request_csrf_cookie_no_token", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_request_csrf_cookie_no_token_exempt_view", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_request_no_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_response_get_token_not_used", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_view_token_invalid_chars", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_process_view_token_too_long", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_put_and_delete_allowed", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_put_and_delete_rejected", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_token_node_empty_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_token_node_no_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_token_node_with_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareTests.test_token_node_with_new_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_cookie_not_reset_on_accepted_request", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_csrf_token_in_header", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_csrf_token_in_header_with_customized_name", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_ensures_csrf_cookie_no_logging", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_ensures_csrf_cookie_with_middleware", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_get_token_for_exempt_view", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_get_token_for_requires_csrf_token_view", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_bad_referer", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_csrf_trusted_origin_allowed", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_csrf_wildcard_trusted_origin_allowed", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_good_referer", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_good_referer_2", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_good_referer_behind_proxy", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_good_referer_matches_cookie_domain", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_good_referer_matches_cookie_domain_with_different_port", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_malformed_host", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_malformed_referer", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_https_reject_insecure_referer", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_no_session_on_request", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_post_data_read_failure", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_request_csrf_cookie_and_token", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_request_csrf_cookie_no_token", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_request_csrf_cookie_no_token_exempt_view", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_request_no_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_response_get_token_not_used", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_process_response_get_token_used", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_put_and_delete_allowed", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_put_and_delete_rejected", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_session_modify", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_token_node_empty_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_token_node_no_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_token_node_with_csrf_cookie", + "csrf_tests.tests.CsrfViewMiddlewareUseSessionsTests.test_token_node_with_new_csrf_cookie", + "db_functions.window.test_validation.ValidationTests.test_lag_negative_offset", + "db_functions.window.test_validation.ValidationTests.test_lead_negative_offset", + "db_functions.window.test_validation.ValidationTests.test_negative_num_buckets_ntile", + "db_functions.window.test_validation.ValidationTests.test_nth_negative_nth_value", + "db_functions.window.test_validation.ValidationTests.test_nth_null_expression", + "db_functions.window.test_validation.ValidationTests.test_null_source_lag", + "db_functions.window.test_validation.ValidationTests.test_null_source_lead", + "db_typecasts.tests.DBTypeCasts.test_typeCasts", + "db_utils.tests.ConnectionHandlerTests.test_connection_handler_no_databases", + "db_utils.tests.ConnectionHandlerTests.test_no_default_database", + "db_utils.tests.DatabaseErrorWrapperTests.test_reraising_backend_specific_database_exception", + "db_utils.tests.LoadBackendTests.test_load_backend_invalid_name", + "dbshell.test_mysql.MySqlDbshellCommandTestCase.test_basic_params_specified_in_settings", + "dbshell.test_mysql.MySqlDbshellCommandTestCase.test_can_connect_using_sockets", + "dbshell.test_mysql.MySqlDbshellCommandTestCase.test_fails_with_keyerror_on_incomplete_config", + "dbshell.test_mysql.MySqlDbshellCommandTestCase.test_options_override_settings_proper_values", + "dbshell.test_mysql.MySqlDbshellCommandTestCase.test_ssl_certificate_is_added", + "dbshell.test_oracle.OracleDbshellTests.test_with_rlwrap", + "dbshell.test_oracle.OracleDbshellTests.test_without_rlwrap", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_accent", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_basic", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_column", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_escape_characters", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_nopass", + "dbshell.test_postgresql.PostgreSqlDbshellCommandTestCase.test_sigint_handler", + "decorators.tests.DecoratorsTest.test_attributes", + "decorators.tests.DecoratorsTest.test_cache_page", + "decorators.tests.DecoratorsTest.test_require_safe_accepts_only_safe_methods", + "decorators.tests.DecoratorsTest.test_user_passes_test_composition", + "decorators.tests.MethodDecoratorTests.test_argumented", + "decorators.tests.MethodDecoratorTests.test_bad_iterable", + "decorators.tests.MethodDecoratorTests.test_class_decoration", + "decorators.tests.MethodDecoratorTests.test_descriptors", + "decorators.tests.MethodDecoratorTests.test_invalid_method_name_to_decorate", + "decorators.tests.MethodDecoratorTests.test_invalid_non_callable_attribute_decoration", + "decorators.tests.MethodDecoratorTests.test_new_attribute", + "decorators.tests.MethodDecoratorTests.test_preserve_attributes", + "decorators.tests.MethodDecoratorTests.test_preserve_signature", + "decorators.tests.MethodDecoratorTests.test_tuple_of_decorators", + "decorators.tests.NeverCacheDecoratorTest.test_never_cache_decorator", + "decorators.tests.XFrameOptionsDecoratorsTests.test_deny_decorator", + "decorators.tests.XFrameOptionsDecoratorsTests.test_exempt_decorator", + "decorators.tests.XFrameOptionsDecoratorsTests.test_sameorigin_decorator", + "deprecation.tests.DeprecationInstanceCheckTest.test_warning", + "deprecation.tests.RenameMethodsTests.test_class_definition_warnings", + "deprecation.tests.RenameMethodsTests.test_deprecated_subclass_renamed", + "deprecation.tests.RenameMethodsTests.test_deprecated_subclass_renamed_and_mixins", + "deprecation.tests.RenameMethodsTests.test_get_new_defined", + "deprecation.tests.RenameMethodsTests.test_get_old_defined", + "deprecation.tests.RenameMethodsTests.test_renamed_subclass_deprecated", + "dispatch.tests.DispatcherTests.test_cached_garbaged_collected", + "dispatch.tests.DispatcherTests.test_cannot_connect_no_kwargs", + "dispatch.tests.DispatcherTests.test_cannot_connect_non_callable", + "dispatch.tests.DispatcherTests.test_disconnection", + "dispatch.tests.DispatcherTests.test_garbage_collected", + "dispatch.tests.DispatcherTests.test_has_listeners", + "dispatch.tests.DispatcherTests.test_multiple_registration", + "dispatch.tests.DispatcherTests.test_send", + "dispatch.tests.DispatcherTests.test_send_connected_no_sender", + "dispatch.tests.DispatcherTests.test_send_different_no_sender", + "dispatch.tests.DispatcherTests.test_send_no_receivers", + "dispatch.tests.DispatcherTests.test_send_robust_fail", + "dispatch.tests.DispatcherTests.test_send_robust_ignored_sender", + "dispatch.tests.DispatcherTests.test_send_robust_no_receivers", + "dispatch.tests.DispatcherTests.test_send_robust_success", + "dispatch.tests.DispatcherTests.test_uid_registration", + "dispatch.tests.DispatcherTests.test_values_returned_by_disconnection", + "dispatch.tests.ReceiverTestCase.test_receiver_signal_list", + "dispatch.tests.ReceiverTestCase.test_receiver_single_signal", + "field_deconstruction.tests.FieldDeconstructionTests.test_auto_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_big_integer_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_binary_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_boolean_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_char_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_char_field_choices", + "field_deconstruction.tests.FieldDeconstructionTests.test_csi_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_date_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_datetime_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_db_tablespace", + "field_deconstruction.tests.FieldDeconstructionTests.test_decimal_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_decimal_field_0_decimal_places", + "field_deconstruction.tests.FieldDeconstructionTests.test_email_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_file_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_file_path_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_float_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_foreign_key", + "field_deconstruction.tests.FieldDeconstructionTests.test_foreign_key_swapped", + "field_deconstruction.tests.FieldDeconstructionTests.test_generic_ip_address_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_image_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_integer_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_ip_address_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_many_to_many_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_many_to_many_field_swapped", + "field_deconstruction.tests.FieldDeconstructionTests.test_name", + "field_deconstruction.tests.FieldDeconstructionTests.test_null_boolean_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_one_to_one", + "field_deconstruction.tests.FieldDeconstructionTests.test_positive_integer_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_positive_small_integer_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_slug_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_small_integer_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_text_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_time_field", + "field_deconstruction.tests.FieldDeconstructionTests.test_url_field", + "field_subclassing.tests.TestDbType.test_db_parameters_respects_db_type", + "file_storage.test_generate_filename.GenerateFilenameStorageTests.test_filefield_awss3_storage", + "file_storage.test_generate_filename.GenerateFilenameStorageTests.test_filefield_generate_filename", + "file_storage.test_generate_filename.GenerateFilenameStorageTests.test_filefield_generate_filename_with_upload_to", + "files.tests.ContentFileTestCase.test_content_file_custom_name", + "files.tests.ContentFileTestCase.test_content_file_default_name", + "files.tests.ContentFileTestCase.test_content_file_input_type", + "files.tests.ContentFileTestCase.test_open_resets_file_to_start_and_returns_context_manager", + "files.tests.ContentFileTestCase.test_size_changing_after_writing", + "files.tests.DimensionClosingBug.test_closing_of_filenames", + "files.tests.DimensionClosingBug.test_not_closing_of_files", + "files.tests.FileMoveSafeTests.test_file_move_copystat_cifs", + "files.tests.FileMoveSafeTests.test_file_move_overwrite", + "files.tests.FileTests.test_context_manager", + "files.tests.FileTests.test_file_iteration", + "files.tests.FileTests.test_file_iteration_mac_newlines", + "files.tests.FileTests.test_file_iteration_mixed_newlines", + "files.tests.FileTests.test_file_iteration_windows_newlines", + "files.tests.FileTests.test_file_iteration_with_mac_newline_at_chunk_boundary", + "files.tests.FileTests.test_file_iteration_with_text", + "files.tests.FileTests.test_file_iteration_with_unix_newline_at_chunk_boundary", + "files.tests.FileTests.test_file_iteration_with_windows_newline_at_chunk_boundary", + "files.tests.FileTests.test_file_mode", + "files.tests.FileTests.test_io_wrapper", + "files.tests.FileTests.test_namedtemporaryfile_closes", + "files.tests.FileTests.test_open_reopens_closed_file_and_returns_context_manager", + "files.tests.FileTests.test_open_resets_opened_file_to_start_and_returns_context_manager", + "files.tests.FileTests.test_readable", + "files.tests.FileTests.test_seekable", + "files.tests.FileTests.test_unicode_file_name", + "files.tests.FileTests.test_unicode_uploadedfile_name", + "files.tests.FileTests.test_writable", + "files.tests.GetImageDimensionsTests.test_invalid_image", + "files.tests.GetImageDimensionsTests.test_valid_image", + "files.tests.GetImageDimensionsTests.test_webp", + "files.tests.InMemoryUploadedFileTests.test_open_resets_file_to_start_and_returns_context_manager", + "files.tests.InconsistentGetImageDimensionsBug.test_bug_19457", + "files.tests.InconsistentGetImageDimensionsBug.test_multiple_calls", + "files.tests.NoNameFileTestCase.test_noname_file_default_name", + "files.tests.NoNameFileTestCase.test_noname_file_get_size", + "files.tests.SpooledTempTests.test_in_memory_spooled_temp", + "files.tests.SpooledTempTests.test_written_spooled_temp", + "files.tests.TemporaryUploadedFileTests.test_extension_kept", + "fixtures_model_package.tests.FixtureTestCase.test_loaddata", + "fixtures_model_package.tests.SampleTestCase.testClassFixtures", + "flatpages_tests.test_sitemaps.FlatpagesSitemapTests.test_flatpage_sitemap", + "forms_tests.field_tests.test_base.BasicFieldsTests.test_cooperative_multiple_inheritance", + "forms_tests.field_tests.test_base.BasicFieldsTests.test_field_deepcopies_widget_instance", + "forms_tests.field_tests.test_base.BasicFieldsTests.test_field_sets_widget_is_required", + "forms_tests.field_tests.test_base.DisabledFieldTests.test_disabled_field_has_changed_always_false", + "forms_tests.field_tests.test_booleanfield.BooleanFieldTest.test_boolean_picklable", + "forms_tests.field_tests.test_booleanfield.BooleanFieldTest.test_booleanfield_changed", + "forms_tests.field_tests.test_booleanfield.BooleanFieldTest.test_booleanfield_clean_1", + "forms_tests.field_tests.test_booleanfield.BooleanFieldTest.test_booleanfield_clean_2", + "forms_tests.field_tests.test_booleanfield.BooleanFieldTest.test_disabled_has_changed", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_1", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_2", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_3", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_4", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_5", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_disabled", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_length_not_int", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_strip", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_charfield_widget_attrs", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_clean_non_string", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_null_characters_prohibited", + "forms_tests.field_tests.test_charfield.CharFieldTest.test_strip_before_checking_empty", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_1", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_2", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_3", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_4", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_callable", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_callable_may_evaluate_to_different_values", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_choices_default", + "forms_tests.field_tests.test_choicefield.ChoiceFieldTest.test_choicefield_disabled", + "forms_tests.field_tests.test_combofield.ComboFieldTest.test_combofield_1", + "forms_tests.field_tests.test_combofield.ComboFieldTest.test_combofield_2", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_1", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_2", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_3", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_4", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_5", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_changed", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_datefield_strptime", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_form_field", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_form_label_association", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_l10n_date_changed", + "forms_tests.field_tests.test_datefield.DateFieldTest.test_l10n_invalid_date_in", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_1", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_2", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_3", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_4", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_5", + "forms_tests.field_tests.test_datetimefield.DateTimeFieldTest.test_datetimefield_changed", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_1", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_2", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_3", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_4", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_5", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_6", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_changed", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_localized", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_scientific", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_support_decimal_separator", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_support_thousands_separator", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_decimalfield_widget_attrs", + "forms_tests.field_tests.test_decimalfield.DecimalFieldTest.test_enter_a_number_error", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_durationfield_clean", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_durationfield_integer_value", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_durationfield_prepare_value", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_durationfield_render", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_overflow", + "forms_tests.field_tests.test_durationfield.DurationFieldTest.test_overflow_translation", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_email_regexp_for_performance", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_emailfield_1", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_emailfield_min_max_length", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_emailfield_not_required", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_emailfield_strip_on_none_value", + "forms_tests.field_tests.test_emailfield.EmailFieldTest.test_emailfield_unable_to_set_strip_kwarg", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_disabled_has_changed", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_file_picklable", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_filefield_1", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_filefield_2", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_filefield_3", + "forms_tests.field_tests.test_filefield.FileFieldTest.test_filefield_changed", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_allow_folders", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_clean", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_fix_os_paths", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_match", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_no_options", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_recursive", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_recursive_folders_without_files", + "forms_tests.field_tests.test_filepathfield.FilePathFieldTest.test_recursive_no_folders_or_files", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_decimalfield_support_decimal_separator", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_decimalfield_support_thousands_separator", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_1", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_2", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_3", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_changed", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_localized", + "forms_tests.field_tests.test_floatfield.FloatFieldTest.test_floatfield_widget_attrs", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_as_generic", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_as_generic_not_required", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_as_ipv4_only", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_as_ipv6_only", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_invalid_arguments", + "forms_tests.field_tests.test_genericipaddressfield.GenericIPAddressFieldTest.test_generic_ipaddress_normalization", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_file_extension_validation", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_imagefield_annotate_with_bitmap_image_after_clean", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_imagefield_annotate_with_image_after_clean", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_widge_attrs_accept_false", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_widge_attrs_accept_specified", + "forms_tests.field_tests.test_imagefield.ImageFieldTest.test_widget_attrs_default_accept", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_1", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_2", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_3", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_4", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_5", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_big_num", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_float", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_localized", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_subclass", + "forms_tests.field_tests.test_integerfield.IntegerFieldTest.test_integerfield_unicode_number", + "forms_tests.field_tests.test_multiplechoicefield.MultipleChoiceFieldTest.test_disabled_has_changed", + "forms_tests.field_tests.test_multiplechoicefield.MultipleChoiceFieldTest.test_multiplechoicefield_1", + "forms_tests.field_tests.test_multiplechoicefield.MultipleChoiceFieldTest.test_multiplechoicefield_2", + "forms_tests.field_tests.test_multiplechoicefield.MultipleChoiceFieldTest.test_multiplechoicefield_3", + "forms_tests.field_tests.test_multiplechoicefield.MultipleChoiceFieldTest.test_multiplechoicefield_changed", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_bad_choice", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_clean", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_clean_disabled_multivalue", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_disabled_has_changed", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_form_as_table", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_form_as_table_data", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_form_cleaned_data", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_has_changed_first_widget", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_has_changed_last_widget", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_has_changed_no_initial", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_has_changed_same", + "forms_tests.field_tests.test_multivaluefield.MultiValueFieldTest.test_no_value", + "forms_tests.field_tests.test_nullbooleanfield.NullBooleanFieldTest.test_nullbooleanfield_2", + "forms_tests.field_tests.test_nullbooleanfield.NullBooleanFieldTest.test_nullbooleanfield_3", + "forms_tests.field_tests.test_nullbooleanfield.NullBooleanFieldTest.test_nullbooleanfield_4", + "forms_tests.field_tests.test_nullbooleanfield.NullBooleanFieldTest.test_nullbooleanfield_changed", + "forms_tests.field_tests.test_nullbooleanfield.NullBooleanFieldTest.test_nullbooleanfield_clean", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_change_regex_after_init", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_regexfield_1", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_regexfield_2", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_regexfield_3", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_regexfield_4", + "forms_tests.field_tests.test_regexfield.RegexFieldTest.test_regexfield_unicode_characters", + "forms_tests.field_tests.test_slugfield.SlugFieldTest.test_slugfield_normalization", + "forms_tests.field_tests.test_slugfield.SlugFieldTest.test_slugfield_unicode_normalization", + "forms_tests.field_tests.test_splitdatetimefield.SplitDateTimeFieldTest.test_splitdatetimefield_1", + "forms_tests.field_tests.test_splitdatetimefield.SplitDateTimeFieldTest.test_splitdatetimefield_2", + "forms_tests.field_tests.test_splitdatetimefield.SplitDateTimeFieldTest.test_splitdatetimefield_changed", + "forms_tests.field_tests.test_timefield.TimeFieldTest.test_timefield_1", + "forms_tests.field_tests.test_timefield.TimeFieldTest.test_timefield_2", + "forms_tests.field_tests.test_timefield.TimeFieldTest.test_timefield_3", + "forms_tests.field_tests.test_timefield.TimeFieldTest.test_timefield_changed", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_1", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_2", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_3", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_4", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_5", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_6", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_has_changed", + "forms_tests.field_tests.test_typedchoicefield.TypedChoiceFieldTest.test_typedchoicefield_special_coerce", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_1", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_2", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_3", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_4", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_5", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_6", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_7", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_has_changed", + "forms_tests.field_tests.test_typedmultiplechoicefield.TypedMultipleChoiceFieldTest.test_typedmultiplechoicefield_special_coerce", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_url_regex_ticket11198", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_1", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_10", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_2", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_5", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_6", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_7", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_9", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_normalization", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_not_string", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_strip_on_none_value", + "forms_tests.field_tests.test_urlfield.URLFieldTest.test_urlfield_unable_to_set_strip_kwarg", + "forms_tests.field_tests.test_uuidfield.UUIDFieldTest.test_clean_value_with_dashes", + "forms_tests.field_tests.test_uuidfield.UUIDFieldTest.test_uuidfield_1", + "forms_tests.field_tests.test_uuidfield.UUIDFieldTest.test_uuidfield_2", + "forms_tests.field_tests.test_uuidfield.UUIDFieldTest.test_uuidfield_3", + "forms_tests.field_tests.test_uuidfield.UUIDFieldTest.test_uuidfield_4", + "forms_tests.tests.test_forms.FormsTestCase.test_accessing_clean", + "forms_tests.tests.test_forms.FormsTestCase.test_auto_id", + "forms_tests.tests.test_forms.FormsTestCase.test_auto_id_false", + "forms_tests.tests.test_forms.FormsTestCase.test_auto_id_on_form_and_field", + "forms_tests.tests.test_forms.FormsTestCase.test_auto_id_true", + "forms_tests.tests.test_forms.FormsTestCase.test_baseform_repr", + "forms_tests.tests.test_forms.FormsTestCase.test_baseform_repr_dont_trigger_validation", + "forms_tests.tests.test_forms.FormsTestCase.test_basic_processing_in_view", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_bool", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_empty_label", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_id_for_label", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_id_for_label_override_by_attrs", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_initial_called_once", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_label_tag", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_label_tag_custom_widget_id_for_label", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_label_tag_no_id", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_slice", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_value_disabled_callable_initial", + "forms_tests.tests.test_forms.FormsTestCase.test_boundfield_values", + "forms_tests.tests.test_forms.FormsTestCase.test_callable_initial_data", + "forms_tests.tests.test_forms.FormsTestCase.test_changed_data", + "forms_tests.tests.test_forms.FormsTestCase.test_changing_cleaned_data_in_clean", + "forms_tests.tests.test_forms.FormsTestCase.test_changing_cleaned_data_nothing_returned", + "forms_tests.tests.test_forms.FormsTestCase.test_checkbox_auto_id", + "forms_tests.tests.test_forms.FormsTestCase.test_class_prefix", + "forms_tests.tests.test_forms.FormsTestCase.test_cleaned_data_only_fields", + "forms_tests.tests.test_forms.FormsTestCase.test_custom_boundfield", + "forms_tests.tests.test_forms.FormsTestCase.test_custom_empty_values", + "forms_tests.tests.test_forms.FormsTestCase.test_datetime_changed_data_callable_with_microseconds", + "forms_tests.tests.test_forms.FormsTestCase.test_datetime_clean_initial_callable_disabled", + "forms_tests.tests.test_forms.FormsTestCase.test_dynamic_construction", + "forms_tests.tests.test_forms.FormsTestCase.test_dynamic_initial_data", + "forms_tests.tests.test_forms.FormsTestCase.test_empty_dict", + "forms_tests.tests.test_forms.FormsTestCase.test_empty_permitted", + "forms_tests.tests.test_forms.FormsTestCase.test_empty_permitted_and_use_required_attribute", + "forms_tests.tests.test_forms.FormsTestCase.test_empty_querydict_args", + "forms_tests.tests.test_forms.FormsTestCase.test_error_dict", + "forms_tests.tests.test_forms.FormsTestCase.test_error_dict_as_json_escape_html", + "forms_tests.tests.test_forms.FormsTestCase.test_error_escaping", + "forms_tests.tests.test_forms.FormsTestCase.test_error_html_required_html_classes", + "forms_tests.tests.test_forms.FormsTestCase.test_error_list", + "forms_tests.tests.test_forms.FormsTestCase.test_error_list_class_has_one_class_specified", + "forms_tests.tests.test_forms.FormsTestCase.test_error_list_class_not_specified", + "forms_tests.tests.test_forms.FormsTestCase.test_error_list_with_hidden_field_errors_has_correct_class", + "forms_tests.tests.test_forms.FormsTestCase.test_error_list_with_non_field_errors_has_correct_class", + "forms_tests.tests.test_forms.FormsTestCase.test_errorlist_override", + "forms_tests.tests.test_forms.FormsTestCase.test_escaping", + "forms_tests.tests.test_forms.FormsTestCase.test_explicit_field_order", + "forms_tests.tests.test_forms.FormsTestCase.test_extracting_hidden_and_visible", + "forms_tests.tests.test_forms.FormsTestCase.test_field_name", + "forms_tests.tests.test_forms.FormsTestCase.test_field_name_with_hidden_input", + "forms_tests.tests.test_forms.FormsTestCase.test_field_name_with_hidden_input_and_non_matching_row_ender", + "forms_tests.tests.test_forms.FormsTestCase.test_field_named_data", + "forms_tests.tests.test_forms.FormsTestCase.test_field_order", + "forms_tests.tests.test_forms.FormsTestCase.test_field_with_css_class", + "forms_tests.tests.test_forms.FormsTestCase.test_field_without_css_classes", + "forms_tests.tests.test_forms.FormsTestCase.test_filefield_initial_callable", + "forms_tests.tests.test_forms.FormsTestCase.test_form", + "forms_tests.tests.test_forms.FormsTestCase.test_form_html_attributes", + "forms_tests.tests.test_forms.FormsTestCase.test_form_with_disabled_fields", + "forms_tests.tests.test_forms.FormsTestCase.test_form_with_iterable_boundfield", + "forms_tests.tests.test_forms.FormsTestCase.test_form_with_iterable_boundfield_id", + "forms_tests.tests.test_forms.FormsTestCase.test_form_with_noniterable_boundfield", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_choices", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_file_fields", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_multiple_choice", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_null_boolean", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_prefixes", + "forms_tests.tests.test_forms.FormsTestCase.test_forms_with_radio", + "forms_tests.tests.test_forms.FormsTestCase.test_get_initial_for_field", + "forms_tests.tests.test_forms.FormsTestCase.test_has_error", + "forms_tests.tests.test_forms.FormsTestCase.test_help_text", + "forms_tests.tests.test_forms.FormsTestCase.test_hidden_data", + "forms_tests.tests.test_forms.FormsTestCase.test_hidden_initial_gets_id", + "forms_tests.tests.test_forms.FormsTestCase.test_hidden_widget", + "forms_tests.tests.test_forms.FormsTestCase.test_html_safe", + "forms_tests.tests.test_forms.FormsTestCase.test_id_on_field", + "forms_tests.tests.test_forms.FormsTestCase.test_initial_data", + "forms_tests.tests.test_forms.FormsTestCase.test_initial_datetime_values", + "forms_tests.tests.test_forms.FormsTestCase.test_iterable_boundfield_select", + "forms_tests.tests.test_forms.FormsTestCase.test_label_has_required_css_class", + "forms_tests.tests.test_forms.FormsTestCase.test_label_split_datetime_not_displayed", + "forms_tests.tests.test_forms.FormsTestCase.test_label_suffix", + "forms_tests.tests.test_forms.FormsTestCase.test_label_tag_override", + "forms_tests.tests.test_forms.FormsTestCase.test_multipart_encoded_form", + "forms_tests.tests.test_forms.FormsTestCase.test_multiple_choice_checkbox", + "forms_tests.tests.test_forms.FormsTestCase.test_multiple_choice_list_data", + "forms_tests.tests.test_forms.FormsTestCase.test_multiple_hidden", + "forms_tests.tests.test_forms.FormsTestCase.test_multivalue_deep_copy", + "forms_tests.tests.test_forms.FormsTestCase.test_multivalue_field_validation", + "forms_tests.tests.test_forms.FormsTestCase.test_multivalue_initial_data", + "forms_tests.tests.test_forms.FormsTestCase.test_multivalue_optional_subfields", + "forms_tests.tests.test_forms.FormsTestCase.test_only_hidden_fields", + "forms_tests.tests.test_forms.FormsTestCase.test_optional_data", + "forms_tests.tests.test_forms.FormsTestCase.test_specifying_labels", + "forms_tests.tests.test_forms.FormsTestCase.test_subclassing_forms", + "forms_tests.tests.test_forms.FormsTestCase.test_templates_with_forms", + "forms_tests.tests.test_forms.FormsTestCase.test_unbound_form", + "forms_tests.tests.test_forms.FormsTestCase.test_unicode_values", + "forms_tests.tests.test_forms.FormsTestCase.test_update_error_dict", + "forms_tests.tests.test_forms.FormsTestCase.test_use_required_attribute_false", + "forms_tests.tests.test_forms.FormsTestCase.test_use_required_attribute_true", + "forms_tests.tests.test_forms.FormsTestCase.test_validating_multiple_fields", + "forms_tests.tests.test_forms.FormsTestCase.test_validators_independence", + "forms_tests.tests.test_forms.FormsTestCase.test_various_boolean_values", + "forms_tests.tests.test_forms.FormsTestCase.test_widget_output", + "forms_tests.tests.test_forms.RendererTests.test_attribute_class", + "forms_tests.tests.test_forms.RendererTests.test_attribute_instance", + "forms_tests.tests.test_forms.RendererTests.test_attribute_override", + "forms_tests.tests.test_forms.RendererTests.test_default", + "forms_tests.tests.test_forms.RendererTests.test_kwarg_class", + "forms_tests.tests.test_forms.RendererTests.test_kwarg_instance", + "forms_tests.tests.test_formsets.AllValidTests.test_invalid", + "forms_tests.tests.test_formsets.AllValidTests.test_valid", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_basic_formset", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_blank_form_unfilled", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_clean_hook", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_delete_prefilled_data", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_displaying_more_than_one_blank_form", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_empty_ordered_fields", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_form_kwargs_empty_form", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_form_kwargs_formset", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_form_kwargs_formset_dynamic", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_calls_forms_is_valid", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_error_class", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_has_changed", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_initial_data", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_iteration", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_nonzero", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_splitdatetimefield", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_total_error_count", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_total_error_count_with_non_form_errors", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validate_max_flag", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validate_min_excludes_empty_forms", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validate_min_flag", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validate_min_unchanged_forms", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validation", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_validation_count", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_with_deletion", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_with_deletion_invalid_deleted_form", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_with_deletion_remove_deletion_flag", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formset_with_ordering_and_deletion", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_formsets_with_ordering", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_hard_limit_on_instantiated_forms", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_html_safe", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_increase_hard_limit", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_invalid_deleted_form_with_ordering", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_limited_max_forms_two", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_limiting_extra_lest_than_max_num", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_limiting_max_forms", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_management_form_prefix", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_max_num_with_initial_data", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_max_num_zero", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_max_num_zero_with_initial", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_min_num_displaying_more_than_one_blank_form", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_min_num_displaying_more_than_one_blank_form_with_zero_extra", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_more_initial_data", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_more_initial_form_result_in_one", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_more_initial_than_max_num", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_non_form_errors", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_non_form_errors_run_full_clean", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_ordering_blank_fieldsets", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_second_form_partially_filled", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_second_form_partially_filled_2", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_single_form_completed", + "forms_tests.tests.test_formsets.FormsFormsetTestCase.test_validate_max_ignores_forms_marked_for_deletion", + "forms_tests.tests.test_formsets.FormsetAsFooTests.test_as_p", + "forms_tests.tests.test_formsets.FormsetAsFooTests.test_as_table", + "forms_tests.tests.test_formsets.FormsetAsFooTests.test_as_ul", + "forms_tests.tests.test_formsets.TestEmptyFormSet.test_empty_formset_is_multipart", + "forms_tests.tests.test_formsets.TestEmptyFormSet.test_empty_formset_is_valid", + "forms_tests.tests.test_formsets.TestEmptyFormSet.test_empty_formset_media", + "forms_tests.tests.test_formsets.TestIsBoundBehavior.test_empty_forms_are_unbound", + "forms_tests.tests.test_formsets.TestIsBoundBehavior.test_form_errors_are_caught_by_formset", + "forms_tests.tests.test_formsets.TestIsBoundBehavior.test_no_data_raises_validation_error", + "forms_tests.tests.test_formsets.TestIsBoundBehavior.test_with_management_data_attrs_work_fine", + "forms_tests.tests.test_i18n.FormsI18nTests.test_lazy_labels", + "forms_tests.tests.test_i18n.FormsI18nTests.test_non_ascii_choices", + "forms_tests.tests.test_i18n.FormsI18nTests.test_non_ascii_label", + "forms_tests.tests.test_i18n.FormsI18nTests.test_select_translated_text", + "forms_tests.tests.test_input_formats.CustomDateInputFormatsTests.test_dateField", + "forms_tests.tests.test_input_formats.CustomDateInputFormatsTests.test_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.CustomDateInputFormatsTests.test_localized_dateField", + "forms_tests.tests.test_input_formats.CustomDateInputFormatsTests.test_localized_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.CustomDateTimeInputFormatsTests.test_dateTimeField", + "forms_tests.tests.test_input_formats.CustomDateTimeInputFormatsTests.test_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.CustomDateTimeInputFormatsTests.test_localized_dateTimeField", + "forms_tests.tests.test_input_formats.CustomDateTimeInputFormatsTests.test_localized_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.CustomTimeInputFormatsTests.test_localized_timeField", + "forms_tests.tests.test_input_formats.CustomTimeInputFormatsTests.test_localized_timeField_with_inputformat", + "forms_tests.tests.test_input_formats.CustomTimeInputFormatsTests.test_timeField", + "forms_tests.tests.test_input_formats.CustomTimeInputFormatsTests.test_timeField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedDateTests.test_dateField", + "forms_tests.tests.test_input_formats.LocalizedDateTests.test_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedDateTests.test_localized_dateField", + "forms_tests.tests.test_input_formats.LocalizedDateTests.test_localized_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedDateTimeTests.test_dateTimeField", + "forms_tests.tests.test_input_formats.LocalizedDateTimeTests.test_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedDateTimeTests.test_localized_dateTimeField", + "forms_tests.tests.test_input_formats.LocalizedDateTimeTests.test_localized_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedTimeTests.test_localized_timeField", + "forms_tests.tests.test_input_formats.LocalizedTimeTests.test_localized_timeField_with_inputformat", + "forms_tests.tests.test_input_formats.LocalizedTimeTests.test_timeField", + "forms_tests.tests.test_input_formats.LocalizedTimeTests.test_timeField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleDateFormatTests.test_dateField", + "forms_tests.tests.test_input_formats.SimpleDateFormatTests.test_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleDateFormatTests.test_localized_dateField", + "forms_tests.tests.test_input_formats.SimpleDateFormatTests.test_localized_dateField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleDateTimeFormatTests.test_dateTimeField", + "forms_tests.tests.test_input_formats.SimpleDateTimeFormatTests.test_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleDateTimeFormatTests.test_localized_dateTimeField", + "forms_tests.tests.test_input_formats.SimpleDateTimeFormatTests.test_localized_dateTimeField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleTimeFormatTests.test_localized_timeField", + "forms_tests.tests.test_input_formats.SimpleTimeFormatTests.test_localized_timeField_with_inputformat", + "forms_tests.tests.test_input_formats.SimpleTimeFormatTests.test_timeField", + "forms_tests.tests.test_input_formats.SimpleTimeFormatTests.test_timeField_with_inputformat", + "forms_tests.tests.test_media.FormsMediaTestCase.test_combine_media", + "forms_tests.tests.test_media.FormsMediaTestCase.test_construction", + "forms_tests.tests.test_media.FormsMediaTestCase.test_form_media", + "forms_tests.tests.test_media.FormsMediaTestCase.test_html_safe", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_deduplication", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_dsl", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_inheritance", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_inheritance_extends", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_inheritance_from_property", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_inheritance_single_type", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_property", + "forms_tests.tests.test_media.FormsMediaTestCase.test_media_property_parent_references", + "forms_tests.tests.test_media.FormsMediaTestCase.test_merge", + "forms_tests.tests.test_media.FormsMediaTestCase.test_merge_css_three_way", + "forms_tests.tests.test_media.FormsMediaTestCase.test_merge_js_three_way", + "forms_tests.tests.test_media.FormsMediaTestCase.test_merge_js_three_way2", + "forms_tests.tests.test_media.FormsMediaTestCase.test_merge_warning", + "forms_tests.tests.test_media.FormsMediaTestCase.test_multi_media", + "forms_tests.tests.test_media.FormsMediaTestCase.test_multi_widget", + "forms_tests.tests.test_renderers.BaseTemplateRendererTests.test_get_renderer", + "forms_tests.tests.test_renderers.DjangoTemplatesTests.test_installed_apps_template_found", + "forms_tests.tests.test_renderers.Jinja2Tests.test_installed_apps_template_found", + "forms_tests.tests.test_renderers.TemplatesSettingTests.test_installed_apps_template_found", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_error_dict_copy", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_error_dict_html_safe", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_error_list_html_safe", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_flatatt", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_flatatt_no_side_effects", + "forms_tests.tests.test_utils.FormsUtilsTestCase.test_validation_error", + "forms_tests.tests.test_validators.TestFieldWithValidators.test_all_errors_get_reported", + "forms_tests.tests.test_validators.TestFieldWithValidators.test_field_validators_can_be_any_iterable", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_check_exception", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_check_test", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_empty", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_false", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_int", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_none", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_true", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_render_value", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_value_from_datadict", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_value_from_datadict_string_int", + "forms_tests.widget_tests.test_checkboxinput.CheckboxInputTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_doesnt_localize_input_value", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_label", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_nested_choices", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_nested_choices_without_id", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_render_none", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_render_value", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_render_value_multiple", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_separate_ids", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_separate_ids_constructor", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_use_required_attribute", + "forms_tests.widget_tests.test_checkboxselectmultiple.CheckboxSelectMultipleTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_clear_input_checked_returns_false", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_clear_input_checked_returns_false_only_if_not_required", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_clear_input_renders", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_clear_input_renders_only_if_initial", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_clear_input_renders_only_if_not_required", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_html_does_not_mask_exceptions", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_html_escaped", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_render_as_subwidget", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_return_false_if_url_does_not_exists", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_url_as_property", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_use_required_attribute", + "forms_tests.widget_tests.test_clearablefileinput.ClearableFileInputTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_dateinput.DateInputTest.test_format", + "forms_tests.widget_tests.test_dateinput.DateInputTest.test_l10n", + "forms_tests.widget_tests.test_dateinput.DateInputTest.test_render_none", + "forms_tests.widget_tests.test_dateinput.DateInputTest.test_render_value", + "forms_tests.widget_tests.test_dateinput.DateInputTest.test_string", + "forms_tests.widget_tests.test_datetimeinput.DateTimeInputTest.test_l10n", + "forms_tests.widget_tests.test_datetimeinput.DateTimeInputTest.test_locale_aware", + "forms_tests.widget_tests.test_datetimeinput.DateTimeInputTest.test_render_formatted", + "forms_tests.widget_tests.test_datetimeinput.DateTimeInputTest.test_render_none", + "forms_tests.widget_tests.test_datetimeinput.DateTimeInputTest.test_render_value", + "forms_tests.widget_tests.test_fileinput.FileInputTest.test_render", + "forms_tests.widget_tests.test_fileinput.FileInputTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_hiddeninput.HiddenInputTest.test_render", + "forms_tests.widget_tests.test_hiddeninput.HiddenInputTest.test_use_required_attribute", + "forms_tests.widget_tests.test_input.InputTests.test_attrs_with_type", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_attrs", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_attrs_constructor", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_attrs_multiple", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_empty", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_increment_id", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_multiple", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_none", + "forms_tests.widget_tests.test_multiplehiddeninput.MultipleHiddenInputTest.test_render_single", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_constructor_attrs", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_constructor_attrs_with_type", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_deepcopy", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_needs_multipart_false", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_needs_multipart_true", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_nested_multiwidget", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_no_whitespace_between_widgets", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_text_inputs", + "forms_tests.widget_tests.test_multiwidget.MultiWidgetTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_l10n", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_false", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_none", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_true", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_1", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_2", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_3", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_false", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_true", + "forms_tests.widget_tests.test_nullbooleanselect.NullBooleanSelectTest.test_render_value_unknown", + "forms_tests.widget_tests.test_numberinput.NumberInputTests.test_attrs_not_localized", + "forms_tests.widget_tests.test_passwordinput.PasswordInputTest.test_render", + "forms_tests.widget_tests.test_passwordinput.PasswordInputTest.test_render_ignore_value", + "forms_tests.widget_tests.test_passwordinput.PasswordInputTest.test_render_value_true", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_class_attrs", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_constructor_attrs", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_doesnt_localize_input_value", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_nested_choices", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_render", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_render_as_subwidget", + "forms_tests.widget_tests.test_radioselect.RadioSelectTest.test_render_attrs", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_constructor_generator", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_constuctor", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_escaping", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_optgroup", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_select_inner", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_select_outer", + "forms_tests.widget_tests.test_select.SelectTest.test_choices_unicode", + "forms_tests.widget_tests.test_select.SelectTest.test_compare_to_str", + "forms_tests.widget_tests.test_select.SelectTest.test_constructor_attrs", + "forms_tests.widget_tests.test_select.SelectTest.test_deepcopy", + "forms_tests.widget_tests.test_select.SelectTest.test_doesnt_localize_option_value", + "forms_tests.widget_tests.test_select.SelectTest.test_doesnt_render_required_when_impossible_to_select_empty_field", + "forms_tests.widget_tests.test_select.SelectTest.test_doesnt_render_required_when_no_choices_are_available", + "forms_tests.widget_tests.test_select.SelectTest.test_optgroups", + "forms_tests.widget_tests.test_select.SelectTest.test_optgroups_integer_choices", + "forms_tests.widget_tests.test_select.SelectTest.test_options", + "forms_tests.widget_tests.test_select.SelectTest.test_render", + "forms_tests.widget_tests.test_select.SelectTest.test_render_label_value", + "forms_tests.widget_tests.test_select.SelectTest.test_render_none", + "forms_tests.widget_tests.test_select.SelectTest.test_render_selected", + "forms_tests.widget_tests.test_select.SelectTest.test_renders_required_when_possible_to_select_empty_field_list", + "forms_tests.widget_tests.test_select.SelectTest.test_renders_required_when_possible_to_select_empty_field_none", + "forms_tests.widget_tests.test_select.SelectTest.test_renders_required_when_possible_to_select_empty_field_str", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_custom_months", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_format_value", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_l10n", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_render_datetime", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_render_empty", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_render_invalid_date", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_render_none", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_render_string", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_selectdate_empty_label", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_selectdate_required", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_value_from_datadict", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_selectdatewidget.SelectDateWidgetTest.test_years_rendered_without_separator", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_compare_string", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_format_value", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_multiple_options_same_value", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_multiple_values_invalid", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_optgroup_select_multiple", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_render_multiple_selected", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_render_none", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_render_selected", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_render_value_label", + "forms_tests.widget_tests.test_selectmultiple.SelectMultipleTest.test_value_omitted_from_data", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_constructor_attrs", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_constructor_different_attrs", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_formatting", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_render_date_and_time", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_render_datetime", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_render_empty", + "forms_tests.widget_tests.test_splitdatetimewidget.SplitDateTimeWidgetTest.test_render_none", + "forms_tests.widget_tests.test_splithiddendatetimewidget.SplitHiddenDateTimeWidgetTest.test_constructor_different_attrs", + "forms_tests.widget_tests.test_splithiddendatetimewidget.SplitHiddenDateTimeWidgetTest.test_l10n", + "forms_tests.widget_tests.test_splithiddendatetimewidget.SplitHiddenDateTimeWidgetTest.test_render_empty", + "forms_tests.widget_tests.test_splithiddendatetimewidget.SplitHiddenDateTimeWidgetTest.test_render_value", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_escaping", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_mark_safe", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_render", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_render_empty", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_render_none", + "forms_tests.widget_tests.test_textarea.TextareaTest.test_render_required", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_attrs_precedence", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_attrs_safestring", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_constructor_attrs", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_boolean", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_custom_attrs", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_none", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_quoted", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_unicode", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_render_value", + "forms_tests.widget_tests.test_textinput.TextInputTest.test_use_required_attribute", + "forms_tests.widget_tests.test_timeinput.TimeInputTest.test_format", + "forms_tests.widget_tests.test_timeinput.TimeInputTest.test_l10n", + "forms_tests.widget_tests.test_timeinput.TimeInputTest.test_render_none", + "forms_tests.widget_tests.test_timeinput.TimeInputTest.test_render_value", + "forms_tests.widget_tests.test_timeinput.TimeInputTest.test_string", + "forms_tests.widget_tests.test_widget.WidgetTests.test_attr_false_not_rendered", + "forms_tests.widget_tests.test_widget.WidgetTests.test_format_value", + "forms_tests.widget_tests.test_widget.WidgetTests.test_no_trailing_newline_in_attrs", + "forms_tests.widget_tests.test_widget.WidgetTests.test_value_omitted_from_data", + "gis_tests.gis_migrations.test_commands.MigrateTests.test_migrate_gis", + "gis_tests.test_gis_tests_utils.FuncTestMixinTests.test_mutated_attribute", + "gis_tests.test_gis_tests_utils.FuncTestMixinTests.test_mutated_expression", + "gis_tests.test_gis_tests_utils.FuncTestMixinTests.test_mutated_expression_deep", + "gis_tests.test_gis_tests_utils.FuncTestMixinTests.test_mutated_expressions", + "gis_tests.test_gis_tests_utils.FuncTestMixinTests.test_not_mutated", + "gis_tests.test_measure.AreaTest.testAccess", + "gis_tests.test_measure.AreaTest.testAccessInvaliA", + "gis_tests.test_measure.AreaTest.testAddition", + "gis_tests.test_measure.AreaTest.testComparisons", + "gis_tests.test_measure.AreaTest.testInit", + "gis_tests.test_measure.AreaTest.testInitInvaliA", + "gis_tests.test_measure.AreaTest.testMultiplication", + "gis_tests.test_measure.AreaTest.testUnitConversions", + "gis_tests.test_measure.AreaTest.testUnitsStr", + "gis_tests.test_measure.DistanceTest.testAccess", + "gis_tests.test_measure.DistanceTest.testAccessInvalid", + "gis_tests.test_measure.DistanceTest.testAddition", + "gis_tests.test_measure.DistanceTest.testComparisons", + "gis_tests.test_measure.DistanceTest.testInit", + "gis_tests.test_measure.DistanceTest.testInitInvalid", + "gis_tests.test_measure.DistanceTest.testMultiplication", + "gis_tests.test_measure.DistanceTest.testUnitAttName", + "gis_tests.test_measure.DistanceTest.testUnitConversions", + "gis_tests.test_measure.DistanceTest.testUnitsStr", + "gis_tests.test_ptr.CPointerBaseTests.test", + "gis_tests.test_ptr.CPointerBaseTests.test_destructor_catches_importerror", + "gis_tests.test_spatialrefsys.SpatialRefSysTest.test_add_entry", + "gis_tests.test_spatialrefsys.SpatialRefSysTest.test_ellipsoid", + "gis_tests.test_spatialrefsys.SpatialRefSysTest.test_get_units", + "gis_tests.test_spatialrefsys.SpatialRefSysTest.test_osr", + "gis_tests.test_spatialrefsys.SpatialRefSysTest.test_retrieve", + "handlers.test_exception.ExceptionHandlerTests.test_data_upload_max_memory_size_exceeded", + "handlers.test_exception.ExceptionHandlerTests.test_data_upload_max_number_fields_exceeded", + "handlers.tests.HandlerRequestTests.test_environ_path_info_type", + "handlers.tests.HandlerRequestTests.test_handle_accepts_httpstatus_enum_value", + "handlers.tests.HandlerRequestTests.test_invalid_urls", + "handlers.tests.HandlerRequestTests.test_middleware_returns_none", + "handlers.tests.HandlerRequestTests.test_no_response", + "handlers.tests.HandlerRequestTests.test_suspiciousop_in_view_returns_400", + "handlers.tests.HandlerTests.test_bad_path_info", + "handlers.tests.HandlerTests.test_invalid_multipart_boundary", + "handlers.tests.HandlerTests.test_invalid_unicode_cookie", + "handlers.tests.HandlerTests.test_middleware_initialized", + "handlers.tests.HandlerTests.test_non_ascii_cookie", + "handlers.tests.HandlerTests.test_non_ascii_query_string", + "handlers.tests.ScriptNameTests.test_get_script_name", + "handlers.tests.ScriptNameTests.test_get_script_name_double_slashes", + "handlers.tests.SignalsTests.test_request_signals", + "handlers.tests.SignalsTests.test_request_signals_streaming_response", + "handlers.tests.TransactionsPerRequestTests.test_auto_transaction", + "handlers.tests.TransactionsPerRequestTests.test_no_auto_transaction", + "handlers.tests.TransactionsPerRequestTests.test_no_transaction", + "handlers.tests_custom_error_handlers.CustomErrorHandlerTests.test_handler_renders_template_response", + "httpwrappers.tests.CookieTests.test_cookie_edgecases", + "httpwrappers.tests.CookieTests.test_decode", + "httpwrappers.tests.CookieTests.test_encode", + "httpwrappers.tests.CookieTests.test_httponly_after_load", + "httpwrappers.tests.CookieTests.test_invalid_cookies", + "httpwrappers.tests.CookieTests.test_load_dict", + "httpwrappers.tests.CookieTests.test_nonstandard_keys", + "httpwrappers.tests.CookieTests.test_pickle", + "httpwrappers.tests.CookieTests.test_python_cookies", + "httpwrappers.tests.CookieTests.test_repeated_nonstandard_keys", + "httpwrappers.tests.CookieTests.test_samesite", + "httpwrappers.tests.FileCloseTests.test_response", + "httpwrappers.tests.FileCloseTests.test_streaming_response", + "httpwrappers.tests.HttpResponseSubclassesTests.test_invalid_redirect_repr", + "httpwrappers.tests.HttpResponseSubclassesTests.test_not_allowed", + "httpwrappers.tests.HttpResponseSubclassesTests.test_not_allowed_repr", + "httpwrappers.tests.HttpResponseSubclassesTests.test_not_allowed_repr_no_content_type", + "httpwrappers.tests.HttpResponseSubclassesTests.test_not_modified", + "httpwrappers.tests.HttpResponseSubclassesTests.test_not_modified_repr", + "httpwrappers.tests.HttpResponseSubclassesTests.test_redirect", + "httpwrappers.tests.HttpResponseSubclassesTests.test_redirect_lazy", + "httpwrappers.tests.HttpResponseSubclassesTests.test_redirect_repr", + "httpwrappers.tests.HttpResponseTests.test_dict_behavior", + "httpwrappers.tests.HttpResponseTests.test_file_interface", + "httpwrappers.tests.HttpResponseTests.test_headers_type", + "httpwrappers.tests.HttpResponseTests.test_iter_content", + "httpwrappers.tests.HttpResponseTests.test_iterator_isnt_rewound", + "httpwrappers.tests.HttpResponseTests.test_lazy_content", + "httpwrappers.tests.HttpResponseTests.test_long_line", + "httpwrappers.tests.HttpResponseTests.test_newlines_in_headers", + "httpwrappers.tests.HttpResponseTests.test_non_string_content", + "httpwrappers.tests.HttpResponseTests.test_stream_interface", + "httpwrappers.tests.HttpResponseTests.test_unsafe_redirect", + "httpwrappers.tests.JsonResponseTests.test_json_response_custom_encoder", + "httpwrappers.tests.JsonResponseTests.test_json_response_list", + "httpwrappers.tests.JsonResponseTests.test_json_response_non_ascii", + "httpwrappers.tests.JsonResponseTests.test_json_response_passing_arguments_to_json_dumps", + "httpwrappers.tests.JsonResponseTests.test_json_response_raises_type_error_with_default_setting", + "httpwrappers.tests.JsonResponseTests.test_json_response_text", + "httpwrappers.tests.JsonResponseTests.test_json_response_uuid", + "httpwrappers.tests.QueryDictTests.test_basic_mutable_operations", + "httpwrappers.tests.QueryDictTests.test_create_with_no_args", + "httpwrappers.tests.QueryDictTests.test_duplicates_in_fromkeys_iterable", + "httpwrappers.tests.QueryDictTests.test_fromkeys_empty_iterable", + "httpwrappers.tests.QueryDictTests.test_fromkeys_is_immutable_by_default", + "httpwrappers.tests.QueryDictTests.test_fromkeys_mutable_override", + "httpwrappers.tests.QueryDictTests.test_fromkeys_noniterable", + "httpwrappers.tests.QueryDictTests.test_fromkeys_with_nondefault_encoding", + "httpwrappers.tests.QueryDictTests.test_fromkeys_with_nonempty_value", + "httpwrappers.tests.QueryDictTests.test_immutability", + "httpwrappers.tests.QueryDictTests.test_immutable_basic_operations", + "httpwrappers.tests.QueryDictTests.test_immutable_get_with_default", + "httpwrappers.tests.QueryDictTests.test_missing_key", + "httpwrappers.tests.QueryDictTests.test_multiple_keys", + "httpwrappers.tests.QueryDictTests.test_mutable_copy", + "httpwrappers.tests.QueryDictTests.test_mutable_delete", + "httpwrappers.tests.QueryDictTests.test_non_default_encoding", + "httpwrappers.tests.QueryDictTests.test_pickle", + "httpwrappers.tests.QueryDictTests.test_querydict_fromkeys", + "httpwrappers.tests.QueryDictTests.test_single_key_value", + "httpwrappers.tests.QueryDictTests.test_update_from_querydict", + "httpwrappers.tests.QueryDictTests.test_urlencode", + "httpwrappers.tests.QueryDictTests.test_urlencode_int", + "httpwrappers.tests.StreamingHttpResponseTests.test_streaming_response", + "humanize_tests.tests.HumanizeTests.test_apnumber", + "humanize_tests.tests.HumanizeTests.test_i18n_html_ordinal", + "humanize_tests.tests.HumanizeTests.test_i18n_intcomma", + "humanize_tests.tests.HumanizeTests.test_i18n_intword", + "humanize_tests.tests.HumanizeTests.test_inflection_for_timedelta", + "humanize_tests.tests.HumanizeTests.test_intcomma", + "humanize_tests.tests.HumanizeTests.test_intcomma_without_number_grouping", + "humanize_tests.tests.HumanizeTests.test_intword", + "humanize_tests.tests.HumanizeTests.test_l10n_intcomma", + "humanize_tests.tests.HumanizeTests.test_naturalday", + "humanize_tests.tests.HumanizeTests.test_naturalday_tz", + "humanize_tests.tests.HumanizeTests.test_naturalday_uses_localtime", + "humanize_tests.tests.HumanizeTests.test_naturaltime", + "humanize_tests.tests.HumanizeTests.test_naturaltime_as_documented", + "humanize_tests.tests.HumanizeTests.test_ordinal", + "i18n.contenttypes.tests.ContentTypeTests.test_verbose_name", + "i18n.patterns.tests.PathUnusedTests.test_no_lang_activate", + "i18n.patterns.tests.RequestURLConfTests.test_request_urlconf_considered", + "i18n.patterns.tests.URLDisabledTests.test_prefixed_i18n_disabled", + "i18n.patterns.tests.URLNamespaceTests.test_account_register", + "i18n.patterns.tests.URLPrefixTests.test_invalid_prefix_use", + "i18n.patterns.tests.URLPrefixTests.test_not_prefixed", + "i18n.patterns.tests.URLPrefixTests.test_prefixed", + "i18n.patterns.tests.URLRedirectTests.test_custom_redirect_class", + "i18n.patterns.tests.URLRedirectTests.test_en_redirect", + "i18n.patterns.tests.URLRedirectTests.test_en_redirect_wrong_url", + "i18n.patterns.tests.URLRedirectTests.test_nl_redirect", + "i18n.patterns.tests.URLRedirectTests.test_nl_redirect_wrong_url", + "i18n.patterns.tests.URLRedirectTests.test_no_prefix_response", + "i18n.patterns.tests.URLRedirectTests.test_pl_pl_redirect", + "i18n.patterns.tests.URLRedirectTests.test_pt_br_redirect", + "i18n.patterns.tests.URLRedirectWithScriptAliasTests.test_language_prefix_with_script_prefix", + "i18n.patterns.tests.URLRedirectWithoutTrailingSlashSettingTests.test_en_redirect", + "i18n.patterns.tests.URLRedirectWithoutTrailingSlashSettingTests.test_not_prefixed_redirect", + "i18n.patterns.tests.URLRedirectWithoutTrailingSlashTests.test_en_redirect", + "i18n.patterns.tests.URLRedirectWithoutTrailingSlashTests.test_not_prefixed_redirect", + "i18n.patterns.tests.URLResponseTests.test_en_path", + "i18n.patterns.tests.URLResponseTests.test_en_url", + "i18n.patterns.tests.URLResponseTests.test_nl_path", + "i18n.patterns.tests.URLResponseTests.test_nl_url", + "i18n.patterns.tests.URLResponseTests.test_not_prefixed_with_prefix", + "i18n.patterns.tests.URLResponseTests.test_pt_br_url", + "i18n.patterns.tests.URLResponseTests.test_wrong_en_prefix", + "i18n.patterns.tests.URLResponseTests.test_wrong_nl_prefix", + "i18n.patterns.tests.URLTagTests.test_args", + "i18n.patterns.tests.URLTagTests.test_context", + "i18n.patterns.tests.URLTagTests.test_kwargs", + "i18n.patterns.tests.URLTagTests.test_strings_only", + "i18n.patterns.tests.URLTranslationTests.test_no_prefix_translated", + "i18n.patterns.tests.URLTranslationTests.test_translate_url_utility", + "i18n.patterns.tests.URLTranslationTests.test_users_url", + "i18n.patterns.tests.URLVaryAcceptLanguageTests.test_en_redirect", + "i18n.patterns.tests.URLVaryAcceptLanguageTests.test_no_prefix_response", + "i18n.test_compilation.AppCompilationTest.test_app_locale_compiled", + "i18n.test_compilation.CompilationErrorHandling.test_error_reported_by_msgfmt", + "i18n.test_compilation.CompilationErrorHandling.test_msgfmt_error_including_non_ascii", + "i18n.test_compilation.ExcludedLocaleCompilationTests.test_command_help", + "i18n.test_compilation.ExcludedLocaleCompilationTests.test_multiple_locales_excluded", + "i18n.test_compilation.ExcludedLocaleCompilationTests.test_multiple_locales_excluded_with_locale", + "i18n.test_compilation.ExcludedLocaleCompilationTests.test_one_locale_excluded", + "i18n.test_compilation.ExcludedLocaleCompilationTests.test_one_locale_excluded_with_locale", + "i18n.test_compilation.FuzzyTranslationTest.test_fuzzy_compiling", + "i18n.test_compilation.FuzzyTranslationTest.test_nofuzzy_compiling", + "i18n.test_compilation.MultipleLocaleCompilationTests.test_multiple_locales", + "i18n.test_compilation.MultipleLocaleCompilationTests.test_one_locale", + "i18n.test_compilation.PoFileContentsTests.test_percent_symbol_in_po_file", + "i18n.test_compilation.PoFileTests.test_bom_rejection", + "i18n.test_compilation.PoFileTests.test_no_write_access", + "i18n.test_extraction.BasicExtractorTests.test_blocktrans_trimmed", + "i18n.test_extraction.BasicExtractorTests.test_comments_extractor", + "i18n.test_extraction.BasicExtractorTests.test_context_in_single_quotes", + "i18n.test_extraction.BasicExtractorTests.test_extraction_error", + "i18n.test_extraction.BasicExtractorTests.test_extraction_warning", + "i18n.test_extraction.BasicExtractorTests.test_makemessages_find_files", + "i18n.test_extraction.BasicExtractorTests.test_makemessages_gettext_version", + "i18n.test_extraction.BasicExtractorTests.test_po_file_encoding_when_updating", + "i18n.test_extraction.BasicExtractorTests.test_pot_charset_header_is_utf8", + "i18n.test_extraction.BasicExtractorTests.test_special_char_extracted", + "i18n.test_extraction.BasicExtractorTests.test_template_comments", + "i18n.test_extraction.BasicExtractorTests.test_template_message_context_extractor", + "i18n.test_extraction.BasicExtractorTests.test_unicode_decode_error", + "i18n.test_extraction.BasicExtractorTests.test_unicode_file_name", + "i18n.test_extraction.BasicExtractorTests.test_use_i18n_false", + "i18n.test_extraction.CopyPluralFormsExtractorTests.test_copy_plural_forms", + "i18n.test_extraction.CopyPluralFormsExtractorTests.test_override_plural_forms", + "i18n.test_extraction.CopyPluralFormsExtractorTests.test_trans_and_plural_blocktrans_collision", + "i18n.test_extraction.CustomLayoutExtractionTests.test_no_locale_raises", + "i18n.test_extraction.CustomLayoutExtractionTests.test_project_locale_paths", + "i18n.test_extraction.ExcludedLocaleExtractionTests.test_command_help", + "i18n.test_extraction.ExcludedLocaleExtractionTests.test_multiple_locales_excluded", + "i18n.test_extraction.ExcludedLocaleExtractionTests.test_multiple_locales_excluded_with_locale", + "i18n.test_extraction.ExcludedLocaleExtractionTests.test_one_locale_excluded", + "i18n.test_extraction.ExcludedLocaleExtractionTests.test_one_locale_excluded_with_locale", + "i18n.test_extraction.IgnoredExtractorTests.test_ignore_directory", + "i18n.test_extraction.IgnoredExtractorTests.test_ignore_file_patterns", + "i18n.test_extraction.IgnoredExtractorTests.test_ignore_subdirectory", + "i18n.test_extraction.IgnoredExtractorTests.test_media_static_dirs_ignored", + "i18n.test_extraction.JavascriptExtractorTests.test_default_root_settings", + "i18n.test_extraction.JavascriptExtractorTests.test_javascript_literals", + "i18n.test_extraction.JavascriptExtractorTests.test_media_static_dirs_ignored", + "i18n.test_extraction.KeepPotFileExtractorTests.test_keep_pot_disabled_by_default", + "i18n.test_extraction.KeepPotFileExtractorTests.test_keep_pot_enabled", + "i18n.test_extraction.KeepPotFileExtractorTests.test_keep_pot_explicitly_disabled", + "i18n.test_extraction.LocationCommentsTests.test_add_location_file", + "i18n.test_extraction.LocationCommentsTests.test_add_location_full", + "i18n.test_extraction.LocationCommentsTests.test_add_location_gettext_version_check", + "i18n.test_extraction.LocationCommentsTests.test_add_location_never", + "i18n.test_extraction.LocationCommentsTests.test_location_comments_for_templatized_files", + "i18n.test_extraction.LocationCommentsTests.test_no_location_disabled", + "i18n.test_extraction.LocationCommentsTests.test_no_location_enabled", + "i18n.test_extraction.MultipleLocaleExtractionTests.test_all_locales", + "i18n.test_extraction.MultipleLocaleExtractionTests.test_multiple_locales", + "i18n.test_extraction.NoSettingsExtractionTests.test_makemessages_no_settings", + "i18n.test_extraction.NoWrapExtractorTests.test_no_wrap_disabled", + "i18n.test_extraction.NoWrapExtractorTests.test_no_wrap_enabled", + "i18n.test_extraction.SymlinkExtractorTests.test_symlink", + "i18n.test_management.TranslatableFileTests.test_eq", + "i18n.test_management.TranslatableFileTests.test_repr", + "i18n.test_percents.ExtractingStringsWithPercentSigns.test_adds_python_format_to_all_percent_signs", + "i18n.test_percents.ExtractingStringsWithPercentSigns.test_trans_tag_with_percent_symbol_at_the_end", + "i18n.test_percents.ExtractingStringsWithPercentSigns.test_trans_tag_with_percent_symbol_in_the_middle", + "i18n.test_percents.ExtractingStringsWithPercentSigns.test_trans_tag_with_string_that_look_like_fmt_spec", + "i18n.test_percents.RenderingTemplatesWithPercentSigns.test_translates_multiple_percent_signs", + "i18n.test_percents.RenderingTemplatesWithPercentSigns.test_translates_with_a_percent_symbol_at_the_end", + "i18n.test_percents.RenderingTemplatesWithPercentSigns.test_translates_with_percent_symbol_in_the_middle", + "i18n.test_percents.RenderingTemplatesWithPercentSigns.test_translates_with_percent_symbol_using_context", + "i18n.test_percents.RenderingTemplatesWithPercentSigns.test_translates_with_string_that_look_like_fmt_spec_with_trans", + "invalid_models_tests.test_backend_specific.BackendSpecificChecksTests.test_check_field", + "invalid_models_tests.test_custom_fields.CustomFieldTest.test_none_column", + "invalid_models_tests.test_deprecated_fields.DeprecatedFieldsTests.test_CommaSeparatedIntegerField_deprecated", + "invalid_models_tests.test_deprecated_fields.DeprecatedFieldsTests.test_IPAddressField_deprecated", + "invalid_models_tests.test_models.ConstraintsTests.test_check_constraints", + "invalid_models_tests.test_models.FieldNamesTests.test_M2M_long_column_name", + "invalid_models_tests.test_models.FieldNamesTests.test_db_column_clash", + "invalid_models_tests.test_models.FieldNamesTests.test_ending_with_underscore", + "invalid_models_tests.test_models.FieldNamesTests.test_including_separator", + "invalid_models_tests.test_models.FieldNamesTests.test_local_field_long_column_name", + "invalid_models_tests.test_models.FieldNamesTests.test_pk", + "invalid_models_tests.test_models.IndexTogetherTests.test_list_containing_non_iterable", + "invalid_models_tests.test_models.IndexTogetherTests.test_non_iterable", + "invalid_models_tests.test_models.IndexTogetherTests.test_non_list", + "invalid_models_tests.test_models.IndexTogetherTests.test_pointing_to_m2m_field", + "invalid_models_tests.test_models.IndexTogetherTests.test_pointing_to_missing_field", + "invalid_models_tests.test_models.IndexTogetherTests.test_pointing_to_non_local_field", + "invalid_models_tests.test_models.IndexesTests.test_pointing_to_m2m_field", + "invalid_models_tests.test_models.IndexesTests.test_pointing_to_missing_field", + "invalid_models_tests.test_models.IndexesTests.test_pointing_to_non_local_field", + "invalid_models_tests.test_models.OtherModelTests.test_just_order_with_respect_to_no_errors", + "invalid_models_tests.test_models.OtherModelTests.test_just_ordering_no_errors", + "invalid_models_tests.test_models.OtherModelTests.test_lazy_reference_checks", + "invalid_models_tests.test_models.OtherModelTests.test_m2m_autogenerated_table_name_clash", + "invalid_models_tests.test_models.OtherModelTests.test_m2m_field_table_name_clash", + "invalid_models_tests.test_models.OtherModelTests.test_m2m_table_name_clash", + "invalid_models_tests.test_models.OtherModelTests.test_m2m_to_concrete_and_proxy_allowed", + "invalid_models_tests.test_models.OtherModelTests.test_m2m_unmanaged_shadow_models_not_checked", + "invalid_models_tests.test_models.OtherModelTests.test_missing_parent_link", + "invalid_models_tests.test_models.OtherModelTests.test_name_beginning_with_underscore", + "invalid_models_tests.test_models.OtherModelTests.test_name_contains_double_underscores", + "invalid_models_tests.test_models.OtherModelTests.test_name_ending_with_underscore", + "invalid_models_tests.test_models.OtherModelTests.test_non_valid", + "invalid_models_tests.test_models.OtherModelTests.test_ordering_non_iterable", + "invalid_models_tests.test_models.OtherModelTests.test_ordering_pointing_to_foreignkey_field", + "invalid_models_tests.test_models.OtherModelTests.test_ordering_pointing_to_missing_field", + "invalid_models_tests.test_models.OtherModelTests.test_ordering_pointing_to_missing_foreignkey_field", + "invalid_models_tests.test_models.OtherModelTests.test_ordering_with_order_with_respect_to", + "invalid_models_tests.test_models.OtherModelTests.test_property_and_related_field_accessor_clash", + "invalid_models_tests.test_models.OtherModelTests.test_single_primary_key", + "invalid_models_tests.test_models.OtherModelTests.test_swappable_missing_app", + "invalid_models_tests.test_models.OtherModelTests.test_swappable_missing_app_name", + "invalid_models_tests.test_models.OtherModelTests.test_two_m2m_through_same_model_with_different_through_fields", + "invalid_models_tests.test_models.OtherModelTests.test_two_m2m_through_same_relationship", + "invalid_models_tests.test_models.OtherModelTests.test_unique_primary_key", + "invalid_models_tests.test_models.ShadowingFieldsTests.test_field_name_clash_with_child_accessor", + "invalid_models_tests.test_models.ShadowingFieldsTests.test_id_clash", + "invalid_models_tests.test_models.ShadowingFieldsTests.test_inheritance_clash", + "invalid_models_tests.test_models.ShadowingFieldsTests.test_multigeneration_inheritance", + "invalid_models_tests.test_models.ShadowingFieldsTests.test_multiinheritance_clash", + "invalid_models_tests.test_models.UniqueTogetherTests.test_list_containing_non_iterable", + "invalid_models_tests.test_models.UniqueTogetherTests.test_non_iterable", + "invalid_models_tests.test_models.UniqueTogetherTests.test_non_list", + "invalid_models_tests.test_models.UniqueTogetherTests.test_pointing_to_m2m", + "invalid_models_tests.test_models.UniqueTogetherTests.test_pointing_to_missing_field", + "invalid_models_tests.test_models.UniqueTogetherTests.test_valid_model", + "invalid_models_tests.test_ordinary_fields.AutoFieldTests.test_primary_key", + "invalid_models_tests.test_ordinary_fields.AutoFieldTests.test_valid_case", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_bad_db_index_value", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_bad_max_length_value", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_bad_validators", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_containing_lazy", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_containing_non_pairs", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_named_group", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_named_group_bad_structure", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_named_group_lazy", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_choices_named_group_non_pairs", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_iterable_of_iterable_choices", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_lazy_choices", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_missing_max_length", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_negative_max_length", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_non_iterable_choices", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_non_iterable_choices_two_letters", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_str_max_length_type", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_str_max_length_value", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_too_long_char_field_under_mysql", + "invalid_models_tests.test_ordinary_fields.CharFieldTests.test_valid_field", + "invalid_models_tests.test_ordinary_fields.DateFieldTests.test_auto_now_and_auto_now_add_raise_error", + "invalid_models_tests.test_ordinary_fields.DateFieldTests.test_fix_default_value", + "invalid_models_tests.test_ordinary_fields.DateFieldTests.test_fix_default_value_tz", + "invalid_models_tests.test_ordinary_fields.DateTimeFieldTests.test_fix_default_value", + "invalid_models_tests.test_ordinary_fields.DateTimeFieldTests.test_fix_default_value_tz", + "invalid_models_tests.test_ordinary_fields.DecimalFieldTests.test_bad_values_of_max_digits_and_decimal_places", + "invalid_models_tests.test_ordinary_fields.DecimalFieldTests.test_decimal_places_greater_than_max_digits", + "invalid_models_tests.test_ordinary_fields.DecimalFieldTests.test_negative_max_digits_and_decimal_places", + "invalid_models_tests.test_ordinary_fields.DecimalFieldTests.test_required_attributes", + "invalid_models_tests.test_ordinary_fields.DecimalFieldTests.test_valid_field", + "invalid_models_tests.test_ordinary_fields.FileFieldTests.test_primary_key", + "invalid_models_tests.test_ordinary_fields.FileFieldTests.test_upload_to_callable_not_checked", + "invalid_models_tests.test_ordinary_fields.FileFieldTests.test_upload_to_starts_with_slash", + "invalid_models_tests.test_ordinary_fields.FileFieldTests.test_valid_case", + "invalid_models_tests.test_ordinary_fields.FileFieldTests.test_valid_default_case", + "invalid_models_tests.test_ordinary_fields.FilePathFieldTests.test_forbidden_files_and_folders", + "invalid_models_tests.test_ordinary_fields.GenericIPAddressFieldTests.test_non_nullable_blank", + "invalid_models_tests.test_ordinary_fields.ImageFieldTests.test_pillow_installed", + "invalid_models_tests.test_ordinary_fields.IntegerFieldTests.test_max_length_warning", + "invalid_models_tests.test_ordinary_fields.TextFieldTests.test_max_length_warning", + "invalid_models_tests.test_ordinary_fields.TimeFieldTests.test_fix_default_value", + "invalid_models_tests.test_ordinary_fields.TimeFieldTests.test_fix_default_value_tz", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_clash_between_accessors", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_fk_to_fk", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_fk_to_integer", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_fk_to_m2m", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_m2m_to_fk", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_m2m_to_integer", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_m2m_to_m2m", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_m2m_to_m2m_with_inheritance", + "invalid_models_tests.test_relative_fields.AccessorClashTests.test_no_clash_for_hidden_related_name", + "invalid_models_tests.test_relative_fields.ComplexClashTests.test_complex_clash", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_fk_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_fk_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_fk_to_m2m", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_m2m_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_m2m_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedNameClashTests.test_m2m_to_m2m", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_fk_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_fk_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_fk_to_m2m", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_fk_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_fk_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_fk_to_m2m", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_m2m_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_m2m_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_hidden_m2m_to_m2m", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_m2m_to_fk", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_m2m_to_integer", + "invalid_models_tests.test_relative_fields.ExplicitRelatedQueryNameClashTests.test_m2m_to_m2m", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_explicit_field_names", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_intersection_foreign_object", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_invalid_field", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_invalid_order", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_m2m_field_argument_validation", + "invalid_models_tests.test_relative_fields.M2mThroughFieldsTests.test_superset_foreign_object", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_ambiguous_relationship_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_key_to_abstract_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_key_to_isolate_apps_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_key_to_missing_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_key_to_non_unique_field", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_key_to_non_unique_field_under_explicit_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_foreign_object_to_non_unique_fields", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_invalid_related_query_name", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_m2m_to_abstract_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_many_to_many_through_isolate_apps_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_many_to_many_to_isolate_apps_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_many_to_many_to_missing_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_many_to_many_with_limit_choices_auto_created_no_warning", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_many_to_many_with_useless_options", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_missing_relationship_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_missing_relationship_model_on_model_check", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_not_swapped_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_nullable_primary_key", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_on_delete_set_default_without_default_value", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_on_delete_set_null_on_non_nullable_field", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_referencing_to_swapped_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_related_field_has_invalid_related_name", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_related_field_has_valid_related_name", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_relationship_model_missing_foreign_key", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_relationship_model_with_foreign_key_to_wrong_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_symmetric_self_reference_with_intermediate_table", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_symmetric_self_reference_with_intermediate_table_and_through_fields", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_symmetrical_self_referential_field", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_to_fields_exist", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_to_fields_not_checked_if_related_model_doesnt_exist", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_too_many_foreign_keys_in_self_referential_model", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_unique_m2m", + "invalid_models_tests.test_relative_fields.RelativeFieldTests.test_valid_foreign_key_without_accessor", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_fk_to_fk", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_fk_to_integer", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_fk_to_m2m", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_m2m_to_fk", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_m2m_to_integer", + "invalid_models_tests.test_relative_fields.ReverseQueryNameClashTests.test_m2m_to_m2m", + "invalid_models_tests.test_relative_fields.SelfReferentialFKClashTests.test_accessor_clash", + "invalid_models_tests.test_relative_fields.SelfReferentialFKClashTests.test_clash_under_explicit_related_name", + "invalid_models_tests.test_relative_fields.SelfReferentialFKClashTests.test_reverse_query_name_clash", + "invalid_models_tests.test_relative_fields.SelfReferentialM2MClashTests.test_accessor_clash", + "invalid_models_tests.test_relative_fields.SelfReferentialM2MClashTests.test_clash_between_accessors", + "invalid_models_tests.test_relative_fields.SelfReferentialM2MClashTests.test_clash_under_explicit_related_name", + "invalid_models_tests.test_relative_fields.SelfReferentialM2MClashTests.test_reverse_query_name_clash", + "invalid_models_tests.test_relative_fields.SelfReferentialM2MClashTests.test_valid_model", + "logging_tests.tests.AdminEmailHandlerTest.test_accepts_args", + "logging_tests.tests.AdminEmailHandlerTest.test_accepts_args_and_request", + "logging_tests.tests.AdminEmailHandlerTest.test_customize_send_mail_method", + "logging_tests.tests.AdminEmailHandlerTest.test_disallowed_host_doesnt_crash", + "logging_tests.tests.AdminEmailHandlerTest.test_emit_non_ascii", + "logging_tests.tests.AdminEmailHandlerTest.test_fail_silently", + "logging_tests.tests.AdminEmailHandlerTest.test_subject_accepts_newlines", + "logging_tests.tests.AdminEmailHandlerTest.test_uses_custom_email_backend", + "logging_tests.tests.CallbackFilterTest.test_passes_on_record", + "logging_tests.tests.CallbackFilterTest.test_sense", + "logging_tests.tests.DefaultLoggingTests.test_django_logger", + "logging_tests.tests.DefaultLoggingTests.test_django_logger_debug", + "logging_tests.tests.DefaultLoggingTests.test_django_logger_info", + "logging_tests.tests.DefaultLoggingTests.test_django_logger_warning", + "logging_tests.tests.HandlerLoggingTests.test_internal_server_error", + "logging_tests.tests.HandlerLoggingTests.test_internal_server_error_599", + "logging_tests.tests.HandlerLoggingTests.test_multi_part_parser_error", + "logging_tests.tests.HandlerLoggingTests.test_page_found_no_warning", + "logging_tests.tests.HandlerLoggingTests.test_page_not_found_raised", + "logging_tests.tests.HandlerLoggingTests.test_page_not_found_warning", + "logging_tests.tests.HandlerLoggingTests.test_permission_denied", + "logging_tests.tests.HandlerLoggingTests.test_redirect_no_warning", + "logging_tests.tests.HandlerLoggingTests.test_uncaught_exception", + "logging_tests.tests.I18nLoggingTests.test_i18n_page_found_no_warning", + "logging_tests.tests.I18nLoggingTests.test_i18n_page_not_found_warning", + "logging_tests.tests.LogFormattersTests.test_server_formatter_default_format", + "logging_tests.tests.LogFormattersTests.test_server_formatter_styles", + "logging_tests.tests.LoggingFiltersTest.test_require_debug_false_filter", + "logging_tests.tests.LoggingFiltersTest.test_require_debug_true_filter", + "logging_tests.tests.SecurityLoggerTest.test_suspicious_email_admins", + "logging_tests.tests.SecurityLoggerTest.test_suspicious_operation_creates_log_message", + "logging_tests.tests.SecurityLoggerTest.test_suspicious_operation_uses_sublogger", + "logging_tests.tests.SettingsConfigTest.test_circular_dependency", + "logging_tests.tests.SettingsCustomLoggingTest.test_custom_logging", + "logging_tests.tests.SetupConfigureLogging.test_configure_initializes_logging", + "lookup.test_lookups.YearComparisonLookupTests.test_get_bound", + "mail.test_sendtestemail.SendTestEmailManagementCommand.test_admin_receivers", + "mail.test_sendtestemail.SendTestEmailManagementCommand.test_manager_and_admin_receivers", + "mail.test_sendtestemail.SendTestEmailManagementCommand.test_manager_receivers", + "mail.test_sendtestemail.SendTestEmailManagementCommand.test_multiple_receivers", + "mail.test_sendtestemail.SendTestEmailManagementCommand.test_single_receiver", + "mail.tests.ConsoleBackendTests.test_close_connection", + "mail.tests.ConsoleBackendTests.test_console_stream_kwarg", + "mail.tests.ConsoleBackendTests.test_empty_admins", + "mail.tests.ConsoleBackendTests.test_html_mail_admins", + "mail.tests.ConsoleBackendTests.test_html_mail_managers", + "mail.tests.ConsoleBackendTests.test_html_send_mail", + "mail.tests.ConsoleBackendTests.test_idn_send", + "mail.tests.ConsoleBackendTests.test_lazy_addresses", + "mail.tests.ConsoleBackendTests.test_manager_and_admin_mail_prefix", + "mail.tests.ConsoleBackendTests.test_message_cc_header", + "mail.tests.ConsoleBackendTests.test_plaintext_send_mail", + "mail.tests.ConsoleBackendTests.test_recipient_without_domain", + "mail.tests.ConsoleBackendTests.test_send", + "mail.tests.ConsoleBackendTests.test_send_long_lines", + "mail.tests.ConsoleBackendTests.test_send_many", + "mail.tests.ConsoleBackendTests.test_send_unicode", + "mail.tests.ConsoleBackendTests.test_send_verbose_name", + "mail.tests.ConsoleBackendTests.test_use_as_contextmanager", + "mail.tests.FileBackendTests.test_close_connection", + "mail.tests.FileBackendTests.test_empty_admins", + "mail.tests.FileBackendTests.test_file_sessions", + "mail.tests.FileBackendTests.test_html_mail_admins", + "mail.tests.FileBackendTests.test_html_mail_managers", + "mail.tests.FileBackendTests.test_html_send_mail", + "mail.tests.FileBackendTests.test_idn_send", + "mail.tests.FileBackendTests.test_lazy_addresses", + "mail.tests.FileBackendTests.test_manager_and_admin_mail_prefix", + "mail.tests.FileBackendTests.test_message_cc_header", + "mail.tests.FileBackendTests.test_plaintext_send_mail", + "mail.tests.FileBackendTests.test_recipient_without_domain", + "mail.tests.FileBackendTests.test_send", + "mail.tests.FileBackendTests.test_send_long_lines", + "mail.tests.FileBackendTests.test_send_many", + "mail.tests.FileBackendTests.test_send_unicode", + "mail.tests.FileBackendTests.test_send_verbose_name", + "mail.tests.FileBackendTests.test_use_as_contextmanager", + "mail.tests.LocmemBackendTests.test_close_connection", + "mail.tests.LocmemBackendTests.test_empty_admins", + "mail.tests.LocmemBackendTests.test_html_mail_admins", + "mail.tests.LocmemBackendTests.test_html_mail_managers", + "mail.tests.LocmemBackendTests.test_html_send_mail", + "mail.tests.LocmemBackendTests.test_idn_send", + "mail.tests.LocmemBackendTests.test_lazy_addresses", + "mail.tests.LocmemBackendTests.test_locmem_shared_messages", + "mail.tests.LocmemBackendTests.test_manager_and_admin_mail_prefix", + "mail.tests.LocmemBackendTests.test_message_cc_header", + "mail.tests.LocmemBackendTests.test_plaintext_send_mail", + "mail.tests.LocmemBackendTests.test_recipient_without_domain", + "mail.tests.LocmemBackendTests.test_send", + "mail.tests.LocmemBackendTests.test_send_long_lines", + "mail.tests.LocmemBackendTests.test_send_many", + "mail.tests.LocmemBackendTests.test_send_unicode", + "mail.tests.LocmemBackendTests.test_send_verbose_name", + "mail.tests.LocmemBackendTests.test_use_as_contextmanager", + "mail.tests.LocmemBackendTests.test_validate_multiline_headers", + "mail.tests.MailTests.test_arbitrary_keyword", + "mail.tests.MailTests.test_ascii", + "mail.tests.MailTests.test_attach_file", + "mail.tests.MailTests.test_attach_non_utf8_text_as_bytes", + "mail.tests.MailTests.test_attach_text_as_bytes", + "mail.tests.MailTests.test_attach_utf8_text_as_bytes", + "mail.tests.MailTests.test_attachments", + "mail.tests.MailTests.test_attachments_MIMEText", + "mail.tests.MailTests.test_attachments_two_tuple", + "mail.tests.MailTests.test_backend_arg", + "mail.tests.MailTests.test_cc", + "mail.tests.MailTests.test_cc_headers", + "mail.tests.MailTests.test_cc_in_headers_only", + "mail.tests.MailTests.test_connection_arg", + "mail.tests.MailTests.test_custom_backend", + "mail.tests.MailTests.test_custom_utf8_encoding", + "mail.tests.MailTests.test_dont_base64_encode", + "mail.tests.MailTests.test_dont_base64_encode_message_rfc822", + "mail.tests.MailTests.test_dont_mangle_from_in_body", + "mail.tests.MailTests.test_dummy_backend", + "mail.tests.MailTests.test_encoding", + "mail.tests.MailTests.test_from_header", + "mail.tests.MailTests.test_header_injection", + "mail.tests.MailTests.test_header_omitted_for_no_to_recipients", + "mail.tests.MailTests.test_message_header_overrides", + "mail.tests.MailTests.test_multiple_message_call", + "mail.tests.MailTests.test_multiple_recipients", + "mail.tests.MailTests.test_non_ascii_attachment_filename", + "mail.tests.MailTests.test_none_body", + "mail.tests.MailTests.test_recipients_as_string", + "mail.tests.MailTests.test_recipients_as_tuple", + "mail.tests.MailTests.test_recipients_with_empty_strings", + "mail.tests.MailTests.test_reply_to", + "mail.tests.MailTests.test_reply_to_header", + "mail.tests.MailTests.test_reply_to_in_headers_only", + "mail.tests.MailTests.test_safe_mime_multipart", + "mail.tests.MailTests.test_safe_mime_multipart_with_attachments", + "mail.tests.MailTests.test_sanitize_address", + "mail.tests.MailTests.test_space_continuation", + "mail.tests.MailTests.test_to_header", + "mail.tests.MailTests.test_to_in_headers_only", + "mail.tests.MailTests.test_unicode_address_header", + "mail.tests.MailTests.test_unicode_headers", + "mail.tests.MailTimeZoneTests.test_date_header_localtime", + "mail.tests.MailTimeZoneTests.test_date_header_utc", + "mail.tests.PythonGlobalState.test_7bit", + "mail.tests.PythonGlobalState.test_8bit_latin", + "mail.tests.PythonGlobalState.test_8bit_non_latin", + "mail.tests.PythonGlobalState.test_utf8", + "mail.tests.SMTPBackendStoppedServerTests.test_fail_silently_on_connection_error", + "mail.tests.SMTPBackendStoppedServerTests.test_server_stopped", + "mail.tests.SMTPBackendTests.test_auth_attempted", + "mail.tests.SMTPBackendTests.test_close_connection", + "mail.tests.SMTPBackendTests.test_connection_timeout_custom", + "mail.tests.SMTPBackendTests.test_connection_timeout_default", + "mail.tests.SMTPBackendTests.test_email_authentication_override_settings", + "mail.tests.SMTPBackendTests.test_email_authentication_use_settings", + "mail.tests.SMTPBackendTests.test_email_disabled_authentication", + "mail.tests.SMTPBackendTests.test_email_msg_uses_crlf", + "mail.tests.SMTPBackendTests.test_email_ssl_attempts_ssl_connection", + "mail.tests.SMTPBackendTests.test_email_ssl_certfile_default_disabled", + "mail.tests.SMTPBackendTests.test_email_ssl_certfile_override_settings", + "mail.tests.SMTPBackendTests.test_email_ssl_certfile_use_settings", + "mail.tests.SMTPBackendTests.test_email_ssl_default_disabled", + "mail.tests.SMTPBackendTests.test_email_ssl_keyfile_default_disabled", + "mail.tests.SMTPBackendTests.test_email_ssl_keyfile_override_settings", + "mail.tests.SMTPBackendTests.test_email_ssl_keyfile_use_settings", + "mail.tests.SMTPBackendTests.test_email_ssl_override_settings", + "mail.tests.SMTPBackendTests.test_email_ssl_use_settings", + "mail.tests.SMTPBackendTests.test_email_timeout_override_settings", + "mail.tests.SMTPBackendTests.test_email_tls_attempts_starttls", + "mail.tests.SMTPBackendTests.test_email_tls_default_disabled", + "mail.tests.SMTPBackendTests.test_email_tls_override_settings", + "mail.tests.SMTPBackendTests.test_email_tls_use_settings", + "mail.tests.SMTPBackendTests.test_empty_admins", + "mail.tests.SMTPBackendTests.test_html_mail_admins", + "mail.tests.SMTPBackendTests.test_html_mail_managers", + "mail.tests.SMTPBackendTests.test_html_send_mail", + "mail.tests.SMTPBackendTests.test_idn_send", + "mail.tests.SMTPBackendTests.test_lazy_addresses", + "mail.tests.SMTPBackendTests.test_manager_and_admin_mail_prefix", + "mail.tests.SMTPBackendTests.test_message_cc_header", + "mail.tests.SMTPBackendTests.test_plaintext_send_mail", + "mail.tests.SMTPBackendTests.test_recipient_without_domain", + "mail.tests.SMTPBackendTests.test_reopen_connection", + "mail.tests.SMTPBackendTests.test_send", + "mail.tests.SMTPBackendTests.test_send_long_lines", + "mail.tests.SMTPBackendTests.test_send_many", + "mail.tests.SMTPBackendTests.test_send_messages_after_open_failed", + "mail.tests.SMTPBackendTests.test_send_messages_empty_list", + "mail.tests.SMTPBackendTests.test_send_messages_zero_sent", + "mail.tests.SMTPBackendTests.test_send_unicode", + "mail.tests.SMTPBackendTests.test_send_verbose_name", + "mail.tests.SMTPBackendTests.test_server_login", + "mail.tests.SMTPBackendTests.test_server_open", + "mail.tests.SMTPBackendTests.test_ssl_tls_mutually_exclusive", + "mail.tests.SMTPBackendTests.test_use_as_contextmanager", + "messages_tests.test_api.ApiTests.test_middleware_missing", + "messages_tests.test_api.ApiTests.test_middleware_missing_silently", + "messages_tests.test_api.ApiTests.test_ok", + "messages_tests.test_api.ApiTests.test_request_is_none", + "messages_tests.test_api.CustomRequestApiTests.test_middleware_missing", + "messages_tests.test_api.CustomRequestApiTests.test_middleware_missing_silently", + "messages_tests.test_api.CustomRequestApiTests.test_ok", + "messages_tests.test_api.CustomRequestApiTests.test_request_is_none", + "messages_tests.test_cookie.CookieTests.test_add", + "messages_tests.test_cookie.CookieTests.test_add_lazy_translation", + "messages_tests.test_cookie.CookieTests.test_add_update", + "messages_tests.test_cookie.CookieTests.test_context_processor_message_levels", + "messages_tests.test_cookie.CookieTests.test_cookie_setings", + "messages_tests.test_cookie.CookieTests.test_custom_tags", + "messages_tests.test_cookie.CookieTests.test_default_level", + "messages_tests.test_cookie.CookieTests.test_existing_add", + "messages_tests.test_cookie.CookieTests.test_existing_add_read_update", + "messages_tests.test_cookie.CookieTests.test_existing_read", + "messages_tests.test_cookie.CookieTests.test_existing_read_add_update", + "messages_tests.test_cookie.CookieTests.test_full_request_response_cycle", + "messages_tests.test_cookie.CookieTests.test_get", + "messages_tests.test_cookie.CookieTests.test_get_bad_cookie", + "messages_tests.test_cookie.CookieTests.test_high_level", + "messages_tests.test_cookie.CookieTests.test_json_encoder_decoder", + "messages_tests.test_cookie.CookieTests.test_level_tag", + "messages_tests.test_cookie.CookieTests.test_low_level", + "messages_tests.test_cookie.CookieTests.test_max_cookie_length", + "messages_tests.test_cookie.CookieTests.test_middleware_disabled", + "messages_tests.test_cookie.CookieTests.test_middleware_disabled_fail_silently", + "messages_tests.test_cookie.CookieTests.test_multiple_posts", + "messages_tests.test_cookie.CookieTests.test_no_update", + "messages_tests.test_cookie.CookieTests.test_pre_1_5_message_format", + "messages_tests.test_cookie.CookieTests.test_safedata", + "messages_tests.test_cookie.CookieTests.test_settings_level", + "messages_tests.test_cookie.CookieTests.test_tags", + "messages_tests.test_cookie.CookieTests.test_with_template_response", + "messages_tests.test_fallback.FallbackTests.test_add", + "messages_tests.test_fallback.FallbackTests.test_add_lazy_translation", + "messages_tests.test_fallback.FallbackTests.test_add_update", + "messages_tests.test_fallback.FallbackTests.test_context_processor_message_levels", + "messages_tests.test_fallback.FallbackTests.test_custom_tags", + "messages_tests.test_fallback.FallbackTests.test_default_level", + "messages_tests.test_fallback.FallbackTests.test_existing_add", + "messages_tests.test_fallback.FallbackTests.test_existing_add_read_update", + "messages_tests.test_fallback.FallbackTests.test_existing_read", + "messages_tests.test_fallback.FallbackTests.test_existing_read_add_update", + "messages_tests.test_fallback.FallbackTests.test_flush_used_backends", + "messages_tests.test_fallback.FallbackTests.test_full_request_response_cycle", + "messages_tests.test_fallback.FallbackTests.test_get", + "messages_tests.test_fallback.FallbackTests.test_get_empty", + "messages_tests.test_fallback.FallbackTests.test_get_fallback", + "messages_tests.test_fallback.FallbackTests.test_get_fallback_only", + "messages_tests.test_fallback.FallbackTests.test_high_level", + "messages_tests.test_fallback.FallbackTests.test_level_tag", + "messages_tests.test_fallback.FallbackTests.test_low_level", + "messages_tests.test_fallback.FallbackTests.test_middleware_disabled", + "messages_tests.test_fallback.FallbackTests.test_middleware_disabled_fail_silently", + "messages_tests.test_fallback.FallbackTests.test_multiple_posts", + "messages_tests.test_fallback.FallbackTests.test_no_fallback", + "messages_tests.test_fallback.FallbackTests.test_no_update", + "messages_tests.test_fallback.FallbackTests.test_session_fallback", + "messages_tests.test_fallback.FallbackTests.test_session_fallback_only", + "messages_tests.test_fallback.FallbackTests.test_settings_level", + "messages_tests.test_fallback.FallbackTests.test_tags", + "messages_tests.test_fallback.FallbackTests.test_with_template_response", + "messages_tests.test_middleware.MiddlewareTests.test_response_without_messages", + "messages_tests.test_mixins.SuccessMessageMixinTests.test_set_messages_success", + "messages_tests.test_session.SessionTests.test_add", + "messages_tests.test_session.SessionTests.test_add_lazy_translation", + "messages_tests.test_session.SessionTests.test_add_update", + "messages_tests.test_session.SessionTests.test_context_processor_message_levels", + "messages_tests.test_session.SessionTests.test_custom_tags", + "messages_tests.test_session.SessionTests.test_default_level", + "messages_tests.test_session.SessionTests.test_existing_add", + "messages_tests.test_session.SessionTests.test_existing_add_read_update", + "messages_tests.test_session.SessionTests.test_existing_read", + "messages_tests.test_session.SessionTests.test_existing_read_add_update", + "messages_tests.test_session.SessionTests.test_full_request_response_cycle", + "messages_tests.test_session.SessionTests.test_get", + "messages_tests.test_session.SessionTests.test_high_level", + "messages_tests.test_session.SessionTests.test_level_tag", + "messages_tests.test_session.SessionTests.test_low_level", + "messages_tests.test_session.SessionTests.test_middleware_disabled", + "messages_tests.test_session.SessionTests.test_middleware_disabled_fail_silently", + "messages_tests.test_session.SessionTests.test_multiple_posts", + "messages_tests.test_session.SessionTests.test_no_update", + "messages_tests.test_session.SessionTests.test_safedata", + "messages_tests.test_session.SessionTests.test_settings_level", + "messages_tests.test_session.SessionTests.test_tags", + "messages_tests.test_session.SessionTests.test_with_template_response", + "middleware.test_security.SecurityMiddlewareTest.test_content_type_already_present", + "middleware.test_security.SecurityMiddlewareTest.test_content_type_off", + "middleware.test_security.SecurityMiddlewareTest.test_content_type_on", + "middleware.test_security.SecurityMiddlewareTest.test_no_redirect_ssl", + "middleware.test_security.SecurityMiddlewareTest.test_redirect_exempt", + "middleware.test_security.SecurityMiddlewareTest.test_redirect_ssl_host", + "middleware.test_security.SecurityMiddlewareTest.test_ssl_redirect_off", + "middleware.test_security.SecurityMiddlewareTest.test_ssl_redirect_on", + "middleware.test_security.SecurityMiddlewareTest.test_sts_already_present", + "middleware.test_security.SecurityMiddlewareTest.test_sts_include_subdomains", + "middleware.test_security.SecurityMiddlewareTest.test_sts_no_include_subdomains", + "middleware.test_security.SecurityMiddlewareTest.test_sts_no_preload", + "middleware.test_security.SecurityMiddlewareTest.test_sts_off", + "middleware.test_security.SecurityMiddlewareTest.test_sts_on", + "middleware.test_security.SecurityMiddlewareTest.test_sts_only_if_secure", + "middleware.test_security.SecurityMiddlewareTest.test_sts_preload", + "middleware.test_security.SecurityMiddlewareTest.test_sts_subdomains_and_preload", + "middleware.test_security.SecurityMiddlewareTest.test_xss_filter_already_present", + "middleware.test_security.SecurityMiddlewareTest.test_xss_filter_off", + "middleware.test_security.SecurityMiddlewareTest.test_xss_filter_on", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_404_error_reporting", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_404_error_reporting_ignored_url", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_404_error_reporting_no_referer", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_custom_request_checker", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_referer_equal_to_requested_url", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_referer_equal_to_requested_url_on_another_domain", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_referer_equal_to_requested_url_without_trailing_slash_when_append_slash_is_set", + "middleware.tests.BrokenLinkEmailsMiddlewareTest.test_referer_equal_to_requested_url_without_trailing_slash_when_append_slash_is_unset", + "middleware.tests.CommonMiddlewareTest.test_append_slash_disabled", + "middleware.tests.CommonMiddlewareTest.test_append_slash_disabled_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_have_slash", + "middleware.tests.CommonMiddlewareTest.test_append_slash_have_slash_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_leading_slashes", + "middleware.tests.CommonMiddlewareTest.test_append_slash_no_redirect_on_POST_in_DEBUG", + "middleware.tests.CommonMiddlewareTest.test_append_slash_no_redirect_on_POST_in_DEBUG_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_quoted", + "middleware.tests.CommonMiddlewareTest.test_append_slash_quoted_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_redirect", + "middleware.tests.CommonMiddlewareTest.test_append_slash_redirect_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_redirect_querystring", + "middleware.tests.CommonMiddlewareTest.test_append_slash_redirect_querystring_have_slash", + "middleware.tests.CommonMiddlewareTest.test_append_slash_slashless_resource", + "middleware.tests.CommonMiddlewareTest.test_append_slash_slashless_resource_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_append_slash_slashless_unknown", + "middleware.tests.CommonMiddlewareTest.test_append_slash_slashless_unknown_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_content_length_header_added", + "middleware.tests.CommonMiddlewareTest.test_content_length_header_not_added_for_streaming_response", + "middleware.tests.CommonMiddlewareTest.test_content_length_header_not_changed", + "middleware.tests.CommonMiddlewareTest.test_disallowed_user_agents", + "middleware.tests.CommonMiddlewareTest.test_non_ascii_query_string_does_not_crash", + "middleware.tests.CommonMiddlewareTest.test_prepend_www", + "middleware.tests.CommonMiddlewareTest.test_prepend_www_append_slash_have_slash", + "middleware.tests.CommonMiddlewareTest.test_prepend_www_append_slash_have_slash_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_prepend_www_append_slash_slashless", + "middleware.tests.CommonMiddlewareTest.test_prepend_www_append_slash_slashless_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_prepend_www_custom_urlconf", + "middleware.tests.CommonMiddlewareTest.test_response_redirect_class", + "middleware.tests.CommonMiddlewareTest.test_response_redirect_class_subclass", + "middleware.tests.ConditionalGetMiddlewareTest.test_etag_extended_cache_control", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_client_error", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_last_modified_in_the_future", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_last_modified_in_the_past", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_no_last_modified", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_redirect", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_modified_since_and_same_last_modified", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_none_match_and_client_error", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_none_match_and_different_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_none_match_and_no_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_none_match_and_redirect", + "middleware.tests.ConditionalGetMiddlewareTest.test_if_none_match_and_same_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_middleware_calculates_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_middleware_wont_overwrite_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_etag_no_store_cache", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_etag_streaming_response", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_head", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_if_modified_since_and_last_modified", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_if_none_match_and_etag", + "middleware.tests.ConditionalGetMiddlewareTest.test_no_unsafe", + "middleware.tests.ConditionalGetMiddlewareTest.test_not_modified_headers", + "middleware.tests.ETagGZipMiddlewareTest.test_etag_match", + "middleware.tests.ETagGZipMiddlewareTest.test_strong_etag_modified", + "middleware.tests.ETagGZipMiddlewareTest.test_weak_etag_not_modified", + "middleware.tests.GZipMiddlewareTest.test_compress_deterministic", + "middleware.tests.GZipMiddlewareTest.test_compress_file_response", + "middleware.tests.GZipMiddlewareTest.test_compress_non_200_response", + "middleware.tests.GZipMiddlewareTest.test_compress_response", + "middleware.tests.GZipMiddlewareTest.test_compress_streaming_response", + "middleware.tests.GZipMiddlewareTest.test_compress_streaming_response_unicode", + "middleware.tests.GZipMiddlewareTest.test_no_compress_compressed_response", + "middleware.tests.GZipMiddlewareTest.test_no_compress_incompressible_response", + "middleware.tests.GZipMiddlewareTest.test_no_compress_short_response", + "middleware.tests.XFrameOptionsMiddlewareTest.test_defaults_sameorigin", + "middleware.tests.XFrameOptionsMiddlewareTest.test_deny", + "middleware.tests.XFrameOptionsMiddlewareTest.test_dont_set_if_set", + "middleware.tests.XFrameOptionsMiddlewareTest.test_is_extendable", + "middleware.tests.XFrameOptionsMiddlewareTest.test_response_exempt", + "middleware.tests.XFrameOptionsMiddlewareTest.test_same_origin", + "middleware_exceptions.tests.MiddlewareNotUsedTests.test_do_not_log_when_debug_is_false", + "middleware_exceptions.tests.MiddlewareNotUsedTests.test_log", + "middleware_exceptions.tests.MiddlewareNotUsedTests.test_log_custom_message", + "middleware_exceptions.tests.MiddlewareNotUsedTests.test_raise_exception", + "middleware_exceptions.tests.MiddlewareTests.test_exception_in_middleware_converted_before_prior_middleware", + "middleware_exceptions.tests.MiddlewareTests.test_exception_in_render_passed_to_process_exception", + "middleware_exceptions.tests.MiddlewareTests.test_process_template_response", + "middleware_exceptions.tests.MiddlewareTests.test_process_template_response_returns_none", + "middleware_exceptions.tests.MiddlewareTests.test_process_view_return_none", + "middleware_exceptions.tests.MiddlewareTests.test_process_view_return_response", + "middleware_exceptions.tests.MiddlewareTests.test_response_from_process_exception_short_circuits_remainder", + "middleware_exceptions.tests.MiddlewareTests.test_templateresponse_from_process_view_passed_to_process_template_response", + "middleware_exceptions.tests.MiddlewareTests.test_templateresponse_from_process_view_rendered", + "middleware_exceptions.tests.MiddlewareTests.test_view_exception_converted_before_middleware", + "middleware_exceptions.tests.MiddlewareTests.test_view_exception_handled_by_process_exception", + "middleware_exceptions.tests.RootUrlconfTests.test_missing_root_urlconf", + "migrations.test_deprecated_fields.Tests.test_migrate", + "migrations.test_exceptions.ExceptionTests.test_node_not_found_error_repr", + "migrations.test_graph.GraphTests.test_circular_graph", + "migrations.test_graph.GraphTests.test_circular_graph_2", + "migrations.test_graph.GraphTests.test_complex_graph", + "migrations.test_graph.GraphTests.test_infinite_loop", + "migrations.test_graph.GraphTests.test_iterative_dfs", + "migrations.test_graph.GraphTests.test_iterative_dfs_complexity", + "migrations.test_graph.GraphTests.test_missing_child_nodes", + "migrations.test_graph.GraphTests.test_missing_parent_nodes", + "migrations.test_graph.GraphTests.test_plan_invalid_node", + "migrations.test_graph.GraphTests.test_remove_replaced_nodes", + "migrations.test_graph.GraphTests.test_remove_replacement_node", + "migrations.test_graph.GraphTests.test_simple_graph", + "migrations.test_graph.GraphTests.test_stringify", + "migrations.test_graph.GraphTests.test_validate_consistency_dummy", + "migrations.test_graph.GraphTests.test_validate_consistency_missing_child", + "migrations.test_graph.GraphTests.test_validate_consistency_missing_parent", + "migrations.test_graph.GraphTests.test_validate_consistency_no_error", + "migrations.test_graph.NodeTests.test_dummynode_repr", + "migrations.test_graph.NodeTests.test_node_repr", + "migrations.test_loader.LoaderTests.test_check_consistent_history", + "migrations.test_loader.LoaderTests.test_check_consistent_history_squashed", + "migrations.test_loader.LoaderTests.test_explicit_missing_module", + "migrations.test_loader.LoaderTests.test_first", + "migrations.test_loader.LoaderTests.test_ignore_files", + "migrations.test_loader.LoaderTests.test_load", + "migrations.test_loader.LoaderTests.test_load_empty_dir", + "migrations.test_loader.LoaderTests.test_load_import_error", + "migrations.test_loader.LoaderTests.test_load_module_file", + "migrations.test_loader.LoaderTests.test_load_unmigrated_dependency", + "migrations.test_loader.LoaderTests.test_loading_squashed", + "migrations.test_loader.LoaderTests.test_loading_squashed_complex", + "migrations.test_loader.LoaderTests.test_loading_squashed_complex_multi_apps", + "migrations.test_loader.LoaderTests.test_loading_squashed_complex_multi_apps_partially_applied", + "migrations.test_loader.LoaderTests.test_loading_squashed_erroneous", + "migrations.test_loader.LoaderTests.test_loading_squashed_ref_squashed", + "migrations.test_loader.LoaderTests.test_marked_as_migrated", + "migrations.test_loader.LoaderTests.test_marked_as_unmigrated", + "migrations.test_loader.LoaderTests.test_name_match", + "migrations.test_loader.LoaderTests.test_plan_handles_repeated_migrations", + "migrations.test_loader.LoaderTests.test_run_before", + "migrations.test_loader.PycLoaderTests.test_invalid", + "migrations.test_loader.PycLoaderTests.test_valid", + "migrations.test_loader.RecorderTests.test_apply", + "migrations.test_questioner.QuestionerTests.test_ask_initial_with_disabled_migrations", + "migrations.test_questioner.QuestionerTests.test_timedelta_default", + "model_fields.test_promises.PromiseTest.test_AutoField", + "model_fields.test_promises.PromiseTest.test_BinaryField", + "model_fields.test_promises.PromiseTest.test_BooleanField", + "model_fields.test_promises.PromiseTest.test_CharField", + "model_fields.test_promises.PromiseTest.test_DateField", + "model_fields.test_promises.PromiseTest.test_DateTimeField", + "model_fields.test_promises.PromiseTest.test_DecimalField", + "model_fields.test_promises.PromiseTest.test_EmailField", + "model_fields.test_promises.PromiseTest.test_FileField", + "model_fields.test_promises.PromiseTest.test_FilePathField", + "model_fields.test_promises.PromiseTest.test_FloatField", + "model_fields.test_promises.PromiseTest.test_GenericIPAddressField", + "model_fields.test_promises.PromiseTest.test_IPAddressField", + "model_fields.test_promises.PromiseTest.test_ImageField", + "model_fields.test_promises.PromiseTest.test_IntegerField", + "model_fields.test_promises.PromiseTest.test_NullBooleanField", + "model_fields.test_promises.PromiseTest.test_PositiveIntegerField", + "model_fields.test_promises.PromiseTest.test_PositiveSmallIntegerField", + "model_fields.test_promises.PromiseTest.test_SlugField", + "model_fields.test_promises.PromiseTest.test_SmallIntegerField", + "model_fields.test_promises.PromiseTest.test_TextField", + "model_fields.test_promises.PromiseTest.test_TimeField", + "model_fields.test_promises.PromiseTest.test_URLField", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_abstract_model_with_regular_python_mixin_mro", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_cannot_override_indirect_abstract_field", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_multi_inheritance_field_clashes", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_multiple_inheritance_cannot_shadow_concrete_inherited_field", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_multiple_parents_mro", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_override_field_with_attr", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_override_one2one_relation_auto_field_clashes", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_overriding_field_removed_by_concrete_model", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_reverse_foreign_key", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_shadow_related_name_when_set_to_none", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_shadowed_fkey_id", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_single_parent", + "model_inheritance.test_abstract_inheritance.AbstractInheritanceTests.test_virtual_field", + "model_meta.test_manager_inheritance_from_future.TestManagerInheritanceFromFuture.test_defined", + "model_regress.test_pickle.ModelPickleTests.test_missing_django_version_unpickling", + "model_regress.test_pickle.ModelPickleTests.test_unsupported_unpickle", + "model_regress.test_pickle.ModelPickleTests.test_with_getstate", + "model_regress.test_state.ModelStateTests.test_fields_cache_descriptor", + "no_models.tests.NoModelTests.test_no_models", + "postgres_tests.test_apps.PostgresConfigTests.test_register_serializer_for_migrations", + "postgres_tests.test_apps.PostgresConfigTests.test_register_type_handlers_connection", + "postgres_tests.test_integration.PostgresIntegrationTests.test_check", + "postgres_tests.test_introspection.InspectDBTests.test_json_field", + "postgres_tests.test_introspection.InspectDBTests.test_range_fields", + "postgres_tests.test_signals.OIDTests.test_citext_cache", + "postgres_tests.test_signals.OIDTests.test_citext_values", + "postgres_tests.test_signals.OIDTests.test_hstore_cache", + "postgres_tests.test_signals.OIDTests.test_hstore_values", + "postgres_tests.test_signals.OIDTests.test_register_type_handlers_no_db", + "project_template.test_settings.TestStartProjectSettings.test_middleware_headers", + "queries.test_q.QTests.test_combine_and_both_empty", + "queries.test_q.QTests.test_combine_and_empty", + "queries.test_q.QTests.test_combine_not_q_object", + "queries.test_q.QTests.test_combine_or_both_empty", + "queries.test_q.QTests.test_combine_or_empty", + "queries.test_q.QTests.test_deconstruct", + "queries.test_q.QTests.test_deconstruct_and", + "queries.test_q.QTests.test_deconstruct_multiple_kwargs", + "queries.test_q.QTests.test_deconstruct_negated", + "queries.test_q.QTests.test_deconstruct_nested", + "queries.test_q.QTests.test_deconstruct_or", + "queries.test_q.QTests.test_reconstruct", + "queries.test_q.QTests.test_reconstruct_and", + "queries.test_q.QTests.test_reconstruct_negated", + "queries.test_q.QTests.test_reconstruct_or", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeFormPostTests.test_no_limit", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeFormPostTests.test_size_exceeded", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeFormPostTests.test_size_not_exceeded", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeGetTests.test_data_upload_max_memory_size_exceeded", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeGetTests.test_empty_content_length", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeGetTests.test_no_limit", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeGetTests.test_size_not_exceeded", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeMultipartPostTests.test_file_passes", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeMultipartPostTests.test_no_limit", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeMultipartPostTests.test_size_exceeded", + "requests.test_data_upload_settings.DataUploadMaxMemorySizeMultipartPostTests.test_size_not_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsFormPost.test_no_limit", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsFormPost.test_number_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsFormPost.test_number_not_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsGet.test_get_max_fields_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsGet.test_get_max_fields_not_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsMultipartPost.test_no_limit", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsMultipartPost.test_number_exceeded", + "requests.test_data_upload_settings.DataUploadMaxNumberOfFieldsMultipartPost.test_number_not_exceeded", + "requests.tests.BuildAbsoluteURITests.test_absolute_url", + "requests.tests.BuildAbsoluteURITests.test_host_retrieval", + "requests.tests.BuildAbsoluteURITests.test_request_path_begins_with_two_slashes", + "requests.tests.HostValidationTests.test_get_host_suggestion_of_allowed_host", + "requests.tests.HostValidationTests.test_get_port", + "requests.tests.HostValidationTests.test_get_port_with_x_forwarded_port", + "requests.tests.HostValidationTests.test_host_validation_in_debug_mode", + "requests.tests.HostValidationTests.test_http_get_host", + "requests.tests.HostValidationTests.test_http_get_host_with_x_forwarded_host", + "requests.tests.HostValidationTests.test_split_domain_port_removes_trailing_dot", + "requests.tests.HttpHeadersTests.test_basic", + "requests.tests.HttpHeadersTests.test_parse_header_name", + "requests.tests.RequestHeadersTests.test_base_request_headers", + "requests.tests.RequestHeadersTests.test_wsgi_request_headers", + "requests.tests.RequestHeadersTests.test_wsgi_request_headers_get", + "requests.tests.RequestHeadersTests.test_wsgi_request_headers_getitem", + "requests.tests.RequestsTests.test_FILES_connection_error", + "requests.tests.RequestsTests.test_POST_after_body_read", + "requests.tests.RequestsTests.test_POST_after_body_read_and_stream_read", + "requests.tests.RequestsTests.test_POST_after_body_read_and_stream_read_multipart", + "requests.tests.RequestsTests.test_POST_binary_only", + "requests.tests.RequestsTests.test_POST_connection_error", + "requests.tests.RequestsTests.test_POST_immutable_for_mutipart", + "requests.tests.RequestsTests.test_POST_multipart_with_content_length_zero", + "requests.tests.RequestsTests.test_alternate_charset_POST", + "requests.tests.RequestsTests.test_body_after_POST_multipart_form_data", + "requests.tests.RequestsTests.test_body_after_POST_multipart_related", + "requests.tests.RequestsTests.test_get_raw_uri", + "requests.tests.RequestsTests.test_httprequest", + "requests.tests.RequestsTests.test_httprequest_full_path", + "requests.tests.RequestsTests.test_httprequest_full_path_with_query_string_and_fragment", + "requests.tests.RequestsTests.test_httprequest_repr", + "requests.tests.RequestsTests.test_httprequest_repr_invalid_method_and_path", + "requests.tests.RequestsTests.test_limited_stream", + "requests.tests.RequestsTests.test_non_ascii_POST", + "requests.tests.RequestsTests.test_read_after_value", + "requests.tests.RequestsTests.test_read_by_lines", + "requests.tests.RequestsTests.test_set_encoding_clears_GET", + "requests.tests.RequestsTests.test_set_encoding_clears_POST", + "requests.tests.RequestsTests.test_stream", + "requests.tests.RequestsTests.test_value_after_read", + "requests.tests.RequestsTests.test_wsgirequest", + "requests.tests.RequestsTests.test_wsgirequest_path_info", + "requests.tests.RequestsTests.test_wsgirequest_path_with_force_script_name_trailing_slash", + "requests.tests.RequestsTests.test_wsgirequest_repr", + "requests.tests.RequestsTests.test_wsgirequest_script_url_double_slashes", + "requests.tests.RequestsTests.test_wsgirequest_with_force_script_name", + "requests.tests.RequestsTests.test_wsgirequest_with_script_name", + "responses.test_cookie.DeleteCookieTests.test_default", + "responses.test_cookie.DeleteCookieTests.test_delete_cookie_secure_prefix", + "responses.test_cookie.SetCookieTests.test_aware_expiration", + "responses.test_cookie.SetCookieTests.test_create_cookie_after_deleting_cookie", + "responses.test_cookie.SetCookieTests.test_far_expiration", + "responses.test_cookie.SetCookieTests.test_httponly_cookie", + "responses.test_cookie.SetCookieTests.test_invalid_samesite", + "responses.test_cookie.SetCookieTests.test_max_age_expiration", + "responses.test_cookie.SetCookieTests.test_near_expiration", + "responses.test_cookie.SetCookieTests.test_samesite", + "responses.test_cookie.SetCookieTests.test_unicode_cookie", + "responses.test_fileresponse.FileResponseTests.test_compressed_response", + "responses.test_fileresponse.FileResponseTests.test_file_from_buffer_response", + "responses.test_fileresponse.FileResponseTests.test_file_from_disk_as_attachment", + "responses.test_fileresponse.FileResponseTests.test_file_from_disk_response", + "responses.test_fileresponse.FileResponseTests.test_file_from_named_pipe_response", + "responses.test_fileresponse.FileResponseTests.test_unicode_attachment", + "responses.tests.HttpResponseBaseTests.test_closed", + "responses.tests.HttpResponseBaseTests.test_setdefault", + "responses.tests.HttpResponseBaseTests.test_tell", + "responses.tests.HttpResponseBaseTests.test_write", + "responses.tests.HttpResponseTests.test_change_status_code", + "responses.tests.HttpResponseTests.test_charset_detection", + "responses.tests.HttpResponseTests.test_generator_cache", + "responses.tests.HttpResponseTests.test_invalid_status_code", + "responses.tests.HttpResponseTests.test_reason_phrase", + "responses.tests.HttpResponseTests.test_repr", + "responses.tests.HttpResponseTests.test_repr_no_content_type", + "responses.tests.HttpResponseTests.test_response_content_charset", + "responses.tests.HttpResponseTests.test_status_code", + "responses.tests.HttpResponseTests.test_valid_status_code_string", + "responses.tests.HttpResponseTests.test_wrap_textiowrapper", + "schema.test_logging.SchemaLoggerTests.test_extra_args", + "servers.test_basehttp.WSGIRequestHandlerTestCase.test_https", + "servers.test_basehttp.WSGIRequestHandlerTestCase.test_log_message", + "servers.test_basehttp.WSGIRequestHandlerTestCase.test_strips_underscore_headers", + "servers.test_liveserverthread.LiveServerThreadTest.test_closes_connections", + "settings_tests.test_file_charset.DeprecationTests.test_access", + "settings_tests.test_file_charset.DeprecationTests.test_access_warning", + "settings_tests.test_file_charset.DeprecationTests.test_override_settings_warning", + "settings_tests.test_file_charset.DeprecationTests.test_settings_init_warning", + "settings_tests.tests.ChildDecoratedTestCase.test_override_settings_inheritance", + "settings_tests.tests.ClassDecoratedTestCase.test_max_recursion_error", + "settings_tests.tests.ClassDecoratedTestCase.test_method_override", + "settings_tests.tests.ClassDecoratedTestCase.test_override", + "settings_tests.tests.ClassDecoratedTestCase.test_setupclass_override", + "settings_tests.tests.ClassDecoratedTestCaseSuper.test_max_recursion_error", + "settings_tests.tests.FullyDecoratedTestCase.test_method_override", + "settings_tests.tests.FullyDecoratedTestCase.test_override", + "settings_tests.tests.FullyDecoratedTranTestCase.test_decorated_testcase_module", + "settings_tests.tests.FullyDecoratedTranTestCase.test_decorated_testcase_name", + "settings_tests.tests.FullyDecoratedTranTestCase.test_method_list_override", + "settings_tests.tests.FullyDecoratedTranTestCase.test_method_list_override_nested_order", + "settings_tests.tests.FullyDecoratedTranTestCase.test_method_list_override_no_ops", + "settings_tests.tests.FullyDecoratedTranTestCase.test_method_list_override_strings", + "settings_tests.tests.FullyDecoratedTranTestCase.test_method_override", + "settings_tests.tests.FullyDecoratedTranTestCase.test_override", + "settings_tests.tests.IsOverriddenTest.test_configure", + "settings_tests.tests.IsOverriddenTest.test_evaluated_lazysettings_repr", + "settings_tests.tests.IsOverriddenTest.test_module", + "settings_tests.tests.IsOverriddenTest.test_override", + "settings_tests.tests.IsOverriddenTest.test_settings_repr", + "settings_tests.tests.IsOverriddenTest.test_unevaluated_lazysettings_repr", + "settings_tests.tests.IsOverriddenTest.test_usersettingsholder_repr", + "settings_tests.tests.OverrideSettingsIsolationOnExceptionTests.test_override_settings_both", + "settings_tests.tests.OverrideSettingsIsolationOnExceptionTests.test_override_settings_enter", + "settings_tests.tests.OverrideSettingsIsolationOnExceptionTests.test_override_settings_exit", + "settings_tests.tests.OverrideSettingsIsolationOnExceptionTests.test_override_settings_reusable_on_enter", + "settings_tests.tests.SecureProxySslHeaderTest.test_none", + "settings_tests.tests.SecureProxySslHeaderTest.test_set_with_xheader_right", + "settings_tests.tests.SecureProxySslHeaderTest.test_set_with_xheader_wrong", + "settings_tests.tests.SecureProxySslHeaderTest.test_set_without_xheader", + "settings_tests.tests.SettingsTests.test_already_configured", + "settings_tests.tests.SettingsTests.test_class_decorator", + "settings_tests.tests.SettingsTests.test_context_manager", + "settings_tests.tests.SettingsTests.test_decorator", + "settings_tests.tests.SettingsTests.test_incorrect_timezone", + "settings_tests.tests.SettingsTests.test_no_secret_key", + "settings_tests.tests.SettingsTests.test_no_settings_module", + "settings_tests.tests.SettingsTests.test_override", + "settings_tests.tests.SettingsTests.test_override_change", + "settings_tests.tests.SettingsTests.test_override_doesnt_leak", + "settings_tests.tests.SettingsTests.test_override_settings_delete", + "settings_tests.tests.SettingsTests.test_override_settings_nested", + "settings_tests.tests.SettingsTests.test_settings_delete", + "settings_tests.tests.SettingsTests.test_settings_delete_wrapped", + "settings_tests.tests.SettingsTests.test_signal_callback_context_manager", + "settings_tests.tests.SettingsTests.test_signal_callback_decorator", + "settings_tests.tests.TestComplexSettingOverride.test_complex_override_warning", + "settings_tests.tests.TestListSettings.test_tuple_settings", + "shell.tests.ShellCommandTestCase.test_command_option", + "shell.tests.ShellCommandTestCase.test_shell_with_bpython_not_installed", + "shell.tests.ShellCommandTestCase.test_shell_with_ipython_not_installed", + "shell.tests.ShellCommandTestCase.test_stdin_read", + "shortcuts.test_render_to_response.RenderToResponseTests.test_render_to_response", + "shortcuts.test_render_to_response.RenderToResponseTests.test_render_to_response_with_content_type", + "shortcuts.test_render_to_response.RenderToResponseTests.test_render_to_response_with_multiple_templates", + "shortcuts.test_render_to_response.RenderToResponseTests.test_render_to_response_with_status", + "shortcuts.test_render_to_response.RenderToResponseTests.test_render_to_response_with_using", + "shortcuts.tests.RenderTests.test_render", + "shortcuts.tests.RenderTests.test_render_with_content_type", + "shortcuts.tests.RenderTests.test_render_with_multiple_templates", + "shortcuts.tests.RenderTests.test_render_with_status", + "shortcuts.tests.RenderTests.test_render_with_using", + "signed_cookies_tests.tests.SignedCookieTest.test_can_set_and_read_signed_cookies", + "signed_cookies_tests.tests.SignedCookieTest.test_can_use_salt", + "signed_cookies_tests.tests.SignedCookieTest.test_default_argument_suppresses_exceptions", + "signed_cookies_tests.tests.SignedCookieTest.test_detects_tampering", + "signed_cookies_tests.tests.SignedCookieTest.test_max_age_argument", + "signed_cookies_tests.tests.SignedCookieTest.test_signed_cookies_with_binary_key", + "signing.tests.TestSigner.test_decode_detects_tampering", + "signing.tests.TestSigner.test_dumps_loads", + "signing.tests.TestSigner.test_invalid_sep", + "signing.tests.TestSigner.test_sign_unsign", + "signing.tests.TestSigner.test_signature", + "signing.tests.TestSigner.test_signature_with_salt", + "signing.tests.TestSigner.test_unsign_detects_tampering", + "signing.tests.TestSigner.test_valid_sep", + "signing.tests.TestSigner.test_works_with_non_ascii_keys", + "signing.tests.TestTimestampSigner.test_timestamp_signer", + "sites_tests.tests.CreateDefaultSiteTests.test_basic", + "sites_tests.tests.CreateDefaultSiteTests.test_custom_site_id", + "sites_tests.tests.CreateDefaultSiteTests.test_multi_db", + "sites_tests.tests.CreateDefaultSiteTests.test_multi_db_with_router", + "sites_tests.tests.CreateDefaultSiteTests.test_no_site_id", + "sites_tests.tests.CreateDefaultSiteTests.test_save_another", + "sites_tests.tests.CreateDefaultSiteTests.test_signal", + "sites_tests.tests.CreateDefaultSiteTests.test_unavailable_site_model", + "sites_tests.tests.MiddlewareTest.test_old_style_request", + "sites_tests.tests.MiddlewareTest.test_request", + "sites_tests.tests.RequestSiteTests.test_delete", + "sites_tests.tests.RequestSiteTests.test_init_attributes", + "sites_tests.tests.RequestSiteTests.test_save", + "sites_tests.tests.RequestSiteTests.test_str", + "sites_tests.tests.SitesFrameworkTests.test_clear_site_cache", + "sites_tests.tests.SitesFrameworkTests.test_clear_site_cache_domain", + "sites_tests.tests.SitesFrameworkTests.test_delete_all_sites_clears_cache", + "sites_tests.tests.SitesFrameworkTests.test_domain_name_with_whitespaces", + "sites_tests.tests.SitesFrameworkTests.test_get_current_site", + "sites_tests.tests.SitesFrameworkTests.test_get_current_site_host_with_trailing_dot", + "sites_tests.tests.SitesFrameworkTests.test_get_current_site_no_site_id", + "sites_tests.tests.SitesFrameworkTests.test_get_current_site_no_site_id_and_handle_port_fallback", + "sites_tests.tests.SitesFrameworkTests.test_site_cache", + "sites_tests.tests.SitesFrameworkTests.test_site_manager", + "sites_tests.tests.SitesFrameworkTests.test_site_natural_key", + "sites_tests.tests.SitesFrameworkTests.test_unique_domain", + "staticfiles_tests.test_checks.FindersCheckTests.test_base_finder_check_not_implemented", + "staticfiles_tests.test_checks.FindersCheckTests.test_check_finders", + "staticfiles_tests.test_checks.FindersCheckTests.test_dirs_contains_static_root", + "staticfiles_tests.test_checks.FindersCheckTests.test_dirs_contains_static_root_in_tuple", + "staticfiles_tests.test_checks.FindersCheckTests.test_dirs_not_tuple_or_list", + "staticfiles_tests.test_checks.FindersCheckTests.test_no_errors_with_test_settings", + "staticfiles_tests.test_checks.FindersCheckTests.test_prefix_contains_trailing_slash", + "staticfiles_tests.test_finders.TestAppDirectoriesFinder.test_find_all", + "staticfiles_tests.test_finders.TestAppDirectoriesFinder.test_find_first", + "staticfiles_tests.test_finders.TestDefaultStorageFinder.test_find_all", + "staticfiles_tests.test_finders.TestDefaultStorageFinder.test_find_first", + "staticfiles_tests.test_finders.TestFileSystemFinder.test_find_all", + "staticfiles_tests.test_finders.TestFileSystemFinder.test_find_first", + "staticfiles_tests.test_finders.TestMiscFinder.test_cache", + "staticfiles_tests.test_finders.TestMiscFinder.test_get_finder", + "staticfiles_tests.test_finders.TestMiscFinder.test_get_finder_bad_classname", + "staticfiles_tests.test_finders.TestMiscFinder.test_get_finder_bad_module", + "staticfiles_tests.test_finders.TestMiscFinder.test_location_empty", + "staticfiles_tests.test_finders.TestMiscFinder.test_searched_locations", + "staticfiles_tests.test_forms.StaticFilesFormsMediaTestCase.test_absolute_url", + "staticfiles_tests.test_liveserver.StaticLiveServerChecks.test_test_test", + "staticfiles_tests.test_liveserver.StaticLiveServerView.test_collectstatic_emulation", + "staticfiles_tests.test_management.TestCollection.test_app_files", + "staticfiles_tests.test_management.TestCollection.test_camelcase_filenames", + "staticfiles_tests.test_management.TestCollection.test_common_ignore_patterns", + "staticfiles_tests.test_management.TestCollection.test_filename_with_percent_sign", + "staticfiles_tests.test_management.TestCollection.test_ignore", + "staticfiles_tests.test_management.TestCollection.test_nonascii_filenames", + "staticfiles_tests.test_management.TestCollection.test_staticfiles_dirs", + "staticfiles_tests.test_management.TestCollection.test_staticfiles_dirs_priority", + "staticfiles_tests.test_management.TestCollection.test_staticfiles_dirs_subdir", + "staticfiles_tests.test_management.TestCollectionClear.test_cleared_not_found", + "staticfiles_tests.test_management.TestCollectionClear.test_dir_not_exists", + "staticfiles_tests.test_management.TestCollectionClear.test_handle_path_notimplemented", + "staticfiles_tests.test_management.TestCollectionCustomIgnorePatterns.test_custom_ignore_patterns", + "staticfiles_tests.test_management.TestCollectionDryRun.test_no_files_created", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_app_files", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_camelcase_filenames", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_filename_with_percent_sign", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_no_common_ignore_patterns", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_nonascii_filenames", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_staticfiles_dirs", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_staticfiles_dirs_priority", + "staticfiles_tests.test_management.TestCollectionExcludeNoDefaultIgnore.test_staticfiles_dirs_subdir", + "staticfiles_tests.test_management.TestCollectionFilesOverride.test_ordering_override", + "staticfiles_tests.test_management.TestCollectionHelpSubcommand.test_missing_settings_dont_prevent_help", + "staticfiles_tests.test_management.TestCollectionLinks.test_app_files", + "staticfiles_tests.test_management.TestCollectionLinks.test_broken_symlink", + "staticfiles_tests.test_management.TestCollectionLinks.test_camelcase_filenames", + "staticfiles_tests.test_management.TestCollectionLinks.test_clear_broken_symlink", + "staticfiles_tests.test_management.TestCollectionLinks.test_filename_with_percent_sign", + "staticfiles_tests.test_management.TestCollectionLinks.test_links_created", + "staticfiles_tests.test_management.TestCollectionLinks.test_no_remote_link", + "staticfiles_tests.test_management.TestCollectionLinks.test_nonascii_filenames", + "staticfiles_tests.test_management.TestCollectionLinks.test_staticfiles_dirs", + "staticfiles_tests.test_management.TestCollectionLinks.test_staticfiles_dirs_priority", + "staticfiles_tests.test_management.TestCollectionLinks.test_staticfiles_dirs_subdir", + "staticfiles_tests.test_management.TestCollectionLinks.test_symlinks_and_files_replaced", + "staticfiles_tests.test_management.TestCollectionNeverCopyStorage.test_skips_newer_files_in_remote_storage", + "staticfiles_tests.test_management.TestCollectionNonLocalStorage.test_no_files_created", + "staticfiles_tests.test_management.TestCollectionNonLocalStorage.test_storage_properties", + "staticfiles_tests.test_management.TestCollectionOverwriteWarning.test_no_warning", + "staticfiles_tests.test_management.TestCollectionOverwriteWarning.test_warning", + "staticfiles_tests.test_management.TestCollectionVerbosity.test_verbosity_0", + "staticfiles_tests.test_management.TestCollectionVerbosity.test_verbosity_1", + "staticfiles_tests.test_management.TestCollectionVerbosity.test_verbosity_1_with_post_process", + "staticfiles_tests.test_management.TestCollectionVerbosity.test_verbosity_2", + "staticfiles_tests.test_management.TestCollectionVerbosity.test_verbosity_2_with_post_process", + "staticfiles_tests.test_management.TestConfiguration.test_local_storage_detection_helper", + "staticfiles_tests.test_management.TestConfiguration.test_location_empty", + "staticfiles_tests.test_management.TestFindStatic.test_all_files", + "staticfiles_tests.test_management.TestFindStatic.test_all_files_less_verbose", + "staticfiles_tests.test_management.TestFindStatic.test_all_files_more_verbose", + "staticfiles_tests.test_management.TestFindStatic.test_app_files", + "staticfiles_tests.test_management.TestFindStatic.test_camelcase_filenames", + "staticfiles_tests.test_management.TestFindStatic.test_filename_with_percent_sign", + "staticfiles_tests.test_management.TestFindStatic.test_nonascii_filenames", + "staticfiles_tests.test_management.TestFindStatic.test_staticfiles_dirs", + "staticfiles_tests.test_management.TestFindStatic.test_staticfiles_dirs_priority", + "staticfiles_tests.test_management.TestFindStatic.test_staticfiles_dirs_subdir", + "staticfiles_tests.test_management.TestInteractiveMessages.test_cancelled", + "staticfiles_tests.test_management.TestInteractiveMessages.test_no_warning_for_empty_staticdir", + "staticfiles_tests.test_management.TestInteractiveMessages.test_no_warning_when_staticdir_does_not_exist", + "staticfiles_tests.test_management.TestInteractiveMessages.test_warning_when_clearing_staticdir", + "staticfiles_tests.test_management.TestInteractiveMessages.test_warning_when_overwriting_files_in_staticdir", + "staticfiles_tests.test_management.TestRunserver.test_404_response", + "staticfiles_tests.test_management.TestRunserver.test_middleware_loaded_only_once", + "staticfiles_tests.test_storage.TestCachedStaticFilesStorageDeprecation.test_warning", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_cache_invalidation", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_cache_key_memcache_validation", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_corrupt_intermediate_files", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_css_import_case_insensitive", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_import_loop", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_import_replacement", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_path_ignored_completely", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_path_with_fragment", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_path_with_querystring", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_path_with_querystring_and_fragment", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_post_processing", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_post_processing_failure", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_absolute", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_absolute_root", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_deep_relative", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_relative", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_return", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_simple_content", + "staticfiles_tests.test_storage.TestCollectionCachedStorage.test_template_tag_url", + "staticfiles_tests.test_storage.TestCollectionHashedFilesCache.test_file_change_after_collectstatic", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_clear_empties_manifest", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_css_import_case_insensitive", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_import_loop", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_import_replacement", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_loaded_cache", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_manifest_exists", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_missing_entry", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_parse_cache", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_path_ignored_completely", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_path_with_fragment", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_path_with_querystring", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_path_with_querystring_and_fragment", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_post_processing", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_post_processing_failure", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_absolute", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_absolute_root", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_deep_relative", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_relative", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_return", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_simple_content", + "staticfiles_tests.test_storage.TestCollectionManifestStorage.test_template_tag_url", + "staticfiles_tests.test_storage.TestCollectionSimpleStorage.test_template_tag_return", + "staticfiles_tests.test_storage.TestCollectionSimpleStorage.test_template_tag_simple_content", + "staticfiles_tests.test_storage.TestExtraPatternsStorage.test_multi_extension_patterns", + "staticfiles_tests.test_storage.TestStaticFilePermissions.test_collect_static_files_default_permissions", + "staticfiles_tests.test_storage.TestStaticFilePermissions.test_collect_static_files_permissions", + "staticfiles_tests.test_storage.TestStaticFilePermissions.test_collect_static_files_subclass_of_static_storage", + "staticfiles_tests.test_templatetag_deprecation.StaticDeprecationTests.test_static_deprecated", + "staticfiles_tests.test_templatetag_deprecation.StaticDeprecationTests.test_templatetag_deprecated", + "staticfiles_tests.test_templatetags.TestTemplateTag.test_template_tag", + "staticfiles_tests.test_templatetags.TestTemplateTag.test_template_tag_escapes", + "staticfiles_tests.test_utils.CheckSettingsTests.test_media_url_in_static_url", + "staticfiles_tests.test_views.TestServeDisabled.test_disabled_serving", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_app_files", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_camelcase_filenames", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_filename_with_percent_sign", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_nonascii_filenames", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_staticfiles_dirs", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_staticfiles_dirs_priority", + "staticfiles_tests.test_views.TestServeStaticWithDefaultURL.test_staticfiles_dirs_subdir", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_app_files", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_camelcase_filenames", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_filename_with_percent_sign", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_nonascii_filenames", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_staticfiles_dirs", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_staticfiles_dirs_priority", + "staticfiles_tests.test_views.TestServeStaticWithURLHelper.test_staticfiles_dirs_subdir", + "template_backends.test_django.DjangoTemplatesTests.test_autoescape_default", + "template_backends.test_django.DjangoTemplatesTests.test_autoescape_off", + "template_backends.test_django.DjangoTemplatesTests.test_builtins_discovery", + "template_backends.test_django.DjangoTemplatesTests.test_context_has_priority_over_template_context_processors", + "template_backends.test_django.DjangoTemplatesTests.test_csrf_token", + "template_backends.test_django.DjangoTemplatesTests.test_debug_default_template_loaders", + "template_backends.test_django.DjangoTemplatesTests.test_django_html_escaping", + "template_backends.test_django.DjangoTemplatesTests.test_from_string", + "template_backends.test_django.DjangoTemplatesTests.test_get_template", + "template_backends.test_django.DjangoTemplatesTests.test_get_template_nonexistent", + "template_backends.test_django.DjangoTemplatesTests.test_get_template_syntax_error", + "template_backends.test_django.DjangoTemplatesTests.test_html_escaping", + "template_backends.test_django.DjangoTemplatesTests.test_no_directory_traversal", + "template_backends.test_django.DjangoTemplatesTests.test_non_ascii_characters", + "template_backends.test_django.DjangoTemplatesTests.test_non_debug_default_template_loaders", + "template_backends.test_django.DjangoTemplatesTests.test_render_requires_dict", + "template_backends.test_django.DjangoTemplatesTests.test_templatetag_discovery", + "template_backends.test_django.DjangoTemplatesTests.test_templatetag_discovery_import_error", + "template_backends.test_dummy.TemplateStringsTests.test_csrf_token", + "template_backends.test_dummy.TemplateStringsTests.test_django_html_escaping", + "template_backends.test_dummy.TemplateStringsTests.test_from_string", + "template_backends.test_dummy.TemplateStringsTests.test_get_template", + "template_backends.test_dummy.TemplateStringsTests.test_get_template_nonexistent", + "template_backends.test_dummy.TemplateStringsTests.test_get_template_syntax_error", + "template_backends.test_dummy.TemplateStringsTests.test_html_escaping", + "template_backends.test_dummy.TemplateStringsTests.test_no_directory_traversal", + "template_backends.test_dummy.TemplateStringsTests.test_non_ascii_characters", + "template_backends.test_jinja2.Jinja2Tests.test_context_processors", + "template_backends.test_jinja2.Jinja2Tests.test_csrf_token", + "template_backends.test_jinja2.Jinja2Tests.test_django_html_escaping", + "template_backends.test_jinja2.Jinja2Tests.test_exception_debug_info_max_context", + "template_backends.test_jinja2.Jinja2Tests.test_exception_debug_info_min_context", + "template_backends.test_jinja2.Jinja2Tests.test_from_string", + "template_backends.test_jinja2.Jinja2Tests.test_get_template", + "template_backends.test_jinja2.Jinja2Tests.test_get_template_nonexistent", + "template_backends.test_jinja2.Jinja2Tests.test_get_template_syntax_error", + "template_backends.test_jinja2.Jinja2Tests.test_html_escaping", + "template_backends.test_jinja2.Jinja2Tests.test_no_directory_traversal", + "template_backends.test_jinja2.Jinja2Tests.test_non_ascii_characters", + "template_backends.test_jinja2.Jinja2Tests.test_origin", + "template_backends.test_jinja2.Jinja2Tests.test_origin_from_string", + "template_backends.test_jinja2.Jinja2Tests.test_self_context", + "template_backends.test_utils.TemplateUtilsTests.test_backend_import_error", + "template_backends.test_utils.TemplateUtilsTests.test_backend_improperly_configured", + "template_backends.test_utils.TemplateUtilsTests.test_backend_names_must_be_unique", + "template_loader.tests.TemplateLoaderTests.test_get_template_first_engine", + "template_loader.tests.TemplateLoaderTests.test_get_template_not_found", + "template_loader.tests.TemplateLoaderTests.test_get_template_second_engine", + "template_loader.tests.TemplateLoaderTests.test_get_template_using_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_first_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_not_found", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_second_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_using_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_empty", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_first_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_not_found", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_second_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_tries_all_engines_before_names", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_list_using_engine", + "template_loader.tests.TemplateLoaderTests.test_render_to_string_with_request", + "template_loader.tests.TemplateLoaderTests.test_select_template_empty", + "template_loader.tests.TemplateLoaderTests.test_select_template_first_engine", + "template_loader.tests.TemplateLoaderTests.test_select_template_not_found", + "template_loader.tests.TemplateLoaderTests.test_select_template_second_engine", + "template_loader.tests.TemplateLoaderTests.test_select_template_string", + "template_loader.tests.TemplateLoaderTests.test_select_template_tries_all_engines_before_names", + "template_loader.tests.TemplateLoaderTests.test_select_template_using_engine", + "template_tests.filter_tests.test_add.AddTests.test_add01", + "template_tests.filter_tests.test_add.AddTests.test_add02", + "template_tests.filter_tests.test_add.AddTests.test_add03", + "template_tests.filter_tests.test_add.AddTests.test_add04", + "template_tests.filter_tests.test_add.AddTests.test_add05", + "template_tests.filter_tests.test_add.AddTests.test_add06", + "template_tests.filter_tests.test_add.AddTests.test_add07", + "template_tests.filter_tests.test_add.FunctionTests.test_add", + "template_tests.filter_tests.test_addslashes.AddslashesTests.test_addslashes01", + "template_tests.filter_tests.test_addslashes.AddslashesTests.test_addslashes02", + "template_tests.filter_tests.test_addslashes.FunctionTests.test_backslashes", + "template_tests.filter_tests.test_addslashes.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_addslashes.FunctionTests.test_quotes", + "template_tests.filter_tests.test_autoescape.AutoescapeStringfilterTests.test_autoescape_stringfilter01", + "template_tests.filter_tests.test_autoescape.AutoescapeStringfilterTests.test_autoescape_stringfilter02", + "template_tests.filter_tests.test_autoescape.AutoescapeStringfilterTests.test_autoescape_stringfilter03", + "template_tests.filter_tests.test_autoescape.AutoescapeStringfilterTests.test_autoescape_stringfilter04", + "template_tests.filter_tests.test_capfirst.CapfirstTests.test_capfirst01", + "template_tests.filter_tests.test_capfirst.CapfirstTests.test_capfirst02", + "template_tests.filter_tests.test_capfirst.FunctionTests.test_capfirst", + "template_tests.filter_tests.test_center.CenterTests.test_center01", + "template_tests.filter_tests.test_center.CenterTests.test_center02", + "template_tests.filter_tests.test_center.FunctionTests.test_center", + "template_tests.filter_tests.test_center.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining01", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining02", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining03", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining04", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining05", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining06", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining07", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining08", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining09", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining10", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining11", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining12", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining13", + "template_tests.filter_tests.test_chaining.ChainingTests.test_chaining14", + "template_tests.filter_tests.test_cut.CutTests.test_cut01", + "template_tests.filter_tests.test_cut.CutTests.test_cut02", + "template_tests.filter_tests.test_cut.CutTests.test_cut03", + "template_tests.filter_tests.test_cut.CutTests.test_cut04", + "template_tests.filter_tests.test_cut.CutTests.test_cut05", + "template_tests.filter_tests.test_cut.CutTests.test_cut06", + "template_tests.filter_tests.test_cut.FunctionTests.test_character", + "template_tests.filter_tests.test_cut.FunctionTests.test_characters", + "template_tests.filter_tests.test_cut.FunctionTests.test_non_matching_string", + "template_tests.filter_tests.test_cut.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_date.DateTests.test_date01", + "template_tests.filter_tests.test_date.DateTests.test_date02", + "template_tests.filter_tests.test_date.DateTests.test_date02_l10n", + "template_tests.filter_tests.test_date.DateTests.test_date03", + "template_tests.filter_tests.test_date.DateTests.test_date04", + "template_tests.filter_tests.test_date.DateTests.test_date05", + "template_tests.filter_tests.test_date.DateTests.test_date06", + "template_tests.filter_tests.test_date.DateTests.test_date07", + "template_tests.filter_tests.test_date.DateTests.test_date08", + "template_tests.filter_tests.test_date.DateTests.test_date09", + "template_tests.filter_tests.test_date.FunctionTests.test_date", + "template_tests.filter_tests.test_date.FunctionTests.test_escape_characters", + "template_tests.filter_tests.test_date.FunctionTests.test_no_args", + "template_tests.filter_tests.test_default.DefaultIfNoneTests.test_default_if_none01", + "template_tests.filter_tests.test_default.DefaultIfNoneTests.test_default_if_none02", + "template_tests.filter_tests.test_default.DefaultTests.test_default01", + "template_tests.filter_tests.test_default.DefaultTests.test_default02", + "template_tests.filter_tests.test_default.DefaultTests.test_default03", + "template_tests.filter_tests.test_default.DefaultTests.test_default04", + "template_tests.filter_tests.test_default.FunctionTests.test_empty_string", + "template_tests.filter_tests.test_default.FunctionTests.test_none", + "template_tests.filter_tests.test_default.FunctionTests.test_value", + "template_tests.filter_tests.test_default_if_none.FunctionTests.test_empty_string", + "template_tests.filter_tests.test_default_if_none.FunctionTests.test_none", + "template_tests.filter_tests.test_default_if_none.FunctionTests.test_value", + "template_tests.filter_tests.test_dictsort.FunctionTests.test_dictsort_complex_sorting_key", + "template_tests.filter_tests.test_dictsort.FunctionTests.test_invalid_values", + "template_tests.filter_tests.test_dictsort.FunctionTests.test_sort", + "template_tests.filter_tests.test_dictsort.FunctionTests.test_sort_list_of_tuple_like_dicts", + "template_tests.filter_tests.test_dictsort.FunctionTests.test_sort_list_of_tuples", + "template_tests.filter_tests.test_dictsortreversed.FunctionTests.test_invalid_values", + "template_tests.filter_tests.test_dictsortreversed.FunctionTests.test_sort", + "template_tests.filter_tests.test_dictsortreversed.FunctionTests.test_sort_list_of_tuple_like_dicts", + "template_tests.filter_tests.test_dictsortreversed.FunctionTests.test_sort_list_of_tuples", + "template_tests.filter_tests.test_divisibleby.FunctionTests.test_false", + "template_tests.filter_tests.test_divisibleby.FunctionTests.test_true", + "template_tests.filter_tests.test_escape.EscapeTests.test_escape01", + "template_tests.filter_tests.test_escape.EscapeTests.test_escape02", + "template_tests.filter_tests.test_escape.EscapeTests.test_escape03", + "template_tests.filter_tests.test_escape.EscapeTests.test_escape04", + "template_tests.filter_tests.test_escape.EscapeTests.test_escape_lazy_string", + "template_tests.filter_tests.test_escape.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_escapejs.EscapejsTests.test_escapejs01", + "template_tests.filter_tests.test_escapejs.EscapejsTests.test_escapejs02", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_backslashes", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_lazy_string", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_paragraph_separator", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_quotes", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_script", + "template_tests.filter_tests.test_escapejs.FunctionTests.test_whitespace", + "template_tests.filter_tests.test_filesizeformat.FunctionTests.test_formats", + "template_tests.filter_tests.test_filesizeformat.FunctionTests.test_localized_formats", + "template_tests.filter_tests.test_filesizeformat.FunctionTests.test_negative_numbers", + "template_tests.filter_tests.test_first.FirstTests.test_first01", + "template_tests.filter_tests.test_first.FirstTests.test_first02", + "template_tests.filter_tests.test_first.FunctionTests.test_empty_string", + "template_tests.filter_tests.test_first.FunctionTests.test_list", + "template_tests.filter_tests.test_first.FunctionTests.test_string", + "template_tests.filter_tests.test_floatformat.FloatformatTests.test_floatformat01", + "template_tests.filter_tests.test_floatformat.FloatformatTests.test_floatformat02", + "template_tests.filter_tests.test_floatformat.FunctionTests.test_float_dunder_method", + "template_tests.filter_tests.test_floatformat.FunctionTests.test_infinity", + "template_tests.filter_tests.test_floatformat.FunctionTests.test_inputs", + "template_tests.filter_tests.test_floatformat.FunctionTests.test_low_decimal_precision", + "template_tests.filter_tests.test_floatformat.FunctionTests.test_zero_values", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape01", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape02", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape03", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape04", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape05", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape06", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape07", + "template_tests.filter_tests.test_force_escape.ForceEscapeTests.test_force_escape08", + "template_tests.filter_tests.test_force_escape.FunctionTests.test_escape", + "template_tests.filter_tests.test_force_escape.FunctionTests.test_unicode", + "template_tests.filter_tests.test_get_digit.FunctionTests.test_string", + "template_tests.filter_tests.test_get_digit.FunctionTests.test_values", + "template_tests.filter_tests.test_iriencode.FunctionTests.test_unicode", + "template_tests.filter_tests.test_iriencode.FunctionTests.test_urlencoded", + "template_tests.filter_tests.test_iriencode.IriencodeTests.test_iriencode01", + "template_tests.filter_tests.test_iriencode.IriencodeTests.test_iriencode02", + "template_tests.filter_tests.test_iriencode.IriencodeTests.test_iriencode03", + "template_tests.filter_tests.test_iriencode.IriencodeTests.test_iriencode04", + "template_tests.filter_tests.test_join.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_join.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_join.FunctionTests.test_list", + "template_tests.filter_tests.test_join.FunctionTests.test_noniterable_arg", + "template_tests.filter_tests.test_join.FunctionTests.test_noniterable_arg_autoescape_off", + "template_tests.filter_tests.test_join.JoinTests.test_join01", + "template_tests.filter_tests.test_join.JoinTests.test_join02", + "template_tests.filter_tests.test_join.JoinTests.test_join03", + "template_tests.filter_tests.test_join.JoinTests.test_join04", + "template_tests.filter_tests.test_join.JoinTests.test_join05", + "template_tests.filter_tests.test_join.JoinTests.test_join06", + "template_tests.filter_tests.test_join.JoinTests.test_join07", + "template_tests.filter_tests.test_join.JoinTests.test_join08", + "template_tests.filter_tests.test_json_script.JsonScriptTests.test_basic", + "template_tests.filter_tests.test_last.LastTests.test_empty_list", + "template_tests.filter_tests.test_last.LastTests.test_last01", + "template_tests.filter_tests.test_last.LastTests.test_last02", + "template_tests.filter_tests.test_length.FunctionTests.test_list", + "template_tests.filter_tests.test_length.FunctionTests.test_safestring", + "template_tests.filter_tests.test_length.FunctionTests.test_string", + "template_tests.filter_tests.test_length.LengthTests.test_length01", + "template_tests.filter_tests.test_length.LengthTests.test_length02", + "template_tests.filter_tests.test_length.LengthTests.test_length03", + "template_tests.filter_tests.test_length.LengthTests.test_length04", + "template_tests.filter_tests.test_length.LengthTests.test_length05", + "template_tests.filter_tests.test_length.LengthTests.test_length06", + "template_tests.filter_tests.test_length.LengthTests.test_length07", + "template_tests.filter_tests.test_length_is.FunctionTests.test_empty_list", + "template_tests.filter_tests.test_length_is.FunctionTests.test_string", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is01", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is02", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is03", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is04", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is05", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is06", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is07", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is08", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is09", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is10", + "template_tests.filter_tests.test_length_is.LengthIsTests.test_length_is11", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_carriage", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_carriage_newline", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_lazy_string_input", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_line", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_newline", + "template_tests.filter_tests.test_linebreaks.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_linebreaks.LinebreaksTests.test_linebreaks01", + "template_tests.filter_tests.test_linebreaks.LinebreaksTests.test_linebreaks02", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_carriage", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_carriage_newline", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_newline", + "template_tests.filter_tests.test_linebreaksbr.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_linebreaksbr.LinebreaksbrTests.test_linebreaksbr01", + "template_tests.filter_tests.test_linebreaksbr.LinebreaksbrTests.test_linebreaksbr02", + "template_tests.filter_tests.test_linenumbers.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_linenumbers.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_linenumbers.FunctionTests.test_linenumbers", + "template_tests.filter_tests.test_linenumbers.FunctionTests.test_linenumbers2", + "template_tests.filter_tests.test_linenumbers.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_linenumbers.LinenumbersTests.test_linenumbers01", + "template_tests.filter_tests.test_linenumbers.LinenumbersTests.test_linenumbers02", + "template_tests.filter_tests.test_ljust.FunctionTests.test_less_than_string_length", + "template_tests.filter_tests.test_ljust.FunctionTests.test_ljust", + "template_tests.filter_tests.test_ljust.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_ljust.LjustTests.test_ljust01", + "template_tests.filter_tests.test_ljust.LjustTests.test_ljust02", + "template_tests.filter_tests.test_lower.FunctionTests.test_lower", + "template_tests.filter_tests.test_lower.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_lower.FunctionTests.test_unicode", + "template_tests.filter_tests.test_lower.LowerTests.test_lower01", + "template_tests.filter_tests.test_lower.LowerTests.test_lower02", + "template_tests.filter_tests.test_make_list.FunctionTests.test_integer", + "template_tests.filter_tests.test_make_list.FunctionTests.test_string", + "template_tests.filter_tests.test_make_list.MakeListTests.test_make_list01", + "template_tests.filter_tests.test_make_list.MakeListTests.test_make_list02", + "template_tests.filter_tests.test_make_list.MakeListTests.test_make_list03", + "template_tests.filter_tests.test_make_list.MakeListTests.test_make_list04", + "template_tests.filter_tests.test_phone2numeric.FunctionTests.test_phone2numeric", + "template_tests.filter_tests.test_phone2numeric.Phone2numericTests.test_phone2numeric01", + "template_tests.filter_tests.test_phone2numeric.Phone2numericTests.test_phone2numeric02", + "template_tests.filter_tests.test_phone2numeric.Phone2numericTests.test_phone2numeric03", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_decimals", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_floats", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_integers", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_lists", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_no_len_type", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_suffixes", + "template_tests.filter_tests.test_pluralize.FunctionTests.test_value_error", + "template_tests.filter_tests.test_pluralize.PluralizeTests.test_no_arguments", + "template_tests.filter_tests.test_pluralize.PluralizeTests.test_singular_and_plural_suffix", + "template_tests.filter_tests.test_pluralize.PluralizeTests.test_suffix", + "template_tests.filter_tests.test_random.RandomTests.test_random01", + "template_tests.filter_tests.test_random.RandomTests.test_random02", + "template_tests.filter_tests.test_rjust.FunctionTests.test_less_than_string_length", + "template_tests.filter_tests.test_rjust.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_rjust.FunctionTests.test_rjust", + "template_tests.filter_tests.test_rjust.RjustTests.test_rjust01", + "template_tests.filter_tests.test_rjust.RjustTests.test_rjust02", + "template_tests.filter_tests.test_safe.SafeTests.test_safe01", + "template_tests.filter_tests.test_safe.SafeTests.test_safe02", + "template_tests.filter_tests.test_safeseq.SafeseqTests.test_safeseq01", + "template_tests.filter_tests.test_safeseq.SafeseqTests.test_safeseq02", + "template_tests.filter_tests.test_slice.FunctionTests.test_fail_silently", + "template_tests.filter_tests.test_slice.FunctionTests.test_index", + "template_tests.filter_tests.test_slice.FunctionTests.test_index_integer", + "template_tests.filter_tests.test_slice.FunctionTests.test_negative_index", + "template_tests.filter_tests.test_slice.FunctionTests.test_range", + "template_tests.filter_tests.test_slice.FunctionTests.test_range_multiple", + "template_tests.filter_tests.test_slice.FunctionTests.test_range_step", + "template_tests.filter_tests.test_slice.FunctionTests.test_zero_length", + "template_tests.filter_tests.test_slice.SliceTests.test_slice01", + "template_tests.filter_tests.test_slice.SliceTests.test_slice02", + "template_tests.filter_tests.test_slugify.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_slugify.FunctionTests.test_slugify", + "template_tests.filter_tests.test_slugify.FunctionTests.test_slugify_lazy_string", + "template_tests.filter_tests.test_slugify.FunctionTests.test_unicode", + "template_tests.filter_tests.test_slugify.SlugifyTests.test_slugify01", + "template_tests.filter_tests.test_slugify.SlugifyTests.test_slugify02", + "template_tests.filter_tests.test_stringformat.FunctionTests.test_format", + "template_tests.filter_tests.test_stringformat.FunctionTests.test_invalid", + "template_tests.filter_tests.test_stringformat.StringformatTests.test_stringformat01", + "template_tests.filter_tests.test_stringformat.StringformatTests.test_stringformat02", + "template_tests.filter_tests.test_striptags.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_striptags.FunctionTests.test_strip", + "template_tests.filter_tests.test_striptags.FunctionTests.test_strip_lazy_string", + "template_tests.filter_tests.test_striptags.StriptagsTests.test_striptags01", + "template_tests.filter_tests.test_striptags.StriptagsTests.test_striptags02", + "template_tests.filter_tests.test_time.FunctionTests.test_inputs", + "template_tests.filter_tests.test_time.FunctionTests.test_no_args", + "template_tests.filter_tests.test_time.TimeTests.test_time00", + "template_tests.filter_tests.test_time.TimeTests.test_time00_l10n", + "template_tests.filter_tests.test_time.TimeTests.test_time01", + "template_tests.filter_tests.test_time.TimeTests.test_time02", + "template_tests.filter_tests.test_time.TimeTests.test_time03", + "template_tests.filter_tests.test_time.TimeTests.test_time04", + "template_tests.filter_tests.test_time.TimeTests.test_time05", + "template_tests.filter_tests.test_time.TimeTests.test_time06", + "template_tests.filter_tests.test_timesince.FunctionTests.test_explicit_date", + "template_tests.filter_tests.test_timesince.FunctionTests.test_no_args", + "template_tests.filter_tests.test_timesince.FunctionTests.test_since_now", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince01", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince02", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince03", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince04", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince05", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince06", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince07", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince08", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince09", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince10", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince11", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince12", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince13", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince14", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince15", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince16", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince17", + "template_tests.filter_tests.test_timesince.TimesinceTests.test_timesince18", + "template_tests.filter_tests.test_timeuntil.FunctionTests.test_explicit_date", + "template_tests.filter_tests.test_timeuntil.FunctionTests.test_no_args", + "template_tests.filter_tests.test_timeuntil.FunctionTests.test_until_now", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_aware_naive_type_error", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_naive_aware_type_error", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil01", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil02", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil03", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil04", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil05", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil06", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil07", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil08", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil09", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil10", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil11", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil12", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil13", + "template_tests.filter_tests.test_timeuntil.TimeuntilTests.test_timeuntil14", + "template_tests.filter_tests.test_title.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_title.FunctionTests.test_title", + "template_tests.filter_tests.test_title.FunctionTests.test_unicode", + "template_tests.filter_tests.test_title.TitleTests.test_title1", + "template_tests.filter_tests.test_title.TitleTests.test_title2", + "template_tests.filter_tests.test_truncatechars.TruncatecharsTests.test_fail_silently_incorrect_arg", + "template_tests.filter_tests.test_truncatechars.TruncatecharsTests.test_truncatechars01", + "template_tests.filter_tests.test_truncatechars.TruncatecharsTests.test_truncatechars02", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_invalid_arg", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate2", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate3", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate_something", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate_unicode", + "template_tests.filter_tests.test_truncatechars_html.FunctionTests.test_truncate_zero", + "template_tests.filter_tests.test_truncatewords.FunctionTests.test_invalid_number", + "template_tests.filter_tests.test_truncatewords.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_truncatewords.FunctionTests.test_overtruncate", + "template_tests.filter_tests.test_truncatewords.FunctionTests.test_truncate", + "template_tests.filter_tests.test_truncatewords.FunctionTests.test_truncate2", + "template_tests.filter_tests.test_truncatewords.TruncatewordsTests.test_truncatewords01", + "template_tests.filter_tests.test_truncatewords.TruncatewordsTests.test_truncatewords02", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_invalid_arg", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate2", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate3", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate4", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate_complex", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate_unicode", + "template_tests.filter_tests.test_truncatewords_html.FunctionTests.test_truncate_zero", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_list", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_list_gettext", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested2", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested3", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested_generators", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested_multiple", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_nested_multiple2", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_ulitem", + "template_tests.filter_tests.test_unordered_list.FunctionTests.test_ulitem_autoescape_off", + "template_tests.filter_tests.test_unordered_list.UnorderedListTests.test_unordered_list01", + "template_tests.filter_tests.test_unordered_list.UnorderedListTests.test_unordered_list02", + "template_tests.filter_tests.test_unordered_list.UnorderedListTests.test_unordered_list03", + "template_tests.filter_tests.test_unordered_list.UnorderedListTests.test_unordered_list04", + "template_tests.filter_tests.test_unordered_list.UnorderedListTests.test_unordered_list05", + "template_tests.filter_tests.test_upper.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_upper.FunctionTests.test_unicode", + "template_tests.filter_tests.test_upper.FunctionTests.test_upper", + "template_tests.filter_tests.test_upper.UpperTests.test_upper01", + "template_tests.filter_tests.test_upper.UpperTests.test_upper02", + "template_tests.filter_tests.test_urlencode.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_urlencode.FunctionTests.test_urlencode", + "template_tests.filter_tests.test_urlencode.UrlencodeTests.test_urlencode01", + "template_tests.filter_tests.test_urlencode.UrlencodeTests.test_urlencode02", + "template_tests.filter_tests.test_urlize.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_urlize.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_urlize.FunctionTests.test_brackets", + "template_tests.filter_tests.test_urlize.FunctionTests.test_email", + "template_tests.filter_tests.test_urlize.FunctionTests.test_exclamation_marks", + "template_tests.filter_tests.test_urlize.FunctionTests.test_https", + "template_tests.filter_tests.test_urlize.FunctionTests.test_idn", + "template_tests.filter_tests.test_urlize.FunctionTests.test_invalid_email", + "template_tests.filter_tests.test_urlize.FunctionTests.test_ipv4", + "template_tests.filter_tests.test_urlize.FunctionTests.test_ipv6", + "template_tests.filter_tests.test_urlize.FunctionTests.test_lazystring", + "template_tests.filter_tests.test_urlize.FunctionTests.test_malformed", + "template_tests.filter_tests.test_urlize.FunctionTests.test_nofollow", + "template_tests.filter_tests.test_urlize.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_urlize.FunctionTests.test_parenthesis", + "template_tests.filter_tests.test_urlize.FunctionTests.test_quotation_marks", + "template_tests.filter_tests.test_urlize.FunctionTests.test_quote_commas", + "template_tests.filter_tests.test_urlize.FunctionTests.test_quoting", + "template_tests.filter_tests.test_urlize.FunctionTests.test_tlds", + "template_tests.filter_tests.test_urlize.FunctionTests.test_trailing_multiple_punctuation", + "template_tests.filter_tests.test_urlize.FunctionTests.test_trailing_period", + "template_tests.filter_tests.test_urlize.FunctionTests.test_unicode", + "template_tests.filter_tests.test_urlize.FunctionTests.test_uppercase", + "template_tests.filter_tests.test_urlize.FunctionTests.test_url_split_chars", + "template_tests.filter_tests.test_urlize.FunctionTests.test_urlencoded", + "template_tests.filter_tests.test_urlize.FunctionTests.test_urls", + "template_tests.filter_tests.test_urlize.FunctionTests.test_word_with_dot", + "template_tests.filter_tests.test_urlize.FunctionTests.test_wrapping_characters", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize01", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize02", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize03", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize04", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize05", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize06", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize07", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize08", + "template_tests.filter_tests.test_urlize.UrlizeTests.test_urlize09", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_autoescape", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_autoescape_off", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_overtruncate", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_query_string", + "template_tests.filter_tests.test_urlizetrunc.FunctionTests.test_truncate", + "template_tests.filter_tests.test_urlizetrunc.UrlizetruncTests.test_urlizetrunc01", + "template_tests.filter_tests.test_urlizetrunc.UrlizetruncTests.test_urlizetrunc02", + "template_tests.filter_tests.test_wordcount.FunctionTests.test_count_multiple", + "template_tests.filter_tests.test_wordcount.FunctionTests.test_count_one", + "template_tests.filter_tests.test_wordcount.FunctionTests.test_empty_string", + "template_tests.filter_tests.test_wordcount.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_wordcount.WordcountTests.test_wordcount01", + "template_tests.filter_tests.test_wordcount.WordcountTests.test_wordcount02", + "template_tests.filter_tests.test_wordwrap.FunctionTests.test_indent", + "template_tests.filter_tests.test_wordwrap.FunctionTests.test_indent2", + "template_tests.filter_tests.test_wordwrap.FunctionTests.test_non_string_input", + "template_tests.filter_tests.test_wordwrap.FunctionTests.test_wrap", + "template_tests.filter_tests.test_wordwrap.FunctionTests.test_wrap_lazy_string", + "template_tests.filter_tests.test_wordwrap.WordwrapTests.test_wordwrap01", + "template_tests.filter_tests.test_wordwrap.WordwrapTests.test_wordwrap02", + "template_tests.filter_tests.test_yesno.FunctionTests.test_false", + "template_tests.filter_tests.test_yesno.FunctionTests.test_false_arguments", + "template_tests.filter_tests.test_yesno.FunctionTests.test_invalid_value", + "template_tests.filter_tests.test_yesno.FunctionTests.test_none", + "template_tests.filter_tests.test_yesno.FunctionTests.test_none_three_arguments", + "template_tests.filter_tests.test_yesno.FunctionTests.test_none_two_arguments", + "template_tests.filter_tests.test_yesno.FunctionTests.test_true", + "template_tests.filter_tests.test_yesno.FunctionTests.test_true_arguments", + "template_tests.filter_tests.test_yesno.YesNoTests.test_true", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_blocktrans_syntax_error_missing_assignment", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_blocktrans_tag_using_a_string_that_looks_like_str_fmt", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_count", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n03", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n04", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n05", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n07", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n08", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n17", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n18", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n19", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n21", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n26", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n27", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n28", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n34", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n34_2", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n34_3", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n37", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n39", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n40", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_i18n41", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n04", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n07", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n08", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n17", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n18", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n26", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n27", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_legacyi18n28", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_no_args_with", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_plural_bad_syntax", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_variable_twice", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_with_block", + "template_tests.syntax_tests.i18n.test_blocktrans.I18nBlockTransTagTests.test_with_for", + "template_tests.syntax_tests.i18n.test_blocktrans.MiscTests.test_percent_formatting_in_blocktrans", + "template_tests.syntax_tests.i18n.test_blocktrans.MiscTests.test_percent_in_translatable_block", + "template_tests.syntax_tests.i18n.test_blocktrans.MultipleLocaleActivationBlockTransTests.test_multiple_locale_btrans", + "template_tests.syntax_tests.i18n.test_blocktrans.MultipleLocaleActivationBlockTransTests.test_multiple_locale_deactivate_btrans", + "template_tests.syntax_tests.i18n.test_blocktrans.MultipleLocaleActivationBlockTransTests.test_multiple_locale_direct_switch_btrans", + "template_tests.syntax_tests.i18n.test_blocktrans.MultipleLocaleActivationBlockTransTests.test_single_locale_activation", + "template_tests.syntax_tests.i18n.test_blocktrans.TranslationBlockTransTagTests.test_bad_placeholder_1", + "template_tests.syntax_tests.i18n.test_blocktrans.TranslationBlockTransTagTests.test_bad_placeholder_2", + "template_tests.syntax_tests.i18n.test_blocktrans.TranslationBlockTransTagTests.test_template_tags_pgettext", + "template_tests.syntax_tests.i18n.test_filters.I18nFiltersTests.test_i18n32", + "template_tests.syntax_tests.i18n.test_filters.I18nFiltersTests.test_i18n33", + "template_tests.syntax_tests.i18n.test_filters.I18nFiltersTests.test_i18n38_2", + "template_tests.syntax_tests.i18n.test_get_available_languages.GetAvailableLanguagesTagTests.test_i18n12", + "template_tests.syntax_tests.i18n.test_get_available_languages.GetAvailableLanguagesTagTests.test_no_as_var", + "template_tests.syntax_tests.i18n.test_get_current_language.I18nGetCurrentLanguageTagTests.test_no_as_var", + "template_tests.syntax_tests.i18n.test_get_current_language_bidi.I18nGetCurrentLanguageBidiTagTests.test_no_as_var", + "template_tests.syntax_tests.i18n.test_get_language_info.I18nGetLanguageInfoTagTests.test_i18n28_2", + "template_tests.syntax_tests.i18n.test_get_language_info.I18nGetLanguageInfoTagTests.test_i18n29", + "template_tests.syntax_tests.i18n.test_get_language_info.I18nGetLanguageInfoTagTests.test_i18n38", + "template_tests.syntax_tests.i18n.test_get_language_info.I18nGetLanguageInfoTagTests.test_no_for_as", + "template_tests.syntax_tests.i18n.test_get_language_info_list.GetLanguageInfoListTests.test_i18n30", + "template_tests.syntax_tests.i18n.test_get_language_info_list.GetLanguageInfoListTests.test_i18n31", + "template_tests.syntax_tests.i18n.test_get_language_info_list.GetLanguageInfoListTests.test_i18n38_2", + "template_tests.syntax_tests.i18n.test_get_language_info_list.GetLanguageInfoListTests.test_no_for_as", + "template_tests.syntax_tests.i18n.test_language.I18nLanguageTagTests.test_no_arg", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n01", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n02", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n06", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n09", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n20", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n22", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n23", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n24", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n25", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n35", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_i18n36", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_bad_option", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_context_as", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_context_noop", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_duplicate_option", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_missing_assignment", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_missing_context", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_syntax_error_no_arguments", + "template_tests.syntax_tests.i18n.test_trans.I18nTransTagTests.test_trans_tag_using_a_string_that_looks_like_str_fmt", + "template_tests.syntax_tests.i18n.test_trans.LocalizeNodeTests.test_repr", + "template_tests.syntax_tests.i18n.test_trans.MultipleLocaleActivationTransTagTests.test_multiple_locale_deactivate_trans", + "template_tests.syntax_tests.i18n.test_trans.MultipleLocaleActivationTransTagTests.test_multiple_locale_direct_switch_trans", + "template_tests.syntax_tests.i18n.test_trans.MultipleLocaleActivationTransTagTests.test_multiple_locale_trans", + "template_tests.syntax_tests.i18n.test_trans.MultipleLocaleActivationTransTagTests.test_single_locale_activation", + "template_tests.syntax_tests.i18n.test_trans.TranslationTransTagTests.test_template_tags_pgettext", + "template_tests.syntax_tests.i18n.test_underscore_syntax.I18nStringLiteralTests.test_i18n13", + "template_tests.syntax_tests.i18n.test_underscore_syntax.I18nStringLiteralTests.test_i18n14", + "template_tests.syntax_tests.i18n.test_underscore_syntax.I18nStringLiteralTests.test_i18n15", + "template_tests.syntax_tests.i18n.test_underscore_syntax.I18nStringLiteralTests.test_i18n16", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_deactivate", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_direct_switch", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_filter", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_filter_deactivate", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_filter_direct_switch", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_loadi18n", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_loadi18n_deactivate", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_multiple_locale_loadi18n_direct_switch", + "template_tests.syntax_tests.i18n.test_underscore_syntax.MultipleLocaleActivationTests.test_single_locale_activation", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_filters01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_filters02", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_filtertag01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_ifequal01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_literals01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_lookup01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_stringiterations01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag01", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag02", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag03", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag04", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag05", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag06", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag07", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag08", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag09", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_autoescape_tag10", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_invalid_arg", + "template_tests.syntax_tests.test_autoescape.AutoescapeTagTests.test_no_arg", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax01", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax02", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax03", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax04", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax06", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax07", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax08", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax09", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax10", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax11", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax12", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax13", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax14", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax15", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax16", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax17", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax18", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax19", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax20", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax20b", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax21", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax22", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax23", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax24", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax25", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax26", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax27", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax28", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax29", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax30", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax31", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax32", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax33", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax34", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax35", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax36", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax37", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_basic_syntax38", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_ignores_strings_that_look_like_format_interpolation", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_unclosed_block", + "template_tests.syntax_tests.test_basic.BasicSyntaxTests.test_unclosed_block2", + "template_tests.syntax_tests.test_builtins.BuiltinsTests.test_builtins01", + "template_tests.syntax_tests.test_builtins.BuiltinsTests.test_builtins02", + "template_tests.syntax_tests.test_builtins.BuiltinsTests.test_builtins03", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache03", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache04", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache05", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache06", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache07", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache08", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache11", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache12", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache13", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache14", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache15", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache16", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache17", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_cache18", + "template_tests.syntax_tests.test_cache.CacheTagTests.test_none_timeout", + "template_tests.syntax_tests.test_cache.CacheTests.test_cache_fragment_cache", + "template_tests.syntax_tests.test_cache.CacheTests.test_cache_missing_backend", + "template_tests.syntax_tests.test_cache.CacheTests.test_cache_regression_20130", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax01", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax02", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax03", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax04", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax05", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax06", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax07", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax08", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax09", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax10", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax11", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_syntax12", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_tag01", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_tag02", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_tag03", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_tag04", + "template_tests.syntax_tests.test_comment.CommentSyntaxTests.test_comment_tag05", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle01", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle05", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle07", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle10", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle11", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle12", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle13", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle14", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle15", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle16", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle17", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle18", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle19", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle20", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle21", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle22", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle23", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle24", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle25", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle26", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle27", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle28", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle29", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle30", + "template_tests.syntax_tests.test_cycle.CycleTagTests.test_cycle_undefined", + "template_tests.syntax_tests.test_exceptions.ExceptionsTests.test_exception01", + "template_tests.syntax_tests.test_exceptions.ExceptionsTests.test_exception02", + "template_tests.syntax_tests.test_exceptions.ExceptionsTests.test_exception03", + "template_tests.syntax_tests.test_exceptions.ExceptionsTests.test_exception04", + "template_tests.syntax_tests.test_exceptions.ExceptionsTests.test_exception05", + "template_tests.syntax_tests.test_extends.ExtendsNodeTests.test_extends_node_repr", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_duplicate_block", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_extends_duplicate", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance01", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance02", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance03", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance04", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance05", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance06", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance07", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance08", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance09", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance10", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance11", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance12", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance13", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance14", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance15", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance16", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance17", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance18", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance19", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance20", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance21", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance22", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance23", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance24", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance25", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance26", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance27", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance29", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance30", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance31", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance32", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance33", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance34", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance35", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance36", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance37", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance38", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance39", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance40", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance41", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance42", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance_28", + "template_tests.syntax_tests.test_extends.InheritanceTests.test_inheritance_empty", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax01", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax02", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax03", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax04", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax05", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax06", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax07", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax08", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax08_multi_line", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax09", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax10", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax11", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax13", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax14", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax15", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax16", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax17", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax18", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax19", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax20", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax21", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax22", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax23", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax24", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_filter_syntax25", + "template_tests.syntax_tests.test_filter_syntax.FilterSyntaxTests.test_type_error_attribute", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter01", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter02", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter03", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter04", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter05", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter05bis", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter06", + "template_tests.syntax_tests.test_filter_tag.FilterTagTests.test_filter06bis", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_all_false_arguments_asvar", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof01", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof02", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof03", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof04", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof05", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof06", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof07", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof08", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof09", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof10", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof11", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof12", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof13", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof14", + "template_tests.syntax_tests.test_firstof.FirstOfTagTests.test_firstof15", + "template_tests.syntax_tests.test_for.ForNodeTests.test_repr", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag01", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag02", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_context", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_empty01", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_empty02", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_empty03", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_filter_ws", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack01", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack03", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack04", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack05", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack06", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack07", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack08", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack09", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack10", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack11", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack12", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack13", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack14", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_unpack_strs", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars01", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars02", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars03", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars04", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars05", + "template_tests.syntax_tests.test_for.ForTagTests.test_for_tag_vars06", + "template_tests.syntax_tests.test_for.ForTagTests.test_invalid_arg", + "template_tests.syntax_tests.test_for.ForTagTests.test_invalid_in_keyword", + "template_tests.syntax_tests.test_for.ForTagTests.test_unpack_double_quote", + "template_tests.syntax_tests.test_for.ForTagTests.test_unpack_single_quote", + "template_tests.syntax_tests.test_for.ForTagTests.test_unpack_vertical_bar", + "template_tests.syntax_tests.test_if.IfNodeTests.test_repr", + "template_tests.syntax_tests.test_if.IfTagTests.test_else_if_tag_error01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_both_variables_missing", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_match", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_no_match", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_not_both_variables_missing", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_not_match", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_not_no_match", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_not_variable_missing", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_is_variable_missing", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag06", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag07", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag08", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag09", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag10", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag11", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag12", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag13", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and06", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and07", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_and08", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_badarg01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_badarg02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_badarg03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_badarg04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_eq01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_eq02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_eq03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_eq04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_eq05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error06", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error07", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error08", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error09", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error10", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error11", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_error12", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_filter01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_filter02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_gt_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_gt_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_gte_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_gte_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_in_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_in_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_lt_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_lt_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_lte_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_lte_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not06", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not07", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not08", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not09", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not10", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not11", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not12", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not13", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not14", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not15", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not16", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not17", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not18", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not19", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not20", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not21", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not22", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not23", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not24", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not25", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not26", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not27", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not28", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not29", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not30", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not31", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not32", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not33", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not34", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not35", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not_in_01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_not_in_02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_noteq01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_noteq02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_noteq03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_noteq04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_noteq05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or03", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or04", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or05", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or06", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or07", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or08", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_or09", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_shortcircuit01", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_shortcircuit02", + "template_tests.syntax_tests.test_if.IfTagTests.test_if_tag_single_eq", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged01", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged02", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged03", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged04", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged05", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged06", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged07", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged08", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_else01", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_else02", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_else03", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_else04", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_filter_ws", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_param01", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_param02", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_param03", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_param04", + "template_tests.syntax_tests.test_if_changed.IfChangedTagTests.test_ifchanged_param05", + "template_tests.syntax_tests.test_if_changed.IfChangedTests.test_ifchanged_concurrency", + "template_tests.syntax_tests.test_if_changed.IfChangedTests.test_ifchanged_render_once", + "template_tests.syntax_tests.test_if_changed.IfChangedTests.test_include", + "template_tests.syntax_tests.test_if_changed.IfChangedTests.test_include_state", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal01", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal02", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal03", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal04", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal05", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal06", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal07", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal08", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal09", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal10", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_filter01", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_filter02", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_filter03", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_filter04", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_filter05", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric01", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric02", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric03", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric04", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric05", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric06", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric07", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric08", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric09", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric10", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric11", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_numeric12", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split01", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split02", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split03", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split04", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split05", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split06", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split07", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split08", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split09", + "template_tests.syntax_tests.test_if_equal.IfEqualTagTests.test_ifequal_split10", + "template_tests.syntax_tests.test_if_equal.IfEqualTests.test_repr", + "template_tests.syntax_tests.test_if_equal.IfNotEqualTagTests.test_ifnotequal01", + "template_tests.syntax_tests.test_if_equal.IfNotEqualTagTests.test_ifnotequal02", + "template_tests.syntax_tests.test_if_equal.IfNotEqualTagTests.test_ifnotequal03", + "template_tests.syntax_tests.test_if_equal.IfNotEqualTagTests.test_ifnotequal04", + "template_tests.syntax_tests.test_if_equal.IfNotEqualTagTests.test_one_var", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include01", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include02", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include03", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include04", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include06", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include07", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include08", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include09", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include10", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include11", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include12", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include13", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include14", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_empty", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error01", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error02", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error03", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error04", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error05", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error06", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error07", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error08", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error09", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_error10", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_fail1", + "template_tests.syntax_tests.test_include.IncludeTagTests.test_include_fail2", + "template_tests.syntax_tests.test_include.IncludeTests.test_extends_include_missing_baseloader", + "template_tests.syntax_tests.test_include.IncludeTests.test_extends_include_missing_cachedloader", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_cache", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_from_loader_get_template", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_immediate_missing", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_missing_template", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_recursive", + "template_tests.syntax_tests.test_include.IncludeTests.test_include_template_argument", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr01", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr02", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr03", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr04", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr04_2", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr05", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr06", + "template_tests.syntax_tests.test_invalid_string.InvalidStringTests.test_invalidstr07", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index01", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index02", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index03", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index04", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index05", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index06", + "template_tests.syntax_tests.test_list_index.ListIndexTests.test_list_index07", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load01", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load02", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load03", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load04", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load05", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load06", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load07", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load08", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load09", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load10", + "template_tests.syntax_tests.test_load.LoadTagTests.test_load12", + "template_tests.syntax_tests.test_lorem.LoremTagTests.test_lorem1", + "template_tests.syntax_tests.test_lorem.LoremTagTests.test_lorem_random", + "template_tests.syntax_tests.test_multiline.MultilineTests.test_multiline01", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks01", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks02", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks03", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks04", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks05", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks06", + "template_tests.syntax_tests.test_named_endblock.NamedEndblockTests.test_namedendblocks07", + "template_tests.syntax_tests.test_now.NowTagTests.test_now01", + "template_tests.syntax_tests.test_now.NowTagTests.test_now02", + "template_tests.syntax_tests.test_now.NowTagTests.test_now03", + "template_tests.syntax_tests.test_now.NowTagTests.test_now04", + "template_tests.syntax_tests.test_now.NowTagTests.test_now05", + "template_tests.syntax_tests.test_now.NowTagTests.test_now06", + "template_tests.syntax_tests.test_now.NowTagTests.test_now07", + "template_tests.syntax_tests.test_now.NowTagTests.test_now_args", + "template_tests.syntax_tests.test_numpy.NumpyTests.test_numpy_array_index01", + "template_tests.syntax_tests.test_numpy.NumpyTests.test_numpy_array_index02", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup01", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup02", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup03", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup04", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup05", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup06", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup07", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup08", + "template_tests.syntax_tests.test_regroup.RegroupTagTests.test_regroup_unpack", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle01", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle02", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle03", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle04", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle05", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle06", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle07", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle08", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle09", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle10", + "template_tests.syntax_tests.test_resetcycle.ResetCycleTagTests.test_resetcycle11", + "template_tests.syntax_tests.test_setup.SetupTests.test_setup", + "template_tests.syntax_tests.test_simple_tag.SimpleTagTests.test_simpletag_renamed01", + "template_tests.syntax_tests.test_simple_tag.SimpleTagTests.test_simpletag_renamed02", + "template_tests.syntax_tests.test_simple_tag.SimpleTagTests.test_simpletag_renamed03", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless01", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless02", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless03", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless04", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless05", + "template_tests.syntax_tests.test_spaceless.SpacelessTagTests.test_spaceless06", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_prefixtag01", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_prefixtag02", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_prefixtag03", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_prefixtag04", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_prefixtag_without_as", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_quotes_urls", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_statictag01", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_statictag02", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_statictag03", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_statictag04", + "template_tests.syntax_tests.test_static.StaticTagTests.test_static_statictag_without_path", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag01", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag02", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag03", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag04", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag05", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag06", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag07", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag08", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag09", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag10", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag11", + "template_tests.syntax_tests.test_template_tag.TemplateTagTests.test_templatetag12", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url01", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url02", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url02a", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url02b", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url02c", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url03", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url04", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url05", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url06", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url08", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url09", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url10", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url11", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url12", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url13", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url14", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url15", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url18", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url19", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url20", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url21", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_asvar01", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_asvar02", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_asvar03", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail01", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail02", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail03", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail04", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail05", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail06", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail07", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail08", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail09", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail11", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail12", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail13", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail14", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail15", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail16", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail17", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail18", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_fail19", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_namespace01", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_namespace02", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_namespace03", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_namespace_explicit_current_app", + "template_tests.syntax_tests.test_url.UrlTagTests.test_url_namespace_no_current_app", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag01", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag02", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag03", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag04", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag05", + "template_tests.syntax_tests.test_verbatim.VerbatimTagTests.test_verbatim_tag06", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_typeerror_as_var", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio01", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio02", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio03", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio04", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio05", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio06", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio07", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio08", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio09", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio10", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio11", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio12a", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio12b", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio13a", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio13b", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio14a", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio14b", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio15", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio16", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio17", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio18", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio19", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio20", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_widthratio21", + "template_tests.syntax_tests.test_width_ratio.WidthRatioTagTests.test_zerodivisionerror_as_var", + "template_tests.syntax_tests.test_with.WithNodeTests.test_repr", + "template_tests.syntax_tests.test_with.WithTagTests.test_legacywith01", + "template_tests.syntax_tests.test_with.WithTagTests.test_legacywith02", + "template_tests.syntax_tests.test_with.WithTagTests.test_with01", + "template_tests.syntax_tests.test_with.WithTagTests.test_with02", + "template_tests.syntax_tests.test_with.WithTagTests.test_with03", + "template_tests.syntax_tests.test_with.WithTagTests.test_with_error01", + "template_tests.syntax_tests.test_with.WithTagTests.test_with_error02", + "template_tests.test_base.TemplateTests.test_lazy_template_string", + "template_tests.test_base.VariableDoesNotExistTests.test_str", + "template_tests.test_base.VariableTests.test_integer_literals", + "template_tests.test_base.VariableTests.test_nonliterals", + "template_tests.test_callables.CallableVariablesTests.test_alters_data", + "template_tests.test_callables.CallableVariablesTests.test_callable", + "template_tests.test_callables.CallableVariablesTests.test_do_not_call", + "template_tests.test_callables.CallableVariablesTests.test_do_not_call_and_alters_data", + "template_tests.test_context.ContextTests.test_context", + "template_tests.test_context.ContextTests.test_context_comparable", + "template_tests.test_context.ContextTests.test_copy_request_context_twice", + "template_tests.test_context.ContextTests.test_flatten_context", + "template_tests.test_context.ContextTests.test_flatten_context_with_context", + "template_tests.test_context.ContextTests.test_push_context_manager", + "template_tests.test_context.ContextTests.test_push_context_manager_with_context_object", + "template_tests.test_context.ContextTests.test_push_proper_layering", + "template_tests.test_context.ContextTests.test_render_context", + "template_tests.test_context.ContextTests.test_resolve_on_context_method", + "template_tests.test_context.ContextTests.test_set_upward", + "template_tests.test_context.ContextTests.test_set_upward_empty_context", + "template_tests.test_context.ContextTests.test_set_upward_with_push", + "template_tests.test_context.ContextTests.test_set_upward_with_push_no_match", + "template_tests.test_context.ContextTests.test_setdefault", + "template_tests.test_context.ContextTests.test_update_context_manager", + "template_tests.test_context.ContextTests.test_update_context_manager_with_context_object", + "template_tests.test_context.ContextTests.test_update_proper_layering", + "template_tests.test_context.RequestContextTests.test_context_comparable", + "template_tests.test_context.RequestContextTests.test_include_only", + "template_tests.test_context.RequestContextTests.test_modify_context_and_render", + "template_tests.test_context.RequestContextTests.test_stack_size", + "template_tests.test_engine.GetDefaultTests.test_multiple_engines_configured", + "template_tests.test_engine.GetDefaultTests.test_no_engines_configured", + "template_tests.test_engine.GetDefaultTests.test_single_engine_configured", + "template_tests.test_engine.LoaderTests.test_cached_loader_priority", + "template_tests.test_engine.LoaderTests.test_loader_priority", + "template_tests.test_engine.LoaderTests.test_origin", + "template_tests.test_engine.RenderToStringTest.test_basic_context", + "template_tests.test_extends.ExtendsBehaviorTests.test_block_override_in_extended_included_template", + "template_tests.test_extends.ExtendsBehaviorTests.test_extend_cached", + "template_tests.test_extends.ExtendsBehaviorTests.test_extend_missing", + "template_tests.test_extends.ExtendsBehaviorTests.test_extend_recursive", + "template_tests.test_extends.ExtendsBehaviorTests.test_extend_self_error", + "template_tests.test_extends.ExtendsBehaviorTests.test_normal_extend", + "template_tests.test_extends.ExtendsBehaviorTests.test_recursive_multiple_loaders", + "template_tests.test_extends.ExtendsBehaviorTests.test_unique_history_per_loader", + "template_tests.test_extends_relative.ExtendsMixedBehaviorTests.test_mixing1", + "template_tests.test_extends_relative.ExtendsMixedBehaviorTests.test_mixing2", + "template_tests.test_extends_relative.ExtendsMixedBehaviorTests.test_mixing_loop", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_dir1_extend", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_dir1_extend1", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_dir1_extend2", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_dir1_extend3", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_dir2_extend", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_extend_error", + "template_tests.test_extends_relative.ExtendsRelativeBehaviorTests.test_normal_extend", + "template_tests.test_extends_relative.IncludeRelativeBehaviorTests.test_dir2_include", + "template_tests.test_extends_relative.IncludeRelativeBehaviorTests.test_include_error", + "template_tests.test_extends_relative.IncludeRelativeBehaviorTests.test_normal_include", + "template_tests.test_library.FilterRegistrationTests.test_filter", + "template_tests.test_library.FilterRegistrationTests.test_filter_call", + "template_tests.test_library.FilterRegistrationTests.test_filter_invalid", + "template_tests.test_library.FilterRegistrationTests.test_filter_name_arg", + "template_tests.test_library.FilterRegistrationTests.test_filter_name_kwarg", + "template_tests.test_library.FilterRegistrationTests.test_filter_parens", + "template_tests.test_library.InclusionTagRegistrationTests.test_inclusion_tag", + "template_tests.test_library.InclusionTagRegistrationTests.test_inclusion_tag_name", + "template_tests.test_library.SimpleTagRegistrationTests.test_simple_tag", + "template_tests.test_library.SimpleTagRegistrationTests.test_simple_tag_invalid", + "template_tests.test_library.SimpleTagRegistrationTests.test_simple_tag_name_kwarg", + "template_tests.test_library.SimpleTagRegistrationTests.test_simple_tag_parens", + "template_tests.test_library.TagRegistrationTests.test_tag", + "template_tests.test_library.TagRegistrationTests.test_tag_call", + "template_tests.test_library.TagRegistrationTests.test_tag_invalid", + "template_tests.test_library.TagRegistrationTests.test_tag_name_arg", + "template_tests.test_library.TagRegistrationTests.test_tag_name_kwarg", + "template_tests.test_library.TagRegistrationTests.test_tag_parens", + "template_tests.test_loaders.AppDirectoriesLoaderTests.test_get_template", + "template_tests.test_loaders.AppDirectoriesLoaderTests.test_not_installed", + "template_tests.test_loaders.CachedLoaderTests.test_cached_exception_no_traceback", + "template_tests.test_loaders.CachedLoaderTests.test_get_template", + "template_tests.test_loaders.CachedLoaderTests.test_get_template_missing_debug_off", + "template_tests.test_loaders.CachedLoaderTests.test_get_template_missing_debug_on", + "template_tests.test_loaders.CachedLoaderTests.test_template_name_lazy_string", + "template_tests.test_loaders.CachedLoaderTests.test_template_name_leading_dash_caching", + "template_tests.test_loaders.FileSystemLoaderTests.test_bytestring", + "template_tests.test_loaders.FileSystemLoaderTests.test_case_sensitivity", + "template_tests.test_loaders.FileSystemLoaderTests.test_directory_security", + "template_tests.test_loaders.FileSystemLoaderTests.test_file_does_not_exist", + "template_tests.test_loaders.FileSystemLoaderTests.test_get_template", + "template_tests.test_loaders.FileSystemLoaderTests.test_loaders_dirs", + "template_tests.test_loaders.FileSystemLoaderTests.test_loaders_dirs_empty", + "template_tests.test_loaders.FileSystemLoaderTests.test_notafile_error", + "template_tests.test_loaders.FileSystemLoaderTests.test_permissions_error", + "template_tests.test_loaders.FileSystemLoaderTests.test_unicode_dir_name", + "template_tests.test_loaders.FileSystemLoaderTests.test_unicode_template_name", + "template_tests.test_loaders.LocmemLoaderTests.test_get_template", + "template_tests.test_logging.VariableResolveLoggingTests.test_log_on_variable_does_not_exist_not_silent", + "template_tests.test_logging.VariableResolveLoggingTests.test_log_on_variable_does_not_exist_silent", + "template_tests.test_logging.VariableResolveLoggingTests.test_no_log_when_variable_exists", + "template_tests.test_nodelist.ErrorIndexTest.test_correct_exception_index", + "template_tests.test_nodelist.NodelistTest.test_for", + "template_tests.test_nodelist.NodelistTest.test_if", + "template_tests.test_nodelist.NodelistTest.test_ifchanged", + "template_tests.test_nodelist.NodelistTest.test_ifequal", + "template_tests.test_nodelist.TextNodeTest.test_textnode_repr", + "template_tests.test_origin.OriginTestCase.test_origin_compares_equal", + "template_tests.test_origin.OriginTestCase.test_origin_compares_not_equal", + "template_tests.test_parser.ParserTests.test_filter_args_count", + "template_tests.test_parser.ParserTests.test_filter_parsing", + "template_tests.test_parser.ParserTests.test_token_smart_split", + "template_tests.test_parser.ParserTests.test_variable_parsing", + "template_tests.test_response.CacheMiddlewareTest.test_middleware_caching", + "template_tests.test_response.CustomURLConfTest.test_custom_urlconf", + "template_tests.test_response.SimpleTemplateResponseTest.test_args", + "template_tests.test_response.SimpleTemplateResponseTest.test_content_access_rendered", + "template_tests.test_response.SimpleTemplateResponseTest.test_content_access_unrendered", + "template_tests.test_response.SimpleTemplateResponseTest.test_dict_context", + "template_tests.test_response.SimpleTemplateResponseTest.test_explicit_baking", + "template_tests.test_response.SimpleTemplateResponseTest.test_iteration_rendered", + "template_tests.test_response.SimpleTemplateResponseTest.test_iteration_unrendered", + "template_tests.test_response.SimpleTemplateResponseTest.test_kwargs", + "template_tests.test_response.SimpleTemplateResponseTest.test_pickling", + "template_tests.test_response.SimpleTemplateResponseTest.test_pickling_cookie", + "template_tests.test_response.SimpleTemplateResponseTest.test_post_callbacks", + "template_tests.test_response.SimpleTemplateResponseTest.test_render", + "template_tests.test_response.SimpleTemplateResponseTest.test_repickling", + "template_tests.test_response.SimpleTemplateResponseTest.test_set_content", + "template_tests.test_response.SimpleTemplateResponseTest.test_template_resolving", + "template_tests.test_response.SimpleTemplateResponseTest.test_using", + "template_tests.test_response.TemplateResponseTest.test_args", + "template_tests.test_response.TemplateResponseTest.test_context_processor_priority", + "template_tests.test_response.TemplateResponseTest.test_kwargs", + "template_tests.test_response.TemplateResponseTest.test_pickling", + "template_tests.test_response.TemplateResponseTest.test_render", + "template_tests.test_response.TemplateResponseTest.test_render_with_requestcontext", + "template_tests.test_response.TemplateResponseTest.test_repickling", + "template_tests.test_response.TemplateResponseTest.test_using", + "template_tests.test_smartif.SmartIfTests.test_in", + "template_tests.test_smartif.SmartIfTests.test_not", + "template_tests.test_smartif.SmartIfTests.test_not_in", + "template_tests.test_smartif.SmartIfTests.test_or", + "template_tests.test_smartif.SmartIfTests.test_precedence", + "template_tests.tests.TemplateTests.test_compile_filter_expression_error", + "template_tests.tests.TemplateTests.test_compile_tag_error", + "template_tests.tests.TemplateTests.test_compile_tag_error_27584", + "template_tests.tests.TemplateTests.test_compile_tag_error_27956", + "template_tests.tests.TemplateTests.test_debug_tag_non_ascii", + "template_tests.tests.TemplateTests.test_extends_generic_template", + "template_tests.tests.TemplateTests.test_invalid_block_suggestion", + "template_tests.tests.TemplateTests.test_no_wrapped_exception", + "template_tests.tests.TemplateTests.test_node_origin", + "template_tests.tests.TemplateTests.test_string_origin", + "template_tests.tests.TemplateTests.test_super_errors", + "template_tests.tests.TemplateTests.test_unknown_block_tag", + "template_tests.tests.TemplateTests.test_url_reverse_no_settings_module", + "template_tests.tests.TemplateTests.test_url_reverse_view_name", + "test_client.test_conditional_content_removal.ConditionalContentTests.test_conditional_content_removal", + "test_client.tests.CSRFEnabledClientTests.test_csrf_enabled_client", + "test_client.tests.ClientTest.test_empty_post", + "test_client.tests.ClientTest.test_exception_following_nested_client_request", + "test_client.tests.ClientTest.test_external_redirect", + "test_client.tests.ClientTest.test_external_redirect_with_fetch_error_msg", + "test_client.tests.ClientTest.test_follow_307_and_308_preserves_get_params", + "test_client.tests.ClientTest.test_follow_307_and_308_preserves_post_data", + "test_client.tests.ClientTest.test_follow_307_and_308_preserves_put_body", + "test_client.tests.ClientTest.test_follow_307_and_308_redirect", + "test_client.tests.ClientTest.test_follow_redirect", + "test_client.tests.ClientTest.test_follow_relative_redirect", + "test_client.tests.ClientTest.test_follow_relative_redirect_no_trailing_slash", + "test_client.tests.ClientTest.test_force_login_with_backend", + "test_client.tests.ClientTest.test_force_login_with_backend_missing_get_user", + "test_client.tests.ClientTest.test_force_login_without_backend", + "test_client.tests.ClientTest.test_form_error", + "test_client.tests.ClientTest.test_form_error_with_template", + "test_client.tests.ClientTest.test_get_data_none", + "test_client.tests.ClientTest.test_get_post_view", + "test_client.tests.ClientTest.test_get_view", + "test_client.tests.ClientTest.test_incomplete_data_form", + "test_client.tests.ClientTest.test_incomplete_data_form_with_template", + "test_client.tests.ClientTest.test_insecure", + "test_client.tests.ClientTest.test_json_encoder_argument", + "test_client.tests.ClientTest.test_json_serialization", + "test_client.tests.ClientTest.test_logout", + "test_client.tests.ClientTest.test_logout_cookie_sessions", + "test_client.tests.ClientTest.test_logout_with_force_login", + "test_client.tests.ClientTest.test_mail_sending", + "test_client.tests.ClientTest.test_mass_mail_sending", + "test_client.tests.ClientTest.test_notfound_response", + "test_client.tests.ClientTest.test_permanent_redirect", + "test_client.tests.ClientTest.test_post", + "test_client.tests.ClientTest.test_post_data_none", + "test_client.tests.ClientTest.test_put", + "test_client.tests.ClientTest.test_query_string_encoding", + "test_client.tests.ClientTest.test_raw_post", + "test_client.tests.ClientTest.test_redirect", + "test_client.tests.ClientTest.test_redirect_http", + "test_client.tests.ClientTest.test_redirect_https", + "test_client.tests.ClientTest.test_redirect_to_strange_location", + "test_client.tests.ClientTest.test_redirect_with_query", + "test_client.tests.ClientTest.test_redirect_with_query_ordering", + "test_client.tests.ClientTest.test_relative_redirect", + "test_client.tests.ClientTest.test_relative_redirect_no_trailing_slash", + "test_client.tests.ClientTest.test_response_attached_request", + "test_client.tests.ClientTest.test_response_headers", + "test_client.tests.ClientTest.test_response_raises_multi_arg_exception", + "test_client.tests.ClientTest.test_response_resolver_match", + "test_client.tests.ClientTest.test_response_resolver_match_redirect_follow", + "test_client.tests.ClientTest.test_response_resolver_match_regular_view", + "test_client.tests.ClientTest.test_reverse_lazy_decodes", + "test_client.tests.ClientTest.test_secure", + "test_client.tests.ClientTest.test_session_engine_is_invalid", + "test_client.tests.ClientTest.test_session_modifying_view", + "test_client.tests.ClientTest.test_sessions_app_is_not_installed", + "test_client.tests.ClientTest.test_temporary_redirect", + "test_client.tests.ClientTest.test_trace", + "test_client.tests.ClientTest.test_unknown_page", + "test_client.tests.ClientTest.test_uploading_named_temp_file", + "test_client.tests.ClientTest.test_uploading_temp_file", + "test_client.tests.ClientTest.test_url_parameters", + "test_client.tests.ClientTest.test_valid_form", + "test_client.tests.ClientTest.test_valid_form_with_hints", + "test_client.tests.ClientTest.test_valid_form_with_template", + "test_client.tests.ClientTest.test_view_with_bad_login", + "test_client.tests.ClientTest.test_view_with_exception", + "test_client.tests.ClientTest.test_view_with_force_login", + "test_client.tests.ClientTest.test_view_with_force_login_and_custom_redirect", + "test_client.tests.ClientTest.test_view_with_inactive_force_login", + "test_client.tests.ClientTest.test_view_with_inactive_login", + "test_client.tests.ClientTest.test_view_with_login", + "test_client.tests.ClientTest.test_view_with_login_and_custom_redirect", + "test_client.tests.ClientTest.test_view_with_login_when_sessions_app_is_not_installed", + "test_client.tests.ClientTest.test_view_with_method_force_login", + "test_client.tests.ClientTest.test_view_with_method_login", + "test_client.tests.ClientTest.test_view_with_method_permissions", + "test_client.tests.ClientTest.test_view_with_permissions", + "test_client.tests.ClientTest.test_view_with_permissions_exception", + "test_client.tests.CustomTestClientTest.test_custom_test_client", + "test_client.tests.RequestFactoryTest.test_get_request_from_factory", + "test_client.tests.RequestFactoryTest.test_request_factory", + "test_client.tests.RequestFactoryTest.test_trace_request_from_factory", + "test_client_regress.tests.AssertContainsTests.test_assert_contains_renders_template_response", + "test_client_regress.tests.AssertContainsTests.test_assert_contains_using_non_template_response", + "test_client_regress.tests.AssertContainsTests.test_assert_not_contains_renders_template_response", + "test_client_regress.tests.AssertContainsTests.test_assert_not_contains_using_non_template_response", + "test_client_regress.tests.AssertContainsTests.test_binary_contains", + "test_client_regress.tests.AssertContainsTests.test_binary_not_contains", + "test_client_regress.tests.AssertContainsTests.test_contains", + "test_client_regress.tests.AssertContainsTests.test_nontext_contains", + "test_client_regress.tests.AssertContainsTests.test_nontext_not_contains", + "test_client_regress.tests.AssertContainsTests.test_unicode_contains", + "test_client_regress.tests.AssertContainsTests.test_unicode_not_contains", + "test_client_regress.tests.AssertFormErrorTests.test_noerror_field", + "test_client_regress.tests.AssertFormErrorTests.test_unknown_error", + "test_client_regress.tests.AssertFormErrorTests.test_unknown_field", + "test_client_regress.tests.AssertFormErrorTests.test_unknown_form", + "test_client_regress.tests.AssertFormErrorTests.test_unknown_nonfield_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_field_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_no_error_field", + "test_client_regress.tests.AssertFormsetErrorTests.test_no_nonfield_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_no_nonform_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_nonfield_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_nonform_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_unknown_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_unknown_field", + "test_client_regress.tests.AssertFormsetErrorTests.test_unknown_formset", + "test_client_regress.tests.AssertFormsetErrorTests.test_unknown_nonfield_error", + "test_client_regress.tests.AssertFormsetErrorTests.test_unknown_nonform_error", + "test_client_regress.tests.AssertRedirectsTests.test_circular_redirect", + "test_client_regress.tests.AssertRedirectsTests.test_incorrect_target", + "test_client_regress.tests.AssertRedirectsTests.test_lost_query", + "test_client_regress.tests.AssertRedirectsTests.test_multiple_redirect_chain", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_delete", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_head", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_on_non_redirect_page", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_options", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_post", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_put", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_to_non_existent", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_chain_to_self", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_on_non_redirect_page", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_page", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_scheme", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_to_different_host", + "test_client_regress.tests.AssertRedirectsTests.test_redirect_to_self_with_changing_query", + "test_client_regress.tests.AssertRedirectsTests.test_target_page", + "test_client_regress.tests.AssertTemplateUsedTests.test_multiple_context", + "test_client_regress.tests.AssertTemplateUsedTests.test_no_context", + "test_client_regress.tests.AssertTemplateUsedTests.test_single_context", + "test_client_regress.tests.AssertTemplateUsedTests.test_template_rendered_multiple_times", + "test_client_regress.tests.ContextTests.test_15368", + "test_client_regress.tests.ContextTests.test_contextlist_get", + "test_client_regress.tests.ContextTests.test_contextlist_keys", + "test_client_regress.tests.ContextTests.test_inherited_context", + "test_client_regress.tests.ContextTests.test_nested_requests", + "test_client_regress.tests.ContextTests.test_single_context", + "test_client_regress.tests.ExceptionTests.test_exception_cleared", + "test_client_regress.tests.LoginTests.test_login_different_client", + "test_client_regress.tests.PayloadEncodingTests.test_non_utf_payload", + "test_client_regress.tests.PayloadEncodingTests.test_simple_payload", + "test_client_regress.tests.PayloadEncodingTests.test_utf16_payload", + "test_client_regress.tests.PayloadEncodingTests.test_utf8_payload", + "test_client_regress.tests.QueryStringTests.test_get_like_requests", + "test_client_regress.tests.QueryStringTests.test_post_like_requests", + "test_client_regress.tests.ReadLimitedStreamTest.test_body_from_empty_request", + "test_client_regress.tests.ReadLimitedStreamTest.test_read_from_empty_request", + "test_client_regress.tests.ReadLimitedStreamTest.test_read_from_nonempty_request", + "test_client_regress.tests.ReadLimitedStreamTest.test_read_numbytes_from_empty_request", + "test_client_regress.tests.ReadLimitedStreamTest.test_read_numbytes_from_nonempty_request", + "test_client_regress.tests.RequestFactoryEnvironmentTests.test_cookies", + "test_client_regress.tests.RequestFactoryEnvironmentTests.test_should_set_correct_env_variables", + "test_client_regress.tests.RequestFactoryStateTest.test_request", + "test_client_regress.tests.RequestFactoryStateTest.test_request_after_client", + "test_client_regress.tests.RequestFactoryStateTest.test_request_after_client_2", + "test_client_regress.tests.RequestHeadersTest.test_client_headers", + "test_client_regress.tests.RequestHeadersTest.test_client_headers_redirect", + "test_client_regress.tests.RequestMethodStringDataTests.test_empty_string_data", + "test_client_regress.tests.RequestMethodStringDataTests.test_json", + "test_client_regress.tests.RequestMethodStringDataTests.test_json_bytes", + "test_client_regress.tests.RequestMethodStringDataTests.test_json_multiple_access", + "test_client_regress.tests.RequestMethodStringDataTests.test_json_structured_suffixes", + "test_client_regress.tests.RequestMethodStringDataTests.test_json_wrong_header", + "test_client_regress.tests.RequestMethodStringDataTests.test_patch", + "test_client_regress.tests.RequestMethodStringDataTests.test_post", + "test_client_regress.tests.RequestMethodStringDataTests.test_put", + "test_client_regress.tests.RequestMethodTests.test_delete", + "test_client_regress.tests.RequestMethodTests.test_get", + "test_client_regress.tests.RequestMethodTests.test_head", + "test_client_regress.tests.RequestMethodTests.test_options", + "test_client_regress.tests.RequestMethodTests.test_patch", + "test_client_regress.tests.RequestMethodTests.test_post", + "test_client_regress.tests.RequestMethodTests.test_put", + "test_client_regress.tests.SessionEngineTests.test_login", + "test_client_regress.tests.SessionTests.test_login_with_user", + "test_client_regress.tests.SessionTests.test_login_without_signal", + "test_client_regress.tests.SessionTests.test_logout", + "test_client_regress.tests.SessionTests.test_logout_with_custom_auth_backend", + "test_client_regress.tests.SessionTests.test_logout_with_custom_user", + "test_client_regress.tests.SessionTests.test_logout_with_user", + "test_client_regress.tests.SessionTests.test_logout_without_user", + "test_client_regress.tests.SessionTests.test_session", + "test_client_regress.tests.SessionTests.test_session_initiated", + "test_client_regress.tests.TemplateExceptionTests.test_bad_404_template", + "test_client_regress.tests.URLEscapingTests.test_argument_with_space_get", + "test_client_regress.tests.URLEscapingTests.test_argument_with_space_post", + "test_client_regress.tests.URLEscapingTests.test_simple_argument_get", + "test_client_regress.tests.URLEscapingTests.test_simple_argument_post", + "test_client_regress.tests.UploadedFileEncodingTest.test_file_encoding", + "test_client_regress.tests.UploadedFileEncodingTest.test_guesses_content_type_on_file_encoding", + "test_client_regress.tests.UrlconfSubstitutionTests.test_urlconf_was_changed", + "test_client_regress.tests.zzUrlconfSubstitutionTests.test_urlconf_was_reverted", + "test_exceptions.test_validation_error.TestValidationError.test_messages_concatenates_error_dict_values", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_all", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_default_and_other", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_default_only", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_mixed", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_no_databases_required", + "test_runner.test_discover_runner.DiscoverRunnerGetDatabasesTests.test_other_only", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_add_arguments_debug_mode", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_discovery_on_package", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_dotted_test_class_django_testcase", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_dotted_test_class_vanilla_unittest", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_dotted_test_method_django_testcase", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_dotted_test_module", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_duplicates_ignored", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_empty_label", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_empty_test_case", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_exclude_tags", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_excluded_tags_displayed", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_file_path", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_ignore_adjacent", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_included_tags_displayed", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_init_debug_mode", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_overridable_get_test_runner_kwargs", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_overridable_test_loader", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_overridable_test_runner", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_overridable_test_suite", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_pattern", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_reverse", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_tag_inheritance", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_tags", + "test_runner.test_discover_runner.DiscoverRunnerTests.test_testcase_ordering", + "test_runner.test_parallel.ParallelTestRunnerTest.test_subtest", + "test_runner.test_parallel.RemoteTestResultTest.test_add_failing_subtests", + "test_runner.test_parallel.RemoteTestResultTest.test_pickle_errors_detection", + "test_runner_apps.databases.tests.AllDatabasesTests.test_nothing", + "test_runner_apps.databases.tests.DefaultDatabaseTests.test_nothing", + "test_runner_apps.databases.tests.NoDatabaseTests.test_nothing", + "test_runner_apps.databases.tests.OtherDatabaseTests.test_nothing", + "test_runner_apps.sample.doctests.factorial", + "test_runner_apps.sample.tests.tests.Test.test_sample", + "test_runner_apps.sample.tests_sample.TestDjangoTestCase.test_sample", + "test_runner_apps.sample.tests_sample.TestVanillaUnittest.test_sample", + "test_runner_apps.sample.tests_sample.TestZimpleTestCase.test_sample", + "test_runner_apps.simple.tests.DjangoCase1.test_1", + "test_runner_apps.simple.tests.DjangoCase1.test_2", + "test_runner_apps.simple.tests.DjangoCase2.test_1", + "test_runner_apps.simple.tests.DjangoCase2.test_2", + "test_runner_apps.simple.tests.SimpleCase1.test_1", + "test_runner_apps.simple.tests.SimpleCase1.test_2", + "test_runner_apps.simple.tests.SimpleCase2.test_1", + "test_runner_apps.simple.tests.SimpleCase2.test_2", + "test_runner_apps.simple.tests.UnittestCase1.test_1", + "test_runner_apps.simple.tests.UnittestCase1.test_2", + "test_runner_apps.simple.tests.UnittestCase2.test_1", + "test_runner_apps.simple.tests.UnittestCase2.test_2", + "test_runner_apps.tagged.tests.TaggedTestCase.test_multiple_tags", + "test_runner_apps.tagged.tests.TaggedTestCase.test_single_tag", + "test_runner_apps.tagged.tests_inheritance.Foo.test_new_func_tag", + "test_runner_apps.tagged.tests_inheritance.Foo.test_no_new_tags", + "test_runner_apps.tagged.tests_inheritance.FooBar.test_new_class_and_func_tags", + "test_runner_apps.tagged.tests_inheritance.FooBar.test_new_class_tag_only", + "unittest.loader._FailedTest.admin_changelist.test_date_hierarchy", + "unittest.loader._FailedTest.admin_changelist.tests", + "unittest.loader._FailedTest.admin_checks.tests", + "unittest.loader._FailedTest.admin_custom_urls.tests", + "unittest.loader._FailedTest.admin_docs.test_views", + "unittest.loader._FailedTest.admin_filters.tests", + "unittest.loader._FailedTest.admin_inlines.tests", + "unittest.loader._FailedTest.admin_ordering.tests", + "unittest.loader._FailedTest.admin_registration.tests", + "unittest.loader._FailedTest.admin_utils.test_logentry", + "unittest.loader._FailedTest.admin_utils.tests", + "unittest.loader._FailedTest.admin_views.test_actions", + "unittest.loader._FailedTest.admin_views.test_adminsite", + "unittest.loader._FailedTest.admin_views.test_autocomplete_view", + "unittest.loader._FailedTest.admin_views.test_multidb", + "unittest.loader._FailedTest.admin_views.test_templatetags", + "unittest.loader._FailedTest.admin_views.tests", + "unittest.loader._FailedTest.admin_widgets.test_autocomplete_widget", + "unittest.loader._FailedTest.admin_widgets.tests", + "unittest.loader._FailedTest.aggregation.test_filter_argument", + "unittest.loader._FailedTest.aggregation.tests", + "unittest.loader._FailedTest.aggregation_regress.tests", + "unittest.loader._FailedTest.annotations.tests", + "unittest.loader._FailedTest.apps.tests", + "unittest.loader._FailedTest.auth_tests.models", + "unittest.loader._FailedTest.auth_tests.test_auth_backends", + "unittest.loader._FailedTest.auth_tests.test_basic", + "unittest.loader._FailedTest.auth_tests.test_checks", + "unittest.loader._FailedTest.auth_tests.test_decorators", + "unittest.loader._FailedTest.auth_tests.test_forms", + "unittest.loader._FailedTest.auth_tests.test_handlers", + "unittest.loader._FailedTest.auth_tests.test_management", + "unittest.loader._FailedTest.auth_tests.test_migrations", + "unittest.loader._FailedTest.auth_tests.test_models", + "unittest.loader._FailedTest.auth_tests.test_signals", + "unittest.loader._FailedTest.auth_tests.test_views", + "unittest.loader._FailedTest.backends.base.test_base", + "unittest.loader._FailedTest.backends.oracle.test_introspection", + "unittest.loader._FailedTest.backends.oracle.tests", + "unittest.loader._FailedTest.backends.postgresql.test_introspection", + "unittest.loader._FailedTest.backends.postgresql.test_server_side_cursors", + "unittest.loader._FailedTest.backends.sqlite.tests", + "unittest.loader._FailedTest.backends.tests", + "unittest.loader._FailedTest.basic.tests", + "unittest.loader._FailedTest.bulk_create.tests", + "unittest.loader._FailedTest.cache.tests", + "unittest.loader._FailedTest.check_framework.tests", + "unittest.loader._FailedTest.choices.tests", + "unittest.loader._FailedTest.constraints.tests", + "unittest.loader._FailedTest.contenttypes_tests.test_fields", + "unittest.loader._FailedTest.contenttypes_tests.test_management", + "unittest.loader._FailedTest.contenttypes_tests.test_models", + "unittest.loader._FailedTest.contenttypes_tests.test_order_with_respect_to", + "unittest.loader._FailedTest.contenttypes_tests.test_views", + "unittest.loader._FailedTest.custom_columns.tests", + "unittest.loader._FailedTest.custom_lookups.tests", + "unittest.loader._FailedTest.custom_managers.tests", + "unittest.loader._FailedTest.custom_methods.tests", + "unittest.loader._FailedTest.custom_pk.tests", + "unittest.loader._FailedTest.datatypes.tests", + "unittest.loader._FailedTest.dates.tests", + "unittest.loader._FailedTest.datetimes.tests", + "unittest.loader._FailedTest.db_functions.comparison.test_cast", + "unittest.loader._FailedTest.db_functions.comparison.test_coalesce", + "unittest.loader._FailedTest.db_functions.comparison.test_greatest", + "unittest.loader._FailedTest.db_functions.comparison.test_least", + "unittest.loader._FailedTest.db_functions.comparison.test_nullif", + "unittest.loader._FailedTest.db_functions.datetime.test_extract_trunc", + "unittest.loader._FailedTest.db_functions.datetime.test_now", + "unittest.loader._FailedTest.db_functions.math.test_abs", + "unittest.loader._FailedTest.db_functions.math.test_acos", + "unittest.loader._FailedTest.db_functions.math.test_asin", + "unittest.loader._FailedTest.db_functions.math.test_atan", + "unittest.loader._FailedTest.db_functions.math.test_atan2", + "unittest.loader._FailedTest.db_functions.math.test_ceil", + "unittest.loader._FailedTest.db_functions.math.test_cos", + "unittest.loader._FailedTest.db_functions.math.test_cot", + "unittest.loader._FailedTest.db_functions.math.test_degrees", + "unittest.loader._FailedTest.db_functions.math.test_exp", + "unittest.loader._FailedTest.db_functions.math.test_floor", + "unittest.loader._FailedTest.db_functions.math.test_ln", + "unittest.loader._FailedTest.db_functions.math.test_log", + "unittest.loader._FailedTest.db_functions.math.test_mod", + "unittest.loader._FailedTest.db_functions.math.test_pi", + "unittest.loader._FailedTest.db_functions.math.test_power", + "unittest.loader._FailedTest.db_functions.math.test_radians", + "unittest.loader._FailedTest.db_functions.math.test_round", + "unittest.loader._FailedTest.db_functions.math.test_sin", + "unittest.loader._FailedTest.db_functions.math.test_sqrt", + "unittest.loader._FailedTest.db_functions.math.test_tan", + "unittest.loader._FailedTest.db_functions.tests", + "unittest.loader._FailedTest.db_functions.text.test_chr", + "unittest.loader._FailedTest.db_functions.text.test_concat", + "unittest.loader._FailedTest.db_functions.text.test_left", + "unittest.loader._FailedTest.db_functions.text.test_length", + "unittest.loader._FailedTest.db_functions.text.test_lower", + "unittest.loader._FailedTest.db_functions.text.test_ord", + "unittest.loader._FailedTest.db_functions.text.test_pad", + "unittest.loader._FailedTest.db_functions.text.test_repeat", + "unittest.loader._FailedTest.db_functions.text.test_replace", + "unittest.loader._FailedTest.db_functions.text.test_reverse", + "unittest.loader._FailedTest.db_functions.text.test_right", + "unittest.loader._FailedTest.db_functions.text.test_strindex", + "unittest.loader._FailedTest.db_functions.text.test_substr", + "unittest.loader._FailedTest.db_functions.text.test_trim", + "unittest.loader._FailedTest.db_functions.text.test_upper", + "unittest.loader._FailedTest.defer.tests", + "unittest.loader._FailedTest.defer_regress.tests", + "unittest.loader._FailedTest.delete.tests", + "unittest.loader._FailedTest.delete_regress.tests", + "unittest.loader._FailedTest.distinct_on_fields.tests", + "unittest.loader._FailedTest.empty.tests", + "unittest.loader._FailedTest.expressions.test_queryset_values", + "unittest.loader._FailedTest.expressions.tests", + "unittest.loader._FailedTest.expressions_case.tests", + "unittest.loader._FailedTest.expressions_window.tests", + "unittest.loader._FailedTest.extra_regress.tests", + "unittest.loader._FailedTest.field_defaults.tests", + "unittest.loader._FailedTest.file_storage.tests", + "unittest.loader._FailedTest.file_uploads.tests", + "unittest.loader._FailedTest.filtered_relation.tests", + "unittest.loader._FailedTest.fixtures.tests", + "unittest.loader._FailedTest.fixtures_regress.tests", + "unittest.loader._FailedTest.flatpages_tests.test_csrf", + "unittest.loader._FailedTest.flatpages_tests.test_forms", + "unittest.loader._FailedTest.flatpages_tests.test_middleware", + "unittest.loader._FailedTest.flatpages_tests.test_models", + "unittest.loader._FailedTest.flatpages_tests.test_templatetags", + "unittest.loader._FailedTest.flatpages_tests.test_views", + "unittest.loader._FailedTest.force_insert_update.tests", + "unittest.loader._FailedTest.foreign_object.models", + "unittest.loader._FailedTest.foreign_object.test_agnostic_order_trimjoin", + "unittest.loader._FailedTest.foreign_object.test_empty_join", + "unittest.loader._FailedTest.foreign_object.test_forms", + "unittest.loader._FailedTest.foreign_object.tests", + "unittest.loader._FailedTest.forms_tests.tests.test_error_messages", + "unittest.loader._FailedTest.forms_tests.tests.test_widgets", + "unittest.loader._FailedTest.forms_tests.tests.tests", + "unittest.loader._FailedTest.from_db_value.test_deprecated", + "unittest.loader._FailedTest.from_db_value.tests", + "unittest.loader._FailedTest.generic_inline_admin.tests", + "unittest.loader._FailedTest.generic_relations.test_forms", + "unittest.loader._FailedTest.generic_relations.tests", + "unittest.loader._FailedTest.generic_relations_regress.tests", + "unittest.loader._FailedTest.generic_views.test_base", + "unittest.loader._FailedTest.generic_views.test_dates", + "unittest.loader._FailedTest.generic_views.test_detail", + "unittest.loader._FailedTest.generic_views.test_edit", + "unittest.loader._FailedTest.generic_views.test_list", + "unittest.loader._FailedTest.get_earliest_or_latest.tests", + "unittest.loader._FailedTest.get_object_or_404.tests", + "unittest.loader._FailedTest.get_or_create.tests", + "unittest.loader._FailedTest.gis_tests.distapp.tests", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_driver", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_ds", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_envelope", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_geom", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_raster", + "unittest.loader._FailedTest.gis_tests.gdal_tests.test_srs", + "unittest.loader._FailedTest.gis_tests.geo3d.tests", + "unittest.loader._FailedTest.gis_tests.geoadmin.tests", + "unittest.loader._FailedTest.gis_tests.geoapp.test_expressions", + "unittest.loader._FailedTest.gis_tests.geoapp.test_feeds", + "unittest.loader._FailedTest.gis_tests.geoapp.test_functions", + "unittest.loader._FailedTest.gis_tests.geoapp.test_regress", + "unittest.loader._FailedTest.gis_tests.geoapp.test_serializers", + "unittest.loader._FailedTest.gis_tests.geoapp.test_sitemaps", + "unittest.loader._FailedTest.gis_tests.geoapp.tests", + "unittest.loader._FailedTest.gis_tests.geogapp.tests", + "unittest.loader._FailedTest.gis_tests.geos_tests.test_coordseq", + "unittest.loader._FailedTest.gis_tests.geos_tests.test_geos", + "unittest.loader._FailedTest.gis_tests.geos_tests.test_geos_mutation", + "unittest.loader._FailedTest.gis_tests.geos_tests.test_io", + "unittest.loader._FailedTest.gis_tests.geos_tests.test_mutable_list", + "unittest.loader._FailedTest.gis_tests.gis_migrations.test_operations", + "unittest.loader._FailedTest.gis_tests.inspectapp.tests", + "unittest.loader._FailedTest.gis_tests.layermap.tests", + "unittest.loader._FailedTest.gis_tests.rasterapp.test_rasterfield", + "unittest.loader._FailedTest.gis_tests.relatedapp.tests", + "unittest.loader._FailedTest.gis_tests.test_fields", + "unittest.loader._FailedTest.gis_tests.test_geoforms", + "unittest.loader._FailedTest.gis_tests.test_geoip2", + "unittest.loader._FailedTest.gis_tests.tests", + "unittest.loader._FailedTest.i18n.tests", + "unittest.loader._FailedTest.import_error_package", + "unittest.loader._FailedTest.indexes.tests", + "unittest.loader._FailedTest.inline_formsets.tests", + "unittest.loader._FailedTest.inspectdb.tests", + "unittest.loader._FailedTest.introspection.tests", + "unittest.loader._FailedTest.known_related_objects.tests", + "unittest.loader._FailedTest.lookup.test_decimalfield", + "unittest.loader._FailedTest.lookup.test_timefield", + "unittest.loader._FailedTest.lookup.tests", + "unittest.loader._FailedTest.m2m_and_m2o.tests", + "unittest.loader._FailedTest.m2m_intermediary.tests", + "unittest.loader._FailedTest.m2m_multiple.tests", + "unittest.loader._FailedTest.m2m_recursive.tests", + "unittest.loader._FailedTest.m2m_regress.tests", + "unittest.loader._FailedTest.m2m_signals.tests", + "unittest.loader._FailedTest.m2m_through.tests", + "unittest.loader._FailedTest.m2m_through_regress.test_multitable", + "unittest.loader._FailedTest.m2m_through_regress.tests", + "unittest.loader._FailedTest.m2o_recursive.tests", + "unittest.loader._FailedTest.managers_regress.tests", + "unittest.loader._FailedTest.many_to_many.tests", + "unittest.loader._FailedTest.many_to_one.tests", + "unittest.loader._FailedTest.many_to_one_null.tests", + "unittest.loader._FailedTest.max_lengths.tests", + "unittest.loader._FailedTest.migrate_signals.tests", + "unittest.loader._FailedTest.migration_test_data_persistence.tests", + "unittest.loader._FailedTest.migrations.test_autodetector", + "unittest.loader._FailedTest.migrations.test_commands", + "unittest.loader._FailedTest.migrations.test_executor", + "unittest.loader._FailedTest.migrations.test_multidb", + "unittest.loader._FailedTest.migrations.test_operations", + "unittest.loader._FailedTest.migrations.test_optimizer", + "unittest.loader._FailedTest.migrations.test_state", + "unittest.loader._FailedTest.migrations.test_writer", + "unittest.loader._FailedTest.model_fields.test_binaryfield", + "unittest.loader._FailedTest.model_fields.test_booleanfield", + "unittest.loader._FailedTest.model_fields.test_charfield", + "unittest.loader._FailedTest.model_fields.test_datetimefield", + "unittest.loader._FailedTest.model_fields.test_decimalfield", + "unittest.loader._FailedTest.model_fields.test_durationfield", + "unittest.loader._FailedTest.model_fields.test_field_flags", + "unittest.loader._FailedTest.model_fields.test_filefield", + "unittest.loader._FailedTest.model_fields.test_floatfield", + "unittest.loader._FailedTest.model_fields.test_foreignkey", + "unittest.loader._FailedTest.model_fields.test_genericipaddressfield", + "unittest.loader._FailedTest.model_fields.test_imagefield", + "unittest.loader._FailedTest.model_fields.test_integerfield", + "unittest.loader._FailedTest.model_fields.test_manytomanyfield", + "unittest.loader._FailedTest.model_fields.test_slugfield", + "unittest.loader._FailedTest.model_fields.test_textfield", + "unittest.loader._FailedTest.model_fields.test_uuid", + "unittest.loader._FailedTest.model_fields.tests", + "unittest.loader._FailedTest.model_forms.test_modelchoicefield", + "unittest.loader._FailedTest.model_forms.test_uuid", + "unittest.loader._FailedTest.model_forms.tests", + "unittest.loader._FailedTest.model_formsets.test_uuid", + "unittest.loader._FailedTest.model_formsets.tests", + "unittest.loader._FailedTest.model_formsets_regress.tests", + "unittest.loader._FailedTest.model_indexes.tests", + "unittest.loader._FailedTest.model_inheritance.tests", + "unittest.loader._FailedTest.model_inheritance_regress.tests", + "unittest.loader._FailedTest.model_meta.tests", + "unittest.loader._FailedTest.model_options.test_default_related_name", + "unittest.loader._FailedTest.model_options.test_tablespaces", + "unittest.loader._FailedTest.model_package.models", + "unittest.loader._FailedTest.model_package.tests", + "unittest.loader._FailedTest.model_regress.tests", + "unittest.loader._FailedTest.modeladmin.test_actions", + "unittest.loader._FailedTest.modeladmin.test_checks", + "unittest.loader._FailedTest.modeladmin.test_has_add_permission_obj_deprecation", + "unittest.loader._FailedTest.modeladmin.tests", + "unittest.loader._FailedTest.multiple_database.tests", + "unittest.loader._FailedTest.mutually_referential.tests", + "unittest.loader._FailedTest.nested_foreign_keys.tests", + "unittest.loader._FailedTest.null_fk.tests", + "unittest.loader._FailedTest.null_fk_ordering.tests", + "unittest.loader._FailedTest.null_queries.tests", + "unittest.loader._FailedTest.one_to_one.tests", + "unittest.loader._FailedTest.or_lookups.tests", + "unittest.loader._FailedTest.order_with_respect_to.tests", + "unittest.loader._FailedTest.ordering.tests", + "unittest.loader._FailedTest.pagination.tests", + "unittest.loader._FailedTest.postgres_tests.test_aggregates", + "unittest.loader._FailedTest.postgres_tests.test_array", + "unittest.loader._FailedTest.postgres_tests.test_bulk_update", + "unittest.loader._FailedTest.postgres_tests.test_citext", + "unittest.loader._FailedTest.postgres_tests.test_constraints", + "unittest.loader._FailedTest.postgres_tests.test_functions", + "unittest.loader._FailedTest.postgres_tests.test_hstore", + "unittest.loader._FailedTest.postgres_tests.test_indexes", + "unittest.loader._FailedTest.postgres_tests.test_json", + "unittest.loader._FailedTest.postgres_tests.test_ranges", + "unittest.loader._FailedTest.postgres_tests.test_search", + "unittest.loader._FailedTest.postgres_tests.test_trigram", + "unittest.loader._FailedTest.postgres_tests.test_unaccent", + "unittest.loader._FailedTest.prefetch_related.test_prefetch_related_objects", + "unittest.loader._FailedTest.prefetch_related.test_uuid", + "unittest.loader._FailedTest.prefetch_related.tests", + "unittest.loader._FailedTest.properties.tests", + "unittest.loader._FailedTest.proxy_model_inheritance.tests", + "unittest.loader._FailedTest.proxy_models.tests", + "unittest.loader._FailedTest.queries.test_bulk_update", + "unittest.loader._FailedTest.queries.test_explain", + "unittest.loader._FailedTest.queries.test_iterator", + "unittest.loader._FailedTest.queries.test_qs_combinators", + "unittest.loader._FailedTest.queries.test_query", + "unittest.loader._FailedTest.queries.tests", + "unittest.loader._FailedTest.queryset_pickle.tests", + "unittest.loader._FailedTest.raw_query.tests", + "unittest.loader._FailedTest.redirects_tests.tests", + "unittest.loader._FailedTest.reserved_names.tests", + "unittest.loader._FailedTest.resolve_url.tests", + "unittest.loader._FailedTest.reverse_lookup.tests", + "unittest.loader._FailedTest.save_delete_hooks.tests", + "unittest.loader._FailedTest.schema.tests", + "unittest.loader._FailedTest.select_for_update.tests", + "unittest.loader._FailedTest.select_related.tests", + "unittest.loader._FailedTest.select_related_onetoone.tests", + "unittest.loader._FailedTest.select_related_regress.tests", + "unittest.loader._FailedTest.serializers.models", + "unittest.loader._FailedTest.serializers.test_data", + "unittest.loader._FailedTest.serializers.test_deserializedobject", + "unittest.loader._FailedTest.serializers.test_json", + "unittest.loader._FailedTest.serializers.test_natural", + "unittest.loader._FailedTest.serializers.test_xml", + "unittest.loader._FailedTest.serializers.test_yaml", + "unittest.loader._FailedTest.serializers.tests", + "unittest.loader._FailedTest.servers.tests", + "unittest.loader._FailedTest.sessions_tests.tests", + "unittest.loader._FailedTest.signals.tests", + "unittest.loader._FailedTest.sitemaps_tests.test_generic", + "unittest.loader._FailedTest.sitemaps_tests.test_http", + "unittest.loader._FailedTest.sitemaps_tests.test_https", + "unittest.loader._FailedTest.sitemaps_tests.test_management", + "unittest.loader._FailedTest.sitemaps_tests.test_utils", + "unittest.loader._FailedTest.sites_framework.tests", + "unittest.loader._FailedTest.str.tests", + "unittest.loader._FailedTest.string_lookup.tests", + "unittest.loader._FailedTest.swappable_models.tests", + "unittest.loader._FailedTest.syndication_tests.tests", + "unittest.loader._FailedTest.template_tests.test_custom", + "unittest.loader._FailedTest.test_runner.test_debug_sql", + "unittest.loader._FailedTest.test_runner.tests", + "unittest.loader._FailedTest.test_utils.test_deprecated_features", + "unittest.loader._FailedTest.test_utils.test_testcase", + "unittest.loader._FailedTest.test_utils.test_transactiontestcase", + "unittest.loader._FailedTest.test_utils.tests", + "unittest.loader._FailedTest.timezones.tests", + "unittest.loader._FailedTest.transaction_hooks.tests", + "unittest.loader._FailedTest.transactions.tests", + "unittest.loader._FailedTest.unmanaged_models.tests", + "unittest.loader._FailedTest.update.tests", + "unittest.loader._FailedTest.update_only_fields.tests", + "unittest.loader._FailedTest.utils_tests.test_lazyobject", + "unittest.loader._FailedTest.validation.test_custom_messages", + "unittest.loader._FailedTest.validation.test_unique", + "unittest.loader._FailedTest.validation.test_validators", + "unittest.loader._FailedTest.validation.tests", + "unittest.loader._FailedTest.view_tests.tests.test_defaults", + "urlpatterns.test_resolvers.RegexPatternTests.test_str", + "urlpatterns.test_resolvers.RoutePatternTests.test_str", + "urlpatterns.tests.ConversionExceptionTests.test_resolve_type_error_propagates", + "urlpatterns.tests.ConversionExceptionTests.test_resolve_value_error_means_no_match", + "urlpatterns.tests.ConversionExceptionTests.test_reverse_value_error_propagates", + "urlpatterns.tests.ConverterTests.test_matching_urls", + "urlpatterns.tests.ConverterTests.test_nonmatching_urls", + "urlpatterns.tests.ParameterRestrictionTests.test_allows_non_ascii_but_valid_identifiers", + "urlpatterns.tests.ParameterRestrictionTests.test_non_identifier_parameter_name_causes_exception", + "urlpatterns.tests.SimplifiedURLTests.test_converter_resolve", + "urlpatterns.tests.SimplifiedURLTests.test_converter_reverse", + "urlpatterns.tests.SimplifiedURLTests.test_converter_reverse_with_second_layer_instance_namespace", + "urlpatterns.tests.SimplifiedURLTests.test_invalid_converter", + "urlpatterns.tests.SimplifiedURLTests.test_path_inclusion_is_matchable", + "urlpatterns.tests.SimplifiedURLTests.test_path_inclusion_is_reversable", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_with_double_inclusion", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_with_empty_string_inclusion", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_with_inclusion", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_with_multiple_paramaters", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_with_typed_parameters", + "urlpatterns.tests.SimplifiedURLTests.test_path_lookup_without_parameters", + "urlpatterns.tests.SimplifiedURLTests.test_path_reverse_with_parameter", + "urlpatterns.tests.SimplifiedURLTests.test_path_reverse_without_parameter", + "urlpatterns.tests.SimplifiedURLTests.test_re_path", + "urlpatterns.tests.SimplifiedURLTests.test_two_variable_at_start_of_path_pattern", + "urlpatterns_reverse.test_localeregexdescriptor.LocaleRegexDescriptorTests.test_access_locale_regex_descriptor", + "urlpatterns_reverse.test_localeregexdescriptor.LocaleRegexDescriptorTests.test_nontranslated_regex_compiled_once", + "urlpatterns_reverse.test_localeregexdescriptor.LocaleRegexDescriptorTests.test_regex_compile_error", + "urlpatterns_reverse.test_localeregexdescriptor.LocaleRegexDescriptorTests.test_translated_regex_compiled_per_language", + "urlpatterns_reverse.tests.DefaultErrorHandlerTests.test_default_handler", + "urlpatterns_reverse.tests.ErroneousViewTests.test_invalid_regex", + "urlpatterns_reverse.tests.ErroneousViewTests.test_noncallable_view", + "urlpatterns_reverse.tests.ErrorHandlerResolutionTests.test_callable_handlers", + "urlpatterns_reverse.tests.ErrorHandlerResolutionTests.test_named_handlers", + "urlpatterns_reverse.tests.IncludeTests.test_include_2_tuple", + "urlpatterns_reverse.tests.IncludeTests.test_include_2_tuple_namespace", + "urlpatterns_reverse.tests.IncludeTests.test_include_3_tuple", + "urlpatterns_reverse.tests.IncludeTests.test_include_3_tuple_namespace", + "urlpatterns_reverse.tests.IncludeTests.test_include_4_tuple", + "urlpatterns_reverse.tests.IncludeTests.test_include_app_name", + "urlpatterns_reverse.tests.IncludeTests.test_include_app_name_namespace", + "urlpatterns_reverse.tests.IncludeTests.test_include_namespace", + "urlpatterns_reverse.tests.IncludeTests.test_include_urls", + "urlpatterns_reverse.tests.LookaheadTests.test_invalid_resolve", + "urlpatterns_reverse.tests.LookaheadTests.test_invalid_reverse", + "urlpatterns_reverse.tests.LookaheadTests.test_valid_resolve", + "urlpatterns_reverse.tests.LookaheadTests.test_valid_reverse", + "urlpatterns_reverse.tests.NamespaceTests.test_ambiguous_object", + "urlpatterns_reverse.tests.NamespaceTests.test_ambiguous_urlpattern", + "urlpatterns_reverse.tests.NamespaceTests.test_app_lookup_object", + "urlpatterns_reverse.tests.NamespaceTests.test_app_lookup_object_with_default", + "urlpatterns_reverse.tests.NamespaceTests.test_app_lookup_object_without_default", + "urlpatterns_reverse.tests.NamespaceTests.test_app_name_pattern", + "urlpatterns_reverse.tests.NamespaceTests.test_app_object", + "urlpatterns_reverse.tests.NamespaceTests.test_app_object_default_namespace", + "urlpatterns_reverse.tests.NamespaceTests.test_current_app_no_partial_match", + "urlpatterns_reverse.tests.NamespaceTests.test_embedded_namespace_object", + "urlpatterns_reverse.tests.NamespaceTests.test_multiple_namespace_pattern", + "urlpatterns_reverse.tests.NamespaceTests.test_namespace_object", + "urlpatterns_reverse.tests.NamespaceTests.test_namespace_pattern", + "urlpatterns_reverse.tests.NamespaceTests.test_namespace_pattern_with_variable_prefix", + "urlpatterns_reverse.tests.NamespaceTests.test_namespaces_with_variables", + "urlpatterns_reverse.tests.NamespaceTests.test_nested_app_lookup", + "urlpatterns_reverse.tests.NamespaceTests.test_nested_namespace_pattern", + "urlpatterns_reverse.tests.NamespaceTests.test_non_existent_namespace", + "urlpatterns_reverse.tests.NamespaceTests.test_normal_name", + "urlpatterns_reverse.tests.NamespaceTests.test_simple_included_name", + "urlpatterns_reverse.tests.NamespaceTests.test_special_chars_namespace", + "urlpatterns_reverse.tests.NoRootUrlConfTests.test_no_handler_exception", + "urlpatterns_reverse.tests.NoURLPatternsTests.test_no_urls_exception", + "urlpatterns_reverse.tests.RequestURLconfTests.test_reverse_inner_in_response_middleware", + "urlpatterns_reverse.tests.RequestURLconfTests.test_reverse_inner_in_streaming", + "urlpatterns_reverse.tests.RequestURLconfTests.test_reverse_outer_in_response_middleware", + "urlpatterns_reverse.tests.RequestURLconfTests.test_reverse_outer_in_streaming", + "urlpatterns_reverse.tests.RequestURLconfTests.test_urlconf", + "urlpatterns_reverse.tests.RequestURLconfTests.test_urlconf_is_reset_after_request", + "urlpatterns_reverse.tests.RequestURLconfTests.test_urlconf_overridden", + "urlpatterns_reverse.tests.RequestURLconfTests.test_urlconf_overridden_with_null", + "urlpatterns_reverse.tests.ResolverMatchTests.test_repr", + "urlpatterns_reverse.tests.ResolverMatchTests.test_resolver_match_on_request", + "urlpatterns_reverse.tests.ResolverMatchTests.test_resolver_match_on_request_before_resolution", + "urlpatterns_reverse.tests.ResolverMatchTests.test_urlpattern_resolve", + "urlpatterns_reverse.tests.ResolverTests.test_404_tried_urls_have_names", + "urlpatterns_reverse.tests.ResolverTests.test_namespaced_view_detail", + "urlpatterns_reverse.tests.ResolverTests.test_non_regex", + "urlpatterns_reverse.tests.ResolverTests.test_populate_concurrency", + "urlpatterns_reverse.tests.ResolverTests.test_resolver_repr", + "urlpatterns_reverse.tests.ResolverTests.test_resolver_reverse", + "urlpatterns_reverse.tests.ResolverTests.test_resolver_reverse_conflict", + "urlpatterns_reverse.tests.ResolverTests.test_reverse_lazy_object_coercion_by_resolve", + "urlpatterns_reverse.tests.ResolverTests.test_view_detail_as_method", + "urlpatterns_reverse.tests.ReverseLazySettingsTest.test_lazy_in_settings", + "urlpatterns_reverse.tests.ReverseLazyTest.test_inserting_reverse_lazy_into_string", + "urlpatterns_reverse.tests.ReverseLazyTest.test_redirect_with_lazy_reverse", + "urlpatterns_reverse.tests.ReverseLazyTest.test_user_permission_with_lazy_reverse", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_no_illegal_imports", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_redirect_to_object", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_redirect_to_url", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_redirect_to_view_name", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_redirect_view_object", + "urlpatterns_reverse.tests.ReverseShortcutTests.test_reverse_by_path_nested", + "urlpatterns_reverse.tests.URLPatternReverse.test_illegal_args_message", + "urlpatterns_reverse.tests.URLPatternReverse.test_illegal_kwargs_message", + "urlpatterns_reverse.tests.URLPatternReverse.test_mixing_args_and_kwargs", + "urlpatterns_reverse.tests.URLPatternReverse.test_no_args_message", + "urlpatterns_reverse.tests.URLPatternReverse.test_non_urlsafe_prefix_with_args", + "urlpatterns_reverse.tests.URLPatternReverse.test_patterns_reported", + "urlpatterns_reverse.tests.URLPatternReverse.test_prefix_braces", + "urlpatterns_reverse.tests.URLPatternReverse.test_prefix_format_char", + "urlpatterns_reverse.tests.URLPatternReverse.test_prefix_parenthesis", + "urlpatterns_reverse.tests.URLPatternReverse.test_reverse_none", + "urlpatterns_reverse.tests.URLPatternReverse.test_script_name_escaping", + "urlpatterns_reverse.tests.URLPatternReverse.test_urlpattern_reverse", + "urlpatterns_reverse.tests.URLPatternReverse.test_view_not_found_message", + "urlpatterns_reverse.tests.ViewLoadingTests.test_attributeerror_not_hidden", + "urlpatterns_reverse.tests.ViewLoadingTests.test_module_does_not_exist", + "urlpatterns_reverse.tests.ViewLoadingTests.test_non_string_value", + "urlpatterns_reverse.tests.ViewLoadingTests.test_not_callable", + "urlpatterns_reverse.tests.ViewLoadingTests.test_parent_module_does_not_exist", + "urlpatterns_reverse.tests.ViewLoadingTests.test_string_without_dot", + "urlpatterns_reverse.tests.ViewLoadingTests.test_view_does_not_exist", + "urlpatterns_reverse.tests.ViewLoadingTests.test_view_loading", + "user_commands.tests.CommandRunTests.test_disallowed_abbreviated_options", + "user_commands.tests.CommandRunTests.test_script_prefix_set_in_commands", + "user_commands.tests.CommandTests.test_call_command_no_checks", + "user_commands.tests.CommandTests.test_call_command_option_parsing", + "user_commands.tests.CommandTests.test_call_command_option_parsing_non_string_arg", + "user_commands.tests.CommandTests.test_call_command_unrecognized_option", + "user_commands.tests.CommandTests.test_call_command_with_required_parameters_in_mixed_options", + "user_commands.tests.CommandTests.test_call_command_with_required_parameters_in_options", + "user_commands.tests.CommandTests.test_calling_a_command_with_no_app_labels_and_parameters_should_raise_a_command_error", + "user_commands.tests.CommandTests.test_calling_a_command_with_only_empty_parameter_should_ends_gracefully", + "user_commands.tests.CommandTests.test_calling_command_with_app_labels_and_parameters_should_be_ok", + "user_commands.tests.CommandTests.test_calling_command_with_parameters_and_app_labels_at_the_end_should_be_ok", + "user_commands.tests.CommandTests.test_check_migrations", + "user_commands.tests.CommandTests.test_command", + "user_commands.tests.CommandTests.test_command_add_arguments_after_common_arguments", + "user_commands.tests.CommandTests.test_command_style", + "user_commands.tests.CommandTests.test_create_parser_kwargs", + "user_commands.tests.CommandTests.test_discover_commands_in_eggs", + "user_commands.tests.CommandTests.test_explode", + "user_commands.tests.CommandTests.test_find_command_without_PATH", + "user_commands.tests.CommandTests.test_language_preserved", + "user_commands.tests.CommandTests.test_no_translations_deactivate_translations", + "user_commands.tests.CommandTests.test_output_transaction", + "user_commands.tests.CommandTests.test_subparser", + "user_commands.tests.CommandTests.test_subparser_invalid_option", + "user_commands.tests.CommandTests.test_system_exit", + "user_commands.tests.UtilsTests.test_get_random_secret_key", + "user_commands.tests.UtilsTests.test_no_existent_external_program", + "utils_tests.test_archive.TestBzip2Tar.test_extract_file_permissions", + "utils_tests.test_archive.TestBzip2Tar.test_extract_function", + "utils_tests.test_archive.TestBzip2Tar.test_extract_function_no_to_path", + "utils_tests.test_archive.TestBzip2Tar.test_extract_function_with_leadpath", + "utils_tests.test_archive.TestBzip2Tar.test_extract_method", + "utils_tests.test_archive.TestBzip2Tar.test_extract_method_no_to_path", + "utils_tests.test_archive.TestGzipTar.test_extract_file_permissions", + "utils_tests.test_archive.TestGzipTar.test_extract_function", + "utils_tests.test_archive.TestGzipTar.test_extract_function_no_to_path", + "utils_tests.test_archive.TestGzipTar.test_extract_function_with_leadpath", + "utils_tests.test_archive.TestGzipTar.test_extract_method", + "utils_tests.test_archive.TestGzipTar.test_extract_method_no_to_path", + "utils_tests.test_archive.TestTar.test_extract_file_permissions", + "utils_tests.test_archive.TestTar.test_extract_function", + "utils_tests.test_archive.TestTar.test_extract_function_no_to_path", + "utils_tests.test_archive.TestTar.test_extract_function_with_leadpath", + "utils_tests.test_archive.TestTar.test_extract_method", + "utils_tests.test_archive.TestTar.test_extract_method_no_to_path", + "utils_tests.test_archive.TestZip.test_extract_file_permissions", + "utils_tests.test_archive.TestZip.test_extract_function", + "utils_tests.test_archive.TestZip.test_extract_function_no_to_path", + "utils_tests.test_archive.TestZip.test_extract_function_with_leadpath", + "utils_tests.test_archive.TestZip.test_extract_method", + "utils_tests.test_archive.TestZip.test_extract_method_no_to_path", + "utils_tests.test_autoreload.BaseReloaderTests.test_run_loop_catches_stopiteration", + "utils_tests.test_autoreload.BaseReloaderTests.test_run_loop_stop_and_return", + "utils_tests.test_autoreload.BaseReloaderTests.test_wait_for_apps_ready_checks_for_exception", + "utils_tests.test_autoreload.BaseReloaderTests.test_wait_for_apps_ready_without_exception", + "utils_tests.test_autoreload.BaseReloaderTests.test_watch_files_with_recursive_glob", + "utils_tests.test_autoreload.BaseReloaderTests.test_watch_with_glob", + "utils_tests.test_autoreload.BaseReloaderTests.test_watch_with_single_file", + "utils_tests.test_autoreload.BaseReloaderTests.test_watch_without_absolute", + "utils_tests.test_autoreload.GetReloaderTests.test_watchman_available", + "utils_tests.test_autoreload.GetReloaderTests.test_watchman_unavailable", + "utils_tests.test_autoreload.RestartWithReloaderTests.test_manage_py", + "utils_tests.test_autoreload.RestartWithReloaderTests.test_python_m_django", + "utils_tests.test_autoreload.RunWithReloaderTests.test_calls_start_django", + "utils_tests.test_autoreload.RunWithReloaderTests.test_calls_sys_exit", + "utils_tests.test_autoreload.RunWithReloaderTests.test_swallows_keyboard_interrupt", + "utils_tests.test_autoreload.StartDjangoTests.test_check_errors_called", + "utils_tests.test_autoreload.StartDjangoTests.test_echo_on_called", + "utils_tests.test_autoreload.StartDjangoTests.test_starts_thread_with_args", + "utils_tests.test_autoreload.StartDjangoTests.test_watchman_becomes_unavailable", + "utils_tests.test_autoreload.StatReloaderTests.test_does_not_fire_without_changes", + "utils_tests.test_autoreload.StatReloaderTests.test_file", + "utils_tests.test_autoreload.StatReloaderTests.test_fires_when_created", + "utils_tests.test_autoreload.StatReloaderTests.test_fires_with_changes", + "utils_tests.test_autoreload.StatReloaderTests.test_glob", + "utils_tests.test_autoreload.StatReloaderTests.test_glob_non_existing_directory", + "utils_tests.test_autoreload.StatReloaderTests.test_glob_recursive", + "utils_tests.test_autoreload.StatReloaderTests.test_multiple_globs", + "utils_tests.test_autoreload.StatReloaderTests.test_multiple_recursive_globs", + "utils_tests.test_autoreload.StatReloaderTests.test_nested_glob_recursive", + "utils_tests.test_autoreload.StatReloaderTests.test_nonexistent_file", + "utils_tests.test_autoreload.StatReloaderTests.test_nonexistent_file_in_non_existing_directory", + "utils_tests.test_autoreload.StatReloaderTests.test_overlapping_glob_recursive", + "utils_tests.test_autoreload.StatReloaderTests.test_overlapping_globs", + "utils_tests.test_autoreload.StatReloaderTests.test_snapshot_files_ignores_missing_files", + "utils_tests.test_autoreload.StatReloaderTests.test_snapshot_files_updates", + "utils_tests.test_autoreload.TestCheckErrors.test_mutates_error_files", + "utils_tests.test_autoreload.TestCommonRoots.test_common_roots", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_bytecode_conversion_to_source", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_check_errors", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_check_errors_catches_all_exceptions", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_file_added", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_module_without_spec", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_paths_are_pathlib_instances", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_weakref_in_sys_module", + "utils_tests.test_autoreload.TestIterModulesAndFiles.test_zip_reload", + "utils_tests.test_autoreload.TestRaiseLastException.test_no_exception", + "utils_tests.test_autoreload.TestRaiseLastException.test_raises_exception", + "utils_tests.test_autoreload.TestSysPathDirectories.test_sys_paths_absolute", + "utils_tests.test_autoreload.TestSysPathDirectories.test_sys_paths_directories", + "utils_tests.test_autoreload.TestSysPathDirectories.test_sys_paths_non_existing", + "utils_tests.test_autoreload.TestSysPathDirectories.test_sys_paths_with_directories", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_check_availability", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_check_availability_lower_version", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_check_server_status", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_check_server_status_raises_error", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_file", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_glob", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_glob_non_existing_directory", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_glob_recursive", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_multiple_globs", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_multiple_recursive_globs", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_nested_glob_recursive", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_nonexistent_file", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_nonexistent_file_in_non_existing_directory", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_overlapping_glob_recursive", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_overlapping_globs", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_pywatchman_not_available", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_update_watches_raises_exceptions", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watch_glob_ignores_non_existing_directories_two_levels", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watch_glob_multiple_patterns", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watch_glob_uses_existing_parent_directories", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watched_roots_contains_directory_globs", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watched_roots_contains_files", + "utils_tests.test_autoreload.WatchmanReloaderTests.test_watched_roots_contains_sys_path", + "utils_tests.test_baseconv.TestBaseConv.test_base11", + "utils_tests.test_baseconv.TestBaseConv.test_base20", + "utils_tests.test_baseconv.TestBaseConv.test_base64", + "utils_tests.test_baseconv.TestBaseConv.test_base7", + "utils_tests.test_baseconv.TestBaseConv.test_baseconv", + "utils_tests.test_baseconv.TestBaseConv.test_exception", + "utils_tests.test_baseconv.TestBaseConv.test_repr", + "utils_tests.test_crypto.TestUtilsCryptoMisc.test_constant_time_compare", + "utils_tests.test_crypto.TestUtilsCryptoPBKDF2.test_default_hmac_alg", + "utils_tests.test_crypto.TestUtilsCryptoPBKDF2.test_public_vectors", + "utils_tests.test_crypto.TestUtilsCryptoPBKDF2.test_regression_vectors", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_copy", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_create_with_invalid_key", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_create_with_invalid_values", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_del", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_dict", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_equal", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_getitem", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_in", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_items", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_list", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_repr", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_set", + "utils_tests.test_datastructures.CaseInsensitiveMappingTests.test_str", + "utils_tests.test_datastructures.DictWrapperTests.test_dictwrapper", + "utils_tests.test_datastructures.ImmutableListTests.test_custom_warning", + "utils_tests.test_datastructures.ImmutableListTests.test_sort", + "utils_tests.test_datastructures.MultiValueDictTests.test_appendlist", + "utils_tests.test_datastructures.MultiValueDictTests.test_copy", + "utils_tests.test_datastructures.MultiValueDictTests.test_dict_translation", + "utils_tests.test_datastructures.MultiValueDictTests.test_getlist_default", + "utils_tests.test_datastructures.MultiValueDictTests.test_getlist_doesnt_mutate", + "utils_tests.test_datastructures.MultiValueDictTests.test_getlist_none_empty_values", + "utils_tests.test_datastructures.MultiValueDictTests.test_internal_getlist_does_mutate", + "utils_tests.test_datastructures.MultiValueDictTests.test_multivaluedict", + "utils_tests.test_datastructures.OrderedSetTests.test_bool", + "utils_tests.test_datastructures.OrderedSetTests.test_len", + "utils_tests.test_dateformat.DateFormatTests.test_am_pm", + "utils_tests.test_dateformat.DateFormatTests.test_date", + "utils_tests.test_dateformat.DateFormatTests.test_date_formats", + "utils_tests.test_dateformat.DateFormatTests.test_dateformat", + "utils_tests.test_dateformat.DateFormatTests.test_datetime_with_local_tzinfo", + "utils_tests.test_dateformat.DateFormatTests.test_datetime_with_tzinfo", + "utils_tests.test_dateformat.DateFormatTests.test_empty_format", + "utils_tests.test_dateformat.DateFormatTests.test_epoch", + "utils_tests.test_dateformat.DateFormatTests.test_futuredates", + "utils_tests.test_dateformat.DateFormatTests.test_invalid_time_format_specifiers", + "utils_tests.test_dateformat.DateFormatTests.test_microsecond", + "utils_tests.test_dateformat.DateFormatTests.test_naive_ambiguous_datetime", + "utils_tests.test_dateformat.DateFormatTests.test_naive_datetime", + "utils_tests.test_dateformat.DateFormatTests.test_time_formats", + "utils_tests.test_dateformat.DateFormatTests.test_timezones", + "utils_tests.test_dateparse.DateParseTests.test_parse_date", + "utils_tests.test_dateparse.DateParseTests.test_parse_datetime", + "utils_tests.test_dateparse.DateParseTests.test_parse_time", + "utils_tests.test_dateparse.DurationParseTests.test_days", + "utils_tests.test_dateparse.DurationParseTests.test_fractions_of_seconds", + "utils_tests.test_dateparse.DurationParseTests.test_hours_minutes_seconds", + "utils_tests.test_dateparse.DurationParseTests.test_iso_8601", + "utils_tests.test_dateparse.DurationParseTests.test_minutes_seconds", + "utils_tests.test_dateparse.DurationParseTests.test_negative", + "utils_tests.test_dateparse.DurationParseTests.test_parse_postgresql_format", + "utils_tests.test_dateparse.DurationParseTests.test_parse_python_format", + "utils_tests.test_dateparse.DurationParseTests.test_seconds", + "utils_tests.test_datetime_safe.DatetimeTests.test_compare_datetimes", + "utils_tests.test_datetime_safe.DatetimeTests.test_safe_strftime", + "utils_tests.test_datetime_safe.DatetimeTests.test_zero_padding", + "utils_tests.test_decorators.ClassPropertyTest.test_getter", + "utils_tests.test_decorators.ClassPropertyTest.test_override_getter", + "utils_tests.test_decorators.DecoratorFromMiddlewareTests.test_callable_process_view_middleware", + "utils_tests.test_decorators.DecoratorFromMiddlewareTests.test_full_dec_normal", + "utils_tests.test_decorators.DecoratorFromMiddlewareTests.test_full_dec_templateresponse", + "utils_tests.test_decorators.DecoratorFromMiddlewareTests.test_process_view_middleware", + "utils_tests.test_duration.TestDurationMicroseconds.test", + "utils_tests.test_duration.TestDurationString.test_days", + "utils_tests.test_duration.TestDurationString.test_microseconds", + "utils_tests.test_duration.TestDurationString.test_negative", + "utils_tests.test_duration.TestDurationString.test_simple", + "utils_tests.test_duration.TestISODurationString.test_days", + "utils_tests.test_duration.TestISODurationString.test_microseconds", + "utils_tests.test_duration.TestISODurationString.test_negative", + "utils_tests.test_duration.TestISODurationString.test_simple", + "utils_tests.test_duration.TestParseDurationRoundtrip.test_days", + "utils_tests.test_duration.TestParseDurationRoundtrip.test_microseconds", + "utils_tests.test_duration.TestParseDurationRoundtrip.test_negative", + "utils_tests.test_duration.TestParseDurationRoundtrip.test_simple", + "utils_tests.test_duration.TestParseISODurationRoundtrip.test_days", + "utils_tests.test_duration.TestParseISODurationRoundtrip.test_microseconds", + "utils_tests.test_duration.TestParseISODurationRoundtrip.test_negative", + "utils_tests.test_duration.TestParseISODurationRoundtrip.test_simple", + "utils_tests.test_encoding.TestEncodingUtils.test_force_bytes_encoding", + "utils_tests.test_encoding.TestEncodingUtils.test_force_bytes_exception", + "utils_tests.test_encoding.TestEncodingUtils.test_force_bytes_memory_view", + "utils_tests.test_encoding.TestEncodingUtils.test_force_bytes_strings_only", + "utils_tests.test_encoding.TestEncodingUtils.test_force_text_DjangoUnicodeDecodeError", + "utils_tests.test_encoding.TestEncodingUtils.test_force_text_exception", + "utils_tests.test_encoding.TestEncodingUtils.test_force_text_lazy", + "utils_tests.test_encoding.TestEncodingUtils.test_get_default_encoding", + "utils_tests.test_encoding.TestEncodingUtils.test_smart_bytes", + "utils_tests.test_encoding.TestEncodingUtils.test_smart_text", + "utils_tests.test_encoding.TestRFC3987IEncodingUtils.test_complementarity", + "utils_tests.test_encoding.TestRFC3987IEncodingUtils.test_escape_uri_path", + "utils_tests.test_encoding.TestRFC3987IEncodingUtils.test_filepath_to_uri", + "utils_tests.test_encoding.TestRFC3987IEncodingUtils.test_iri_to_uri", + "utils_tests.test_encoding.TestRFC3987IEncodingUtils.test_uri_to_iri", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_atom1_mime_type", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_atom_add_item", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_deterministic_attribute_order", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_feed_with_feed_url_gets_rendered_with_atom_link", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_feed_without_feed_url_gets_rendered_without_atom_link", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_get_tag_uri", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_get_tag_uri_with_port", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_latest_post_date_returns_utc_time", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc2822_date", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc2822_date_with_timezone", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc2822_date_without_time", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc3339_date", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc3339_date_with_timezone", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rfc3339_date_without_time", + "utils_tests.test_feedgenerator.FeedgeneratorTests.test_rss_mime_type", + "utils_tests.test_functional.FunctionalTests.test_cached_property", + "utils_tests.test_functional.FunctionalTests.test_cached_property_auto_name", + "utils_tests.test_functional.FunctionalTests.test_cached_property_mangled_error", + "utils_tests.test_functional.FunctionalTests.test_cached_property_name_validation", + "utils_tests.test_functional.FunctionalTests.test_cached_property_reuse_different_names", + "utils_tests.test_functional.FunctionalTests.test_cached_property_reuse_same_name", + "utils_tests.test_functional.FunctionalTests.test_cached_property_set_name_not_called", + "utils_tests.test_functional.FunctionalTests.test_lazy", + "utils_tests.test_functional.FunctionalTests.test_lazy_base_class", + "utils_tests.test_functional.FunctionalTests.test_lazy_base_class_override", + "utils_tests.test_functional.FunctionalTests.test_lazy_equality", + "utils_tests.test_functional.FunctionalTests.test_lazy_object_to_string", + "utils_tests.test_functional.FunctionalTests.test_lazy_repr_bytes", + "utils_tests.test_functional.FunctionalTests.test_lazy_repr_int", + "utils_tests.test_functional.FunctionalTests.test_lazy_repr_text", + "utils_tests.test_hashable.TestHashable.test_count_equal", + "utils_tests.test_hashable.TestHashable.test_equal", + "utils_tests.test_hashable.TestHashable.test_unhashable", + "utils_tests.test_html.TestUtilsHtml.test_conditional_escape", + "utils_tests.test_html.TestUtilsHtml.test_escape", + "utils_tests.test_html.TestUtilsHtml.test_escapejs", + "utils_tests.test_html.TestUtilsHtml.test_format_html", + "utils_tests.test_html.TestUtilsHtml.test_html_safe", + "utils_tests.test_html.TestUtilsHtml.test_html_safe_defines_html_error", + "utils_tests.test_html.TestUtilsHtml.test_html_safe_doesnt_define_str", + "utils_tests.test_html.TestUtilsHtml.test_html_safe_subclass", + "utils_tests.test_html.TestUtilsHtml.test_json_script", + "utils_tests.test_html.TestUtilsHtml.test_linebreaks", + "utils_tests.test_html.TestUtilsHtml.test_smart_urlquote", + "utils_tests.test_html.TestUtilsHtml.test_strip_spaces_between_tags", + "utils_tests.test_html.TestUtilsHtml.test_strip_tags", + "utils_tests.test_html.TestUtilsHtml.test_strip_tags_files", + "utils_tests.test_html.TestUtilsHtml.test_urlize", + "utils_tests.test_html.TestUtilsHtml.test_urlize_unchanged_inputs", + "utils_tests.test_http.Base36IntTests.test_input_too_large", + "utils_tests.test_http.Base36IntTests.test_invalid_literal", + "utils_tests.test_http.Base36IntTests.test_negative_input", + "utils_tests.test_http.Base36IntTests.test_roundtrip", + "utils_tests.test_http.Base36IntTests.test_to_base36_errors", + "utils_tests.test_http.Base36IntTests.test_to_int_errors", + "utils_tests.test_http.Base36IntTests.test_values", + "utils_tests.test_http.ETagProcessingTests.test_parsing", + "utils_tests.test_http.ETagProcessingTests.test_quoting", + "utils_tests.test_http.EscapeLeadingSlashesTests.test", + "utils_tests.test_http.HttpDateProcessingTests.test_cookie_date", + "utils_tests.test_http.HttpDateProcessingTests.test_http_date", + "utils_tests.test_http.HttpDateProcessingTests.test_parsing_asctime", + "utils_tests.test_http.HttpDateProcessingTests.test_parsing_rfc1123", + "utils_tests.test_http.HttpDateProcessingTests.test_parsing_rfc850", + "utils_tests.test_http.HttpDateProcessingTests.test_parsing_year_less_than_70", + "utils_tests.test_http.IsSafeURLTests.test_allowed_hosts_str", + "utils_tests.test_http.IsSafeURLTests.test_bad_urls", + "utils_tests.test_http.IsSafeURLTests.test_basic_auth", + "utils_tests.test_http.IsSafeURLTests.test_good_urls", + "utils_tests.test_http.IsSafeURLTests.test_no_allowed_hosts", + "utils_tests.test_http.IsSafeURLTests.test_secure_param_https_urls", + "utils_tests.test_http.IsSafeURLTests.test_secure_param_non_https_urls", + "utils_tests.test_http.IsSameDomainTests.test_bad", + "utils_tests.test_http.IsSameDomainTests.test_good", + "utils_tests.test_http.URLEncodeTests.test_dict", + "utils_tests.test_http.URLEncodeTests.test_dict_containing_empty_sequence_doseq", + "utils_tests.test_http.URLEncodeTests.test_dict_containing_sequence_doseq", + "utils_tests.test_http.URLEncodeTests.test_dict_containing_sequence_not_doseq", + "utils_tests.test_http.URLEncodeTests.test_dict_with_bytearray", + "utils_tests.test_http.URLEncodeTests.test_dict_with_bytes_values", + "utils_tests.test_http.URLEncodeTests.test_dict_with_sequence_of_bytes", + "utils_tests.test_http.URLEncodeTests.test_generator", + "utils_tests.test_http.URLEncodeTests.test_multivaluedict", + "utils_tests.test_http.URLEncodeTests.test_none", + "utils_tests.test_http.URLEncodeTests.test_none_in_generator", + "utils_tests.test_http.URLEncodeTests.test_none_in_sequence", + "utils_tests.test_http.URLEncodeTests.test_tuples", + "utils_tests.test_http.URLQuoteTests.test_quote", + "utils_tests.test_http.URLQuoteTests.test_quote_plus", + "utils_tests.test_http.URLQuoteTests.test_unquote", + "utils_tests.test_http.URLQuoteTests.test_unquote_plus", + "utils_tests.test_http.URLSafeBase64Tests.test_roundtrip", + "utils_tests.test_inspect.TestInspectMethods.test_func_accepts_var_args_has_var_args", + "utils_tests.test_inspect.TestInspectMethods.test_func_accepts_var_args_no_var_args", + "utils_tests.test_inspect.TestInspectMethods.test_get_func_full_args_all_arguments", + "utils_tests.test_inspect.TestInspectMethods.test_get_func_full_args_no_arguments", + "utils_tests.test_inspect.TestInspectMethods.test_get_func_full_args_one_argument", + "utils_tests.test_inspect.TestInspectMethods.test_method_has_no_args", + "utils_tests.test_ipv6.TestUtilsIPv6.test_cleans_plain_address", + "utils_tests.test_ipv6.TestUtilsIPv6.test_cleans_with_v4_mapping", + "utils_tests.test_ipv6.TestUtilsIPv6.test_unpacks_ipv4", + "utils_tests.test_ipv6.TestUtilsIPv6.test_validates_correct_plain_address", + "utils_tests.test_ipv6.TestUtilsIPv6.test_validates_correct_with_v4mapping", + "utils_tests.test_ipv6.TestUtilsIPv6.test_validates_incorrect_plain_address", + "utils_tests.test_ipv6.TestUtilsIPv6.test_validates_incorrect_with_v4mapping", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_0", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_1", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_2", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_3", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_4", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_5", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_6", + "utils_tests.test_jslex.JsToCForGettextTest.test_case_7", + "utils_tests.test_jslex.JsTokensTest.test_case_0", + "utils_tests.test_jslex.JsTokensTest.test_case_1", + "utils_tests.test_jslex.JsTokensTest.test_case_10", + "utils_tests.test_jslex.JsTokensTest.test_case_11", + "utils_tests.test_jslex.JsTokensTest.test_case_12", + "utils_tests.test_jslex.JsTokensTest.test_case_13", + "utils_tests.test_jslex.JsTokensTest.test_case_14", + "utils_tests.test_jslex.JsTokensTest.test_case_15", + "utils_tests.test_jslex.JsTokensTest.test_case_16", + "utils_tests.test_jslex.JsTokensTest.test_case_17", + "utils_tests.test_jslex.JsTokensTest.test_case_18", + "utils_tests.test_jslex.JsTokensTest.test_case_19", + "utils_tests.test_jslex.JsTokensTest.test_case_2", + "utils_tests.test_jslex.JsTokensTest.test_case_20", + "utils_tests.test_jslex.JsTokensTest.test_case_21", + "utils_tests.test_jslex.JsTokensTest.test_case_22", + "utils_tests.test_jslex.JsTokensTest.test_case_23", + "utils_tests.test_jslex.JsTokensTest.test_case_24", + "utils_tests.test_jslex.JsTokensTest.test_case_25", + "utils_tests.test_jslex.JsTokensTest.test_case_26", + "utils_tests.test_jslex.JsTokensTest.test_case_27", + "utils_tests.test_jslex.JsTokensTest.test_case_28", + "utils_tests.test_jslex.JsTokensTest.test_case_29", + "utils_tests.test_jslex.JsTokensTest.test_case_3", + "utils_tests.test_jslex.JsTokensTest.test_case_30", + "utils_tests.test_jslex.JsTokensTest.test_case_31", + "utils_tests.test_jslex.JsTokensTest.test_case_32", + "utils_tests.test_jslex.JsTokensTest.test_case_4", + "utils_tests.test_jslex.JsTokensTest.test_case_5", + "utils_tests.test_jslex.JsTokensTest.test_case_6", + "utils_tests.test_jslex.JsTokensTest.test_case_7", + "utils_tests.test_jslex.JsTokensTest.test_case_8", + "utils_tests.test_jslex.JsTokensTest.test_case_9", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_common_large_number_of_words", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_common_words_in_string", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_more_words_than_common", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_negative_words", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_not_common_words", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_paragraph", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_paragraphs", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_paragraphs_not_common", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_same_or_less_common_words", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_sentence", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_sentence_ending", + "utils_tests.test_lorem_ipsum.LoremIpsumTests.test_sentence_starts_with_capital", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_found", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_found_but_bad_module", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_not_found", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_several_found", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_several_found_with_registry", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_autodiscover_modules_several_one_bad_module", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_validate_registry_keeps_intact", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_validate_registry_resets_after_erroneous_module", + "utils_tests.test_module_loading.AutodiscoverModulesTestCase.test_validate_registry_resets_after_missing_module", + "utils_tests.test_module_loading.CustomLoader.test_deep_loader", + "utils_tests.test_module_loading.CustomLoader.test_shallow_loader", + "utils_tests.test_module_loading.DefaultLoader.test_has_sumbodule_with_dotted_path", + "utils_tests.test_module_loading.DefaultLoader.test_loader", + "utils_tests.test_module_loading.EggLoader.test_deep_loader", + "utils_tests.test_module_loading.EggLoader.test_shallow_loader", + "utils_tests.test_module_loading.ModuleImportTests.test_import_string", + "utils_tests.test_numberformat.TestNumberFormat.test_decimal_numbers", + "utils_tests.test_numberformat.TestNumberFormat.test_decimal_subclass", + "utils_tests.test_numberformat.TestNumberFormat.test_float_numbers", + "utils_tests.test_numberformat.TestNumberFormat.test_format_number", + "utils_tests.test_numberformat.TestNumberFormat.test_format_string", + "utils_tests.test_numberformat.TestNumberFormat.test_large_number", + "utils_tests.test_os_utils.SafeJoinTests.test_base_path_ends_with_sep", + "utils_tests.test_os_utils.SafeJoinTests.test_parent_path", + "utils_tests.test_os_utils.SafeJoinTests.test_root_path", + "utils_tests.test_regex_helper.NormalizeTests.test_empty", + "utils_tests.test_regex_helper.NormalizeTests.test_escape", + "utils_tests.test_regex_helper.NormalizeTests.test_group_backreference", + "utils_tests.test_regex_helper.NormalizeTests.test_group_named", + "utils_tests.test_regex_helper.NormalizeTests.test_group_noncapturing", + "utils_tests.test_regex_helper.NormalizeTests.test_group_positional", + "utils_tests.test_safestring.SafeStringTest.test_add_lazy_safe_text_and_safe_text", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_as_decorator", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_decorator_does_not_affect_dunder_html", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_decorator_does_not_affect_promises", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_lazy", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_lazy_result_implements_dunder_html", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_object_implementing_dunder_html", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_object_implementing_dunder_str", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_result_implements_dunder_html", + "utils_tests.test_safestring.SafeStringTest.test_mark_safe_str", + "utils_tests.test_simplelazyobject.TestUtilsSimpleLazyObjectDjangoTestCase.test_pickle", + "utils_tests.test_termcolors.TermColorTests.test_bad_color", + "utils_tests.test_termcolors.TermColorTests.test_bad_option", + "utils_tests.test_termcolors.TermColorTests.test_bad_palette", + "utils_tests.test_termcolors.TermColorTests.test_bad_role", + "utils_tests.test_termcolors.TermColorTests.test_color_case", + "utils_tests.test_termcolors.TermColorTests.test_colorize_empty_text", + "utils_tests.test_termcolors.TermColorTests.test_empty_definition", + "utils_tests.test_termcolors.TermColorTests.test_empty_options", + "utils_tests.test_termcolors.TermColorTests.test_empty_string", + "utils_tests.test_termcolors.TermColorTests.test_fg", + "utils_tests.test_termcolors.TermColorTests.test_fg_bg", + "utils_tests.test_termcolors.TermColorTests.test_fg_bg_opts", + "utils_tests.test_termcolors.TermColorTests.test_fg_opts", + "utils_tests.test_termcolors.TermColorTests.test_multiple_roles", + "utils_tests.test_termcolors.TermColorTests.test_opts_case", + "utils_tests.test_termcolors.TermColorTests.test_override_nocolor", + "utils_tests.test_termcolors.TermColorTests.test_override_palette", + "utils_tests.test_termcolors.TermColorTests.test_override_with_multiple_roles", + "utils_tests.test_termcolors.TermColorTests.test_reverse_override", + "utils_tests.test_termcolors.TermColorTests.test_role_case", + "utils_tests.test_termcolors.TermColorTests.test_simple_palette", + "utils_tests.test_text.TestUtilsText.test_compress_sequence", + "utils_tests.test_text.TestUtilsText.test_format_lazy", + "utils_tests.test_text.TestUtilsText.test_get_text_list", + "utils_tests.test_text.TestUtilsText.test_get_valid_filename", + "utils_tests.test_text.TestUtilsText.test_normalize_newlines", + "utils_tests.test_text.TestUtilsText.test_phone2numeric", + "utils_tests.test_text.TestUtilsText.test_slugify", + "utils_tests.test_text.TestUtilsText.test_smart_split", + "utils_tests.test_text.TestUtilsText.test_truncate_chars", + "utils_tests.test_text.TestUtilsText.test_truncate_html_words", + "utils_tests.test_text.TestUtilsText.test_truncate_words", + "utils_tests.test_text.TestUtilsText.test_unescape_entities", + "utils_tests.test_text.TestUtilsText.test_unescape_string_literal", + "utils_tests.test_text.TestUtilsText.test_wrap", + "utils_tests.test_timesince.TimesinceTests.test_both_date_objects", + "utils_tests.test_timesince.TimesinceTests.test_date_objects", + "utils_tests.test_timesince.TimesinceTests.test_different_timezones", + "utils_tests.test_timesince.TimesinceTests.test_display_first_unit", + "utils_tests.test_timesince.TimesinceTests.test_display_second_before_first", + "utils_tests.test_timesince.TimesinceTests.test_equal_datetimes", + "utils_tests.test_timesince.TimesinceTests.test_ignore_microseconds_and_seconds", + "utils_tests.test_timesince.TimesinceTests.test_leap_year", + "utils_tests.test_timesince.TimesinceTests.test_leap_year_new_years_eve", + "utils_tests.test_timesince.TimesinceTests.test_multiple_units", + "utils_tests.test_timesince.TimesinceTests.test_naive_datetime_with_tzinfo_attribute", + "utils_tests.test_timesince.TimesinceTests.test_other_units", + "utils_tests.test_timesince.TimesinceTests.test_thousand_years_ago", + "utils_tests.test_timezone.TimezoneTests.test_activate_invalid_timezone", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_deprecation", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_dst", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_negative_timedelta", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_pickle", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_timedelta", + "utils_tests.test_timezone.TimezoneTests.test_fixedoffset_utcoffset", + "utils_tests.test_timezone.TimezoneTests.test_get_default_timezone", + "utils_tests.test_timezone.TimezoneTests.test_get_default_timezone_utc", + "utils_tests.test_timezone.TimezoneTests.test_is_aware", + "utils_tests.test_timezone.TimezoneTests.test_is_naive", + "utils_tests.test_timezone.TimezoneTests.test_localdate", + "utils_tests.test_timezone.TimezoneTests.test_make_aware", + "utils_tests.test_timezone.TimezoneTests.test_make_aware2", + "utils_tests.test_timezone.TimezoneTests.test_make_aware_no_tz", + "utils_tests.test_timezone.TimezoneTests.test_make_aware_pytz", + "utils_tests.test_timezone.TimezoneTests.test_make_aware_pytz_ambiguous", + "utils_tests.test_timezone.TimezoneTests.test_make_aware_pytz_non_existent", + "utils_tests.test_timezone.TimezoneTests.test_make_naive", + "utils_tests.test_timezone.TimezoneTests.test_make_naive_no_tz", + "utils_tests.test_timezone.TimezoneTests.test_now", + "utils_tests.test_timezone.TimezoneTests.test_override", + "utils_tests.test_timezone.TimezoneTests.test_override_decorator", + "utils_tests.test_timezone.TimezoneTests.test_override_fixed_offset", + "utils_tests.test_timezone.TimezoneTests.test_override_string_tz", + "utils_tests.test_topological_sort.TopologicalSortTests.test_basic", + "utils_tests.test_topological_sort.TopologicalSortTests.test_cyclic_dependency", + "utils_tests.test_tree.NodeTests.test_add", + "utils_tests.test_tree.NodeTests.test_bool", + "utils_tests.test_tree.NodeTests.test_contains", + "utils_tests.test_tree.NodeTests.test_deepcopy", + "utils_tests.test_tree.NodeTests.test_eq_children", + "utils_tests.test_tree.NodeTests.test_eq_connector", + "utils_tests.test_tree.NodeTests.test_eq_negated", + "utils_tests.test_tree.NodeTests.test_hash", + "utils_tests.test_tree.NodeTests.test_len", + "utils_tests.test_tree.NodeTests.test_negate", + "utils_tests.test_tree.NodeTests.test_repr", + "utils_tests.test_tree.NodeTests.test_str", + "validation.test_error_messages.ValidationMessagesTest.test_autofield_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_boolean_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_date_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_datetime_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_decimal_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_float_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_integer_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_null_boolean_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_nullable_boolean_field_raises_error_message", + "validation.test_error_messages.ValidationMessagesTest.test_time_field_raises_error_message", + "validation.test_picklable.PickableValidationErrorTestCase.test_validationerror_is_picklable", + "validators.tests.TestValidatorEquality.test_basic_equality", + "validators.tests.TestValidatorEquality.test_decimal_equality", + "validators.tests.TestValidatorEquality.test_email_equality", + "validators.tests.TestValidatorEquality.test_file_extension_equality", + "validators.tests.TestValidatorEquality.test_prohibit_null_characters_validator_equality", + "validators.tests.TestValidatorEquality.test_regex_equality", + "validators.tests.TestValidatorEquality.test_regex_equality_blank", + "validators.tests.TestValidatorEquality.test_regex_equality_nocache", + "validators.tests.TestValidators.test_max_length_validator_message", + "validators.tests.TestValidators.test_message_dict", + "validators.tests.TestValidators.test_message_list", + "validators.tests.TestValidators.test_regex_validator_flags", + "validators.tests.TestValidators.test_single_message", + "validators.tests.TestValidators.test_validators", + "version.tests.VersionTests.test_development", + "version.tests.VersionTests.test_get_version_tuple", + "version.tests.VersionTests.test_releases", + "view_tests.tests.test_csrf.CsrfViewTests.test_custom_template", + "view_tests.tests.test_csrf.CsrfViewTests.test_custom_template_does_not_exist", + "view_tests.tests.test_csrf.CsrfViewTests.test_no_cookies", + "view_tests.tests.test_csrf.CsrfViewTests.test_no_django_template_engine", + "view_tests.tests.test_csrf.CsrfViewTests.test_no_referer", + "view_tests.tests.test_csrf.CsrfViewTests.test_translation", + "view_tests.tests.test_debug.AjaxResponseExceptionReporterFilter.test_ajax_response_encoding", + "view_tests.tests.test_debug.AjaxResponseExceptionReporterFilter.test_custom_exception_reporter_filter", + "view_tests.tests.test_debug.AjaxResponseExceptionReporterFilter.test_non_sensitive_request", + "view_tests.tests.test_debug.AjaxResponseExceptionReporterFilter.test_paranoid_request", + "view_tests.tests.test_debug.AjaxResponseExceptionReporterFilter.test_sensitive_request", + "view_tests.tests.test_debug.CallableSettingWrapperTests.test_repr", + "view_tests.tests.test_debug.DebugViewQueriesAllowedTests.test_handle_db_exception", + "view_tests.tests.test_debug.DebugViewTests.test_400", + "view_tests.tests.test_debug.DebugViewTests.test_403", + "view_tests.tests.test_debug.DebugViewTests.test_403_template", + "view_tests.tests.test_debug.DebugViewTests.test_404", + "view_tests.tests.test_debug.DebugViewTests.test_404_empty_path_not_in_urls", + "view_tests.tests.test_debug.DebugViewTests.test_404_not_in_urls", + "view_tests.tests.test_debug.DebugViewTests.test_classbased_technical_404", + "view_tests.tests.test_debug.DebugViewTests.test_default_urlconf_template", + "view_tests.tests.test_debug.DebugViewTests.test_files", + "view_tests.tests.test_debug.DebugViewTests.test_no_template_source_loaders", + "view_tests.tests.test_debug.DebugViewTests.test_non_l10ned_numeric_ids", + "view_tests.tests.test_debug.DebugViewTests.test_regression_21530", + "view_tests.tests.test_debug.DebugViewTests.test_technical_404", + "view_tests.tests.test_debug.DebugViewTests.test_template_exceptions", + "view_tests.tests.test_debug.DebugViewTests.test_template_loader_postmortem", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_callable_settings", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_callable_settings_forbidding_to_set_attributes", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_custom_exception_reporter_filter", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_dict_setting_with_non_str_key", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_multivalue_dict_key_error", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_non_sensitive_request", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_paranoid_request", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_sensitive_function_arguments", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_sensitive_function_keyword_arguments", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_sensitive_method", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_sensitive_request", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_sensitive_settings", + "view_tests.tests.test_debug.ExceptionReporterFilterTests.test_settings_with_sensitive_keys", + "view_tests.tests.test_debug.ExceptionReporterTests.test_disallowed_host", + "view_tests.tests.test_debug.ExceptionReporterTests.test_encoding_error", + "view_tests.tests.test_debug.ExceptionReporterTests.test_eol_support", + "view_tests.tests.test_debug.ExceptionReporterTests.test_exception_fetching_user", + "view_tests.tests.test_debug.ExceptionReporterTests.test_ignore_traceback_evaluation_exceptions", + "view_tests.tests.test_debug.ExceptionReporterTests.test_local_variable_escaping", + "view_tests.tests.test_debug.ExceptionReporterTests.test_message_only", + "view_tests.tests.test_debug.ExceptionReporterTests.test_no_exception", + "view_tests.tests.test_debug.ExceptionReporterTests.test_no_request", + "view_tests.tests.test_debug.ExceptionReporterTests.test_non_utf8_values_handling", + "view_tests.tests.test_debug.ExceptionReporterTests.test_reporting_frames_without_source", + "view_tests.tests.test_debug.ExceptionReporterTests.test_reporting_of_nested_exceptions", + "view_tests.tests.test_debug.ExceptionReporterTests.test_request_and_exception", + "view_tests.tests.test_debug.ExceptionReporterTests.test_request_and_message", + "view_tests.tests.test_debug.ExceptionReporterTests.test_request_with_items_key", + "view_tests.tests.test_debug.ExceptionReporterTests.test_too_large_values_handling", + "view_tests.tests.test_debug.ExceptionReporterTests.test_unfrozen_importlib", + "view_tests.tests.test_debug.ExceptionReporterTests.test_unprintable_values_handling", + "view_tests.tests.test_debug.HelperFunctionTests.test_cleanse_setting_basic", + "view_tests.tests.test_debug.HelperFunctionTests.test_cleanse_setting_ignore_case", + "view_tests.tests.test_debug.HelperFunctionTests.test_cleanse_setting_recurses_in_dictionary", + "view_tests.tests.test_debug.NonDjangoTemplatesDebugViewTests.test_400", + "view_tests.tests.test_debug.NonDjangoTemplatesDebugViewTests.test_403", + "view_tests.tests.test_debug.NonDjangoTemplatesDebugViewTests.test_404", + "view_tests.tests.test_debug.NonDjangoTemplatesDebugViewTests.test_template_not_found_error", + "view_tests.tests.test_debug.PlainTextReportTests.test_disallowed_host", + "view_tests.tests.test_debug.PlainTextReportTests.test_message_only", + "view_tests.tests.test_debug.PlainTextReportTests.test_no_exception", + "view_tests.tests.test_debug.PlainTextReportTests.test_no_request", + "view_tests.tests.test_debug.PlainTextReportTests.test_request_and_exception", + "view_tests.tests.test_debug.PlainTextReportTests.test_request_and_message", + "view_tests.tests.test_debug.PlainTextReportTests.test_request_with_items_key", + "view_tests.tests.test_debug.PlainTextReportTests.test_template_exception", + "view_tests.tests.test_default_content_type.DefaultContentTypeTests.test_access", + "view_tests.tests.test_default_content_type.DefaultContentTypeTests.test_access_warning", + "view_tests.tests.test_default_content_type.DefaultContentTypeTests.test_default_content_type_is_text_html", + "view_tests.tests.test_default_content_type.DefaultContentTypeTests.test_override_settings_warning", + "view_tests.tests.test_default_content_type.DefaultContentTypeTests.test_settings_init_warning", + "view_tests.tests.test_i18n.I18NViewTests.test_escaping", + "view_tests.tests.test_i18n.I18NViewTests.test_get_formats", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_different_non_english_languages", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_english_variant", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_fallback_language_plural", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_language_english_default", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_language_non_english_default", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_language_non_english_fallback", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_unknown_package_error", + "view_tests.tests.test_i18n.I18NViewTests.test_i18n_with_locale_paths", + "view_tests.tests.test_i18n.I18NViewTests.test_jsi18n", + "view_tests.tests.test_i18n.I18NViewTests.test_jsi18n_USE_I18N_False", + "view_tests.tests.test_i18n.I18NViewTests.test_jsi18n_fallback_language", + "view_tests.tests.test_i18n.I18NViewTests.test_jsi18n_with_missing_en_files", + "view_tests.tests.test_i18n.I18NViewTests.test_jsoni18n", + "view_tests.tests.test_i18n.I18NViewTests.test_jsoni18n_with_missing_en_files", + "view_tests.tests.test_i18n.I18NViewTests.test_non_BMP_char", + "view_tests.tests.test_i18n.I18NViewTests.test_non_english_default_english_userpref", + "view_tests.tests.test_i18n.I18nSeleniumTests.test_javascript_gettext", + "view_tests.tests.test_i18n.I18nSeleniumTests.test_multiple_catalogs", + "view_tests.tests.test_i18n.SetLanguageTests.test_lang_from_translated_i18n_pattern", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_cookie", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_decodes_http_referer_url", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_default_redirect", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_doesnt_perform_a_default_redirect_for_ajax", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_doesnt_perform_a_redirect_to_referer_for_ajax", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_http_next", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_performs_redirect_for_ajax_if_explicitly_requested", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_redirect_to_referer", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_reversal", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_unsafe_next", + "view_tests.tests.test_i18n.SetLanguageTests.test_setlang_unsafe_next_for_ajax", + "view_tests.tests.test_json.JsonResponseTests.test_json_response", + "view_tests.tests.test_specials.URLHandling.test_nonascii_redirect", + "view_tests.tests.test_specials.URLHandling.test_permanent_nonascii_redirect", + "view_tests.tests.test_static.StaticHelperTest.test_404", + "view_tests.tests.test_static.StaticHelperTest.test_chunked", + "view_tests.tests.test_static.StaticHelperTest.test_copes_with_empty_path_component", + "view_tests.tests.test_static.StaticHelperTest.test_debug_off", + "view_tests.tests.test_static.StaticHelperTest.test_empty_prefix", + "view_tests.tests.test_static.StaticHelperTest.test_index", + "view_tests.tests.test_static.StaticHelperTest.test_index_custom_template", + "view_tests.tests.test_static.StaticHelperTest.test_index_subdir", + "view_tests.tests.test_static.StaticHelperTest.test_invalid_if_modified_since", + "view_tests.tests.test_static.StaticHelperTest.test_invalid_if_modified_since2", + "view_tests.tests.test_static.StaticHelperTest.test_is_modified_since", + "view_tests.tests.test_static.StaticHelperTest.test_not_modified_since", + "view_tests.tests.test_static.StaticHelperTest.test_prefix", + "view_tests.tests.test_static.StaticHelperTest.test_serve", + "view_tests.tests.test_static.StaticHelperTest.test_special_prefix", + "view_tests.tests.test_static.StaticHelperTest.test_unknown_mime_type", + "view_tests.tests.test_static.StaticTests.test_404", + "view_tests.tests.test_static.StaticTests.test_chunked", + "view_tests.tests.test_static.StaticTests.test_copes_with_empty_path_component", + "view_tests.tests.test_static.StaticTests.test_index", + "view_tests.tests.test_static.StaticTests.test_index_custom_template", + "view_tests.tests.test_static.StaticTests.test_index_subdir", + "view_tests.tests.test_static.StaticTests.test_invalid_if_modified_since", + "view_tests.tests.test_static.StaticTests.test_invalid_if_modified_since2", + "view_tests.tests.test_static.StaticTests.test_is_modified_since", + "view_tests.tests.test_static.StaticTests.test_not_modified_since", + "view_tests.tests.test_static.StaticTests.test_serve", + "view_tests.tests.test_static.StaticTests.test_unknown_mime_type", + "view_tests.tests.test_static.StaticUtilsTests.test_was_modified_since_fp", + "wsgi.tests.GetInternalWSGIApplicationTest.test_bad_module", + "wsgi.tests.GetInternalWSGIApplicationTest.test_bad_name", + "wsgi.tests.GetInternalWSGIApplicationTest.test_default", + "wsgi.tests.GetInternalWSGIApplicationTest.test_success", + "wsgi.tests.WSGITest.test_file_wrapper", + "wsgi.tests.WSGITest.test_get_wsgi_application" + ], + "p36": { + "sqlite": { + "passing": {}, + "failing": {} + }, + "mongodb": { + "passing": {}, + "failing": {} + } + }, + "p38": { + "sqlite": { + "passing": {}, + "failing": {} + }, + "mongodb": { + "passing": { + "migrations": [ + "migrations.test_autodetector.AutodetectorTests.test_add_alter_order_with_respect_to", + "migrations.test_autodetector.AutodetectorTests.test_add_blank_textfield_and_charfield", + "migrations.test_autodetector.AutodetectorTests.test_add_constraints", + "migrations.test_autodetector.AutodetectorTests.test_add_date_fields_with_auto_now_add_asking_for_default", + "migrations.test_autodetector.AutodetectorTests.test_add_date_fields_with_auto_now_add_not_asking_for_null_addition", + "migrations.test_autodetector.AutodetectorTests.test_add_date_fields_with_auto_now_not_asking_for_default", + "migrations.test_autodetector.AutodetectorTests.test_add_field", + "migrations.test_autodetector.AutodetectorTests.test_add_field_and_foo_together", + "migrations.test_autodetector.AutodetectorTests.test_add_field_with_default", + "migrations.test_autodetector.AutodetectorTests.test_add_foo_together", + "migrations.test_autodetector.AutodetectorTests.test_add_indexes", + "migrations.test_autodetector.AutodetectorTests.test_add_many_to_many", + "migrations.test_autodetector.AutodetectorTests.test_add_model_order_with_respect_to", + "migrations.test_autodetector.AutodetectorTests.test_add_non_blank_textfield_and_charfield", + "migrations.test_autodetector.AutodetectorTests.test_alter_db_table_add", + "migrations.test_autodetector.AutodetectorTests.test_alter_db_table_change", + "migrations.test_autodetector.AutodetectorTests.test_alter_db_table_no_changes", + "migrations.test_autodetector.AutodetectorTests.test_alter_db_table_remove", + "migrations.test_autodetector.AutodetectorTests.test_alter_db_table_with_model_change", + "migrations.test_autodetector.AutodetectorTests.test_alter_field", + "migrations.test_autodetector.AutodetectorTests.test_alter_field_to_not_null_oneoff_default", + "migrations.test_autodetector.AutodetectorTests.test_alter_field_to_not_null_with_default", + "migrations.test_autodetector.AutodetectorTests.test_alter_field_to_not_null_without_default", + "migrations.test_autodetector.AutodetectorTests.test_alter_fk_before_model_deletion", + "migrations.test_autodetector.AutodetectorTests.test_alter_many_to_many", + "migrations.test_autodetector.AutodetectorTests.test_alter_model_managers", + "migrations.test_autodetector.AutodetectorTests.test_alter_model_options", + "migrations.test_autodetector.AutodetectorTests.test_alter_model_options_proxy", + "migrations.test_autodetector.AutodetectorTests.test_arrange_for_graph", + "migrations.test_autodetector.AutodetectorTests.test_bases_first", + "migrations.test_autodetector.AutodetectorTests.test_circular_dependency_mixed_addcreate", + "migrations.test_autodetector.AutodetectorTests.test_circular_dependency_swappable", + "migrations.test_autodetector.AutodetectorTests.test_circular_dependency_swappable2", + "migrations.test_autodetector.AutodetectorTests.test_circular_dependency_swappable_self", + "migrations.test_autodetector.AutodetectorTests.test_circular_fk_dependency", + "migrations.test_autodetector.AutodetectorTests.test_concrete_field_changed_to_many_to_many", + "migrations.test_autodetector.AutodetectorTests.test_create_model_and_unique_together", + "migrations.test_autodetector.AutodetectorTests.test_create_model_with_check_constraint", + "migrations.test_autodetector.AutodetectorTests.test_create_model_with_indexes", + "migrations.test_autodetector.AutodetectorTests.test_create_with_through_model", + "migrations.test_autodetector.AutodetectorTests.test_custom_deconstructible", + "migrations.test_autodetector.AutodetectorTests.test_custom_migration_name", + "migrations.test_autodetector.AutodetectorTests.test_deconstruct_field_kwarg", + "migrations.test_autodetector.AutodetectorTests.test_deconstruct_type", + "migrations.test_autodetector.AutodetectorTests.test_deconstructible_dict", + "migrations.test_autodetector.AutodetectorTests.test_deconstructible_list", + "migrations.test_autodetector.AutodetectorTests.test_deconstructible_tuple", + "migrations.test_autodetector.AutodetectorTests.test_default_related_name_option", + "migrations.test_autodetector.AutodetectorTests.test_different_regex_does_alter", + "migrations.test_autodetector.AutodetectorTests.test_empty_foo_together", + "migrations.test_autodetector.AutodetectorTests.test_first_dependency", + "migrations.test_autodetector.AutodetectorTests.test_fk_dependency", + "migrations.test_autodetector.AutodetectorTests.test_fk_dependency_other_app", + "migrations.test_autodetector.AutodetectorTests.test_foo_together_no_changes", + "migrations.test_autodetector.AutodetectorTests.test_foo_together_ordering", + "migrations.test_autodetector.AutodetectorTests.test_foo_together_remove_fk", + "migrations.test_autodetector.AutodetectorTests.test_foreign_key_removed_before_target_model", + "migrations.test_autodetector.AutodetectorTests.test_identical_regex_doesnt_alter", + "migrations.test_autodetector.AutodetectorTests.test_keep_db_table_with_model_change", + "migrations.test_autodetector.AutodetectorTests.test_last_dependency", + "migrations.test_autodetector.AutodetectorTests.test_m2m_w_through_multistep_remove", + "migrations.test_autodetector.AutodetectorTests.test_managed_to_unmanaged", + "migrations.test_autodetector.AutodetectorTests.test_many_to_many_changed_to_concrete_field", + "migrations.test_autodetector.AutodetectorTests.test_many_to_many_removed_before_through_model", + "migrations.test_autodetector.AutodetectorTests.test_many_to_many_removed_before_through_model_2", + "migrations.test_autodetector.AutodetectorTests.test_mti_inheritance_model_removal", + "migrations.test_autodetector.AutodetectorTests.test_multiple_bases", + "migrations.test_autodetector.AutodetectorTests.test_nested_deconstructible_objects", + "migrations.test_autodetector.AutodetectorTests.test_new_model", + "migrations.test_autodetector.AutodetectorTests.test_non_circular_foreignkey_dependency_removal", + "migrations.test_autodetector.AutodetectorTests.test_old_model", + "migrations.test_autodetector.AutodetectorTests.test_order_fields_indexes", + "migrations.test_autodetector.AutodetectorTests.test_pk_fk_included", + "migrations.test_autodetector.AutodetectorTests.test_proxy", + "migrations.test_autodetector.AutodetectorTests.test_proxy_bases_first", + "migrations.test_autodetector.AutodetectorTests.test_proxy_custom_pk", + "migrations.test_autodetector.AutodetectorTests.test_proxy_fk_dependency", + "migrations.test_autodetector.AutodetectorTests.test_proxy_to_mti_with_fk_to_proxy", + "migrations.test_autodetector.AutodetectorTests.test_proxy_to_mti_with_fk_to_proxy_proxy", + "migrations.test_autodetector.AutodetectorTests.test_remove_alter_order_with_respect_to", + "migrations.test_autodetector.AutodetectorTests.test_remove_constraints", + "migrations.test_autodetector.AutodetectorTests.test_remove_field", + "migrations.test_autodetector.AutodetectorTests.test_remove_field_and_foo_together", + "migrations.test_autodetector.AutodetectorTests.test_remove_foo_together", + "migrations.test_autodetector.AutodetectorTests.test_remove_indexes", + "migrations.test_autodetector.AutodetectorTests.test_rename_field", + "migrations.test_autodetector.AutodetectorTests.test_rename_field_and_foo_together", + "migrations.test_autodetector.AutodetectorTests.test_rename_field_foreign_key_to_field", + "migrations.test_autodetector.AutodetectorTests.test_rename_field_preserved_db_column", + "migrations.test_autodetector.AutodetectorTests.test_rename_foreign_object_fields", + "migrations.test_autodetector.AutodetectorTests.test_rename_m2m_through_model", + "migrations.test_autodetector.AutodetectorTests.test_rename_model", + "migrations.test_autodetector.AutodetectorTests.test_rename_model_reverse_relation_dependencies", + "migrations.test_autodetector.AutodetectorTests.test_rename_model_with_fks_in_different_position", + "migrations.test_autodetector.AutodetectorTests.test_rename_model_with_renamed_rel_field", + "migrations.test_autodetector.AutodetectorTests.test_rename_related_field_preserved_db_column", + "migrations.test_autodetector.AutodetectorTests.test_replace_string_with_foreignkey", + "migrations.test_autodetector.AutodetectorTests.test_same_app_circular_fk_dependency", + "migrations.test_autodetector.AutodetectorTests.test_same_app_circular_fk_dependency_with_unique_together_and_indexes", + "migrations.test_autodetector.AutodetectorTests.test_same_app_no_fk_dependency", + "migrations.test_autodetector.AutodetectorTests.test_set_alter_order_with_respect_to", + "migrations.test_autodetector.AutodetectorTests.test_supports_functools_partial", + "migrations.test_autodetector.AutodetectorTests.test_swappable", + "migrations.test_autodetector.AutodetectorTests.test_swappable_changed", + "migrations.test_autodetector.AutodetectorTests.test_swappable_circular_multi_mti", + "migrations.test_autodetector.AutodetectorTests.test_swappable_first_inheritance", + "migrations.test_autodetector.AutodetectorTests.test_swappable_first_setting", + "migrations.test_autodetector.AutodetectorTests.test_trim_apps", + "migrations.test_autodetector.AutodetectorTests.test_unmanaged_create", + "migrations.test_autodetector.AutodetectorTests.test_unmanaged_custom_pk", + "migrations.test_autodetector.AutodetectorTests.test_unmanaged_delete", + "migrations.test_autodetector.AutodetectorTests.test_unmanaged_to_managed", + "migrations.test_deprecated_fields.Tests.test_migrate", + "migrations.test_exceptions.ExceptionTests.test_node_not_found_error_repr", + "migrations.test_graph.GraphTests.test_circular_graph", + "migrations.test_graph.GraphTests.test_circular_graph_2", + "migrations.test_graph.GraphTests.test_complex_graph", + "migrations.test_graph.GraphTests.test_infinite_loop", + "migrations.test_graph.GraphTests.test_iterative_dfs", + "migrations.test_graph.GraphTests.test_iterative_dfs_complexity", + "migrations.test_graph.GraphTests.test_missing_child_nodes", + "migrations.test_graph.GraphTests.test_missing_parent_nodes", + "migrations.test_graph.GraphTests.test_plan_invalid_node", + "migrations.test_graph.GraphTests.test_remove_replaced_nodes", + "migrations.test_graph.GraphTests.test_remove_replacement_node", + "migrations.test_graph.GraphTests.test_simple_graph", + "migrations.test_graph.GraphTests.test_stringify", + "migrations.test_graph.GraphTests.test_validate_consistency_dummy", + "migrations.test_graph.GraphTests.test_validate_consistency_missing_child", + "migrations.test_graph.GraphTests.test_validate_consistency_missing_parent", + "migrations.test_graph.GraphTests.test_validate_consistency_no_error", + "migrations.test_graph.NodeTests.test_dummynode_repr", + "migrations.test_graph.NodeTests.test_node_repr", + "migrations.test_loader.LoaderTests.test_check_consistent_history", + "migrations.test_loader.LoaderTests.test_check_consistent_history_squashed", + "migrations.test_loader.LoaderTests.test_explicit_missing_module", + "migrations.test_loader.LoaderTests.test_first", + "migrations.test_loader.LoaderTests.test_ignore_files", + "migrations.test_loader.LoaderTests.test_load", + "migrations.test_loader.LoaderTests.test_load_empty_dir", + "migrations.test_loader.LoaderTests.test_load_import_error", + "migrations.test_loader.LoaderTests.test_load_module_file", + "migrations.test_loader.LoaderTests.test_load_unmigrated_dependency", + "migrations.test_loader.LoaderTests.test_loading_squashed_complex", + "migrations.test_loader.LoaderTests.test_loading_squashed_complex_multi_apps", + "migrations.test_loader.LoaderTests.test_loading_squashed_complex_multi_apps_partially_applied", + "migrations.test_loader.LoaderTests.test_loading_squashed_erroneous", + "migrations.test_loader.LoaderTests.test_loading_squashed_ref_squashed", + "migrations.test_loader.LoaderTests.test_marked_as_migrated", + "migrations.test_loader.LoaderTests.test_marked_as_unmigrated", + "migrations.test_loader.LoaderTests.test_name_match", + "migrations.test_loader.LoaderTests.test_plan_handles_repeated_migrations", + "migrations.test_loader.LoaderTests.test_run_before", + "migrations.test_loader.PycLoaderTests.test_invalid", + "migrations.test_loader.PycLoaderTests.test_valid", + "migrations.test_loader.RecorderTests.test_apply", + "migrations.test_multidb.MultiDBOperationTests.test_create_model", + "migrations.test_multidb.MultiDBOperationTests.test_create_model2", + "migrations.test_multidb.MultiDBOperationTests.test_create_model3", + "migrations.test_multidb.MultiDBOperationTests.test_create_model4", + "migrations.test_multidb.MultiDBOperationTests.test_run_python_migrate_foo_router_with_hints", + "migrations.test_multidb.MultiDBOperationTests.test_run_python_migrate_foo_router_without_hints", + "migrations.test_multidb.MultiDBOperationTests.test_run_python_migrate_nothing_router", + "migrations.test_multidb.MultiDBOperationTests.test_run_sql_migrate_foo_router_without_hints", + "migrations.test_multidb.MultiDBOperationTests.test_run_sql_migrate_nothing_router", + "migrations.test_operations.FieldOperationTests.test_reference_field_by_through_fields", + "migrations.test_operations.FieldOperationTests.test_references_field_by_from_fields", + "migrations.test_operations.FieldOperationTests.test_references_field_by_name", + "migrations.test_operations.FieldOperationTests.test_references_field_by_remote_field_model", + "migrations.test_operations.FieldOperationTests.test_references_field_by_through", + "migrations.test_operations.FieldOperationTests.test_references_field_by_to_fields", + "migrations.test_operations.FieldOperationTests.test_references_model", + "migrations.test_operations.OperationTests.test_add_binaryfield", + "migrations.test_operations.OperationTests.test_add_charfield", + "migrations.test_operations.OperationTests.test_add_field_m2m", + "migrations.test_operations.OperationTests.test_add_index", + "migrations.test_operations.OperationTests.test_add_index_state_forwards", + "migrations.test_operations.OperationTests.test_add_textfield", + "migrations.test_operations.OperationTests.test_alter_field_m2m", + "migrations.test_operations.OperationTests.test_alter_field_pk", + "migrations.test_operations.OperationTests.test_alter_field_reloads_state_on_fk_target_changes", + "migrations.test_operations.OperationTests.test_alter_field_reloads_state_on_fk_with_to_field_target_changes", + "migrations.test_operations.OperationTests.test_alter_fk", + "migrations.test_operations.OperationTests.test_alter_index_together", + "migrations.test_operations.OperationTests.test_alter_index_together_remove", + "migrations.test_operations.OperationTests.test_alter_model_managers", + "migrations.test_operations.OperationTests.test_alter_model_managers_emptying", + "migrations.test_operations.OperationTests.test_alter_model_options", + "migrations.test_operations.OperationTests.test_alter_model_options_emptying", + "migrations.test_operations.OperationTests.test_alter_model_table", + "migrations.test_operations.OperationTests.test_alter_model_table_m2m", + "migrations.test_operations.OperationTests.test_alter_model_table_none", + "migrations.test_operations.OperationTests.test_alter_model_table_noop", + "migrations.test_operations.OperationTests.test_alter_unique_together_remove", + "migrations.test_operations.OperationTests.test_create_model", + "migrations.test_operations.OperationTests.test_create_model_inheritance", + "migrations.test_operations.OperationTests.test_create_model_m2m", + "migrations.test_operations.OperationTests.test_create_model_managers", + "migrations.test_operations.OperationTests.test_create_model_with_duplicate_base", + "migrations.test_operations.OperationTests.test_create_model_with_duplicate_field_name", + "migrations.test_operations.OperationTests.test_create_model_with_duplicate_manager_name", + "migrations.test_operations.OperationTests.test_create_model_with_unique_after", + "migrations.test_operations.OperationTests.test_create_proxy_model", + "migrations.test_operations.OperationTests.test_create_unmanaged_model", + "migrations.test_operations.OperationTests.test_delete_model", + "migrations.test_operations.OperationTests.test_delete_mti_model", + "migrations.test_operations.OperationTests.test_delete_proxy_model", + "migrations.test_operations.OperationTests.test_model_with_bigautofield", + "migrations.test_operations.OperationTests.test_remove_field_m2m", + "migrations.test_operations.OperationTests.test_remove_field_m2m_with_through", + "migrations.test_operations.OperationTests.test_remove_index_state_forwards", + "migrations.test_operations.OperationTests.test_rename_field_reloads_state_on_fk_target_changes", + "migrations.test_operations.OperationTests.test_rename_missing_field", + "migrations.test_operations.OperationTests.test_rename_model_state_forwards", + "migrations.test_operations.OperationTests.test_rename_referenced_field_state_forward", + "migrations.test_operations.OperationTests.test_repoint_field_m2m", + "migrations.test_operations.OperationTests.test_run_python", + "migrations.test_operations.OperationTests.test_run_python_noop", + "migrations.test_operations.OperationTests.test_run_python_related_assignment", + "migrations.test_operations.OperationTests.test_run_sql_noop", + "migrations.test_operations.OperationTests.test_run_sql_params_invalid", + "migrations.test_operations.OperationTests.test_separate_database_and_state2", + "migrations.test_operations.SwappableOperationTests.test_add_field_ignore_swapped", + "migrations.test_operations.SwappableOperationTests.test_create_ignore_swapped", + "migrations.test_operations.SwappableOperationTests.test_delete_ignore_swapped", + "migrations.test_operations.SwappableOperationTests.test_indexes_ignore_swapped", + "migrations.test_operations.TestCreateModel.test_references_model_mixin", + "migrations.test_optimizer.OptimizerTests.test_add_field_alter_field", + "migrations.test_optimizer.OptimizerTests.test_add_field_delete_field", + "migrations.test_optimizer.OptimizerTests.test_add_field_rename_field", + "migrations.test_optimizer.OptimizerTests.test_alter_alter_index_model", + "migrations.test_optimizer.OptimizerTests.test_alter_alter_owrt_model", + "migrations.test_optimizer.OptimizerTests.test_alter_alter_table_model", + "migrations.test_optimizer.OptimizerTests.test_alter_alter_unique_model", + "migrations.test_optimizer.OptimizerTests.test_alter_field_delete_field", + "migrations.test_optimizer.OptimizerTests.test_alter_field_rename_field", + "migrations.test_optimizer.OptimizerTests.test_create_alter_index_delete_model", + "migrations.test_optimizer.OptimizerTests.test_create_alter_index_field", + "migrations.test_optimizer.OptimizerTests.test_create_alter_model_options", + "migrations.test_optimizer.OptimizerTests.test_create_alter_owrt_delete_model", + "migrations.test_optimizer.OptimizerTests.test_create_alter_owrt_field", + "migrations.test_optimizer.OptimizerTests.test_create_alter_unique_delete_model", + "migrations.test_optimizer.OptimizerTests.test_create_alter_unique_field", + "migrations.test_optimizer.OptimizerTests.test_create_delete_model", + "migrations.test_optimizer.OptimizerTests.test_create_model_add_field", + "migrations.test_optimizer.OptimizerTests.test_create_model_add_field_not_through_m2m_through", + "migrations.test_optimizer.OptimizerTests.test_create_model_alter_field", + "migrations.test_optimizer.OptimizerTests.test_create_model_no_reordering_for_unrelated_fk", + "migrations.test_optimizer.OptimizerTests.test_create_model_no_reordering_of_inherited_model", + "migrations.test_optimizer.OptimizerTests.test_create_model_remove_field", + "migrations.test_optimizer.OptimizerTests.test_create_model_rename_field", + "migrations.test_optimizer.OptimizerTests.test_create_model_reordering", + "migrations.test_optimizer.OptimizerTests.test_create_model_reordering_circular_fk", + "migrations.test_optimizer.OptimizerTests.test_create_rename_model", + "migrations.test_optimizer.OptimizerTests.test_optimize_elidable_operation", + "migrations.test_optimizer.OptimizerTests.test_optimize_through_create", + "migrations.test_optimizer.OptimizerTests.test_optimize_through_fields", + "migrations.test_optimizer.OptimizerTests.test_rename_model_self", + "migrations.test_optimizer.OptimizerTests.test_single", + "migrations.test_questioner.QuestionerTests.test_ask_initial_with_disabled_migrations", + "migrations.test_questioner.QuestionerTests.test_timedelta_default", + "migrations.test_state.ModelStateTests.test_abstract_model_children_inherit_indexes", + "migrations.test_state.ModelStateTests.test_bound_field_sanity_check", + "migrations.test_state.ModelStateTests.test_create_swappable", + "migrations.test_state.ModelStateTests.test_create_swappable_from_abstract", + "migrations.test_state.ModelStateTests.test_custom_manager_swappable", + "migrations.test_state.ModelStateTests.test_custom_model_base", + "migrations.test_state.ModelStateTests.test_explicit_index_name", + "migrations.test_state.ModelStateTests.test_fields_immutability", + "migrations.test_state.ModelStateTests.test_from_model_constraints", + "migrations.test_state.ModelStateTests.test_order_with_respect_to_private_field", + "migrations.test_state.ModelStateTests.test_repr", + "migrations.test_state.ModelStateTests.test_sanity_check_through", + "migrations.test_state.ModelStateTests.test_sanity_check_to", + "migrations.test_state.ModelStateTests.test_sanity_index_name", + "migrations.test_state.RelatedModelsTests.test_abstract_base", + "migrations.test_state.RelatedModelsTests.test_base", + "migrations.test_state.RelatedModelsTests.test_base_to_base_fk", + "migrations.test_state.RelatedModelsTests.test_base_to_subclass_fk", + "migrations.test_state.RelatedModelsTests.test_circle", + "migrations.test_state.RelatedModelsTests.test_direct_fk", + "migrations.test_state.RelatedModelsTests.test_direct_hidden_fk", + "migrations.test_state.RelatedModelsTests.test_direct_m2m", + "migrations.test_state.RelatedModelsTests.test_direct_m2m_self", + "migrations.test_state.RelatedModelsTests.test_fk_through_proxy", + "migrations.test_state.RelatedModelsTests.test_generic_fk", + "migrations.test_state.RelatedModelsTests.test_intermediate_m2m", + "migrations.test_state.RelatedModelsTests.test_intermediate_m2m_base", + "migrations.test_state.RelatedModelsTests.test_intermediate_m2m_extern_fk", + "migrations.test_state.RelatedModelsTests.test_intermediate_m2m_self", + "migrations.test_state.RelatedModelsTests.test_multiple_bases", + "migrations.test_state.RelatedModelsTests.test_multiple_mixed_bases", + "migrations.test_state.RelatedModelsTests.test_multiple_nested_bases", + "migrations.test_state.RelatedModelsTests.test_nested_abstract_base", + "migrations.test_state.RelatedModelsTests.test_nested_base", + "migrations.test_state.RelatedModelsTests.test_nested_fk", + "migrations.test_state.RelatedModelsTests.test_nested_proxy_base", + "migrations.test_state.RelatedModelsTests.test_proxy_base", + "migrations.test_state.RelatedModelsTests.test_two_sided", + "migrations.test_state.RelatedModelsTests.test_unrelated", + "migrations.test_state.StateTests.test_add_relations", + "migrations.test_state.StateTests.test_apps_bulk_update", + "migrations.test_state.StateTests.test_choices_iterator", + "migrations.test_state.StateTests.test_create", + "migrations.test_state.StateTests.test_custom_base_manager", + "migrations.test_state.StateTests.test_custom_default_manager", + "migrations.test_state.StateTests.test_custom_default_manager_added_to_the_model_state", + "migrations.test_state.StateTests.test_custom_default_manager_named_objects_with_false_migration_flag", + "migrations.test_state.StateTests.test_dangling_references_throw_error", + "migrations.test_state.StateTests.test_equality", + "migrations.test_state.StateTests.test_ignore_order_wrt", + "migrations.test_state.StateTests.test_manager_refer_correct_model_version", + "migrations.test_state.StateTests.test_no_duplicate_managers", + "migrations.test_state.StateTests.test_real_apps", + "migrations.test_state.StateTests.test_remove_relations", + "migrations.test_state.StateTests.test_render", + "migrations.test_state.StateTests.test_render_model_inheritance", + "migrations.test_state.StateTests.test_render_model_with_multiple_inheritance", + "migrations.test_state.StateTests.test_render_project_dependencies", + "migrations.test_state.StateTests.test_render_unique_app_labels", + "migrations.test_state.StateTests.test_self_relation", + "migrations.test_writer.OperationWriterTests.test_args_kwargs_signature", + "migrations.test_writer.OperationWriterTests.test_args_signature", + "migrations.test_writer.OperationWriterTests.test_empty_signature", + "migrations.test_writer.OperationWriterTests.test_expand_args_signature", + "migrations.test_writer.OperationWriterTests.test_kwargs_signature", + "migrations.test_writer.OperationWriterTests.test_multiline_args_signature", + "migrations.test_writer.OperationWriterTests.test_nested_args_signature", + "migrations.test_writer.OperationWriterTests.test_nested_operation_expand_args_signature", + "migrations.test_writer.WriterTests.test_custom_operation", + "migrations.test_writer.WriterTests.test_deconstruct_class_arguments", + "migrations.test_writer.WriterTests.test_migration_file_header_comments", + "migrations.test_writer.WriterTests.test_migration_path", + "migrations.test_writer.WriterTests.test_models_import_omitted", + "migrations.test_writer.WriterTests.test_register_non_serializer", + "migrations.test_writer.WriterTests.test_register_serializer", + "migrations.test_writer.WriterTests.test_serialize_builtin_types", + "migrations.test_writer.WriterTests.test_serialize_builtins", + "migrations.test_writer.WriterTests.test_serialize_class_based_validators", + "migrations.test_writer.WriterTests.test_serialize_collections", + "migrations.test_writer.WriterTests.test_serialize_compiled_regex", + "migrations.test_writer.WriterTests.test_serialize_constants", + "migrations.test_writer.WriterTests.test_serialize_datetime", + "migrations.test_writer.WriterTests.test_serialize_empty_nonempty_tuple", + "migrations.test_writer.WriterTests.test_serialize_enums", + "migrations.test_writer.WriterTests.test_serialize_fields", + "migrations.test_writer.WriterTests.test_serialize_frozensets", + "migrations.test_writer.WriterTests.test_serialize_functions", + "migrations.test_writer.WriterTests.test_serialize_functools_partial", + "migrations.test_writer.WriterTests.test_serialize_functools_partialmethod", + "migrations.test_writer.WriterTests.test_serialize_iterators", + "migrations.test_writer.WriterTests.test_serialize_lazy_objects", + "migrations.test_writer.WriterTests.test_serialize_local_function_reference", + "migrations.test_writer.WriterTests.test_serialize_managers", + "migrations.test_writer.WriterTests.test_serialize_multiline_strings", + "migrations.test_writer.WriterTests.test_serialize_numbers", + "migrations.test_writer.WriterTests.test_serialize_set", + "migrations.test_writer.WriterTests.test_serialize_settings", + "migrations.test_writer.WriterTests.test_serialize_strings", + "migrations.test_writer.WriterTests.test_serialize_timedelta", + "migrations.test_writer.WriterTests.test_serialize_type_none", + "migrations.test_writer.WriterTests.test_serialize_unbound_method_reference", + "migrations.test_writer.WriterTests.test_serialize_uuid", + "migrations.test_writer.WriterTests.test_simple_migration", + "migrations.test_writer.WriterTests.test_sorted_imports" + ], + "db_functions": [ + "db_functions.comparison.test_coalesce.CoalesceTests.test_gt_two_expressions", + "db_functions.comparison.test_greatest.GreatestTests.test_one_expressions", + "db_functions.comparison.test_least.LeastTests.test_one_expressions", + "db_functions.comparison.test_nullif.NullIfTests.test_too_few_args", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_duration_without_native_duration_field", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_year_exact_lookup", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_year_greaterthan_lookup", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_year_lessthan_lookup", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_duration_without_native_duration_field", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_year_exact_lookup", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_year_greaterthan_lookup", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_year_lessthan_lookup", + "db_functions.text.test_concat.ConcatTests.test_gt_two_expressions", + "db_functions.text.test_concat.ConcatTests.test_sql_generation_idempotency", + "db_functions.text.test_left.LeftTests.test_invalid_length", + "db_functions.text.test_lower.LowerTests.test_num_args", + "db_functions.text.test_pad.PadTests.test_pad_negative_length", + "db_functions.text.test_repeat.RepeatTests.test_negative_number", + "db_functions.text.test_right.RightTests.test_invalid_length", + "db_functions.text.test_substr.SubstrTests.test_pos_gt_zero", + "db_functions.window.test_validation.ValidationTests.test_lag_negative_offset", + "db_functions.window.test_validation.ValidationTests.test_lead_negative_offset", + "db_functions.window.test_validation.ValidationTests.test_negative_num_buckets_ntile", + "db_functions.window.test_validation.ValidationTests.test_nth_negative_nth_value", + "db_functions.window.test_validation.ValidationTests.test_nth_null_expression", + "db_functions.window.test_validation.ValidationTests.test_null_source_lag", + "db_functions.window.test_validation.ValidationTests.test_null_source_lead" + ], + "inspectdb": [ + "inspectdb.tests.InspectDBTestCase.test_digits_column_name_introspection", + "inspectdb.tests.InspectDBTestCase.test_introspection_errors", + "inspectdb.tests.InspectDBTestCase.test_managed_models", + "inspectdb.tests.InspectDBTestCase.test_stealth_table_name_filter_option", + "inspectdb.tests.InspectDBTestCase.test_table_name_introspection", + "inspectdb.tests.InspectDBTestCase.test_table_option", + "inspectdb.tests.InspectDBTestCase.test_unique_together_meta" + ] + }, + "failing": { + "migrations": [ + "migrations.test_multidb.MultiDBOperationTests.test_run_sql_migrate_foo_router_with_hints", + "migrations.test_operations.OperationTests.test_add_constraint", + "migrations.test_operations.OperationTests.test_add_field", + "migrations.test_operations.OperationTests.test_add_field_preserve_default", + "migrations.test_operations.OperationTests.test_add_partial_unique_constraint", + "migrations.test_operations.OperationTests.test_alter_field", + "migrations.test_operations.OperationTests.test_alter_field_pk_fk", + "migrations.test_operations.OperationTests.test_alter_field_with_index", + "migrations.test_operations.OperationTests.test_alter_fk_non_fk", + "migrations.test_operations.OperationTests.test_alter_order_with_respect_to", + "migrations.test_operations.OperationTests.test_alter_unique_together", + "migrations.test_operations.OperationTests.test_autofield_foreignfield_growth", + "migrations.test_operations.OperationTests.test_column_name_quoting", + "migrations.test_operations.OperationTests.test_create_model_with_constraint", + "migrations.test_operations.OperationTests.test_create_model_with_partial_unique_constraint", + "migrations.test_operations.OperationTests.test_remove_constraint", + "migrations.test_operations.OperationTests.test_remove_field", + "migrations.test_operations.OperationTests.test_remove_fk", + "migrations.test_operations.OperationTests.test_remove_index", + "migrations.test_operations.OperationTests.test_remove_partial_unique_constraint", + "migrations.test_operations.OperationTests.test_rename_field", + "migrations.test_operations.OperationTests.test_rename_m2m_model_after_rename_field", + "migrations.test_operations.OperationTests.test_rename_m2m_target_model", + "migrations.test_operations.OperationTests.test_rename_m2m_through_model", + "migrations.test_operations.OperationTests.test_rename_model", + "migrations.test_operations.OperationTests.test_rename_model_with_m2m", + "migrations.test_operations.OperationTests.test_rename_model_with_self_referential_fk", + "migrations.test_operations.OperationTests.test_rename_model_with_self_referential_m2m", + "migrations.test_operations.OperationTests.test_rename_model_with_superclass_fk", + "migrations.test_operations.OperationTests.test_run_python_atomic", + "migrations.test_operations.OperationTests.test_run_sql", + "migrations.test_operations.OperationTests.test_run_sql_params", + "migrations.test_operations.OperationTests.test_separate_database_and_state" + ], + "unittest": [ + "unittest.loader._FailedTest.migrations.test_commands", + "unittest.loader._FailedTest.migrations.test_executor" + ], + "inspectdb": [ + "inspectdb.tests.InspectDBTestCase.test_attribute_name_not_python_keyword", + "inspectdb.tests.InspectDBTestCase.test_field_types", + "inspectdb.tests.InspectDBTestCase.test_number_field_types", + "inspectdb.tests.InspectDBTestCase.test_special_column_name_introspection", + "inspectdb.tests.InspectDBTransactionalTests.test_include_views" + ], + "db_functions": [ + "db_functions.comparison.test_cast.CastTests.test_cast_from_db_date_to_datetime", + "db_functions.comparison.test_cast.CastTests.test_cast_from_db_datetime_to_date", + "db_functions.comparison.test_cast.CastTests.test_cast_from_db_datetime_to_date_group_by", + "db_functions.comparison.test_cast.CastTests.test_cast_from_db_datetime_to_time", + "db_functions.comparison.test_cast.CastTests.test_cast_from_field", + "db_functions.comparison.test_cast.CastTests.test_cast_from_python", + "db_functions.comparison.test_cast.CastTests.test_cast_from_python_to_date", + "db_functions.comparison.test_cast.CastTests.test_cast_from_python_to_datetime", + "db_functions.comparison.test_cast.CastTests.test_cast_from_value", + "db_functions.comparison.test_cast.CastTests.test_cast_to_char_field_with_max_length", + "db_functions.comparison.test_cast.CastTests.test_cast_to_char_field_without_max_length", + "db_functions.comparison.test_cast.CastTests.test_cast_to_decimal_field", + "db_functions.comparison.test_cast.CastTests.test_cast_to_integer", + "db_functions.comparison.test_cast.CastTests.test_cast_to_integer", + "db_functions.comparison.test_cast.CastTests.test_cast_to_integer", + "db_functions.comparison.test_cast.CastTests.test_cast_to_integer", + "db_functions.comparison.test_cast.CastTests.test_cast_to_integer", + "db_functions.comparison.test_cast.CastTests.test_cast_to_integer", + "db_functions.comparison.test_cast.CastTests.test_cast_to_integer", + "db_functions.comparison.test_cast.CastTests.test_cast_to_text_field", + "db_functions.comparison.test_coalesce.CoalesceTests.test_basic", + "db_functions.comparison.test_coalesce.CoalesceTests.test_mixed_values", + "db_functions.comparison.test_coalesce.CoalesceTests.test_ordering", + "db_functions.comparison.test_greatest.GreatestTests.test_all_null", + "db_functions.comparison.test_greatest.GreatestTests.test_basic", + "db_functions.comparison.test_greatest.GreatestTests.test_coalesce_workaround", + "db_functions.comparison.test_greatest.GreatestTests.test_decimal_filter", + "db_functions.comparison.test_greatest.GreatestTests.test_propagates_null", + "db_functions.comparison.test_greatest.GreatestTests.test_related_field", + "db_functions.comparison.test_greatest.GreatestTests.test_update", + "db_functions.comparison.test_least.LeastTests.test_all_null", + "db_functions.comparison.test_least.LeastTests.test_basic", + "db_functions.comparison.test_least.LeastTests.test_coalesce_workaround", + "db_functions.comparison.test_least.LeastTests.test_decimal_filter", + "db_functions.comparison.test_least.LeastTests.test_propagates_null", + "db_functions.comparison.test_least.LeastTests.test_related_field", + "db_functions.comparison.test_least.LeastTests.test_update", + "db_functions.comparison.test_nullif.NullIfTests.test_basic", + "db_functions.comparison.test_nullif.NullIfTests.test_null_argument", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_day_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_hour_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_iso_year_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_iso_year_func_boundaries", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_minute_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_month_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_none", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_none", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_none", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_quarter_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_quarter_func_boundaries", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_second_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_week_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_week_func_boundaries", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_weekday_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_extract_year_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_date_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_date_none", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_day_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_hour_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_minute_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_month_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_none", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_none", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_none", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_quarter_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_second_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_subquery_with_parameters", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_time_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_time_none", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_week_func", + "db_functions.datetime.test_extract_trunc.DateFunctionTests.test_trunc_year_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_day_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_func_explicit_timezone_priority", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_func_with_timezone", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_hour_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_iso_year_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_iso_year_func_boundaries", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_minute_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_month_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_none", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_none", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_none", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_quarter_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_quarter_func_boundaries", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_second_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_week_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_week_func_boundaries", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_weekday_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_extract_year_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_date_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_date_none", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_day_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_func_with_timezone", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_hour_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_minute_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_month_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_none", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_none", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_none", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_quarter_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_second_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_subquery_with_parameters", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_time_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_time_none", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_timezone_applied_before_truncation", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_week_func", + "db_functions.datetime.test_extract_trunc.DateFunctionWithTimeZoneTests.test_trunc_year_func", + "db_functions.datetime.test_now.NowTests.test_basic", + "db_functions.math.test_abs.AbsTests.test_decimal", + "db_functions.math.test_abs.AbsTests.test_float", + "db_functions.math.test_abs.AbsTests.test_integer", + "db_functions.math.test_abs.AbsTests.test_null", + "db_functions.math.test_abs.AbsTests.test_transform", + "db_functions.math.test_acos.ACosTests.test_decimal", + "db_functions.math.test_acos.ACosTests.test_float", + "db_functions.math.test_acos.ACosTests.test_integer", + "db_functions.math.test_acos.ACosTests.test_null", + "db_functions.math.test_acos.ACosTests.test_transform", + "db_functions.math.test_asin.ASinTests.test_decimal", + "db_functions.math.test_asin.ASinTests.test_float", + "db_functions.math.test_asin.ASinTests.test_integer", + "db_functions.math.test_asin.ASinTests.test_null", + "db_functions.math.test_asin.ASinTests.test_transform", + "db_functions.math.test_atan.ATanTests.test_decimal", + "db_functions.math.test_atan.ATanTests.test_float", + "db_functions.math.test_atan.ATanTests.test_integer", + "db_functions.math.test_atan.ATanTests.test_null", + "db_functions.math.test_atan.ATanTests.test_transform", + "db_functions.math.test_atan2.ATan2Tests.test_decimal", + "db_functions.math.test_atan2.ATan2Tests.test_float", + "db_functions.math.test_atan2.ATan2Tests.test_integer", + "db_functions.math.test_atan2.ATan2Tests.test_null", + "db_functions.math.test_ceil.CeilTests.test_decimal", + "db_functions.math.test_ceil.CeilTests.test_float", + "db_functions.math.test_ceil.CeilTests.test_integer", + "db_functions.math.test_ceil.CeilTests.test_null", + "db_functions.math.test_ceil.CeilTests.test_transform", + "db_functions.math.test_cos.CosTests.test_decimal", + "db_functions.math.test_cos.CosTests.test_float", + "db_functions.math.test_cos.CosTests.test_integer", + "db_functions.math.test_cos.CosTests.test_null", + "db_functions.math.test_cos.CosTests.test_transform", + "db_functions.math.test_cot.CotTests.test_decimal", + "db_functions.math.test_cot.CotTests.test_float", + "db_functions.math.test_cot.CotTests.test_integer", + "db_functions.math.test_cot.CotTests.test_null", + "db_functions.math.test_cot.CotTests.test_transform", + "db_functions.math.test_degrees.DegreesTests.test_decimal", + "db_functions.math.test_degrees.DegreesTests.test_float", + "db_functions.math.test_degrees.DegreesTests.test_integer", + "db_functions.math.test_degrees.DegreesTests.test_null", + "db_functions.math.test_degrees.DegreesTests.test_transform", + "db_functions.math.test_exp.ExpTests.test_decimal", + "db_functions.math.test_exp.ExpTests.test_float", + "db_functions.math.test_exp.ExpTests.test_integer", + "db_functions.math.test_exp.ExpTests.test_null", + "db_functions.math.test_exp.ExpTests.test_transform", + "db_functions.math.test_floor.FloorTests.test_decimal", + "db_functions.math.test_floor.FloorTests.test_float", + "db_functions.math.test_floor.FloorTests.test_integer", + "db_functions.math.test_floor.FloorTests.test_null", + "db_functions.math.test_floor.FloorTests.test_transform", + "db_functions.math.test_ln.LnTests.test_decimal", + "db_functions.math.test_ln.LnTests.test_float", + "db_functions.math.test_ln.LnTests.test_integer", + "db_functions.math.test_ln.LnTests.test_null", + "db_functions.math.test_ln.LnTests.test_transform", + "db_functions.math.test_log.LogTests.test_decimal", + "db_functions.math.test_log.LogTests.test_float", + "db_functions.math.test_log.LogTests.test_integer", + "db_functions.math.test_log.LogTests.test_null", + "db_functions.math.test_mod.ModTests.test_decimal", + "db_functions.math.test_mod.ModTests.test_float", + "db_functions.math.test_mod.ModTests.test_integer", + "db_functions.math.test_mod.ModTests.test_null", + "db_functions.math.test_pi.PiTests.test", + "db_functions.math.test_power.PowerTests.test_decimal", + "db_functions.math.test_power.PowerTests.test_float", + "db_functions.math.test_power.PowerTests.test_integer", + "db_functions.math.test_power.PowerTests.test_null", + "db_functions.math.test_radians.RadiansTests.test_decimal", + "db_functions.math.test_radians.RadiansTests.test_float", + "db_functions.math.test_radians.RadiansTests.test_integer", + "db_functions.math.test_radians.RadiansTests.test_null", + "db_functions.math.test_radians.RadiansTests.test_transform", + "db_functions.math.test_round.RoundTests.test_decimal", + "db_functions.math.test_round.RoundTests.test_float", + "db_functions.math.test_round.RoundTests.test_integer", + "db_functions.math.test_round.RoundTests.test_null", + "db_functions.math.test_round.RoundTests.test_transform", + "db_functions.math.test_sin.SinTests.test_decimal", + "db_functions.math.test_sin.SinTests.test_float", + "db_functions.math.test_sin.SinTests.test_integer", + "db_functions.math.test_sin.SinTests.test_null", + "db_functions.math.test_sin.SinTests.test_transform", + "db_functions.math.test_sqrt.SqrtTests.test_decimal", + "db_functions.math.test_sqrt.SqrtTests.test_float", + "db_functions.math.test_sqrt.SqrtTests.test_integer", + "db_functions.math.test_sqrt.SqrtTests.test_null", + "db_functions.math.test_sqrt.SqrtTests.test_transform", + "db_functions.math.test_tan.TanTests.test_decimal", + "db_functions.math.test_tan.TanTests.test_float", + "db_functions.math.test_tan.TanTests.test_integer", + "db_functions.math.test_tan.TanTests.test_null", + "db_functions.math.test_tan.TanTests.test_transform", + "db_functions.tests.FunctionTests.test_func_transform_bilateral", + "db_functions.tests.FunctionTests.test_func_transform_bilateral_multivalue", + "db_functions.tests.FunctionTests.test_function_as_filter", + "db_functions.tests.FunctionTests.test_nested_function_ordering", + "db_functions.text.test_chr.ChrTests.test_basic", + "db_functions.text.test_chr.ChrTests.test_non_ascii", + "db_functions.text.test_chr.ChrTests.test_transform", + "db_functions.text.test_concat.ConcatTests.test_basic", + "db_functions.text.test_concat.ConcatTests.test_many", + "db_functions.text.test_concat.ConcatTests.test_mixed_char_text", + "db_functions.text.test_left.LeftTests.test_basic", + "db_functions.text.test_left.LeftTests.test_expressions", + "db_functions.text.test_length.LengthTests.test_basic", + "db_functions.text.test_length.LengthTests.test_ordering", + "db_functions.text.test_length.LengthTests.test_transform", + "db_functions.text.test_lower.LowerTests.test_basic", + "db_functions.text.test_lower.LowerTests.test_transform", + "db_functions.text.test_ord.OrdTests.test_basic", + "db_functions.text.test_ord.OrdTests.test_transform", + "db_functions.text.test_pad.PadTests.test_combined_with_length", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_pad.PadTests.test_pad", + "db_functions.text.test_repeat.RepeatTests.test_basic", + "db_functions.text.test_repeat.RepeatTests.test_basic", + "db_functions.text.test_repeat.RepeatTests.test_basic", + "db_functions.text.test_repeat.RepeatTests.test_basic", + "db_functions.text.test_repeat.RepeatTests.test_basic", + "db_functions.text.test_repeat.RepeatTests.test_basic", + "db_functions.text.test_replace.ReplaceTests.test_case_sensitive", + "db_functions.text.test_replace.ReplaceTests.test_replace_expression", + "db_functions.text.test_replace.ReplaceTests.test_replace_with_default_arg", + "db_functions.text.test_replace.ReplaceTests.test_replace_with_empty_string", + "db_functions.text.test_replace.ReplaceTests.test_update", + "db_functions.text.test_reverse.ReverseTests.test_basic", + "db_functions.text.test_reverse.ReverseTests.test_expressions", + "db_functions.text.test_reverse.ReverseTests.test_null", + "db_functions.text.test_reverse.ReverseTests.test_transform", + "db_functions.text.test_right.RightTests.test_basic", + "db_functions.text.test_right.RightTests.test_expressions", + "db_functions.text.test_strindex.StrIndexTests.test_annotate_charfield", + "db_functions.text.test_strindex.StrIndexTests.test_annotate_textfield", + "db_functions.text.test_strindex.StrIndexTests.test_filtering", + "db_functions.text.test_strindex.StrIndexTests.test_order_by", + "db_functions.text.test_strindex.StrIndexTests.test_unicode_values", + "db_functions.text.test_substr.SubstrTests.test_basic", + "db_functions.text.test_substr.SubstrTests.test_expressions", + "db_functions.text.test_substr.SubstrTests.test_start", + "db_functions.text.test_trim.TrimTests.test_trim", + "db_functions.text.test_trim.TrimTests.test_trim_transform", + "db_functions.text.test_trim.TrimTests.test_trim_transform", + "db_functions.text.test_trim.TrimTests.test_trim_transform", + "db_functions.text.test_upper.UpperTests.test_basic", + "db_functions.text.test_upper.UpperTests.test_transform" + ] + } + } + } + }, + "v30": { + "repo_tests": [], + "p36": { + "sqlite": { + "passing": {}, + "failing": {} + }, + "mongodb": { + "passing": {}, + "failing": {} + } + }, + "p38": { + "sqlite": { + "passing": {}, + "failing": {} + }, + "mongodb": { + "passing": {}, + "failing": {} + } + } + } +} \ No newline at end of file diff --git a/tests/django_tests/results/tests_list.json b/tests/django_tests/results/tests_list.json new file mode 100644 index 00000000..f1e13c91 --- /dev/null +++ b/tests/django_tests/results/tests_list.json @@ -0,0 +1 @@ +{"v21": {"mongodb": {"all_tests": ["m2m_signals", "reserved_names", "builtin_server", "dispatch", "signed_cookies_tests", "test_client_regress", "csrf_tests", "invalid_models_tests", "m2m_regress", "project_template", "model_regress", "conditional_processing", "contenttypes_tests", "admin_scripts", "runtests.py", "db_functions", "bulk_create", "custom_pk", "select_for_update", "model_forms", "logging_tests", "admin_views", "unmanaged_models", "deprecation", "m2m_intermediary", "inline_formsets", "wsgi", "annotations", "middleware_exceptions", "i18n", "user_commands", "model_package", "httpwrappers", "middleware", "admin_custom_urls", "check_framework", "m2m_through_regress", "known_related_objects", "aggregation", "model_fields", "test_client", "messages_tests", "apps", "select_related_regress", "validators", "admin_docs", "admin_checks", "flatpages_tests", "nested_foreign_keys", "model_formsets", "staticfiles_tests", "indexes", "servers", "timezones", "decorators", "humanize_tests", "model_indexes", "files", "templates", "select_related", "datetimes", "sites_framework", "db_utils", "file_storage", "model_formsets_regress", "custom_managers", "context_processors", "backends", "mail", "test_runner", "proxy_model_inheritance", "validation", "base", "m2m_through", "many_to_one_null", "swappable_models", "migrate_signals", "__pycache__", "shell", "raw_query", "field_defaults", "settings_tests", "shortcuts", "many_to_one", "defer_regress", "multiple_database", "lookup", "test_exceptions", "admin_inlines", "import_error_package", "admin_changelist", "expressions", "responses", "requests", "datatypes", "one_to_one", "mutually_referential", "prefetch_related", "fixtures_model_package", "field_subclassing", "custom_migration_operations", "template_loader", "delete", "get_earliest_or_latest", "m2o_recursive", "bash_completion", "proxy_models", ".coveragerc", "properties", "save_delete_hooks", "admin_registration", "file_uploads", "extra_regress", "test_sqlite.py", "null_fk", "aggregation_regress", "generic_relations", "migrations2", "distinct_on_fields", "modeladmin", "null_queries", "model_inheritance_regress", "admin_utils", "expressions_case", "foreign_object", "handlers", "test_utils", "view_tests", "test_mongodb.py", "custom_lookups", "admin_ordering", "queries", "gis_tests", "update", "migrations", "generic_views", "or_lookups", "string_lookup", "version", "select_related_onetoone", "basic", "pagination", "signing", "model_options", "force_insert_update", "inspectdb", "update_only_fields", "sites_tests", "order_with_respect_to", "m2m_and_m2o", "admin_filters", "custom_columns", "auth_tests", "null_fk_ordering", "utils_tests", "app_loading", "m2m_recursive", "urlpatterns_reverse", "transactions", "urlpatterns", "many_to_many", "queryset_pickle", "admin_default_site", "dates", "delete_regress", "schema", "introspection", "template_backends", "model_inheritance", "model_meta", "str", "fixtures", "admin_widgets", "m2m_multiple", "from_db_value", "field_deconstruction", "generic_inline_admin", "migration_test_data_persistence", "choices", "reverse_lookup", "no_models", "db_typecasts", "urls.py", "absolute_url_overrides", "get_object_or_404", "requirements", "custom_methods", "test_runner_apps", "ordering", "sessions_tests", "template_tests", "signals", "expressions_window", "empty", "get_or_create", "defer", "max_lengths", "sitemaps_tests", "filtered_relation", "redirects_tests", "serializers", "dbshell", "postgres_tests", "admin_autodiscover", "syndication_tests", "managers_regress"], "failing_tests": [".coveragerc", "admin_changelist", "admin_checks", "admin_filters", "admin_inlines", "admin_ordering", "admin_utils", "admin_views", "aggregation", "aggregation_regress", "annotations", "auth_tests", "backends", "basic", "bulk_create", "contenttypes_tests", "custom_columns", "custom_lookups", "custom_managers", "custom_methods", "custom_pk", "dates", "datetimes", "db_functions", "defer", "delete", "delete_regress", "expressions", "expressions_case", "extra_regress", "file_storage", "filtered_relation", "fixtures", "force_insert_update", "foreign_object", "generic_relations", "generic_views", "get_or_create", "gis_tests", "httpwrappers", "import_error_package", "inspectdb", "introspection", "lookup", "m2m_through_regress", "many_to_many", "many_to_one", "migrations", "model_fields", "model_forms", "model_formsets", "model_inheritance", "model_inheritance_regress", "model_regress", "modeladmin", "multiple_database", "null_queries", "one_to_one", "or_lookups", "order_with_respect_to", "ordering", "prefetch_related", "proxy_models", "queries", "queryset_pickle", "raw_query", "reserved_names", "runtests.py", "schema", "select_related", "select_related_onetoone", "select_related_regress", "serializers", "servers", "sitemaps_tests", "syndication_tests", "test_client_regress", "test_mongodb.py", "test_runner", "test_sqlite.py", "test_utils", "timezones", "transactions", "update", "urls.py", "utils_tests", "validation", "view_tests"]}}, "v22": {"mongodb": {"all_tests": ["m2m_signals", "reserved_names", "builtin_server", "dispatch", "signed_cookies_tests", "test_client_regress", "csrf_tests", "invalid_models_tests", "m2m_regress", "project_template", "model_regress", "conditional_processing", "contenttypes_tests", "admin_scripts", "runtests.py", "db_functions", "bulk_create", "custom_pk", "select_for_update", "model_forms", "logging_tests", "admin_views", "unmanaged_models", "deprecation", "m2m_intermediary", "inline_formsets", "wsgi", "annotations", "middleware_exceptions", "constraints", "i18n", "user_commands", "model_package", "httpwrappers", "middleware", "admin_custom_urls", "check_framework", "m2m_through_regress", "known_related_objects", "aggregation", "model_fields", "test_client", "messages_tests", "apps", "select_related_regress", "validators", "admin_docs", "admin_checks", "flatpages_tests", "nested_foreign_keys", "model_formsets", "staticfiles_tests", "indexes", "servers", "timezones", "decorators", "humanize_tests", "model_indexes", "files", "templates", "select_related", "datetimes", "sites_framework", "db_utils", "file_storage", "model_formsets_regress", "custom_managers", "context_processors", "backends", "mail", "test_runner", "proxy_model_inheritance", "validation", "base", "m2m_through", "many_to_one_null", "swappable_models", "migrate_signals", "__pycache__", "shell", "raw_query", "field_defaults", "settings_tests", "shortcuts", "many_to_one", "defer_regress", "multiple_database", "lookup", "test_exceptions", "admin_inlines", "import_error_package", "admin_changelist", "expressions", "responses", "requests", "datatypes", "one_to_one", "mutually_referential", "prefetch_related", "fixtures_model_package", "field_subclassing", "custom_migration_operations", "template_loader", "delete", "get_earliest_or_latest", "m2o_recursive", "bash_completion", "proxy_models", ".coveragerc", "properties", "save_delete_hooks", "admin_registration", "file_uploads", "extra_regress", "test_sqlite.py", "null_fk", "aggregation_regress", "generic_relations", "migrations2", "distinct_on_fields", "modeladmin", "null_queries", "model_inheritance_regress", "admin_utils", "expressions_case", "foreign_object", "handlers", "test_utils", "view_tests", "test_mongodb.py", "custom_lookups", "admin_ordering", "queries", "gis_tests", "update", "migrations", "generic_views", "or_lookups", "string_lookup", "version", "select_related_onetoone", "basic", "pagination", "signing", "model_options", "force_insert_update", "inspectdb", "update_only_fields", "sites_tests", "order_with_respect_to", "m2m_and_m2o", "admin_filters", "custom_columns", "auth_tests", "null_fk_ordering", "utils_tests", "app_loading", "m2m_recursive", "urlpatterns_reverse", "transactions", "urlpatterns", "many_to_many", "queryset_pickle", "admin_default_site", "dates", "delete_regress", "schema", "introspection", "template_backends", "model_inheritance", "model_meta", "str", "fixtures", "admin_widgets", "m2m_multiple", "from_db_value", "field_deconstruction", "generic_inline_admin", "migration_test_data_persistence", "choices", "reverse_lookup", "no_models", "db_typecasts", "urls.py", "absolute_url_overrides", "get_object_or_404", "requirements", "custom_methods", "test_runner_apps", "ordering", "sessions_tests", "template_tests", "signals", "expressions_window", "empty", "get_or_create", "defer", "max_lengths", "sitemaps_tests", "filtered_relation", "redirects_tests", "serializers", "dbshell", "postgres_tests", "admin_autodiscover", "syndication_tests", "managers_regress"], "failing_tests": [".coveragerc", "admin_changelist", "admin_filters", "admin_ordering", "admin_utils", "admin_views", "aggregation", "aggregation_regress", "annotations", "auth_tests", "backends", "basic", "bulk_create", "constraints", "contenttypes_tests", "custom_columns", "custom_lookups", "custom_managers", "custom_methods", "custom_pk", "dates", "datetimes", "db_functions", "defer", "delete", "delete_regress", "expressions", "expressions_case", "extra_regress", "filtered_relation", "fixtures", "force_insert_update", "foreign_object", "generic_relations", "generic_views", "get_or_create", "gis_tests", "i18n", "import_error_package", "indexes", "inspectdb", "introspection", "lookup", "m2m_and_m2o", "m2m_through", "m2m_through_regress", "many_to_many", "many_to_one", "migrations", "model_fields", "model_forms", "model_formsets", "model_inheritance", "model_inheritance_regress", "model_regress", "multiple_database", "null_queries", "one_to_one", "or_lookups", "order_with_respect_to", "ordering", "prefetch_related", "proxy_models", "queries", "queryset_pickle", "raw_query", "reserved_names", "runtests.py", "schema", "select_related", "select_related_onetoone", "select_related_regress", "serializers", "servers", "sessions_tests", "sitemaps_tests", "syndication_tests", "test_mongodb.py", "test_runner", "test_runner_apps", "test_sqlite.py", "test_utils", "timezones", "transactions", "update", "urls.py", "validation", "view_tests"]}, "sqlite": {"all_tests": ["m2m_signals", "reserved_names", "builtin_server", "dispatch", "signed_cookies_tests", "test_client_regress", "csrf_tests", "invalid_models_tests", "m2m_regress", "project_template", "model_regress", "conditional_processing", "contenttypes_tests", "admin_scripts", "runtests.py", "db_functions", "bulk_create", "custom_pk", "select_for_update", "model_forms", "logging_tests", "admin_views", "unmanaged_models", "deprecation", "m2m_intermediary", "inline_formsets", "wsgi", "annotations", "middleware_exceptions", "constraints", "i18n", "user_commands", "model_package", "httpwrappers", "middleware", "admin_custom_urls", "check_framework", "m2m_through_regress", "known_related_objects", "aggregation", "model_fields", "test_client", "messages_tests", "apps", "select_related_regress", "validators", "admin_docs", "admin_checks", "flatpages_tests", "nested_foreign_keys", "model_formsets", "staticfiles_tests", "indexes", "servers", "timezones", "decorators", "humanize_tests", "model_indexes", "files", "templates", "select_related", "datetimes", "sites_framework", "db_utils", "file_storage", "model_formsets_regress", "custom_managers", "context_processors", "backends", "mail", "test_runner", "proxy_model_inheritance", "validation", "base", "m2m_through", "many_to_one_null", "swappable_models", "migrate_signals", "__pycache__", "shell", "raw_query", "field_defaults", "settings_tests", "shortcuts", "many_to_one", "defer_regress", "multiple_database", "lookup", "test_exceptions", "admin_inlines", "import_error_package", "admin_changelist", "expressions", "responses", "requests", "datatypes", "one_to_one", "mutually_referential", "prefetch_related", "fixtures_model_package", "field_subclassing", "custom_migration_operations", "template_loader", "delete", "get_earliest_or_latest", "m2o_recursive", "bash_completion", "proxy_models", ".coveragerc", "properties", "save_delete_hooks", "admin_registration", "file_uploads", "extra_regress", "test_sqlite.py", "null_fk", "aggregation_regress", "generic_relations", "migrations2", "distinct_on_fields", "modeladmin", "null_queries", "model_inheritance_regress", "admin_utils", "expressions_case", "foreign_object", "handlers", "test_utils", "view_tests", "test_mongodb.py", "custom_lookups", "admin_ordering", "queries", "gis_tests", "update", "migrations", "generic_views", "or_lookups", "string_lookup", "version", "select_related_onetoone", "basic", "pagination", "signing", "model_options", "force_insert_update", "inspectdb", "update_only_fields", "sites_tests", "order_with_respect_to", "m2m_and_m2o", "admin_filters", "custom_columns", "auth_tests", "null_fk_ordering", "utils_tests", "app_loading", "m2m_recursive", "urlpatterns_reverse", "transactions", "urlpatterns", "many_to_many", "queryset_pickle", "admin_default_site", "dates", "delete_regress", "schema", "introspection", "template_backends", "model_inheritance", "model_meta", "str", "fixtures", "admin_widgets", "m2m_multiple", "from_db_value", "field_deconstruction", "generic_inline_admin", "migration_test_data_persistence", "choices", "reverse_lookup", "no_models", "db_typecasts", "urls.py", "absolute_url_overrides", "get_object_or_404", "requirements", "custom_methods", "test_runner_apps", "ordering", "sessions_tests", "template_tests", "signals", "expressions_window", "empty", "get_or_create", "defer", "max_lengths", "sitemaps_tests", "filtered_relation", "redirects_tests", "serializers", "dbshell", "postgres_tests", "admin_autodiscover", "syndication_tests", "managers_regress"], "failing_tests": [".coveragerc", "gis_tests", "i18n", "import_error_package", "runtests.py", "sites_tests", "test_mongodb.py", "test_sqlite.py", "urls.py"]}}} \ No newline at end of file diff --git a/tests/django_tests/results/tests_list.json.bak b/tests/django_tests/results/tests_list.json.bak new file mode 100644 index 00000000..3e0a2a42 --- /dev/null +++ b/tests/django_tests/results/tests_list.json.bak @@ -0,0 +1 @@ +{"v21": {"mongodb": {"all_tests": ["m2m_signals", "reserved_names", "builtin_server", "dispatch", "signed_cookies_tests", "test_client_regress", "csrf_tests", "invalid_models_tests", "m2m_regress", "project_template", "model_regress", "conditional_processing", "contenttypes_tests", "admin_scripts", "runtests.py", "db_functions", "bulk_create", "custom_pk", "select_for_update", "model_forms", "logging_tests", "admin_views", "unmanaged_models", "deprecation", "m2m_intermediary", "inline_formsets", "wsgi", "annotations", "middleware_exceptions", "i18n", "user_commands", "model_package", "httpwrappers", "middleware", "admin_custom_urls", "check_framework", "m2m_through_regress", "known_related_objects", "aggregation", "model_fields", "test_client", "messages_tests", "apps", "select_related_regress", "validators", "admin_docs", "admin_checks", "flatpages_tests", "nested_foreign_keys", "model_formsets", "staticfiles_tests", "indexes", "servers", "timezones", "decorators", "humanize_tests", "model_indexes", "files", "templates", "select_related", "datetimes", "sites_framework", "db_utils", "file_storage", "model_formsets_regress", "custom_managers", "context_processors", "backends", "mail", "test_runner", "proxy_model_inheritance", "validation", "base", "m2m_through", "many_to_one_null", "swappable_models", "migrate_signals", "__pycache__", "shell", "raw_query", "field_defaults", "settings_tests", "shortcuts", "many_to_one", "defer_regress", "multiple_database", "lookup", "test_exceptions", "admin_inlines", "import_error_package", "admin_changelist", "expressions", "responses", "requests", "datatypes", "one_to_one", "mutually_referential", "prefetch_related", "fixtures_model_package", "field_subclassing", "custom_migration_operations", "template_loader", "delete", "get_earliest_or_latest", "m2o_recursive", "bash_completion", "proxy_models", ".coveragerc", "properties", "save_delete_hooks", "admin_registration", "file_uploads", "extra_regress", "test_sqlite.py", "null_fk", "aggregation_regress", "generic_relations", "migrations2", "distinct_on_fields", "modeladmin", "null_queries", "model_inheritance_regress", "admin_utils", "expressions_case", "foreign_object", "handlers", "test_utils", "view_tests", "test_mongodb.py", "custom_lookups", "admin_ordering", "queries", "gis_tests", "update", "migrations", "generic_views", "or_lookups", "string_lookup", "version", "select_related_onetoone", "basic", "pagination", "signing", "model_options", "force_insert_update", "inspectdb", "update_only_fields", "sites_tests", "order_with_respect_to", "m2m_and_m2o", "admin_filters", "custom_columns", "auth_tests", "null_fk_ordering", "utils_tests", "app_loading", "m2m_recursive", "urlpatterns_reverse", "transactions", "urlpatterns", "many_to_many", "queryset_pickle", "admin_default_site", "dates", "delete_regress", "schema", "introspection", "template_backends", "model_inheritance", "model_meta", "str", "fixtures", "admin_widgets", "m2m_multiple", "from_db_value", "field_deconstruction", "generic_inline_admin", "migration_test_data_persistence", "choices", "reverse_lookup", "no_models", "db_typecasts", "urls.py", "absolute_url_overrides", "get_object_or_404", "requirements", "custom_methods", "test_runner_apps", "ordering", "sessions_tests", "template_tests", "signals", "expressions_window", "empty", "get_or_create", "defer", "max_lengths", "sitemaps_tests", "filtered_relation", "redirects_tests", "serializers", "dbshell", "postgres_tests", "admin_autodiscover", "syndication_tests", "managers_regress"], "failing_tests": [".coveragerc", "admin_changelist", "admin_checks", "admin_filters", "admin_inlines", "admin_ordering", "admin_utils", "admin_views", "aggregation", "aggregation_regress", "annotations", "auth_tests", "backends", "basic", "bulk_create", "contenttypes_tests", "custom_columns", "custom_lookups", "custom_managers", "custom_methods", "custom_pk", "dates", "datetimes", "db_functions", "defer", "delete", "delete_regress", "expressions", "expressions_case", "extra_regress", "file_storage", "filtered_relation", "fixtures", "force_insert_update", "foreign_object", "generic_relations", "generic_views", "get_or_create", "gis_tests", "httpwrappers", "import_error_package", "inspectdb", "introspection", "lookup", "m2m_through_regress", "many_to_many", "many_to_one", "migrations", "model_fields", "model_forms", "model_formsets", "model_inheritance", "model_inheritance_regress", "model_regress", "modeladmin", "multiple_database", "null_queries", "one_to_one", "or_lookups", "order_with_respect_to", "ordering", "prefetch_related", "proxy_models", "queries", "queryset_pickle", "raw_query", "reserved_names", "runtests.py", "schema", "select_related", "select_related_onetoone", "select_related_regress", "serializers", "servers", "sitemaps_tests", "syndication_tests", "test_client_regress", "test_mongodb.py", "test_runner", "test_sqlite.py", "test_utils", "timezones", "transactions", "update", "urls.py", "utils_tests", "validation", "view_tests"]}}, "v22": {"mongodb": {"all_tests": ["m2m_signals", "reserved_names", "builtin_server", "dispatch", "signed_cookies_tests", "test_client_regress", "csrf_tests", "invalid_models_tests", "m2m_regress", "project_template", "model_regress", "conditional_processing", "contenttypes_tests", "admin_scripts", "runtests.py", "db_functions", "bulk_create", "custom_pk", "select_for_update", "model_forms", "logging_tests", "admin_views", "unmanaged_models", "deprecation", "m2m_intermediary", "inline_formsets", "wsgi", "annotations", "middleware_exceptions", "constraints", "i18n", "user_commands", "model_package", "httpwrappers", "middleware", "admin_custom_urls", "check_framework", "m2m_through_regress", "known_related_objects", "aggregation", "model_fields", "test_client", "messages_tests", "apps", "select_related_regress", "validators", "admin_docs", "admin_checks", "flatpages_tests", "nested_foreign_keys", "model_formsets", "staticfiles_tests", "indexes", "servers", "timezones", "decorators", "humanize_tests", "model_indexes", "files", "templates", "select_related", "datetimes", "sites_framework", "db_utils", "file_storage", "model_formsets_regress", "custom_managers", "context_processors", "backends", "mail", "test_runner", "proxy_model_inheritance", "validation", "base", "m2m_through", "many_to_one_null", "swappable_models", "migrate_signals", "__pycache__", "shell", "raw_query", "field_defaults", "settings_tests", "shortcuts", "many_to_one", "defer_regress", "multiple_database", "lookup", "test_exceptions", "admin_inlines", "import_error_package", "admin_changelist", "expressions", "responses", "requests", "datatypes", "one_to_one", "mutually_referential", "prefetch_related", "fixtures_model_package", "field_subclassing", "custom_migration_operations", "template_loader", "delete", "get_earliest_or_latest", "m2o_recursive", "bash_completion", "proxy_models", ".coveragerc", "properties", "save_delete_hooks", "admin_registration", "file_uploads", "extra_regress", "test_sqlite.py", "null_fk", "aggregation_regress", "generic_relations", "migrations2", "distinct_on_fields", "modeladmin", "null_queries", "model_inheritance_regress", "admin_utils", "expressions_case", "foreign_object", "handlers", "test_utils", "view_tests", "test_mongodb.py", "custom_lookups", "admin_ordering", "queries", "gis_tests", "update", "migrations", "generic_views", "or_lookups", "string_lookup", "version", "select_related_onetoone", "basic", "pagination", "signing", "model_options", "force_insert_update", "inspectdb", "update_only_fields", "sites_tests", "order_with_respect_to", "m2m_and_m2o", "admin_filters", "custom_columns", "auth_tests", "null_fk_ordering", "utils_tests", "app_loading", "m2m_recursive", "urlpatterns_reverse", "transactions", "urlpatterns", "many_to_many", "queryset_pickle", "admin_default_site", "dates", "delete_regress", "schema", "introspection", "template_backends", "model_inheritance", "model_meta", "str", "fixtures", "admin_widgets", "m2m_multiple", "from_db_value", "field_deconstruction", "generic_inline_admin", "migration_test_data_persistence", "choices", "reverse_lookup", "no_models", "db_typecasts", "urls.py", "absolute_url_overrides", "get_object_or_404", "requirements", "custom_methods", "test_runner_apps", "ordering", "sessions_tests", "template_tests", "signals", "expressions_window", "empty", "get_or_create", "defer", "max_lengths", "sitemaps_tests", "filtered_relation", "redirects_tests", "serializers", "dbshell", "postgres_tests", "admin_autodiscover", "syndication_tests", "managers_regress"], "failing_tests": [".coveragerc", "admin_changelist", "admin_filters", "admin_ordering", "admin_utils", "admin_views", "aggregation", "aggregation_regress", "annotations", "auth_tests", "backends", "basic", "bulk_create", "constraints", "contenttypes_tests", "custom_columns", "custom_lookups", "custom_managers", "custom_methods", "custom_pk", "dates", "datetimes", "db_functions", "defer", "delete", "delete_regress", "expressions", "expressions_case", "extra_regress", "filtered_relation", "fixtures", "force_insert_update", "foreign_object", "generic_relations", "generic_views", "get_or_create", "gis_tests", "i18n", "import_error_package", "indexes", "inspectdb", "introspection", "lookup", "m2m_through", "m2m_through_regress", "many_to_many", "many_to_one", "migrations", "model_fields", "model_forms", "model_formsets", "model_inheritance", "model_inheritance_regress", "model_regress", "multiple_database", "null_queries", "one_to_one", "or_lookups", "order_with_respect_to", "ordering", "prefetch_related", "proxy_models", "queries", "queryset_pickle", "raw_query", "reserved_names", "runtests.py", "schema", "select_related", "select_related_onetoone", "select_related_regress", "serializers", "servers", "sessions_tests", "sitemaps_tests", "syndication_tests", "test_mongodb.py", "test_runner", "test_runner_apps", "test_sqlite.py", "test_utils", "timezones", "transactions", "update", "urls.py", "validation", "view_tests"]}}} \ No newline at end of file diff --git a/tests/django_tests/runtests.py b/tests/django_tests/runtests.py new file mode 100644 index 00000000..ee5ba5a7 --- /dev/null +++ b/tests/django_tests/runtests.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python3 +import argparse +import json +import os +import sys +from itertools import chain +# from typing import Literal + +from test_utils import setup_tests + +ROOT_DIR = os.path.dirname(os.path.realpath(__file__)) +UTILS_DIR = os.path.join(ROOT_DIR, 'test_utils',) +TEST_REPO_DIR = os.path.join( + ROOT_DIR, + 'tests' +) +TEST_RESULTS_FILE = os.path.join(ROOT_DIR, 'results', 'test_list.json') + +TEST_VERSIONS = ('v21', 'v22', 'v30') +PY_VERSIONS = ('p36', 'p38') +DB_VERSIONS = ('sqlite', 'mongodb') + +# TEST_LITERAL = Literal['v21', 'v22', 'v30'] +# PY_LITERAL = Literal['p36', 'p38'] +# DB_LITERAL = Literal['sqlite', 'mongodb'] + +# +# class TestResult(TypedDict): +# passing: List[str] +# failing: List[str] +# +# class TestName(TypedDict): +# migrations: TestResult +# +# class DbVersions(TypedDict): +# sqlite: TestName +# mongodb: TestName +# +# +# class PyVersions(TypedDict): +# p36: DbVersions +# p38: DbVersions +# repo_tests: List[str] +# +# +# class TestVersions(TypedDict): +# v21: PyVersions +# v22: PyVersions +# v30: PyVersions + + +PARSER_ARGS = { + '--start-index': { + 'default': None, + 'type': int, + 'dest': 'start_index' + }, + '--django-version': { + 'default': 21, + 'type': int, + 'choices': [21, 22, 30] + }, + '--db-type': { + 'default': 'mongodb', + 'type': str, + 'choices': ['mongodb', 'sqlite'] + }, + '--check-currently-passing': { + 'action': 'store_true', + }, + '--discover-passing': { + 'action': 'store_true', + }, + '--discover-tests': { + 'action': 'store_true', + }, + '--check-specific': { + 'action': 'store_true', + }, +} + +check_tests = [ + 'bulk_create', + 'migrations', + 'inspectdb', + 'indexes', + 'dbshell', + 'db_utils', + 'db_typecasts', + 'db_functions', + 'datetimes', + 'dates', + 'datatypes', + 'aggregation'] + + +class TestManager: + + def __init__(self): + parser = argparse.ArgumentParser(parents=[setup_tests.get_parser()], add_help=False) + for option, arg in PARSER_ARGS.items(): + parser.add_argument(option, **arg) + parsed = self.parsed = parser.parse_args() + setup_tests.validate_parsed(parsed, parser) + + django_version = f'v{parsed.django_version}' + python_version = f'p{sys.version_info.major}{sys.version_info.minor}' + self.selected_test_dir = os.path.join( + TEST_REPO_DIR, + django_version, + 'tests' + ) + + sys.path.insert(0, UTILS_DIR) + sys.path.insert(0, self.selected_test_dir) + if parsed.db_type == 'mongodb': + os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.test_mongodb' + else: + os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.test_sqlite' + setup_tests.RUNTESTS_DIR = self.selected_test_dir + + self.test_list = self.load_test_list() + self.repo_tests_list = self.test_list[django_version]['repo_tests'] + self.result_list = self.test_list[django_version][python_version][parsed.db_type] + + def check_passing(self): + passing = self.result_list['passing'] + tests = [] + for test in passing.values(): + tests.extend(test) + + self.parsed.modules = tests + return self.check_specific() + + def discover_tests(self): + testlist = setup_tests.get_test_list(self.parsed) + testlist.sort() + self.repo_tests_list.extend(testlist) + + @staticmethod + def to_result_dict(test_result): + res_dict = {} + for test, trace in test_result: + _id = test.id() + name, _ = _id.split('.', 1) + try: + res_dict[name].append(_id) + except KeyError: + res_dict[name] = [_id] + for ids in res_dict.values(): + ids.sort() + return res_dict + + def discover_passing(self): + if not self.repo_tests_list: + self.discover_tests() + self.parsed.modules = self.parsed.modules or check_tests + result = setup_tests.test_exec(self.parsed) + res_dict = self.to_result_dict(chain(result.failures, + result.errors, + result.unexpectedSuccesses)) + self.result_list['failing'].update(res_dict) + res_dict = self.to_result_dict(result.passed) + self.result_list['passing'].update(res_dict) + + def check_specific(self): + result = setup_tests.test_exec(self.parsed) + if any(chain(result.failures, result.errors, result.unexpectedSuccesses)): + return -1 + else: + return 0 + + def run(self): + if self.parsed.discover_tests: + self.discover_tests() + self.store_test_list(self.test_list) + + if self.parsed.discover_passing: + self.discover_passing() + self.store_test_list(self.test_list) + + if self.parsed.check_currently_passing: + return self.check_passing() + + if self.parsed.check_specific: + return self.check_specific() + + @staticmethod + def store_test_list(test_data): + with open(TEST_RESULTS_FILE, 'w') as fp: + json.dump(test_data, fp, indent=3) + + @staticmethod + def load_test_list(): + try: + with open(TEST_RESULTS_FILE, 'r') as fp: + return json.load(fp) + except FileNotFoundError: + test_list = {} + for tv in TEST_VERSIONS: + test_list[tv] = {} + test_list[tv]['repo_tests'] = [] + for pv in PY_VERSIONS: + test_list[tv][pv] = {} + for dbv in DB_VERSIONS: + test_list[tv][pv][dbv] = {} + test_list[tv][pv][dbv]['passing'] = {} + test_list[tv][pv][dbv]['failing'] = {} + return test_list + + +if __name__ == '__main__': + tm = TestManager() + exit(tm.run()) diff --git a/tests/dummy_app/dummy/migrations/__init__.py b/tests/django_tests/test_utils/__init__.py similarity index 100% rename from tests/dummy_app/dummy/migrations/__init__.py rename to tests/django_tests/test_utils/__init__.py diff --git a/tests/dummy_app/dummy_app/__init__.py b/tests/django_tests/test_utils/settings/__init__.py similarity index 100% rename from tests/dummy_app/dummy_app/__init__.py rename to tests/django_tests/test_utils/settings/__init__.py diff --git a/tests/django_tests/test_utils/settings/test_mongodb.py b/tests/django_tests/test_utils/settings/test_mongodb.py new file mode 100644 index 00000000..b8ac050c --- /dev/null +++ b/tests/django_tests/test_utils/settings/test_mongodb.py @@ -0,0 +1,35 @@ +# This is an example test settings file for use with the Django test suite. +# +# The 'sqlite3' backend requires only the ENGINE setting (an in- +# memory database will be used). All other backends will require a +# NAME and potentially authentication information. See the +# following section in the docs for more information: +# +# https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/unit-tests/ +# +# The different databases that Django supports behave differently in certain +# situations, so it is recommended to run the test suite against as many +# database backends as possible. You may want to create a separate settings +# file for each of the backends you test against. +import sys + +DATABASES = { + 'default': { + 'ENGINE': 'djongo', + 'NAME': 'test1', + 'ENFORCE_SCHEMA': True, + }, + 'other': { + 'ENGINE': 'djongo', + 'NAME': 'test2', + 'ENFORCE_SCHEMA': True + } +} + +SECRET_KEY = "django_tests_secret_key" + +# Use a fast hasher to speed up tests. +PASSWORD_HASHERS = [ + 'django.contrib.auth.hashers.MD5PasswordHasher', +] + diff --git a/tests/django_tests/test_utils/settings/test_sqlite.py b/tests/django_tests/test_utils/settings/test_sqlite.py new file mode 100644 index 00000000..f1b65f7d --- /dev/null +++ b/tests/django_tests/test_utils/settings/test_sqlite.py @@ -0,0 +1,29 @@ +# This is an example test settings file for use with the Django test suite. +# +# The 'sqlite3' backend requires only the ENGINE setting (an in- +# memory database will be used). All other backends will require a +# NAME and potentially authentication information. See the +# following section in the docs for more information: +# +# https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/unit-tests/ +# +# The different databases that Django supports behave differently in certain +# situations, so it is recommended to run the test suite against as many +# database backends as possible. You may want to create a separate settings +# file for each of the backends you test against. + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + }, + 'other': { + 'ENGINE': 'django.db.backends.sqlite3', + } +} + +SECRET_KEY = "django_tests_secret_key" + +# Use a fast hasher to speed up tests. +PASSWORD_HASHERS = [ + 'django.contrib.auth.hashers.MD5PasswordHasher', +] diff --git a/tests/django_tests/test_utils/setup_tests.py b/tests/django_tests/test_utils/setup_tests.py new file mode 100644 index 00000000..d5d2cc9b --- /dev/null +++ b/tests/django_tests/test_utils/setup_tests.py @@ -0,0 +1,553 @@ +import argparse +import atexit +import copy +import os +import shutil +import socket +import subprocess +import sys +import tempfile +import warnings + +import django +from django.apps import apps +from django.conf import settings +from django.db import connection, connections +from django.test import TestCase, TransactionTestCase +from django.test.runner import default_test_processes +from django.test.selenium import SeleniumTestCaseBase +from django.test.utils import get_runner +from django.utils.deprecation import ( + RemovedInDjango30Warning, RemovedInDjango31Warning, +) +from django.utils.log import DEFAULT_LOGGING +from .test_runner import DiscoverRunner + +try: + import MySQLdb +except ImportError: + pass +else: + # Ignore informational warnings from QuerySet.explain(). + warnings.filterwarnings('ignore', r'\(1003, *', category=MySQLdb.Warning) + +# Make deprecation warnings errors to ensure no usage of deprecated features. +warnings.simplefilter("error", RemovedInDjango30Warning) +warnings.simplefilter('error', RemovedInDjango31Warning) +# Make runtime warning errors to ensure no usage of error prone patterns. +warnings.simplefilter("error", RuntimeWarning) +# Ignore known warnings in test dependencies. +warnings.filterwarnings("ignore", "'U' mode is deprecated", DeprecationWarning, module='docutils.io') + +RUNTESTS_DIR = os.path.abspath(os.path.dirname(__file__)) + +TEMPLATE_DIR = os.path.join(RUNTESTS_DIR, 'templates') + +# Create a specific subdirectory for the duration of the test suite. +TMPDIR = tempfile.mkdtemp(prefix='django_') +# Set the TMPDIR environment variable in addition to tempfile.tempdir +# so that children processes inherit it. +tempfile.tempdir = os.environ['TMPDIR'] = TMPDIR + +# Removing the temporary TMPDIR. +atexit.register(shutil.rmtree, TMPDIR) + + +SUBDIRS_TO_SKIP = [ + 'data', + 'import_error_package', + 'test_runner_apps', +] + +ALWAYS_INSTALLED_APPS = [ + 'django.contrib.contenttypes', + 'django.contrib.auth', + 'django.contrib.sites', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.admin.apps.SimpleAdminConfig', + 'django.contrib.staticfiles', +] + +ALWAYS_MIDDLEWARE = [ + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', +] + +# Need to add the associated contrib app to INSTALLED_APPS in some cases to +# avoid "RuntimeError: Model class X doesn't declare an explicit app_label +# and isn't in an application in INSTALLED_APPS." +CONTRIB_TESTS_TO_APPS = { + 'flatpages_tests': 'django.contrib.flatpages', + 'redirects_tests': 'django.contrib.redirects', +} + + +def get_test_modules(): + modules = [] + discovery_paths = [(None, RUNTESTS_DIR)] + if connection.features.gis_enabled: + # GIS tests are in nested apps + discovery_paths.append(('gis_tests', os.path.join(RUNTESTS_DIR, 'gis_tests'))) + else: + SUBDIRS_TO_SKIP.append('gis_tests') + + for modpath, dirpath in discovery_paths: + for f in os.scandir(dirpath): + if ('.' not in f.name and + os.path.basename(f.name) not in SUBDIRS_TO_SKIP and + not f.is_file() and + os.path.exists(os.path.join(f.path, '__init__.py'))): + modules.append((modpath, f.name)) + return modules + + +def get_installed(): + return [app_config.name for app_config in apps.get_app_configs()] + + +def setup(verbosity, test_labels, parallel): + # Reduce the given test labels to just the app module path. + test_labels_set = set() + for label in test_labels: + bits = label.split('.')[:1] + test_labels_set.add('.'.join(bits)) + + if verbosity >= 1: + msg = "Testing against Django installed in '%s'" % os.path.dirname(django.__file__) + max_parallel = default_test_processes() if parallel == 0 else parallel + if max_parallel > 1: + msg += " with up to %d processes" % max_parallel + print(msg) + + # Force declaring available_apps in TransactionTestCase for faster tests. + def no_available_apps(self): + raise Exception("Please define available_apps in TransactionTestCase " + "and its subclasses.") + TransactionTestCase.available_apps = property(no_available_apps) + TestCase.available_apps = None + + state = { + 'INSTALLED_APPS': settings.INSTALLED_APPS, + 'ROOT_URLCONF': getattr(settings, "ROOT_URLCONF", ""), + 'TEMPLATES': settings.TEMPLATES, + 'LANGUAGE_CODE': settings.LANGUAGE_CODE, + 'STATIC_URL': settings.STATIC_URL, + 'STATIC_ROOT': settings.STATIC_ROOT, + 'MIDDLEWARE': settings.MIDDLEWARE, + 'TEST_RUNNER': settings.TEST_RUNNER + } + + # Redirect some settings for the duration of these tests. + settings.INSTALLED_APPS = ALWAYS_INSTALLED_APPS + settings.ROOT_URLCONF = 'urls' + settings.STATIC_URL = '/static/' + settings.STATIC_ROOT = os.path.join(TMPDIR, 'static') + settings.TEMPLATES = [{ + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [TEMPLATE_DIR], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }] + settings.LANGUAGE_CODE = 'en' + settings.SITE_ID = 1 + settings.MIDDLEWARE = ALWAYS_MIDDLEWARE + settings.MIGRATION_MODULES = { + # This lets us skip creating migrations for the test models as many of + # them depend on one of the following contrib applications. + 'auth': None, + 'contenttypes': None, + 'sessions': None, + } + log_config = copy.deepcopy(DEFAULT_LOGGING) + # Filter out non-error logging so we don't have to capture it in lots of + # tests. + log_config['loggers']['django']['level'] = 'ERROR' + settings.LOGGING = log_config + settings.SILENCED_SYSTEM_CHECKS = [ + 'fields.W342', # ForeignKey(unique=True) -> OneToOneField + ] + settings.TEST_RUNNER = 'test_utils.test_runner.DiscoverRunner' + # Load all the ALWAYS_INSTALLED_APPS. + django.setup() + + # It would be nice to put this validation earlier but it must come after + # django.setup() so that connection.features.gis_enabled can be accessed + # without raising AppRegistryNotReady when running gis_tests in isolation + # on some backends (e.g. PostGIS). + if 'gis_tests' in test_labels_set and not connection.features.gis_enabled: + print('Aborting: A GIS database backend is required to run gis_tests.') + sys.exit(1) + + # Load all the test model apps. + test_modules = get_test_modules() + + installed_app_names = set(get_installed()) + for modpath, module_name in test_modules: + if modpath: + module_label = modpath + '.' + module_name + else: + module_label = module_name + # if the module (or an ancestor) was named on the command line, or + # no modules were named (i.e., run all), import + # this module and add it to INSTALLED_APPS. + module_found_in_labels = not test_labels or any( + # exact match or ancestor match + module_label == label or module_label.startswith(label + '.') + for label in test_labels_set + ) + + if module_name in CONTRIB_TESTS_TO_APPS and module_found_in_labels: + settings.INSTALLED_APPS.append(CONTRIB_TESTS_TO_APPS[module_name]) + + if module_found_in_labels and module_label not in installed_app_names: + if verbosity >= 2: + print("Importing application %s" % module_name) + settings.INSTALLED_APPS.append(module_label) + + # Add contrib.gis to INSTALLED_APPS if needed (rather than requiring + # @override_settings(INSTALLED_APPS=...) on all test cases. + gis = 'django.contrib.gis' + if connection.features.gis_enabled and gis not in settings.INSTALLED_APPS: + if verbosity >= 2: + print("Importing application %s" % gis) + settings.INSTALLED_APPS.append(gis) + + apps.set_installed_apps(settings.INSTALLED_APPS) + + return state + + +def teardown(state): + # Restore the old settings. + for key, value in state.items(): + setattr(settings, key, value) + # Discard the multiprocessing.util finalizer that tries to remove a + # temporary directory that's already removed by this script's + # atexit.register(shutil.rmtree, TMPDIR) handler. Prevents + # FileNotFoundError at the end of a test run on Python 3.6+ (#27890). + from multiprocessing.util import _finalizer_registry + _finalizer_registry.pop((-100, 0), None) + + +def actual_test_processes(parallel): + if parallel == 0: + # This doesn't work before django.setup() on some databases. + if all(conn.features.can_clone_databases for conn in connections.all()): + return default_test_processes() + else: + return 1 + else: + return parallel + + +class ActionSelenium(argparse.Action): + """ + Validate the comma-separated list of requested browsers. + """ + def __call__(self, parser, namespace, values, option_string=None): + browsers = values.split(',') + for browser in browsers: + try: + SeleniumTestCaseBase.import_webdriver(browser) + except ImportError: + raise argparse.ArgumentError(self, "Selenium browser specification '%s' is not valid." % browser) + setattr(namespace, self.dest, browsers) + + +def get_test_list(options): + state = setup(options.verbosity, options.modules, options.parallel) + + runner = make_test_runner( + verbosity=options.verbosity, + interactive=options.interactive, + failfast=options.failfast, + keepdb=options.keepdb, + reverse=options.reverse, + debug_sql=options.debug_sql, + parallel=options.parallel, + tags=options.tags, + exclude_tags=options.exclude_tags + ) + suits = runner.build_suite() + testlist = [] + for suit in suits: + for test in suit: + testlist.append(test.id()) + teardown(state) + return testlist + + +def make_test_runner(verbosity, interactive, failfast, keepdb, reverse, + debug_sql, parallel, tags, exclude_tags): + if not hasattr(settings, 'TEST_RUNNER'): + settings.TEST_RUNNER = 'django.test.runner.DiscoverRunner' + TestRunner = get_runner(settings) + + test_runner = TestRunner( + verbosity=verbosity, + interactive=interactive, + failfast=failfast, + keepdb=keepdb, + reverse=reverse, + debug_sql=debug_sql, + parallel=actual_test_processes(parallel), + tags=tags, + exclude_tags=exclude_tags, + ) + return test_runner + + +def django_tests(verbosity, interactive, failfast, keepdb, reverse, + test_labels, debug_sql, parallel, tags, exclude_tags): + state = setup(verbosity, test_labels, parallel) + extra_tests = [] + + # Run the test suite, including the extra validation tests. + if not hasattr(settings, 'TEST_RUNNER'): + settings.TEST_RUNNER = 'django.test.runner.DiscoverRunner' + + test_runner = make_test_runner( + verbosity=verbosity, + interactive=interactive, + failfast=failfast, + keepdb=keepdb, + reverse=reverse, + debug_sql=debug_sql, + parallel=parallel, + tags=tags, + exclude_tags=exclude_tags + ) + + result = test_runner.run_tests( + test_labels or get_installed(), + extra_tests=extra_tests, + ) + teardown(state) + return result + + +def get_subprocess_args(options): + subprocess_args = [ + sys.executable, __file__, '--settings=%s' % options.settings + ] + if options.failfast: + subprocess_args.append('--failfast') + if options.verbosity: + subprocess_args.append('--verbosity=%s' % options.verbosity) + if not options.interactive: + subprocess_args.append('--noinput') + if options.tags: + subprocess_args.append('--tag=%s' % options.tags) + if options.exclude_tags: + subprocess_args.append('--exclude_tag=%s' % options.exclude_tags) + return subprocess_args + + +def bisect_tests(bisection_label, options, test_labels, parallel): + state = setup(options.verbosity, test_labels, parallel) + + test_labels = test_labels or get_installed() + + print('***** Bisecting test suite: %s' % ' '.join(test_labels)) + + # Make sure the bisection point isn't in the test list + # Also remove tests that need to be run in specific combinations + for label in [bisection_label, 'model_inheritance_same_model_name']: + try: + test_labels.remove(label) + except ValueError: + pass + + subprocess_args = get_subprocess_args(options) + + iteration = 1 + while len(test_labels) > 1: + midpoint = len(test_labels) // 2 + test_labels_a = test_labels[:midpoint] + [bisection_label] + test_labels_b = test_labels[midpoint:] + [bisection_label] + print('***** Pass %da: Running the first half of the test suite' % iteration) + print('***** Test labels: %s' % ' '.join(test_labels_a)) + failures_a = subprocess.call(subprocess_args + test_labels_a) + + print('***** Pass %db: Running the second half of the test suite' % iteration) + print('***** Test labels: %s' % ' '.join(test_labels_b)) + print('') + failures_b = subprocess.call(subprocess_args + test_labels_b) + + if failures_a and not failures_b: + print("***** Problem found in first half. Bisecting again...") + iteration += 1 + test_labels = test_labels_a[:-1] + elif failures_b and not failures_a: + print("***** Problem found in second half. Bisecting again...") + iteration += 1 + test_labels = test_labels_b[:-1] + elif failures_a and failures_b: + print("***** Multiple sources of failure found") + break + else: + print("***** No source of failure found... try pair execution (--pair)") + break + + if len(test_labels) == 1: + print("***** Source of error: %s" % test_labels[0]) + teardown(state) + + +def paired_tests(paired_test, options, test_labels, parallel): + state = setup(options.verbosity, test_labels, parallel) + + test_labels = test_labels or get_installed() + + print('***** Trying paired execution') + + # Make sure the constant member of the pair isn't in the test list + # Also remove tests that need to be run in specific combinations + for label in [paired_test, 'model_inheritance_same_model_name']: + try: + test_labels.remove(label) + except ValueError: + pass + + subprocess_args = get_subprocess_args(options) + + for i, label in enumerate(test_labels): + print('***** %d of %d: Check test pairing with %s' % ( + i + 1, len(test_labels), label)) + failures = subprocess.call(subprocess_args + [label, paired_test]) + if failures: + print('***** Found problem pair with %s' % label) + return + + print('***** No problem pair found') + teardown(state) + + +def get_parser(): + parser = argparse.ArgumentParser(description="Run the Django test suite.") + parser.add_argument( + 'modules', nargs='*', metavar='module', + help='Optional path(s) to test modules; e.g. "i18n" or ' + '"i18n.tests.TranslationTests.test_lazy_objects".', + ) + parser.add_argument( + '-v', '--verbosity', default=1, type=int, choices=[0, 1, 2, 3], + help='Verbosity level; 0=minimal output, 1=normal output, 2=all output', + ) + parser.add_argument( + '--noinput', action='store_false', dest='interactive', + help='Tells Django to NOT prompt the user for input of any kind.', + ) + parser.add_argument( + '--failfast', action='store_true', + help='Tells Django to stop running the test suite after first failed test.', + ) + parser.add_argument( + '-k', '--keepdb', action='store_true', + help='Tells Django to preserve the test database between runs.', + ) + parser.add_argument( + '--settings', + help='Python path to settings module, e.g. "myproject.settings". If ' + 'this isn\'t provided, either the DJANGO_SETTINGS_MODULE ' + 'environment variable or "test_sqlite" will be used.', + ) + parser.add_argument( + '--bisect', + help='Bisect the test suite to discover a test that causes a test ' + 'failure when combined with the named test.', + ) + parser.add_argument( + '--pair', + help='Run the test suite in pairs with the named test to find problem pairs.', + ) + parser.add_argument( + '--reverse', action='store_true', + help='Sort test suites and test cases in opposite order to debug ' + 'test side effects not apparent with normal execution lineup.', + ) + parser.add_argument( + '--selenium', action=ActionSelenium, metavar='BROWSERS', + help='A comma-separated list of browsers to run the Selenium tests against.', + ) + parser.add_argument( + '--selenium-hub', + help='A URL for a selenium hub instance to use in combination with --selenium.', + ) + parser.add_argument( + '--external-host', default=socket.gethostname(), + help='The external host that can be reached by the selenium hub instance when running Selenium ' + 'tests via Selenium Hub.', + ) + parser.add_argument( + '--debug-sql', action='store_true', + help='Turn on the SQL query logger within tests.', + ) + parser.add_argument( + '--parallel', nargs='?', default=0, type=int, + const=default_test_processes(), metavar='N', + help='Run tests using up to N parallel processes.', + ) + parser.add_argument( + '--tag', dest='tags', action='append', + help='Run only tests with the specified tags. Can be used multiple times.', + ) + parser.add_argument( + '--exclude-tag', dest='exclude_tags', action='append', + help='Do not run tests with the specified tag. Can be used multiple times.', + ) + return parser + + +def validate_parsed(options, parser): + using_selenium_hub = options.selenium and options.selenium_hub + if options.selenium_hub and not options.selenium: + parser.error('--selenium-hub and --external-host require --selenium to be used.') + if using_selenium_hub and not options.external_host: + parser.error('--selenium-hub and --external-host must be used together.') + + +def test_exec(options): + + # Allow including a trailing slash on app_labels for tab completion convenience + options.modules = [os.path.normpath(labels) for labels in options.modules] + + if options.settings: + os.environ['DJANGO_SETTINGS_MODULE'] = options.settings + else: + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_sqlite') + options.settings = os.environ['DJANGO_SETTINGS_MODULE'] + + if options.selenium: + if not options.tags: + options.tags = ['selenium'] + elif 'selenium' not in options.tags: + options.tags.append('selenium') + if options.selenium_hub: + SeleniumTestCaseBase.selenium_hub = options.selenium_hub + SeleniumTestCaseBase.external_host = options.external_host + SeleniumTestCaseBase.browsers = options.selenium + + if options.bisect: + bisect_tests(options.bisect, options, options.modules, options.parallel) + elif options.pair: + paired_tests(options.pair, options, options.modules, options.parallel) + else: + result = django_tests( + options.verbosity, options.interactive, options.failfast, + options.keepdb, options.reverse, options.modules, + options.debug_sql, options.parallel, options.tags, + options.exclude_tags, + ) + return result diff --git a/tests/django_tests/test_utils/test_runner.py b/tests/django_tests/test_utils/test_runner.py new file mode 100644 index 00000000..6bb5142a --- /dev/null +++ b/tests/django_tests/test_utils/test_runner.py @@ -0,0 +1,114 @@ +import sys +from logging import getLogger, DEBUG, INFO, StreamHandler +from unittest.case import TestCase +from unittest.runner import ( + TextTestResult as BaseTextTestResult, + TextTestRunner) + +from django.test.runner import ( + DiscoverRunner as BaseDiscoverRunner, + ParallelTestSuite as ParallelSuite, + RemoteTestRunner as RemoteRunner, + RemoteTestResult as RemoteResult) + + +class TextTestResult(BaseTextTestResult): + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.passed = [] + self.handler = StreamHandler(sys.stdout) + self.stopped = False + + def addSuccess(self, test: TestCase): + super().addSuccess(test) + self.stream.writeln('## Ending Test ##') + self.passed.append((test, '')) + logger = getLogger('djongo') + logger.setLevel(INFO) + + def startTest(self, test): + self.stream.writeln('## Starting Test ##') + super().startTest(test) + logger = getLogger('djongo') + logger.setLevel(INFO) + if logger.hasHandlers(): + logger.removeHandler(self.handler) + self.handler = StreamHandler(sys.stdout) + logger.addHandler(self.handler) + + def stopTest(self, test): + super().stopTest(test) + + def addError(self, test, err): + self.errors.append((test, '')) + self.stream.writeln("ERROR") + self.stream.writeln('## Ending Test ##') + + def addSubTest(self, test, subtest, err): + if err is not None: + self.errors.append((test, '')) + + +class RemoteTestResult(RemoteResult): + def addSubTest(self, test, subtest, err): + if err is not None: + self.events.append(('addSubTest', self.test_index, object(), object())) + + def addError(self, test, err): + self.events.append(('addError', self.test_index, '')) + + +class RemoteTestRunner(RemoteRunner): + resultclass = RemoteTestResult + + +class ParallelTestSuite(ParallelSuite): + runner_class = RemoteTestRunner + + +class TextTestRunnerFactory: + + def __init__(self, + buffer=False, + result_class=TextTestResult): + + self.buffer = buffer + self.result_class = result_class + + def __call__(self, *args, **kwargs): + kwargs['resultclass'] = self.result_class + return TextTestRunner(buffer=self.buffer, + *args, + **kwargs) + +TestRunner = TextTestRunnerFactory() + + +class DiscoverRunner(BaseDiscoverRunner): + test_runner = TestRunner + parallel_test_suite = ParallelTestSuite + + def run_tests(self, test_labels, extra_tests=None, **kwargs): + self.setup_test_environment() + suite = self.build_suite(test_labels, extra_tests) + databases = self.get_databases(suite) + old_config = self.setup_databases(aliases=databases) + run_failed = False + result = None + try: + self.run_checks() + result = self.run_suite(suite) + except Exception: + run_failed = True + raise + finally: + try: + self.teardown_databases(old_config) + self.teardown_test_environment() + except Exception: + # Silence teardown exceptions if an exception was raised during + # runs to avoid shadowing it. + if not run_failed: + raise + return result diff --git a/tests/django_tests/tests/.gitignore b/tests/django_tests/tests/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/.gitignore b/tests/django_tests/tests/v21/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/.coveragerc b/tests/django_tests/tests/v21/tests/.coveragerc new file mode 100644 index 00000000..e519f062 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/.coveragerc @@ -0,0 +1,14 @@ +[run] +branch = True +omit = + */django/utils/autoreload.py +source = django + +[report] +ignore_errors = True +omit = + */django/conf/locale/* + */tests/* + +[html] +directory = coverage_html diff --git a/tests/django_tests/tests/v21/tests/README.rst b/tests/django_tests/tests/v21/tests/README.rst new file mode 100644 index 00000000..7f64afe6 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/README.rst @@ -0,0 +1,10 @@ +To run the test suite, first, create and activate a virtual environment. Then +install some requirements and run the tests:: + + $ cd tests + $ pip install -e .. + $ pip install -r requirements/py3.txt + $ ./runtests.py + +For more information about the test suite, see +https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/unit-tests/. diff --git a/tests/django_tests/tests/v21/tests/absolute_url_overrides/__init__.py b/tests/django_tests/tests/v21/tests/absolute_url_overrides/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/absolute_url_overrides/tests.py b/tests/django_tests/tests/v21/tests/absolute_url_overrides/tests.py new file mode 100644 index 00000000..68792830 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/absolute_url_overrides/tests.py @@ -0,0 +1,58 @@ +from django.db import models +from django.test import SimpleTestCase +from django.test.utils import isolate_apps + + +@isolate_apps('absolute_url_overrides') +class AbsoluteUrlOverrideTests(SimpleTestCase): + + def test_get_absolute_url(self): + """ + get_absolute_url() functions as a normal method. + """ + def get_absolute_url(o): + return '/test-a/%s/' % o.pk + TestA = self._create_model_class('TestA', get_absolute_url) + + self.assertTrue(hasattr(TestA, 'get_absolute_url')) + obj = TestA(pk=1, name='Foo') + self.assertEqual('/test-a/%s/' % obj.pk, obj.get_absolute_url()) + + def test_override_get_absolute_url(self): + """ + ABSOLUTE_URL_OVERRIDES should override get_absolute_url(). + """ + def get_absolute_url(o): + return '/test-b/%s/' % o.pk + with self.settings( + ABSOLUTE_URL_OVERRIDES={ + 'absolute_url_overrides.testb': lambda o: '/overridden-test-b/%s/' % o.pk, + }, + ): + TestB = self._create_model_class('TestB', get_absolute_url) + obj = TestB(pk=1, name='Foo') + self.assertEqual('/overridden-test-b/%s/' % obj.pk, obj.get_absolute_url()) + + def test_insert_get_absolute_url(self): + """ + ABSOLUTE_URL_OVERRIDES should work even if the model doesn't have a + get_absolute_url() method. + """ + with self.settings( + ABSOLUTE_URL_OVERRIDES={ + 'absolute_url_overrides.testc': lambda o: '/test-c/%s/' % o.pk, + }, + ): + TestC = self._create_model_class('TestC') + obj = TestC(pk=1, name='Foo') + self.assertEqual('/test-c/%s/' % obj.pk, obj.get_absolute_url()) + + def _create_model_class(self, class_name, get_absolute_url_method=None): + attrs = { + 'name': models.CharField(max_length=50), + '__module__': 'absolute_url_overrides', + } + if get_absolute_url_method: + attrs['get_absolute_url'] = get_absolute_url_method + + return type(class_name, (models.Model,), attrs) diff --git a/tests/django_tests/tests/v21/tests/admin_autodiscover/__init__.py b/tests/django_tests/tests/v21/tests/admin_autodiscover/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/admin_autodiscover/admin.py b/tests/django_tests/tests/v21/tests/admin_autodiscover/admin.py new file mode 100644 index 00000000..e2b941ac --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_autodiscover/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin + +from .models import Story + +admin.site.register(Story) +raise Exception("Bad admin module") diff --git a/tests/django_tests/tests/v21/tests/admin_autodiscover/models.py b/tests/django_tests/tests/v21/tests/admin_autodiscover/models.py new file mode 100644 index 00000000..a093db4b --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_autodiscover/models.py @@ -0,0 +1,5 @@ +from django.db import models + + +class Story(models.Model): + title = models.CharField(max_length=10) diff --git a/tests/django_tests/tests/v21/tests/admin_autodiscover/tests.py b/tests/django_tests/tests/v21/tests/admin_autodiscover/tests.py new file mode 100644 index 00000000..af5aebcd --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_autodiscover/tests.py @@ -0,0 +1,21 @@ +from unittest import TestCase + +from django.contrib import admin + + +class AdminAutoDiscoverTests(TestCase): + """ + Test for bug #8245 - don't raise an AlreadyRegistered exception when using + autodiscover() and an admin.py module contains an error. + """ + def test_double_call_autodiscover(self): + # The first time autodiscover is called, we should get our real error. + with self.assertRaises(Exception) as cm: + admin.autodiscover() + self.assertEqual(str(cm.exception), "Bad admin module") + + # Calling autodiscover again should raise the very same error it did + # the first time, not an AlreadyRegistered error. + with self.assertRaises(Exception) as cm: + admin.autodiscover() + self.assertEqual(str(cm.exception), "Bad admin module") diff --git a/tests/django_tests/tests/v21/tests/admin_changelist/__init__.py b/tests/django_tests/tests/v21/tests/admin_changelist/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/admin_changelist/admin.py b/tests/django_tests/tests/v21/tests/admin_changelist/admin.py new file mode 100644 index 00000000..1e686bd6 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_changelist/admin.py @@ -0,0 +1,149 @@ +from django.contrib import admin +from django.contrib.auth.admin import UserAdmin +from django.contrib.auth.models import User +from django.core.paginator import Paginator + +from .models import Child, Event, Parent, Swallow + +site = admin.AdminSite(name="admin") + +site.register(User, UserAdmin) + + +class CustomPaginator(Paginator): + def __init__(self, queryset, page_size, orphans=0, allow_empty_first_page=True): + super().__init__(queryset, 5, orphans=2, allow_empty_first_page=allow_empty_first_page) + + +class EventAdmin(admin.ModelAdmin): + date_hierarchy = 'date' + list_display = ['event_date_func'] + + def event_date_func(self, event): + return event.date + + def has_add_permission(self, request): + return False + + +site.register(Event, EventAdmin) + + +class ParentAdmin(admin.ModelAdmin): + list_filter = ['child__name'] + search_fields = ['child__name'] + + +class ChildAdmin(admin.ModelAdmin): + list_display = ['name', 'parent'] + list_per_page = 10 + list_filter = ['parent', 'age'] + + def get_queryset(self, request): + return super().get_queryset(request).select_related("parent") + + +class CustomPaginationAdmin(ChildAdmin): + paginator = CustomPaginator + + +class FilteredChildAdmin(admin.ModelAdmin): + list_display = ['name', 'parent'] + list_per_page = 10 + + def get_queryset(self, request): + return super().get_queryset(request).filter(name__contains='filtered') + + +class BandAdmin(admin.ModelAdmin): + list_filter = ['genres'] + + +class GroupAdmin(admin.ModelAdmin): + list_filter = ['members'] + + +class ConcertAdmin(admin.ModelAdmin): + list_filter = ['group__members'] + search_fields = ['group__members__name'] + + +class QuartetAdmin(admin.ModelAdmin): + list_filter = ['members'] + + +class ChordsBandAdmin(admin.ModelAdmin): + list_filter = ['members'] + + +class InvitationAdmin(admin.ModelAdmin): + list_display = ('band', 'player') + list_select_related = ('player',) + + +class DynamicListDisplayChildAdmin(admin.ModelAdmin): + list_display = ('parent', 'name', 'age') + + def get_list_display(self, request): + my_list_display = super().get_list_display(request) + if request.user.username == 'noparents': + my_list_display = list(my_list_display) + my_list_display.remove('parent') + return my_list_display + + +class DynamicListDisplayLinksChildAdmin(admin.ModelAdmin): + list_display = ('parent', 'name', 'age') + list_display_links = ['parent', 'name'] + + def get_list_display_links(self, request, list_display): + return ['age'] + + +site.register(Child, DynamicListDisplayChildAdmin) + + +class NoListDisplayLinksParentAdmin(admin.ModelAdmin): + list_display_links = None + + +site.register(Parent, NoListDisplayLinksParentAdmin) + + +class SwallowAdmin(admin.ModelAdmin): + actions = None # prevent ['action_checkbox'] + list(list_display) + list_display = ('origin', 'load', 'speed', 'swallowonetoone') + list_editable = ['load', 'speed'] + list_per_page = 3 + + +site.register(Swallow, SwallowAdmin) + + +class DynamicListFilterChildAdmin(admin.ModelAdmin): + list_filter = ('parent', 'name', 'age') + + def get_list_filter(self, request): + my_list_filter = super().get_list_filter(request) + if request.user.username == 'noparents': + my_list_filter = list(my_list_filter) + my_list_filter.remove('parent') + return my_list_filter + + +class DynamicSearchFieldsChildAdmin(admin.ModelAdmin): + search_fields = ('name',) + + def get_search_fields(self, request): + search_fields = super().get_search_fields(request) + search_fields += ('age',) + return search_fields + + +class EmptyValueChildAdmin(admin.ModelAdmin): + empty_value_display = '-empty-' + list_display = ('name', 'age_display', 'age') + + def age_display(self, obj): + return obj.age + age_display.empty_value_display = '†' diff --git a/tests/django_tests/tests/v21/tests/admin_changelist/models.py b/tests/django_tests/tests/v21/tests/admin_changelist/models.py new file mode 100644 index 00000000..81d7fdfb --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_changelist/models.py @@ -0,0 +1,121 @@ +import uuid + +from django.db import models + + +class Event(models.Model): + # Oracle can have problems with a column named "date" + date = models.DateField(db_column="event_date") + + +class Parent(models.Model): + name = models.CharField(max_length=128) + + +class Child(models.Model): + parent = models.ForeignKey(Parent, models.SET_NULL, editable=False, null=True) + name = models.CharField(max_length=30, blank=True) + age = models.IntegerField(null=True, blank=True) + + +class Genre(models.Model): + name = models.CharField(max_length=20) + + +class Band(models.Model): + name = models.CharField(max_length=20) + nr_of_members = models.PositiveIntegerField() + genres = models.ManyToManyField(Genre) + + +class Musician(models.Model): + name = models.CharField(max_length=30) + age = models.IntegerField(null=True, blank=True) + + def __str__(self): + return self.name + + +class Group(models.Model): + name = models.CharField(max_length=30) + members = models.ManyToManyField(Musician, through='Membership') + + def __str__(self): + return self.name + + +class Concert(models.Model): + name = models.CharField(max_length=30) + group = models.ForeignKey(Group, models.CASCADE) + + +class Membership(models.Model): + music = models.ForeignKey(Musician, models.CASCADE) + group = models.ForeignKey(Group, models.CASCADE) + role = models.CharField(max_length=15) + + +class Quartet(Group): + pass + + +class ChordsMusician(Musician): + pass + + +class ChordsBand(models.Model): + name = models.CharField(max_length=30) + members = models.ManyToManyField(ChordsMusician, through='Invitation') + + +class Invitation(models.Model): + player = models.ForeignKey(ChordsMusician, models.CASCADE) + band = models.ForeignKey(ChordsBand, models.CASCADE) + instrument = models.CharField(max_length=15) + + +class Swallow(models.Model): + uuid = models.UUIDField(primary_key=True, default=uuid.uuid4) + origin = models.CharField(max_length=255) + load = models.FloatField() + speed = models.FloatField() + + class Meta: + ordering = ('speed', 'load') + + +class SwallowOneToOne(models.Model): + swallow = models.OneToOneField(Swallow, models.CASCADE) + + +class UnorderedObject(models.Model): + """ + Model without any defined `Meta.ordering`. + Refs #17198. + """ + bool = models.BooleanField(default=True) + + +class OrderedObjectManager(models.Manager): + def get_queryset(self): + return super().get_queryset().order_by('number') + + +class OrderedObject(models.Model): + """ + Model with Manager that defines a default order. + Refs #17198. + """ + name = models.CharField(max_length=255) + bool = models.BooleanField(default=True) + number = models.IntegerField(default=0, db_column='number_val') + + objects = OrderedObjectManager() + + +class CustomIdUser(models.Model): + uuid = models.AutoField(primary_key=True) + + +class CharPK(models.Model): + char_pk = models.CharField(max_length=100, primary_key=True) diff --git a/tests/django_tests/tests/v21/tests/admin_changelist/test_date_hierarchy.py b/tests/django_tests/tests/v21/tests/admin_changelist/test_date_hierarchy.py new file mode 100644 index 00000000..f19e38f9 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_changelist/test_date_hierarchy.py @@ -0,0 +1,61 @@ +from datetime import datetime + +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib.auth.models import User +from django.test import RequestFactory, TestCase +from django.utils.timezone import make_aware + +from .admin import EventAdmin, site as custom_site +from .models import Event + + +class DateHierarchyTests(TestCase): + factory = RequestFactory() + + @classmethod + def setUpTestData(cls): + cls.superuser = User.objects.create_superuser(username='super', email='a@b.com', password='xxx') + + def assertDateParams(self, query, expected_from_date, expected_to_date): + query = {'date__%s' % field: val for field, val in query.items()} + request = self.factory.get('/', query) + request.user = self.superuser + changelist = EventAdmin(Event, custom_site).get_changelist_instance(request) + _, _, lookup_params, _ = changelist.get_filters(request) + self.assertEqual(lookup_params['date__gte'], expected_from_date) + self.assertEqual(lookup_params['date__lt'], expected_to_date) + + def test_bounded_params(self): + tests = ( + ({'year': 2017}, datetime(2017, 1, 1), datetime(2018, 1, 1)), + ({'year': 2017, 'month': 2}, datetime(2017, 2, 1), datetime(2017, 3, 1)), + ({'year': 2017, 'month': 12}, datetime(2017, 12, 1), datetime(2018, 1, 1)), + ({'year': 2017, 'month': 12, 'day': 15}, datetime(2017, 12, 15), datetime(2017, 12, 16)), + ({'year': 2017, 'month': 12, 'day': 31}, datetime(2017, 12, 31), datetime(2018, 1, 1)), + ({'year': 2017, 'month': 2, 'day': 28}, datetime(2017, 2, 28), datetime(2017, 3, 1)), + ) + for query, expected_from_date, expected_to_date in tests: + with self.subTest(query=query): + self.assertDateParams(query, expected_from_date, expected_to_date) + + def test_bounded_params_with_time_zone(self): + with self.settings(USE_TZ=True, TIME_ZONE='Asia/Jerusalem'): + self.assertDateParams( + {'year': 2017, 'month': 2, 'day': 28}, + make_aware(datetime(2017, 2, 28)), + make_aware(datetime(2017, 3, 1)), + ) + + def test_invalid_params(self): + tests = ( + {'year': 'x'}, + {'year': 2017, 'month': 'x'}, + {'year': 2017, 'month': 12, 'day': 'x'}, + {'year': 2017, 'month': 13}, + {'year': 2017, 'month': 12, 'day': 32}, + {'year': 2017, 'month': 0}, + {'year': 2017, 'month': 12, 'day': 0}, + ) + for invalid_query in tests: + with self.subTest(query=invalid_query), self.assertRaises(IncorrectLookupParameters): + self.assertDateParams(invalid_query, None, None) diff --git a/tests/django_tests/tests/v21/tests/admin_changelist/tests.py b/tests/django_tests/tests/v21/tests/admin_changelist/tests.py new file mode 100644 index 00000000..c12bfc7c --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_changelist/tests.py @@ -0,0 +1,1100 @@ +import datetime + +from django.contrib import admin +from django.contrib.admin.models import LogEntry +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib.admin.templatetags.admin_list import pagination +from django.contrib.admin.tests import AdminSeleniumTestCase +from django.contrib.admin.views.main import ALL_VAR, SEARCH_VAR +from django.contrib.auth.models import User +from django.contrib.contenttypes.models import ContentType +from django.db import connection +from django.db.models import F +from django.db.models.fields import Field, IntegerField +from django.db.models.functions import Upper +from django.db.models.lookups import Contains, Exact +from django.template import Context, Template, TemplateSyntaxError +from django.test import TestCase, override_settings +from django.test.client import RequestFactory +from django.test.utils import CaptureQueriesContext +from django.urls import reverse +from django.utils import formats + +from .admin import ( + BandAdmin, ChildAdmin, ChordsBandAdmin, ConcertAdmin, + CustomPaginationAdmin, CustomPaginator, DynamicListDisplayChildAdmin, + DynamicListDisplayLinksChildAdmin, DynamicListFilterChildAdmin, + DynamicSearchFieldsChildAdmin, EmptyValueChildAdmin, EventAdmin, + FilteredChildAdmin, GroupAdmin, InvitationAdmin, + NoListDisplayLinksParentAdmin, ParentAdmin, QuartetAdmin, SwallowAdmin, + site as custom_site, +) +from .models import ( + Band, CharPK, Child, ChordsBand, ChordsMusician, Concert, CustomIdUser, + Event, Genre, Group, Invitation, Membership, Musician, OrderedObject, + Parent, Quartet, Swallow, SwallowOneToOne, UnorderedObject, +) + + +def build_tbody_html(pk, href, extra_fields): + return ( + '' + '' + '' + 'name' + '{}' + ).format(pk, href, extra_fields) + + +@override_settings(ROOT_URLCONF="admin_changelist.urls") +class ChangeListTests(TestCase): + + def setUp(self): + self.factory = RequestFactory() + self.superuser = User.objects.create_superuser(username='super', email='a@b.com', password='xxx') + + def _create_superuser(self, username): + return User.objects.create_superuser(username=username, email='a@b.com', password='xxx') + + def _mocked_authenticated_request(self, url, user): + request = self.factory.get(url) + request.user = user + return request + + def test_specified_ordering_by_f_expression(self): + class OrderedByFBandAdmin(admin.ModelAdmin): + list_display = ['name', 'genres', 'nr_of_members'] + ordering = ( + F('nr_of_members').desc(nulls_last=True), + Upper(F('name')).asc(), + F('genres').asc(), + ) + + m = OrderedByFBandAdmin(Band, custom_site) + request = self.factory.get('/band/') + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertEqual(cl.get_ordering_field_columns(), {3: 'desc', 2: 'asc'}) + + def test_specified_ordering_by_f_expression_without_asc_desc(self): + class OrderedByFBandAdmin(admin.ModelAdmin): + list_display = ['name', 'genres', 'nr_of_members'] + ordering = (F('nr_of_members'), Upper('name'), F('genres')) + + m = OrderedByFBandAdmin(Band, custom_site) + request = self.factory.get('/band/') + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertEqual(cl.get_ordering_field_columns(), {3: 'asc', 2: 'asc'}) + + def test_select_related_preserved(self): + """ + Regression test for #10348: ChangeList.get_queryset() shouldn't + overwrite a custom select_related provided by ModelAdmin.get_queryset(). + """ + m = ChildAdmin(Child, custom_site) + request = self.factory.get('/child/') + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertEqual(cl.queryset.query.select_related, {'parent': {}}) + + def test_select_related_as_tuple(self): + ia = InvitationAdmin(Invitation, custom_site) + request = self.factory.get('/invitation/') + request.user = self.superuser + cl = ia.get_changelist_instance(request) + self.assertEqual(cl.queryset.query.select_related, {'player': {}}) + + def test_select_related_as_empty_tuple(self): + ia = InvitationAdmin(Invitation, custom_site) + ia.list_select_related = () + request = self.factory.get('/invitation/') + request.user = self.superuser + cl = ia.get_changelist_instance(request) + self.assertIs(cl.queryset.query.select_related, False) + + def test_get_select_related_custom_method(self): + class GetListSelectRelatedAdmin(admin.ModelAdmin): + list_display = ('band', 'player') + + def get_list_select_related(self, request): + return ('band', 'player') + + ia = GetListSelectRelatedAdmin(Invitation, custom_site) + request = self.factory.get('/invitation/') + request.user = self.superuser + cl = ia.get_changelist_instance(request) + self.assertEqual(cl.queryset.query.select_related, {'player': {}, 'band': {}}) + + def test_result_list_empty_changelist_value(self): + """ + Regression test for #14982: EMPTY_CHANGELIST_VALUE should be honored + for relationship fields + """ + new_child = Child.objects.create(name='name', parent=None) + request = self.factory.get('/child/') + request.user = self.superuser + m = ChildAdmin(Child, custom_site) + cl = m.get_changelist_instance(request) + cl.formset = None + template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') + context = Context({'cl': cl, 'opts': Child._meta}) + table_output = template.render(context) + link = reverse('admin:admin_changelist_child_change', args=(new_child.id,)) + row_html = build_tbody_html(new_child.id, link, '-') + self.assertNotEqual(table_output.find(row_html), -1, 'Failed to find expected row element: %s' % table_output) + + def test_result_list_set_empty_value_display_on_admin_site(self): + """ + Empty value display can be set on AdminSite. + """ + new_child = Child.objects.create(name='name', parent=None) + request = self.factory.get('/child/') + request.user = self.superuser + # Set a new empty display value on AdminSite. + admin.site.empty_value_display = '???' + m = ChildAdmin(Child, admin.site) + cl = m.get_changelist_instance(request) + cl.formset = None + template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') + context = Context({'cl': cl, 'opts': Child._meta}) + table_output = template.render(context) + link = reverse('admin:admin_changelist_child_change', args=(new_child.id,)) + row_html = build_tbody_html(new_child.id, link, '???') + self.assertNotEqual(table_output.find(row_html), -1, 'Failed to find expected row element: %s' % table_output) + + def test_result_list_set_empty_value_display_in_model_admin(self): + """ + Empty value display can be set in ModelAdmin or individual fields. + """ + new_child = Child.objects.create(name='name', parent=None) + request = self.factory.get('/child/') + request.user = self.superuser + m = EmptyValueChildAdmin(Child, admin.site) + cl = m.get_changelist_instance(request) + cl.formset = None + template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') + context = Context({'cl': cl, 'opts': Child._meta}) + table_output = template.render(context) + link = reverse('admin:admin_changelist_child_change', args=(new_child.id,)) + row_html = build_tbody_html( + new_child.id, + link, + '&dagger;' + '-empty-' + ) + self.assertNotEqual(table_output.find(row_html), -1, 'Failed to find expected row element: %s' % table_output) + + def test_result_list_html(self): + """ + Inclusion tag result_list generates a table when with default + ModelAdmin settings. + """ + new_parent = Parent.objects.create(name='parent') + new_child = Child.objects.create(name='name', parent=new_parent) + request = self.factory.get('/child/') + request.user = self.superuser + m = ChildAdmin(Child, custom_site) + cl = m.get_changelist_instance(request) + cl.formset = None + template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') + context = Context({'cl': cl, 'opts': Child._meta}) + table_output = template.render(context) + link = reverse('admin:admin_changelist_child_change', args=(new_child.id,)) + row_html = build_tbody_html(new_child.id, link, '%s' % new_parent) + self.assertNotEqual(table_output.find(row_html), -1, 'Failed to find expected row element: %s' % table_output) + + def test_result_list_editable_html(self): + """ + Regression tests for #11791: Inclusion tag result_list generates a + table and this checks that the items are nested within the table + element tags. + Also a regression test for #13599, verifies that hidden fields + when list_editable is enabled are rendered in a div outside the + table. + """ + new_parent = Parent.objects.create(name='parent') + new_child = Child.objects.create(name='name', parent=new_parent) + request = self.factory.get('/child/') + request.user = self.superuser + m = ChildAdmin(Child, custom_site) + + # Test with list_editable fields + m.list_display = ['id', 'name', 'parent'] + m.list_display_links = ['id'] + m.list_editable = ['name'] + cl = m.get_changelist_instance(request) + FormSet = m.get_changelist_formset(request) + cl.formset = FormSet(queryset=cl.result_list) + template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') + context = Context({'cl': cl, 'opts': Child._meta}) + table_output = template.render(context) + # make sure that hidden fields are in the correct place + hiddenfields_div = ( + '
' + '' + '
' + ) % new_child.id + self.assertInHTML(hiddenfields_div, table_output, msg_prefix='Failed to find hidden fields') + + # make sure that list editable fields are rendered in divs correctly + editable_name_field = ( + '' + ) + self.assertInHTML( + '%s' % editable_name_field, + table_output, + msg_prefix='Failed to find "name" list_editable field', + ) + + def test_result_list_editable(self): + """ + Regression test for #14312: list_editable with pagination + """ + new_parent = Parent.objects.create(name='parent') + for i in range(200): + Child.objects.create(name='name %s' % i, parent=new_parent) + request = self.factory.get('/child/', data={'p': -1}) # Anything outside range + request.user = self.superuser + m = ChildAdmin(Child, custom_site) + + # Test with list_editable fields + m.list_display = ['id', 'name', 'parent'] + m.list_display_links = ['id'] + m.list_editable = ['name'] + with self.assertRaises(IncorrectLookupParameters): + m.get_changelist_instance(request) + + def test_custom_paginator(self): + new_parent = Parent.objects.create(name='parent') + for i in range(200): + Child.objects.create(name='name %s' % i, parent=new_parent) + + request = self.factory.get('/child/') + request.user = self.superuser + m = CustomPaginationAdmin(Child, custom_site) + + cl = m.get_changelist_instance(request) + cl.get_results(request) + self.assertIsInstance(cl.paginator, CustomPaginator) + + def test_distinct_for_m2m_in_list_filter(self): + """ + Regression test for #13902: When using a ManyToMany in list_filter, + results shouldn't appear more than once. Basic ManyToMany. + """ + blues = Genre.objects.create(name='Blues') + band = Band.objects.create(name='B.B. King Review', nr_of_members=11) + + band.genres.add(blues) + band.genres.add(blues) + + m = BandAdmin(Band, custom_site) + request = self.factory.get('/band/', data={'genres': blues.pk}) + request.user = self.superuser + + cl = m.get_changelist_instance(request) + cl.get_results(request) + + # There's only one Group instance + self.assertEqual(cl.result_count, 1) + + def test_distinct_for_through_m2m_in_list_filter(self): + """ + Regression test for #13902: When using a ManyToMany in list_filter, + results shouldn't appear more than once. With an intermediate model. + """ + lead = Musician.objects.create(name='Vox') + band = Group.objects.create(name='The Hype') + Membership.objects.create(group=band, music=lead, role='lead voice') + Membership.objects.create(group=band, music=lead, role='bass player') + + m = GroupAdmin(Group, custom_site) + request = self.factory.get('/group/', data={'members': lead.pk}) + request.user = self.superuser + + cl = m.get_changelist_instance(request) + cl.get_results(request) + + # There's only one Group instance + self.assertEqual(cl.result_count, 1) + + def test_distinct_for_through_m2m_at_second_level_in_list_filter(self): + """ + When using a ManyToMany in list_filter at the second level behind a + ForeignKey, distinct() must be called and results shouldn't appear more + than once. + """ + lead = Musician.objects.create(name='Vox') + band = Group.objects.create(name='The Hype') + Concert.objects.create(name='Woodstock', group=band) + Membership.objects.create(group=band, music=lead, role='lead voice') + Membership.objects.create(group=band, music=lead, role='bass player') + + m = ConcertAdmin(Concert, custom_site) + request = self.factory.get('/concert/', data={'group__members': lead.pk}) + request.user = self.superuser + + cl = m.get_changelist_instance(request) + cl.get_results(request) + + # There's only one Concert instance + self.assertEqual(cl.result_count, 1) + + def test_distinct_for_inherited_m2m_in_list_filter(self): + """ + Regression test for #13902: When using a ManyToMany in list_filter, + results shouldn't appear more than once. Model managed in the + admin inherits from the one that defines the relationship. + """ + lead = Musician.objects.create(name='John') + four = Quartet.objects.create(name='The Beatles') + Membership.objects.create(group=four, music=lead, role='lead voice') + Membership.objects.create(group=four, music=lead, role='guitar player') + + m = QuartetAdmin(Quartet, custom_site) + request = self.factory.get('/quartet/', data={'members': lead.pk}) + request.user = self.superuser + + cl = m.get_changelist_instance(request) + cl.get_results(request) + + # There's only one Quartet instance + self.assertEqual(cl.result_count, 1) + + def test_distinct_for_m2m_to_inherited_in_list_filter(self): + """ + Regression test for #13902: When using a ManyToMany in list_filter, + results shouldn't appear more than once. Target of the relationship + inherits from another. + """ + lead = ChordsMusician.objects.create(name='Player A') + three = ChordsBand.objects.create(name='The Chords Trio') + Invitation.objects.create(band=three, player=lead, instrument='guitar') + Invitation.objects.create(band=three, player=lead, instrument='bass') + + m = ChordsBandAdmin(ChordsBand, custom_site) + request = self.factory.get('/chordsband/', data={'members': lead.pk}) + request.user = self.superuser + + cl = m.get_changelist_instance(request) + cl.get_results(request) + + # There's only one ChordsBand instance + self.assertEqual(cl.result_count, 1) + + def test_distinct_for_non_unique_related_object_in_list_filter(self): + """ + Regressions tests for #15819: If a field listed in list_filters + is a non-unique related object, distinct() must be called. + """ + parent = Parent.objects.create(name='Mary') + # Two children with the same name + Child.objects.create(parent=parent, name='Daniel') + Child.objects.create(parent=parent, name='Daniel') + + m = ParentAdmin(Parent, custom_site) + request = self.factory.get('/parent/', data={'child__name': 'Daniel'}) + request.user = self.superuser + + cl = m.get_changelist_instance(request) + # Make sure distinct() was called + self.assertEqual(cl.queryset.count(), 1) + + def test_distinct_for_non_unique_related_object_in_search_fields(self): + """ + Regressions tests for #15819: If a field listed in search_fields + is a non-unique related object, distinct() must be called. + """ + parent = Parent.objects.create(name='Mary') + Child.objects.create(parent=parent, name='Danielle') + Child.objects.create(parent=parent, name='Daniel') + + m = ParentAdmin(Parent, custom_site) + request = self.factory.get('/parent/', data={SEARCH_VAR: 'daniel'}) + request.user = self.superuser + + cl = m.get_changelist_instance(request) + # Make sure distinct() was called + self.assertEqual(cl.queryset.count(), 1) + + def test_distinct_for_many_to_many_at_second_level_in_search_fields(self): + """ + When using a ManyToMany in search_fields at the second level behind a + ForeignKey, distinct() must be called and results shouldn't appear more + than once. + """ + lead = Musician.objects.create(name='Vox') + band = Group.objects.create(name='The Hype') + Concert.objects.create(name='Woodstock', group=band) + Membership.objects.create(group=band, music=lead, role='lead voice') + Membership.objects.create(group=band, music=lead, role='bass player') + + m = ConcertAdmin(Concert, custom_site) + request = self.factory.get('/concert/', data={SEARCH_VAR: 'vox'}) + request.user = self.superuser + + cl = m.get_changelist_instance(request) + # There's only one Concert instance + self.assertEqual(cl.queryset.count(), 1) + + def test_pk_in_search_fields(self): + band = Group.objects.create(name='The Hype') + Concert.objects.create(name='Woodstock', group=band) + + m = ConcertAdmin(Concert, custom_site) + m.search_fields = ['group__pk'] + + request = self.factory.get('/concert/', data={SEARCH_VAR: band.pk}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertEqual(cl.queryset.count(), 1) + + request = self.factory.get('/concert/', data={SEARCH_VAR: band.pk + 5}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertEqual(cl.queryset.count(), 0) + + def test_builtin_lookup_in_search_fields(self): + band = Group.objects.create(name='The Hype') + concert = Concert.objects.create(name='Woodstock', group=band) + + m = ConcertAdmin(Concert, custom_site) + m.search_fields = ['name__iexact'] + + request = self.factory.get('/', data={SEARCH_VAR: 'woodstock'}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [concert]) + + request = self.factory.get('/', data={SEARCH_VAR: 'wood'}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, []) + + def test_custom_lookup_in_search_fields(self): + band = Group.objects.create(name='The Hype') + concert = Concert.objects.create(name='Woodstock', group=band) + + m = ConcertAdmin(Concert, custom_site) + m.search_fields = ['group__name__cc'] + Field.register_lookup(Contains, 'cc') + try: + request = self.factory.get('/', data={SEARCH_VAR: 'Hype'}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [concert]) + + request = self.factory.get('/', data={SEARCH_VAR: 'Woodstock'}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, []) + finally: + Field._unregister_lookup(Contains, 'cc') + + def test_spanning_relations_with_custom_lookup_in_search_fields(self): + hype = Group.objects.create(name='The Hype') + concert = Concert.objects.create(name='Woodstock', group=hype) + vox = Musician.objects.create(name='Vox', age=20) + Membership.objects.create(music=vox, group=hype) + # Register a custom lookup on IntegerField to ensure that field + # traversing logic in ModelAdmin.get_search_results() works. + IntegerField.register_lookup(Exact, 'exactly') + try: + m = ConcertAdmin(Concert, custom_site) + m.search_fields = ['group__members__age__exactly'] + + request = self.factory.get('/', data={SEARCH_VAR: '20'}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [concert]) + + request = self.factory.get('/', data={SEARCH_VAR: '21'}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, []) + finally: + IntegerField._unregister_lookup(Exact, 'exactly') + + def test_custom_lookup_with_pk_shortcut(self): + self.assertEqual(CharPK._meta.pk.name, 'char_pk') # Not equal to 'pk'. + m = admin.ModelAdmin(CustomIdUser, custom_site) + + abc = CharPK.objects.create(char_pk='abc') + abcd = CharPK.objects.create(char_pk='abcd') + m = admin.ModelAdmin(CharPK, custom_site) + m.search_fields = ['pk__exact'] + + request = self.factory.get('/', data={SEARCH_VAR: 'abc'}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [abc]) + + request = self.factory.get('/', data={SEARCH_VAR: 'abcd'}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertCountEqual(cl.queryset, [abcd]) + + def test_no_distinct_for_m2m_in_list_filter_without_params(self): + """ + If a ManyToManyField is in list_filter but isn't in any lookup params, + the changelist's query shouldn't have distinct. + """ + m = BandAdmin(Band, custom_site) + for lookup_params in ({}, {'name': 'test'}): + request = self.factory.get('/band/', lookup_params) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertFalse(cl.queryset.query.distinct) + + # A ManyToManyField in params does have distinct applied. + request = self.factory.get('/band/', {'genres': '0'}) + request.user = self.superuser + cl = m.get_changelist_instance(request) + self.assertTrue(cl.queryset.query.distinct) + + def test_pagination(self): + """ + Regression tests for #12893: Pagination in admins changelist doesn't + use queryset set by modeladmin. + """ + parent = Parent.objects.create(name='anything') + for i in range(30): + Child.objects.create(name='name %s' % i, parent=parent) + Child.objects.create(name='filtered %s' % i, parent=parent) + + request = self.factory.get('/child/') + request.user = self.superuser + + # Test default queryset + m = ChildAdmin(Child, custom_site) + cl = m.get_changelist_instance(request) + self.assertEqual(cl.queryset.count(), 60) + self.assertEqual(cl.paginator.count, 60) + self.assertEqual(list(cl.paginator.page_range), [1, 2, 3, 4, 5, 6]) + + # Test custom queryset + m = FilteredChildAdmin(Child, custom_site) + cl = m.get_changelist_instance(request) + self.assertEqual(cl.queryset.count(), 30) + self.assertEqual(cl.paginator.count, 30) + self.assertEqual(list(cl.paginator.page_range), [1, 2, 3]) + + def test_computed_list_display_localization(self): + """ + Regression test for #13196: output of functions should be localized + in the changelist. + """ + self.client.force_login(self.superuser) + event = Event.objects.create(date=datetime.date.today()) + response = self.client.get(reverse('admin:admin_changelist_event_changelist')) + self.assertContains(response, formats.localize(event.date)) + self.assertNotContains(response, str(event.date)) + + def test_dynamic_list_display(self): + """ + Regression tests for #14206: dynamic list_display support. + """ + parent = Parent.objects.create(name='parent') + for i in range(10): + Child.objects.create(name='child %s' % i, parent=parent) + + user_noparents = self._create_superuser('noparents') + user_parents = self._create_superuser('parents') + + # Test with user 'noparents' + m = custom_site._registry[Child] + request = self._mocked_authenticated_request('/child/', user_noparents) + response = m.changelist_view(request) + self.assertNotContains(response, 'Parent object') + + list_display = m.get_list_display(request) + list_display_links = m.get_list_display_links(request, list_display) + self.assertEqual(list_display, ['name', 'age']) + self.assertEqual(list_display_links, ['name']) + + # Test with user 'parents' + m = DynamicListDisplayChildAdmin(Child, custom_site) + request = self._mocked_authenticated_request('/child/', user_parents) + response = m.changelist_view(request) + self.assertContains(response, 'Parent object') + + custom_site.unregister(Child) + + list_display = m.get_list_display(request) + list_display_links = m.get_list_display_links(request, list_display) + self.assertEqual(list_display, ('parent', 'name', 'age')) + self.assertEqual(list_display_links, ['parent']) + + # Test default implementation + custom_site.register(Child, ChildAdmin) + m = custom_site._registry[Child] + request = self._mocked_authenticated_request('/child/', user_noparents) + response = m.changelist_view(request) + self.assertContains(response, 'Parent object') + + def test_show_all(self): + parent = Parent.objects.create(name='anything') + for i in range(30): + Child.objects.create(name='name %s' % i, parent=parent) + Child.objects.create(name='filtered %s' % i, parent=parent) + + # Add "show all" parameter to request + request = self.factory.get('/child/', data={ALL_VAR: ''}) + request.user = self.superuser + + # Test valid "show all" request (number of total objects is under max) + m = ChildAdmin(Child, custom_site) + m.list_max_show_all = 200 + # 200 is the max we'll pass to ChangeList + cl = m.get_changelist_instance(request) + cl.get_results(request) + self.assertEqual(len(cl.result_list), 60) + + # Test invalid "show all" request (number of total objects over max) + # falls back to paginated pages + m = ChildAdmin(Child, custom_site) + m.list_max_show_all = 30 + # 30 is the max we'll pass to ChangeList for this test + cl = m.get_changelist_instance(request) + cl.get_results(request) + self.assertEqual(len(cl.result_list), 10) + + def test_dynamic_list_display_links(self): + """ + Regression tests for #16257: dynamic list_display_links support. + """ + parent = Parent.objects.create(name='parent') + for i in range(1, 10): + Child.objects.create(id=i, name='child %s' % i, parent=parent, age=i) + + m = DynamicListDisplayLinksChildAdmin(Child, custom_site) + superuser = self._create_superuser('superuser') + request = self._mocked_authenticated_request('/child/', superuser) + response = m.changelist_view(request) + for i in range(1, 10): + link = reverse('admin:admin_changelist_child_change', args=(i,)) + self.assertContains(response, '%s' % (link, i)) + + list_display = m.get_list_display(request) + list_display_links = m.get_list_display_links(request, list_display) + self.assertEqual(list_display, ('parent', 'name', 'age')) + self.assertEqual(list_display_links, ['age']) + + def test_no_list_display_links(self): + """#15185 -- Allow no links from the 'change list' view grid.""" + p = Parent.objects.create(name='parent') + m = NoListDisplayLinksParentAdmin(Parent, custom_site) + superuser = self._create_superuser('superuser') + request = self._mocked_authenticated_request('/parent/', superuser) + response = m.changelist_view(request) + link = reverse('admin:admin_changelist_parent_change', args=(p.pk,)) + self.assertNotContains(response, '' % link) + + def test_tuple_list_display(self): + swallow = Swallow.objects.create(origin='Africa', load='12.34', speed='22.2') + swallow2 = Swallow.objects.create(origin='Africa', load='12.34', speed='22.2') + swallow_o2o = SwallowOneToOne.objects.create(swallow=swallow2) + + model_admin = SwallowAdmin(Swallow, custom_site) + superuser = self._create_superuser('superuser') + request = self._mocked_authenticated_request('/swallow/', superuser) + response = model_admin.changelist_view(request) + # just want to ensure it doesn't blow up during rendering + self.assertContains(response, str(swallow.origin)) + self.assertContains(response, str(swallow.load)) + self.assertContains(response, str(swallow.speed)) + # Reverse one-to-one relations should work. + self.assertContains(response, '-') + self.assertContains(response, '%s' % swallow_o2o) + + def test_multiuser_edit(self): + """ + Simultaneous edits of list_editable fields on the changelist by + different users must not result in one user's edits creating a new + object instead of modifying the correct existing object (#11313). + """ + # To replicate this issue, simulate the following steps: + # 1. User1 opens an admin changelist with list_editable fields. + # 2. User2 edits object "Foo" such that it moves to another page in + # the pagination order and saves. + # 3. User1 edits object "Foo" and saves. + # 4. The edit made by User1 does not get applied to object "Foo" but + # instead is used to create a new object (bug). + + # For this test, order the changelist by the 'speed' attribute and + # display 3 objects per page (SwallowAdmin.list_per_page = 3). + + # Setup the test to reflect the DB state after step 2 where User2 has + # edited the first swallow object's speed from '4' to '1'. + a = Swallow.objects.create(origin='Swallow A', load=4, speed=1) + b = Swallow.objects.create(origin='Swallow B', load=2, speed=2) + c = Swallow.objects.create(origin='Swallow C', load=5, speed=5) + d = Swallow.objects.create(origin='Swallow D', load=9, speed=9) + + superuser = self._create_superuser('superuser') + self.client.force_login(superuser) + changelist_url = reverse('admin:admin_changelist_swallow_changelist') + + # Send the POST from User1 for step 3. It's still using the changelist + # ordering from before User2's edits in step 2. + data = { + 'form-TOTAL_FORMS': '3', + 'form-INITIAL_FORMS': '3', + 'form-MIN_NUM_FORMS': '0', + 'form-MAX_NUM_FORMS': '1000', + 'form-0-uuid': str(d.pk), + 'form-1-uuid': str(c.pk), + 'form-2-uuid': str(a.pk), + 'form-0-load': '9.0', + 'form-0-speed': '9.0', + 'form-1-load': '5.0', + 'form-1-speed': '5.0', + 'form-2-load': '5.0', + 'form-2-speed': '4.0', + '_save': 'Save', + } + response = self.client.post(changelist_url, data, follow=True, extra={'o': '-2'}) + + # The object User1 edited in step 3 is displayed on the changelist and + # has the correct edits applied. + self.assertContains(response, '1 swallow was changed successfully.') + self.assertContains(response, a.origin) + a.refresh_from_db() + self.assertEqual(a.load, float(data['form-2-load'])) + self.assertEqual(a.speed, float(data['form-2-speed'])) + b.refresh_from_db() + self.assertEqual(b.load, 2) + self.assertEqual(b.speed, 2) + c.refresh_from_db() + self.assertEqual(c.load, float(data['form-1-load'])) + self.assertEqual(c.speed, float(data['form-1-speed'])) + d.refresh_from_db() + self.assertEqual(d.load, float(data['form-0-load'])) + self.assertEqual(d.speed, float(data['form-0-speed'])) + # No new swallows were created. + self.assertEqual(len(Swallow.objects.all()), 4) + + def test_get_edited_object_ids(self): + a = Swallow.objects.create(origin='Swallow A', load=4, speed=1) + b = Swallow.objects.create(origin='Swallow B', load=2, speed=2) + c = Swallow.objects.create(origin='Swallow C', load=5, speed=5) + superuser = self._create_superuser('superuser') + self.client.force_login(superuser) + changelist_url = reverse('admin:admin_changelist_swallow_changelist') + m = SwallowAdmin(Swallow, custom_site) + data = { + 'form-TOTAL_FORMS': '3', + 'form-INITIAL_FORMS': '3', + 'form-MIN_NUM_FORMS': '0', + 'form-MAX_NUM_FORMS': '1000', + 'form-0-uuid': str(a.pk), + 'form-1-uuid': str(b.pk), + 'form-2-uuid': str(c.pk), + 'form-0-load': '9.0', + 'form-0-speed': '9.0', + 'form-1-load': '5.0', + 'form-1-speed': '5.0', + 'form-2-load': '5.0', + 'form-2-speed': '4.0', + '_save': 'Save', + } + request = self.factory.post(changelist_url, data=data) + pks = m._get_edited_object_pks(request, prefix='form') + self.assertEqual(sorted(pks), sorted([str(a.pk), str(b.pk), str(c.pk)])) + + def test_get_list_editable_queryset(self): + a = Swallow.objects.create(origin='Swallow A', load=4, speed=1) + Swallow.objects.create(origin='Swallow B', load=2, speed=2) + data = { + 'form-TOTAL_FORMS': '2', + 'form-INITIAL_FORMS': '2', + 'form-MIN_NUM_FORMS': '0', + 'form-MAX_NUM_FORMS': '1000', + 'form-0-uuid': str(a.pk), + 'form-0-load': '10', + '_save': 'Save', + } + superuser = self._create_superuser('superuser') + self.client.force_login(superuser) + changelist_url = reverse('admin:admin_changelist_swallow_changelist') + m = SwallowAdmin(Swallow, custom_site) + request = self.factory.post(changelist_url, data=data) + queryset = m._get_list_editable_queryset(request, prefix='form') + self.assertEqual(queryset.count(), 1) + data['form-0-uuid'] = 'INVALD_PRIMARY_KEY' + # The unfiltered queryset is returned if there's invalid data. + request = self.factory.post(changelist_url, data=data) + queryset = m._get_list_editable_queryset(request, prefix='form') + self.assertEqual(queryset.count(), 2) + + def test_changelist_view_list_editable_changed_objects_uses_filter(self): + """list_editable edits use a filtered queryset to limit memory usage.""" + a = Swallow.objects.create(origin='Swallow A', load=4, speed=1) + Swallow.objects.create(origin='Swallow B', load=2, speed=2) + data = { + 'form-TOTAL_FORMS': '2', + 'form-INITIAL_FORMS': '2', + 'form-MIN_NUM_FORMS': '0', + 'form-MAX_NUM_FORMS': '1000', + 'form-0-uuid': str(a.pk), + 'form-0-load': '10', + '_save': 'Save', + } + superuser = self._create_superuser('superuser') + self.client.force_login(superuser) + changelist_url = reverse('admin:admin_changelist_swallow_changelist') + with CaptureQueriesContext(connection) as context: + response = self.client.post(changelist_url, data=data) + self.assertEqual(response.status_code, 200) + self.assertIn('WHERE', context.captured_queries[4]['sql']) + self.assertIn('IN', context.captured_queries[4]['sql']) + # Check only the first few characters since the UUID may have dashes. + self.assertIn(str(a.pk)[:8], context.captured_queries[4]['sql']) + + def test_deterministic_order_for_unordered_model(self): + """ + The primary key is used in the ordering of the changelist's results to + guarantee a deterministic order, even when the model doesn't have any + default ordering defined (#17198). + """ + superuser = self._create_superuser('superuser') + + for counter in range(1, 51): + UnorderedObject.objects.create(id=counter, bool=True) + + class UnorderedObjectAdmin(admin.ModelAdmin): + list_per_page = 10 + + def check_results_order(ascending=False): + custom_site.register(UnorderedObject, UnorderedObjectAdmin) + model_admin = UnorderedObjectAdmin(UnorderedObject, custom_site) + counter = 0 if ascending else 51 + for page in range(0, 5): + request = self._mocked_authenticated_request('/unorderedobject/?p=%s' % page, superuser) + response = model_admin.changelist_view(request) + for result in response.context_data['cl'].result_list: + counter += 1 if ascending else -1 + self.assertEqual(result.id, counter) + custom_site.unregister(UnorderedObject) + + # When no order is defined at all, everything is ordered by '-pk'. + check_results_order() + + # When an order field is defined but multiple records have the same + # value for that field, make sure everything gets ordered by -pk as well. + UnorderedObjectAdmin.ordering = ['bool'] + check_results_order() + + # When order fields are defined, including the pk itself, use them. + UnorderedObjectAdmin.ordering = ['bool', '-pk'] + check_results_order() + UnorderedObjectAdmin.ordering = ['bool', 'pk'] + check_results_order(ascending=True) + UnorderedObjectAdmin.ordering = ['-id', 'bool'] + check_results_order() + UnorderedObjectAdmin.ordering = ['id', 'bool'] + check_results_order(ascending=True) + + def test_deterministic_order_for_model_ordered_by_its_manager(self): + """ + The primary key is used in the ordering of the changelist's results to + guarantee a deterministic order, even when the model has a manager that + defines a default ordering (#17198). + """ + superuser = self._create_superuser('superuser') + + for counter in range(1, 51): + OrderedObject.objects.create(id=counter, bool=True, number=counter) + + class OrderedObjectAdmin(admin.ModelAdmin): + list_per_page = 10 + + def check_results_order(ascending=False): + custom_site.register(OrderedObject, OrderedObjectAdmin) + model_admin = OrderedObjectAdmin(OrderedObject, custom_site) + counter = 0 if ascending else 51 + for page in range(0, 5): + request = self._mocked_authenticated_request('/orderedobject/?p=%s' % page, superuser) + response = model_admin.changelist_view(request) + for result in response.context_data['cl'].result_list: + counter += 1 if ascending else -1 + self.assertEqual(result.id, counter) + custom_site.unregister(OrderedObject) + + # When no order is defined at all, use the model's default ordering (i.e. 'number') + check_results_order(ascending=True) + + # When an order field is defined but multiple records have the same + # value for that field, make sure everything gets ordered by -pk as well. + OrderedObjectAdmin.ordering = ['bool'] + check_results_order() + + # When order fields are defined, including the pk itself, use them. + OrderedObjectAdmin.ordering = ['bool', '-pk'] + check_results_order() + OrderedObjectAdmin.ordering = ['bool', 'pk'] + check_results_order(ascending=True) + OrderedObjectAdmin.ordering = ['-id', 'bool'] + check_results_order() + OrderedObjectAdmin.ordering = ['id', 'bool'] + check_results_order(ascending=True) + + def test_dynamic_list_filter(self): + """ + Regression tests for ticket #17646: dynamic list_filter support. + """ + parent = Parent.objects.create(name='parent') + for i in range(10): + Child.objects.create(name='child %s' % i, parent=parent) + + user_noparents = self._create_superuser('noparents') + user_parents = self._create_superuser('parents') + + # Test with user 'noparents' + m = DynamicListFilterChildAdmin(Child, custom_site) + request = self._mocked_authenticated_request('/child/', user_noparents) + response = m.changelist_view(request) + self.assertEqual(response.context_data['cl'].list_filter, ['name', 'age']) + + # Test with user 'parents' + m = DynamicListFilterChildAdmin(Child, custom_site) + request = self._mocked_authenticated_request('/child/', user_parents) + response = m.changelist_view(request) + self.assertEqual(response.context_data['cl'].list_filter, ('parent', 'name', 'age')) + + def test_dynamic_search_fields(self): + child = self._create_superuser('child') + m = DynamicSearchFieldsChildAdmin(Child, custom_site) + request = self._mocked_authenticated_request('/child/', child) + response = m.changelist_view(request) + self.assertEqual(response.context_data['cl'].search_fields, ('name', 'age')) + + def test_pagination_page_range(self): + """ + Regression tests for ticket #15653: ensure the number of pages + generated for changelist views are correct. + """ + # instantiating and setting up ChangeList object + m = GroupAdmin(Group, custom_site) + request = self.factory.get('/group/') + request.user = self.superuser + cl = m.get_changelist_instance(request) + per_page = cl.list_per_page = 10 + + for page_num, objects_count, expected_page_range in [ + (0, per_page, []), + (0, per_page * 2, list(range(2))), + (5, per_page * 11, list(range(11))), + (5, per_page * 12, [0, 1, 2, 3, 4, 5, 6, 7, 8, '.', 10, 11]), + (6, per_page * 12, [0, 1, '.', 3, 4, 5, 6, 7, 8, 9, 10, 11]), + (6, per_page * 13, [0, 1, '.', 3, 4, 5, 6, 7, 8, 9, '.', 11, 12]), + ]: + # assuming we have exactly `objects_count` objects + Group.objects.all().delete() + for i in range(objects_count): + Group.objects.create(name='test band') + + # setting page number and calculating page range + cl.page_num = page_num + cl.get_results(request) + real_page_range = pagination(cl)['page_range'] + self.assertEqual(expected_page_range, list(real_page_range)) + + def test_object_tools_displayed_no_add_permission(self): + """ + When ModelAdmin.has_add_permission() returns False, the object-tools + block is still shown. + """ + superuser = self._create_superuser('superuser') + m = EventAdmin(Event, custom_site) + request = self._mocked_authenticated_request('/event/', superuser) + self.assertFalse(m.has_add_permission(request)) + response = m.changelist_view(request) + self.assertIn('
    ', response.rendered_content) + # The "Add" button inside the object-tools shouldn't appear. + self.assertNotIn('Add ', response.rendered_content) + + +class GetAdminLogTests(TestCase): + + def test_custom_user_pk_not_named_id(self): + """ + {% get_admin_log %} works if the user model's primary key isn't named + 'id'. + """ + context = Context({'user': CustomIdUser()}) + template = Template('{% load log %}{% get_admin_log 10 as admin_log for_user user %}') + # This template tag just logs. + self.assertEqual(template.render(context), '') + + def test_no_user(self): + """{% get_admin_log %} works without specifying a user.""" + user = User(username='jondoe', password='secret', email='super@example.com') + user.save() + ct = ContentType.objects.get_for_model(User) + LogEntry.objects.log_action(user.pk, ct.pk, user.pk, repr(user), 1) + t = Template( + '{% load log %}' + '{% get_admin_log 100 as admin_log %}' + '{% for entry in admin_log %}' + '{{ entry|safe }}' + '{% endfor %}' + ) + self.assertEqual(t.render(Context({})), 'Added "".') + + def test_missing_args(self): + msg = "'get_admin_log' statements require two arguments" + with self.assertRaisesMessage(TemplateSyntaxError, msg): + Template('{% load log %}{% get_admin_log 10 as %}') + + def test_non_integer_limit(self): + msg = "First argument to 'get_admin_log' must be an integer" + with self.assertRaisesMessage(TemplateSyntaxError, msg): + Template('{% load log %}{% get_admin_log "10" as admin_log for_user user %}') + + def test_without_as(self): + msg = "Second argument to 'get_admin_log' must be 'as'" + with self.assertRaisesMessage(TemplateSyntaxError, msg): + Template('{% load log %}{% get_admin_log 10 ad admin_log for_user user %}') + + def test_without_for_user(self): + msg = "Fourth argument to 'get_admin_log' must be 'for_user'" + with self.assertRaisesMessage(TemplateSyntaxError, msg): + Template('{% load log %}{% get_admin_log 10 as admin_log foruser user %}') + + +@override_settings(ROOT_URLCONF='admin_changelist.urls') +class SeleniumTests(AdminSeleniumTestCase): + + available_apps = ['admin_changelist'] + AdminSeleniumTestCase.available_apps + + def setUp(self): + User.objects.create_superuser(username='super', password='secret', email=None) + + def test_add_row_selection(self): + """ + The status line for selected rows gets updated correctly (#22038). + """ + self.admin_login(username='super', password='secret') + self.selenium.get(self.live_server_url + reverse('admin:auth_user_changelist')) + + form_id = '#changelist-form' + + # Test amount of rows in the Changelist + rows = self.selenium.find_elements_by_css_selector( + '%s #result_list tbody tr' % form_id) + self.assertEqual(len(rows), 1) + + # Test current selection + selection_indicator = self.selenium.find_element_by_css_selector( + '%s .action-counter' % form_id) + self.assertEqual(selection_indicator.text, "0 of 1 selected") + + # Select a row and check again + row_selector = self.selenium.find_element_by_css_selector( + '%s #result_list tbody tr:first-child .action-select' % form_id) + row_selector.click() + self.assertEqual(selection_indicator.text, "1 of 1 selected") diff --git a/tests/django_tests/tests/v21/tests/admin_changelist/urls.py b/tests/django_tests/tests/v21/tests/admin_changelist/urls.py new file mode 100644 index 00000000..1f553a85 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_changelist/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import url + +from . import admin + +urlpatterns = [ + url(r'^admin/', admin.site.urls), +] diff --git a/tests/django_tests/tests/v21/tests/admin_checks/__init__.py b/tests/django_tests/tests/v21/tests/admin_checks/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/admin_checks/models.py b/tests/django_tests/tests/v21/tests/admin_checks/models.py new file mode 100644 index 00000000..3336ce87 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_checks/models.py @@ -0,0 +1,66 @@ +""" +Tests of ModelAdmin system checks logic. +""" + +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.db import models + + +class Album(models.Model): + title = models.CharField(max_length=150) + + +class Song(models.Model): + title = models.CharField(max_length=150) + album = models.ForeignKey(Album, models.CASCADE) + original_release = models.DateField(editable=False) + + class Meta: + ordering = ('title',) + + def __str__(self): + return self.title + + def readonly_method_on_model(self): + # does nothing + pass + + +class TwoAlbumFKAndAnE(models.Model): + album1 = models.ForeignKey(Album, models.CASCADE, related_name="album1_set") + album2 = models.ForeignKey(Album, models.CASCADE, related_name="album2_set") + e = models.CharField(max_length=1) + + +class Author(models.Model): + name = models.CharField(max_length=100) + + +class Book(models.Model): + name = models.CharField(max_length=100) + subtitle = models.CharField(max_length=100) + price = models.FloatField() + authors = models.ManyToManyField(Author, through='AuthorsBooks') + + +class AuthorsBooks(models.Model): + author = models.ForeignKey(Author, models.CASCADE) + book = models.ForeignKey(Book, models.CASCADE) + featured = models.BooleanField() + + +class State(models.Model): + name = models.CharField(max_length=15) + + +class City(models.Model): + state = models.ForeignKey(State, models.CASCADE) + + +class Influence(models.Model): + name = models.TextField() + + content_type = models.ForeignKey(ContentType, models.CASCADE) + object_id = models.PositiveIntegerField() + content_object = GenericForeignKey('content_type', 'object_id') diff --git a/tests/django_tests/tests/v21/tests/admin_checks/tests.py b/tests/django_tests/tests/v21/tests/admin_checks/tests.py new file mode 100644 index 00000000..f4fabef3 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_checks/tests.py @@ -0,0 +1,783 @@ +from django import forms +from django.contrib import admin +from django.contrib.admin import AdminSite +from django.contrib.contenttypes.admin import GenericStackedInline +from django.core import checks +from django.test import SimpleTestCase, override_settings + +from .models import ( + Album, Author, Book, City, Influence, Song, State, TwoAlbumFKAndAnE, +) + + +class SongForm(forms.ModelForm): + pass + + +class ValidFields(admin.ModelAdmin): + form = SongForm + fields = ['title'] + + +class ValidFormFieldsets(admin.ModelAdmin): + def get_form(self, request, obj=None, **kwargs): + class ExtraFieldForm(SongForm): + name = forms.CharField(max_length=50) + return ExtraFieldForm + + fieldsets = ( + (None, { + 'fields': ('name',), + }), + ) + + +class MyAdmin(admin.ModelAdmin): + def check(self, **kwargs): + return ['error!'] + + +@override_settings( + SILENCED_SYSTEM_CHECKS=['fields.W342'], # ForeignKey(unique=True) + INSTALLED_APPS=['django.contrib.auth', 'django.contrib.contenttypes', 'admin_checks'] +) +class SystemChecksTestCase(SimpleTestCase): + + def test_checks_are_performed(self): + admin.site.register(Song, MyAdmin) + try: + errors = checks.run_checks() + expected = ['error!'] + self.assertEqual(errors, expected) + finally: + admin.site.unregister(Song) + + @override_settings(INSTALLED_APPS=['django.contrib.admin']) + def test_contenttypes_dependency(self): + errors = admin.checks.check_dependencies() + expected = [ + checks.Error( + "'django.contrib.contenttypes' must be in " + "INSTALLED_APPS in order to use the admin application.", + id="admin.E401", + ) + ] + self.assertEqual(errors, expected) + + @override_settings(TEMPLATES=[]) + def test_no_template_engines(self): + self.assertEqual(admin.checks.check_dependencies(), []) + + @override_settings( + INSTALLED_APPS=[ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + ], + TEMPLATES=[{ + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [], + }, + }], + ) + def test_auth_contextprocessor_dependency(self): + errors = admin.checks.check_dependencies() + expected = [ + checks.Error( + "'django.contrib.auth.context_processors.auth' must be in " + "TEMPLATES in order to use the admin application.", + id="admin.E402", + ) + ] + self.assertEqual(errors, expected) + + def test_custom_adminsite(self): + class CustomAdminSite(admin.AdminSite): + pass + + custom_site = CustomAdminSite() + custom_site.register(Song, MyAdmin) + try: + errors = checks.run_checks() + expected = ['error!'] + self.assertEqual(errors, expected) + finally: + custom_site.unregister(Song) + + def test_allows_checks_relying_on_other_modeladmins(self): + class MyBookAdmin(admin.ModelAdmin): + def check(self, **kwargs): + errors = super().check(**kwargs) + author_admin = self.admin_site._registry.get(Author) + if author_admin is None: + errors.append('AuthorAdmin missing!') + return errors + + class MyAuthorAdmin(admin.ModelAdmin): + pass + + admin.site.register(Book, MyBookAdmin) + admin.site.register(Author, MyAuthorAdmin) + try: + self.assertEqual(admin.site.check(None), []) + finally: + admin.site.unregister(Book) + admin.site.unregister(Author) + + def test_field_name_not_in_list_display(self): + class SongAdmin(admin.ModelAdmin): + list_editable = ["original_release"] + + errors = SongAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'list_editable[0]' refers to 'original_release', " + "which is not contained in 'list_display'.", + obj=SongAdmin, + id='admin.E122', + ) + ] + self.assertEqual(errors, expected) + + def test_list_editable_not_a_list_or_tuple(self): + class SongAdmin(admin.ModelAdmin): + list_editable = 'test' + + self.assertEqual(SongAdmin(Song, AdminSite()).check(), [ + checks.Error( + "The value of 'list_editable' must be a list or tuple.", + obj=SongAdmin, + id='admin.E120', + ) + ]) + + def test_list_editable_missing_field(self): + class SongAdmin(admin.ModelAdmin): + list_editable = ('test',) + + self.assertEqual(SongAdmin(Song, AdminSite()).check(), [ + checks.Error( + "The value of 'list_editable[0]' refers to 'test', which is " + "not an attribute of 'admin_checks.Song'.", + obj=SongAdmin, + id='admin.E121', + ) + ]) + + def test_readonly_and_editable(self): + class SongAdmin(admin.ModelAdmin): + readonly_fields = ["original_release"] + list_display = ["pk", "original_release"] + list_editable = ["original_release"] + fieldsets = [ + (None, { + "fields": ["title", "original_release"], + }), + ] + errors = SongAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'list_editable[0]' refers to 'original_release', " + "which is not editable through the admin.", + obj=SongAdmin, + id='admin.E125', + ) + ] + self.assertEqual(errors, expected) + + def test_editable(self): + class SongAdmin(admin.ModelAdmin): + list_display = ["pk", "title"] + list_editable = ["title"] + fieldsets = [ + (None, { + "fields": ["title", "original_release"], + }), + ] + + errors = SongAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_custom_modelforms_with_fields_fieldsets(self): + """ + # Regression test for #8027: custom ModelForms with fields/fieldsets + """ + errors = ValidFields(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_custom_get_form_with_fieldsets(self): + """ + The fieldsets checks are skipped when the ModelAdmin.get_form() method + is overridden. + """ + errors = ValidFormFieldsets(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_fieldsets_fields_non_tuple(self): + """ + The first fieldset's fields must be a list/tuple. + """ + class NotATupleAdmin(admin.ModelAdmin): + list_display = ["pk", "title"] + list_editable = ["title"] + fieldsets = [ + (None, { + "fields": "title" # not a tuple + }), + ] + + errors = NotATupleAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'fieldsets[0][1]['fields']' must be a list or tuple.", + obj=NotATupleAdmin, + id='admin.E008', + ) + ] + self.assertEqual(errors, expected) + + def test_nonfirst_fieldset(self): + """ + The second fieldset's fields must be a list/tuple. + """ + class NotATupleAdmin(admin.ModelAdmin): + fieldsets = [ + (None, { + "fields": ("title",) + }), + ('foo', { + "fields": "author" # not a tuple + }), + ] + + errors = NotATupleAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'fieldsets[1][1]['fields']' must be a list or tuple.", + obj=NotATupleAdmin, + id='admin.E008', + ) + ] + self.assertEqual(errors, expected) + + def test_exclude_values(self): + """ + Tests for basic system checks of 'exclude' option values (#12689) + """ + class ExcludedFields1(admin.ModelAdmin): + exclude = 'foo' + + errors = ExcludedFields1(Book, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'exclude' must be a list or tuple.", + obj=ExcludedFields1, + id='admin.E014', + ) + ] + self.assertEqual(errors, expected) + + def test_exclude_duplicate_values(self): + class ExcludedFields2(admin.ModelAdmin): + exclude = ('name', 'name') + + errors = ExcludedFields2(Book, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'exclude' contains duplicate field(s).", + obj=ExcludedFields2, + id='admin.E015', + ) + ] + self.assertEqual(errors, expected) + + def test_exclude_in_inline(self): + class ExcludedFieldsInline(admin.TabularInline): + model = Song + exclude = 'foo' + + class ExcludedFieldsAlbumAdmin(admin.ModelAdmin): + model = Album + inlines = [ExcludedFieldsInline] + + errors = ExcludedFieldsAlbumAdmin(Album, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'exclude' must be a list or tuple.", + obj=ExcludedFieldsInline, + id='admin.E014', + ) + ] + self.assertEqual(errors, expected) + + def test_exclude_inline_model_admin(self): + """ + Regression test for #9932 - exclude in InlineModelAdmin should not + contain the ForeignKey field used in ModelAdmin.model + """ + class SongInline(admin.StackedInline): + model = Song + exclude = ['album'] + + class AlbumAdmin(admin.ModelAdmin): + model = Album + inlines = [SongInline] + + errors = AlbumAdmin(Album, AdminSite()).check() + expected = [ + checks.Error( + "Cannot exclude the field 'album', because it is the foreign key " + "to the parent model 'admin_checks.Album'.", + obj=SongInline, + id='admin.E201', + ) + ] + self.assertEqual(errors, expected) + + def test_valid_generic_inline_model_admin(self): + """ + Regression test for #22034 - check that generic inlines don't look for + normal ForeignKey relations. + """ + class InfluenceInline(GenericStackedInline): + model = Influence + + class SongAdmin(admin.ModelAdmin): + inlines = [InfluenceInline] + + errors = SongAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_generic_inline_model_admin_non_generic_model(self): + """ + A model without a GenericForeignKey raises problems if it's included + in a GenericInlineModelAdmin definition. + """ + class BookInline(GenericStackedInline): + model = Book + + class SongAdmin(admin.ModelAdmin): + inlines = [BookInline] + + errors = SongAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "'admin_checks.Book' has no GenericForeignKey.", + obj=BookInline, + id='admin.E301', + ) + ] + self.assertEqual(errors, expected) + + def test_generic_inline_model_admin_bad_ct_field(self): + """ + A GenericInlineModelAdmin errors if the ct_field points to a + nonexistent field. + """ + class InfluenceInline(GenericStackedInline): + model = Influence + ct_field = 'nonexistent' + + class SongAdmin(admin.ModelAdmin): + inlines = [InfluenceInline] + + errors = SongAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "'ct_field' references 'nonexistent', which is not a field on 'admin_checks.Influence'.", + obj=InfluenceInline, + id='admin.E302', + ) + ] + self.assertEqual(errors, expected) + + def test_generic_inline_model_admin_bad_fk_field(self): + """ + A GenericInlineModelAdmin errors if the ct_fk_field points to a + nonexistent field. + """ + class InfluenceInline(GenericStackedInline): + model = Influence + ct_fk_field = 'nonexistent' + + class SongAdmin(admin.ModelAdmin): + inlines = [InfluenceInline] + + errors = SongAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "'ct_fk_field' references 'nonexistent', which is not a field on 'admin_checks.Influence'.", + obj=InfluenceInline, + id='admin.E303', + ) + ] + self.assertEqual(errors, expected) + + def test_generic_inline_model_admin_non_gfk_ct_field(self): + """ + A GenericInlineModelAdmin raises problems if the ct_field points to a + field that isn't part of a GenericForeignKey. + """ + class InfluenceInline(GenericStackedInline): + model = Influence + ct_field = 'name' + + class SongAdmin(admin.ModelAdmin): + inlines = [InfluenceInline] + + errors = SongAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "'admin_checks.Influence' has no GenericForeignKey using " + "content type field 'name' and object ID field 'object_id'.", + obj=InfluenceInline, + id='admin.E304', + ) + ] + self.assertEqual(errors, expected) + + def test_generic_inline_model_admin_non_gfk_fk_field(self): + """ + A GenericInlineModelAdmin raises problems if the ct_fk_field points to + a field that isn't part of a GenericForeignKey. + """ + class InfluenceInline(GenericStackedInline): + model = Influence + ct_fk_field = 'name' + + class SongAdmin(admin.ModelAdmin): + inlines = [InfluenceInline] + + errors = SongAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "'admin_checks.Influence' has no GenericForeignKey using " + "content type field 'content_type' and object ID field 'name'.", + obj=InfluenceInline, + id='admin.E304', + ) + ] + self.assertEqual(errors, expected) + + def test_app_label_in_admin_checks(self): + class RawIdNonexistentAdmin(admin.ModelAdmin): + raw_id_fields = ('nonexistent',) + + errors = RawIdNonexistentAdmin(Album, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'raw_id_fields[0]' refers to 'nonexistent', " + "which is not an attribute of 'admin_checks.Album'.", + obj=RawIdNonexistentAdmin, + id='admin.E002', + ) + ] + self.assertEqual(errors, expected) + + def test_fk_exclusion(self): + """ + Regression test for #11709 - when testing for fk excluding (when exclude is + given) make sure fk_name is honored or things blow up when there is more + than one fk to the parent model. + """ + class TwoAlbumFKAndAnEInline(admin.TabularInline): + model = TwoAlbumFKAndAnE + exclude = ("e",) + fk_name = "album1" + + class MyAdmin(admin.ModelAdmin): + inlines = [TwoAlbumFKAndAnEInline] + + errors = MyAdmin(Album, AdminSite()).check() + self.assertEqual(errors, []) + + def test_inline_self_check(self): + class TwoAlbumFKAndAnEInline(admin.TabularInline): + model = TwoAlbumFKAndAnE + + class MyAdmin(admin.ModelAdmin): + inlines = [TwoAlbumFKAndAnEInline] + + errors = MyAdmin(Album, AdminSite()).check() + expected = [ + checks.Error( + "'admin_checks.TwoAlbumFKAndAnE' has more than one ForeignKey to 'admin_checks.Album'.", + obj=TwoAlbumFKAndAnEInline, + id='admin.E202', + ) + ] + self.assertEqual(errors, expected) + + def test_inline_with_specified(self): + class TwoAlbumFKAndAnEInline(admin.TabularInline): + model = TwoAlbumFKAndAnE + fk_name = "album1" + + class MyAdmin(admin.ModelAdmin): + inlines = [TwoAlbumFKAndAnEInline] + + errors = MyAdmin(Album, AdminSite()).check() + self.assertEqual(errors, []) + + def test_readonly(self): + class SongAdmin(admin.ModelAdmin): + readonly_fields = ("title",) + + errors = SongAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_readonly_on_method(self): + def my_function(obj): + pass + + class SongAdmin(admin.ModelAdmin): + readonly_fields = (my_function,) + + errors = SongAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_readonly_on_modeladmin(self): + class SongAdmin(admin.ModelAdmin): + readonly_fields = ("readonly_method_on_modeladmin",) + + def readonly_method_on_modeladmin(self, obj): + pass + + errors = SongAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_readonly_dynamic_attribute_on_modeladmin(self): + class SongAdmin(admin.ModelAdmin): + readonly_fields = ("dynamic_method",) + + def __getattr__(self, item): + if item == "dynamic_method": + def method(obj): + pass + return method + raise AttributeError + + errors = SongAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_readonly_method_on_model(self): + class SongAdmin(admin.ModelAdmin): + readonly_fields = ("readonly_method_on_model",) + + errors = SongAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_nonexistent_field(self): + class SongAdmin(admin.ModelAdmin): + readonly_fields = ("title", "nonexistent") + + errors = SongAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'readonly_fields[1]' is not a callable, an attribute " + "of 'SongAdmin', or an attribute of 'admin_checks.Song'.", + obj=SongAdmin, + id='admin.E035', + ) + ] + self.assertEqual(errors, expected) + + def test_nonexistent_field_on_inline(self): + class CityInline(admin.TabularInline): + model = City + readonly_fields = ['i_dont_exist'] # Missing attribute + + errors = CityInline(State, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'readonly_fields[0]' is not a callable, an attribute " + "of 'CityInline', or an attribute of 'admin_checks.City'.", + obj=CityInline, + id='admin.E035', + ) + ] + self.assertEqual(errors, expected) + + def test_readonly_fields_not_list_or_tuple(self): + class SongAdmin(admin.ModelAdmin): + readonly_fields = 'test' + + self.assertEqual(SongAdmin(Song, AdminSite()).check(), [ + checks.Error( + "The value of 'readonly_fields' must be a list or tuple.", + obj=SongAdmin, + id='admin.E034', + ) + ]) + + def test_extra(self): + class SongAdmin(admin.ModelAdmin): + def awesome_song(self, instance): + if instance.title == "Born to Run": + return "Best Ever!" + return "Status unknown." + + errors = SongAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_readonly_lambda(self): + class SongAdmin(admin.ModelAdmin): + readonly_fields = (lambda obj: "test",) + + errors = SongAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_graceful_m2m_fail(self): + """ + Regression test for #12203/#12237 - Fail more gracefully when a M2M field that + specifies the 'through' option is included in the 'fields' or the 'fieldsets' + ModelAdmin options. + """ + class BookAdmin(admin.ModelAdmin): + fields = ['authors'] + + errors = BookAdmin(Book, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'fields' cannot include the ManyToManyField 'authors', " + "because that field manually specifies a relationship model.", + obj=BookAdmin, + id='admin.E013', + ) + ] + self.assertEqual(errors, expected) + + def test_cannot_include_through(self): + class FieldsetBookAdmin(admin.ModelAdmin): + fieldsets = ( + ('Header 1', {'fields': ('name',)}), + ('Header 2', {'fields': ('authors',)}), + ) + + errors = FieldsetBookAdmin(Book, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'fieldsets[1][1][\"fields\"]' cannot include the ManyToManyField " + "'authors', because that field manually specifies a relationship model.", + obj=FieldsetBookAdmin, + id='admin.E013', + ) + ] + self.assertEqual(errors, expected) + + def test_nested_fields(self): + class NestedFieldsAdmin(admin.ModelAdmin): + fields = ('price', ('name', 'subtitle')) + + errors = NestedFieldsAdmin(Book, AdminSite()).check() + self.assertEqual(errors, []) + + def test_nested_fieldsets(self): + class NestedFieldsetAdmin(admin.ModelAdmin): + fieldsets = ( + ('Main', {'fields': ('price', ('name', 'subtitle'))}), + ) + + errors = NestedFieldsetAdmin(Book, AdminSite()).check() + self.assertEqual(errors, []) + + def test_explicit_through_override(self): + """ + Regression test for #12209 -- If the explicitly provided through model + is specified as a string, the admin should still be able use + Model.m2m_field.through + """ + class AuthorsInline(admin.TabularInline): + model = Book.authors.through + + class BookAdmin(admin.ModelAdmin): + inlines = [AuthorsInline] + + errors = BookAdmin(Book, AdminSite()).check() + self.assertEqual(errors, []) + + def test_non_model_fields(self): + """ + Regression for ensuring ModelAdmin.fields can contain non-model fields + that broke with r11737 + """ + class SongForm(forms.ModelForm): + extra_data = forms.CharField() + + class FieldsOnFormOnlyAdmin(admin.ModelAdmin): + form = SongForm + fields = ['title', 'extra_data'] + + errors = FieldsOnFormOnlyAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_non_model_first_field(self): + """ + Regression for ensuring ModelAdmin.field can handle first elem being a + non-model field (test fix for UnboundLocalError introduced with r16225). + """ + class SongForm(forms.ModelForm): + extra_data = forms.CharField() + + class Meta: + model = Song + fields = '__all__' + + class FieldsOnFormOnlyAdmin(admin.ModelAdmin): + form = SongForm + fields = ['extra_data', 'title'] + + errors = FieldsOnFormOnlyAdmin(Song, AdminSite()).check() + self.assertEqual(errors, []) + + def test_check_sublists_for_duplicates(self): + class MyModelAdmin(admin.ModelAdmin): + fields = ['state', ['state']] + + errors = MyModelAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "The value of 'fields' contains duplicate field(s).", + obj=MyModelAdmin, + id='admin.E006' + ) + ] + self.assertEqual(errors, expected) + + def test_check_fieldset_sublists_for_duplicates(self): + class MyModelAdmin(admin.ModelAdmin): + fieldsets = [ + (None, { + 'fields': ['title', 'album', ('title', 'album')] + }), + ] + + errors = MyModelAdmin(Song, AdminSite()).check() + expected = [ + checks.Error( + "There are duplicate field(s) in 'fieldsets[0][1]'.", + obj=MyModelAdmin, + id='admin.E012' + ) + ] + self.assertEqual(errors, expected) + + def test_list_filter_works_on_through_field_even_when_apps_not_ready(self): + """ + Ensure list_filter can access reverse fields even when the app registry + is not ready; refs #24146. + """ + class BookAdminWithListFilter(admin.ModelAdmin): + list_filter = ['authorsbooks__featured'] + + # Temporarily pretending apps are not ready yet. This issue can happen + # if the value of 'list_filter' refers to a 'through__field'. + Book._meta.apps.ready = False + try: + errors = BookAdminWithListFilter(Book, AdminSite()).check() + self.assertEqual(errors, []) + finally: + Book._meta.apps.ready = True diff --git a/tests/django_tests/tests/v21/tests/admin_custom_urls/__init__.py b/tests/django_tests/tests/v21/tests/admin_custom_urls/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/admin_custom_urls/models.py b/tests/django_tests/tests/v21/tests/admin_custom_urls/models.py new file mode 100644 index 00000000..1fc30ec1 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_custom_urls/models.py @@ -0,0 +1,83 @@ +from functools import update_wrapper + +from django.contrib import admin +from django.db import models +from django.http import HttpResponseRedirect +from django.urls import reverse + + +class Action(models.Model): + name = models.CharField(max_length=50, primary_key=True) + description = models.CharField(max_length=70) + + def __str__(self): + return self.name + + +class ActionAdmin(admin.ModelAdmin): + """ + A ModelAdmin for the Action model that changes the URL of the add_view + to '//!add/' + The Action model has a CharField PK. + """ + + list_display = ('name', 'description') + + def remove_url(self, name): + """ + Remove all entries named 'name' from the ModelAdmin instance URL + patterns list + """ + return [url for url in super().get_urls() if url.name != name] + + def get_urls(self): + # Add the URL of our custom 'add_view' view to the front of the URLs + # list. Remove the existing one(s) first + from django.conf.urls import url + + def wrap(view): + def wrapper(*args, **kwargs): + return self.admin_site.admin_view(view)(*args, **kwargs) + return update_wrapper(wrapper, view) + + info = self.model._meta.app_label, self.model._meta.model_name + + view_name = '%s_%s_add' % info + + return [ + url(r'^!add/$', wrap(self.add_view), name=view_name), + ] + self.remove_url(view_name) + + +class Person(models.Model): + name = models.CharField(max_length=20) + + +class PersonAdmin(admin.ModelAdmin): + + def response_post_save_add(self, request, obj): + return HttpResponseRedirect( + reverse('admin:admin_custom_urls_person_history', args=[obj.pk])) + + def response_post_save_change(self, request, obj): + return HttpResponseRedirect( + reverse('admin:admin_custom_urls_person_delete', args=[obj.pk])) + + +class Car(models.Model): + name = models.CharField(max_length=20) + + +class CarAdmin(admin.ModelAdmin): + + def response_add(self, request, obj, post_url_continue=None): + return super().response_add( + request, obj, + post_url_continue=reverse('admin:admin_custom_urls_car_history', args=[obj.pk]), + ) + + +site = admin.AdminSite(name='admin_custom_urls') +site.register(Action, ActionAdmin) +site.register(Person, PersonAdmin) +site.register(Car, CarAdmin) diff --git a/tests/django_tests/tests/v21/tests/admin_custom_urls/tests.py b/tests/django_tests/tests/v21/tests/admin_custom_urls/tests.py new file mode 100644 index 00000000..e0c2d4f7 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_custom_urls/tests.py @@ -0,0 +1,120 @@ +from django.contrib.admin.utils import quote +from django.contrib.auth.models import User +from django.template.response import TemplateResponse +from django.test import TestCase, override_settings +from django.urls import reverse + +from .models import Action, Car, Person + + +@override_settings(ROOT_URLCONF='admin_custom_urls.urls',) +class AdminCustomUrlsTest(TestCase): + """ + Remember that: + * The Action model has a CharField PK. + * The ModelAdmin for Action customizes the add_view URL, it's + '//!add/' + """ + + @classmethod + def setUpTestData(cls): + cls.superuser = User.objects.create_superuser(username='super', password='secret', email='super@example.com') + Action.objects.create(name='delete', description='Remove things.') + Action.objects.create(name='rename', description='Gives things other names.') + Action.objects.create(name='add', description='Add things.') + Action.objects.create(name='path/to/file/', description="An action with '/' in its name.") + Action.objects.create( + name='path/to/html/document.html', + description='An action with a name similar to a HTML doc path.' + ) + Action.objects.create( + name='javascript:alert(\'Hello world\');">Click here', + description='An action with a name suspected of being a XSS attempt' + ) + + def setUp(self): + self.client.force_login(self.superuser) + + def test_basic_add_GET(self): + """ + Ensure GET on the add_view works. + """ + add_url = reverse('admin_custom_urls:admin_custom_urls_action_add') + self.assertTrue(add_url.endswith('/!add/')) + response = self.client.get(add_url) + self.assertIsInstance(response, TemplateResponse) + self.assertEqual(response.status_code, 200) + + def test_add_with_GET_args(self): + """ + Ensure GET on the add_view plus specifying a field value in the query + string works. + """ + response = self.client.get(reverse('admin_custom_urls:admin_custom_urls_action_add'), {'name': 'My Action'}) + self.assertContains(response, 'value="My Action"') + + def test_basic_add_POST(self): + """ + Ensure POST on add_view works. + """ + post_data = { + '_popup': '1', + "name": 'Action added through a popup', + "description": "Description of added action", + } + response = self.client.post(reverse('admin_custom_urls:admin_custom_urls_action_add'), post_data) + self.assertContains(response, 'Action added through a popup') + + def test_admin_URLs_no_clash(self): + # Should get the change_view for model instance with PK 'add', not show + # the add_view + url = reverse('admin_custom_urls:%s_action_change' % Action._meta.app_label, args=(quote('add'),)) + response = self.client.get(url) + self.assertContains(response, 'Change action') + + # Should correctly get the change_view for the model instance with the + # funny-looking PK (the one with a 'path/to/html/document.html' value) + url = reverse( + 'admin_custom_urls:%s_action_change' % Action._meta.app_label, + args=(quote("path/to/html/document.html"),) + ) + response = self.client.get(url) + self.assertContains(response, 'Change action') + self.assertContains(response, 'value="path/to/html/document.html"') + + def test_post_save_add_redirect(self): + """ + ModelAdmin.response_post_save_add() controls the redirection after + the 'Save' button has been pressed when adding a new object. + """ + post_data = {'name': 'John Doe'} + self.assertEqual(Person.objects.count(), 0) + response = self.client.post(reverse('admin_custom_urls:admin_custom_urls_person_add'), post_data) + persons = Person.objects.all() + self.assertEqual(len(persons), 1) + redirect_url = reverse('admin_custom_urls:admin_custom_urls_person_history', args=[persons[0].pk]) + self.assertRedirects(response, redirect_url) + + def test_post_save_change_redirect(self): + """ + ModelAdmin.response_post_save_change() controls the redirection after + the 'Save' button has been pressed when editing an existing object. + """ + Person.objects.create(name='John Doe') + self.assertEqual(Person.objects.count(), 1) + person = Person.objects.all()[0] + post_url = reverse('admin_custom_urls:admin_custom_urls_person_change', args=[person.pk]) + response = self.client.post(post_url, {'name': 'Jack Doe'}) + self.assertRedirects(response, reverse('admin_custom_urls:admin_custom_urls_person_delete', args=[person.pk])) + + def test_post_url_continue(self): + """ + The ModelAdmin.response_add()'s parameter `post_url_continue` controls + the redirection after an object has been created. + """ + post_data = {'name': 'SuperFast', '_continue': '1'} + self.assertEqual(Car.objects.count(), 0) + response = self.client.post(reverse('admin_custom_urls:admin_custom_urls_car_add'), post_data) + cars = Car.objects.all() + self.assertEqual(len(cars), 1) + self.assertRedirects(response, reverse('admin_custom_urls:admin_custom_urls_car_history', args=[cars[0].pk])) diff --git a/tests/django_tests/tests/v21/tests/admin_custom_urls/urls.py b/tests/django_tests/tests/v21/tests/admin_custom_urls/urls.py new file mode 100644 index 00000000..b07e1395 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_custom_urls/urls.py @@ -0,0 +1,7 @@ +from django.conf.urls import url + +from .models import site + +urlpatterns = [ + url(r'^admin/', site.urls), +] diff --git a/tests/django_tests/tests/v21/tests/admin_default_site/__init__.py b/tests/django_tests/tests/v21/tests/admin_default_site/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/admin_default_site/apps.py b/tests/django_tests/tests/v21/tests/admin_default_site/apps.py new file mode 100644 index 00000000..92743c18 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_default_site/apps.py @@ -0,0 +1,6 @@ +from django.contrib.admin.apps import SimpleAdminConfig + + +class MyCustomAdminConfig(SimpleAdminConfig): + verbose_name = 'My custom default admin site.' + default_site = 'admin_default_site.sites.CustomAdminSite' diff --git a/tests/django_tests/tests/v21/tests/admin_default_site/sites.py b/tests/django_tests/tests/v21/tests/admin_default_site/sites.py new file mode 100644 index 00000000..f2c33bd7 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_default_site/sites.py @@ -0,0 +1,5 @@ +from django.contrib import admin + + +class CustomAdminSite(admin.AdminSite): + pass diff --git a/tests/django_tests/tests/v21/tests/admin_default_site/tests.py b/tests/django_tests/tests/v21/tests/admin_default_site/tests.py new file mode 100644 index 00000000..5d05ec9c --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_default_site/tests.py @@ -0,0 +1,31 @@ +from django.contrib import admin +from django.contrib.admin import sites +from django.test import SimpleTestCase, override_settings + + +@override_settings(INSTALLED_APPS=[ + 'admin_default_site.apps.MyCustomAdminConfig', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +]) +class CustomAdminSiteTests(SimpleTestCase): + + def setUp(self): + # Reset admin.site since it may have already been instantiated by + # another test app. + self._old_site = admin.site + admin.site = sites.site = sites.DefaultAdminSite() + + def tearDown(self): + admin.site = sites.site = self._old_site + + def test_use_custom_admin_site(self): + self.assertEqual(admin.site.__class__.__name__, 'CustomAdminSite') + + +class DefaultAdminSiteTests(SimpleTestCase): + def test_use_default_admin_site(self): + self.assertEqual(admin.site.__class__.__name__, 'AdminSite') diff --git a/tests/django_tests/tests/v21/tests/admin_docs/__init__.py b/tests/django_tests/tests/v21/tests/admin_docs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/admin_docs/evilfile.txt b/tests/django_tests/tests/v21/tests/admin_docs/evilfile.txt new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/admin_docs/models.py b/tests/django_tests/tests/v21/tests/admin_docs/models.py new file mode 100644 index 00000000..a425ae0f --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_docs/models.py @@ -0,0 +1,80 @@ +""" +Models for testing various aspects of the djang.contrib.admindocs app +""" + +from django.db import models + + +class Company(models.Model): + name = models.CharField(max_length=200) + + +class Group(models.Model): + name = models.CharField(max_length=200) + + +class Family(models.Model): + last_name = models.CharField(max_length=200) + + +class Person(models.Model): + """ + Stores information about a person, related to :model:`myapp.Company`. + + **Notes** + + Use ``save_changes()`` when saving this object. + + ``company`` + Field storing :model:`myapp.Company` where the person works. + + (DESCRIPTION) + + .. raw:: html + :file: admin_docs/evilfile.txt + + .. include:: admin_docs/evilfile.txt + """ + first_name = models.CharField(max_length=200, help_text="The person's first name") + last_name = models.CharField(max_length=200, help_text="The person's last name") + company = models.ForeignKey(Company, models.CASCADE, help_text="place of work") + family = models.ForeignKey(Family, models.SET_NULL, related_name='+', null=True) + groups = models.ManyToManyField(Group, help_text="has membership") + + def _get_full_name(self): + return "%s %s" % (self.first_name, self.last_name) + + def rename_company(self, new_name): + self.company.name = new_name + self.company.save() + return new_name + + def dummy_function(self, baz, rox, *some_args, **some_kwargs): + return some_kwargs + + def suffix_company_name(self, suffix='ltd'): + return self.company.name + suffix + + def add_image(self): + pass + + def delete_image(self): + pass + + def save_changes(self): + pass + + def set_status(self): + pass + + def get_full_name(self): + """ + Get the full name of the person + """ + return self._get_full_name() + + def get_status_count(self): + return 0 + + def get_groups_list(self): + return [] diff --git a/tests/django_tests/tests/v21/tests/admin_docs/namespace_urls.py b/tests/django_tests/tests/v21/tests/admin_docs/namespace_urls.py new file mode 100644 index 00000000..d05922c3 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_docs/namespace_urls.py @@ -0,0 +1,14 @@ +from django.conf.urls import include, url +from django.contrib import admin + +from . import views + +backend_urls = ([ + url(r'^something/$', views.XViewClass.as_view(), name='something'), +], 'backend') + +urlpatterns = [ + url(r'^admin/doc/', include('django.contrib.admindocs.urls')), + url(r'^admin/', admin.site.urls), + url(r'^api/backend/', include(backend_urls, namespace='backend')), +] diff --git a/tests/django_tests/tests/v21/tests/admin_docs/test_middleware.py b/tests/django_tests/tests/v21/tests/admin_docs/test_middleware.py new file mode 100644 index 00000000..ab537164 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_docs/test_middleware.py @@ -0,0 +1,47 @@ +from django.contrib.auth.models import User + +from .tests import AdminDocsTestCase, TestDataMixin + + +class XViewMiddlewareTest(TestDataMixin, AdminDocsTestCase): + + def test_xview_func(self): + user = User.objects.get(username='super') + response = self.client.head('/xview/func/') + self.assertNotIn('X-View', response) + self.client.force_login(self.superuser) + response = self.client.head('/xview/func/') + self.assertIn('X-View', response) + self.assertEqual(response['X-View'], 'admin_docs.views.xview') + user.is_staff = False + user.save() + response = self.client.head('/xview/func/') + self.assertNotIn('X-View', response) + user.is_staff = True + user.is_active = False + user.save() + response = self.client.head('/xview/func/') + self.assertNotIn('X-View', response) + + def test_xview_class(self): + user = User.objects.get(username='super') + response = self.client.head('/xview/class/') + self.assertNotIn('X-View', response) + self.client.force_login(self.superuser) + response = self.client.head('/xview/class/') + self.assertIn('X-View', response) + self.assertEqual(response['X-View'], 'admin_docs.views.XViewClass') + user.is_staff = False + user.save() + response = self.client.head('/xview/class/') + self.assertNotIn('X-View', response) + user.is_staff = True + user.is_active = False + user.save() + response = self.client.head('/xview/class/') + self.assertNotIn('X-View', response) + + def test_callable_object_view(self): + self.client.force_login(self.superuser) + response = self.client.head('/xview/callable_object/') + self.assertEqual(response['X-View'], 'admin_docs.views.XViewCallableObject') diff --git a/tests/django_tests/tests/v21/tests/admin_docs/test_utils.py b/tests/django_tests/tests/v21/tests/admin_docs/test_utils.py new file mode 100644 index 00000000..0c738e5e --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_docs/test_utils.py @@ -0,0 +1,120 @@ +import unittest + +from django.contrib.admindocs.utils import ( + docutils_is_available, parse_docstring, parse_rst, trim_docstring, +) + +from .tests import AdminDocsTestCase + + +@unittest.skipUnless(docutils_is_available, "no docutils installed.") +class TestUtils(AdminDocsTestCase): + """ + This __doc__ output is required for testing. I copied this example from + `admindocs` documentation. (TITLE) + + Display an individual :model:`myapp.MyModel`. + + **Context** + + ``RequestContext`` + + ``mymodel`` + An instance of :model:`myapp.MyModel`. + + **Template:** + + :template:`myapp/my_template.html` (DESCRIPTION) + + some_metadata: some data + """ + def setUp(self): + self.docstring = self.__doc__ + + def test_trim_docstring(self): + trim_docstring_output = trim_docstring(self.docstring) + trimmed_docstring = ( + 'This __doc__ output is required for testing. I copied this ' + 'example from\n`admindocs` documentation. (TITLE)\n\n' + 'Display an individual :model:`myapp.MyModel`.\n\n' + '**Context**\n\n``RequestContext``\n\n``mymodel``\n' + ' An instance of :model:`myapp.MyModel`.\n\n' + '**Template:**\n\n:template:`myapp/my_template.html` ' + '(DESCRIPTION)\n\nsome_metadata: some data' + ) + self.assertEqual(trim_docstring_output, trimmed_docstring) + + def test_parse_docstring(self): + title, description, metadata = parse_docstring(self.docstring) + docstring_title = ( + 'This __doc__ output is required for testing. I copied this example from\n' + '`admindocs` documentation. (TITLE)' + ) + docstring_description = ( + 'Display an individual :model:`myapp.MyModel`.\n\n' + '**Context**\n\n``RequestContext``\n\n``mymodel``\n' + ' An instance of :model:`myapp.MyModel`.\n\n' + '**Template:**\n\n:template:`myapp/my_template.html` ' + '(DESCRIPTION)' + ) + self.assertEqual(title, docstring_title) + self.assertEqual(description, docstring_description) + self.assertEqual(metadata, {'some_metadata': 'some data'}) + + def test_title_output(self): + title, description, metadata = parse_docstring(self.docstring) + title_output = parse_rst(title, 'model', 'model:admindocs') + self.assertIn('TITLE', title_output) + title_rendered = ( + '

    This __doc__ output is required for testing. I copied this ' + 'example from\nadmindocs documentation. ' + '(TITLE)

    \n' + ) + self.assertHTMLEqual(title_output, title_rendered) + + def test_description_output(self): + title, description, metadata = parse_docstring(self.docstring) + description_output = parse_rst(description, 'model', 'model:admindocs') + description_rendered = ( + '

    Display an individual myapp.MyModel.

    \n' + '

    Context

    \n

    ' + 'RequestContext

    \n
    \n
    mymodel
    \n
    An instance of ' + 'myapp.MyModel.
    \n
    \n

    Template:

    ' + '\n

    myapp/my_template.html (DESCRIPTION)' + '

    \n' + ) + self.assertHTMLEqual(description_output, description_rendered) + + def test_initial_header_level(self): + header = 'should be h3...\n\nHeader\n------\n' + output = parse_rst(header, 'header') + self.assertIn('

    Header

    ', output) + + def test_parse_rst(self): + """ + parse_rst() should use `cmsreference` as the default role. + """ + markup = '

    title

    \n' + self.assertEqual(parse_rst('`title`', 'model'), markup % 'models/title/') + self.assertEqual(parse_rst('`title`', 'view'), markup % 'views/title/') + self.assertEqual(parse_rst('`title`', 'template'), markup % 'templates/title/') + self.assertEqual(parse_rst('`title`', 'filter'), markup % 'filters/#title') + self.assertEqual(parse_rst('`title`', 'tag'), markup % 'tags/#title') + + def test_publish_parts(self): + """ + Django shouldn't break the default role for interpreted text + when ``publish_parts`` is used directly, by setting it to + ``cmsreference`` (#6681). + """ + import docutils + self.assertNotEqual(docutils.parsers.rst.roles.DEFAULT_INTERPRETED_ROLE, 'cmsreference') + source = 'reST, `interpreted text`, default role.' + markup = '

    reST, interpreted text, default role.

    \n' + parts = docutils.core.publish_parts(source=source, writer_name="html4css1") + self.assertEqual(parts['fragment'], markup) diff --git a/tests/django_tests/tests/v21/tests/admin_docs/test_views.py b/tests/django_tests/tests/v21/tests/admin_docs/test_views.py new file mode 100644 index 00000000..c55891a3 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_docs/test_views.py @@ -0,0 +1,359 @@ +import sys +import unittest + +from django.conf import settings +from django.contrib.admindocs import utils, views +from django.contrib.admindocs.views import get_return_data_type, simplify_regex +from django.contrib.sites.models import Site +from django.db import models +from django.db.models import fields +from django.test import SimpleTestCase, modify_settings, override_settings +from django.test.utils import captured_stderr +from django.urls import reverse + +from .models import Company, Person +from .tests import AdminDocsTestCase, TestDataMixin + + +@unittest.skipUnless(utils.docutils_is_available, "no docutils installed.") +class AdminDocViewTests(TestDataMixin, AdminDocsTestCase): + + def setUp(self): + self.client.force_login(self.superuser) + + def test_index(self): + response = self.client.get(reverse('django-admindocs-docroot')) + self.assertContains(response, '

    Documentation

    ', html=True) + self.assertContains(response, '

    Django administration

    ') + self.client.logout() + response = self.client.get(reverse('django-admindocs-docroot'), follow=True) + # Should display the login screen + self.assertContains(response, '', html=True) + + def test_bookmarklets(self): + response = self.client.get(reverse('django-admindocs-bookmarklets')) + self.assertContains(response, '/admindocs/views/') + + def test_templatetag_index(self): + response = self.client.get(reverse('django-admindocs-tags')) + self.assertContains(response, '

    extends

    ', html=True) + + def test_templatefilter_index(self): + response = self.client.get(reverse('django-admindocs-filters')) + self.assertContains(response, '

    first

    ', html=True) + + def test_view_index(self): + response = self.client.get(reverse('django-admindocs-views-index')) + self.assertContains( + response, + '

    /admindocs/

    ', + html=True + ) + self.assertContains(response, 'Views by namespace test') + self.assertContains(response, 'Name: test:func.') + self.assertContains( + response, + '

    ' + '/xview/callable_object_without_xview/

    ', + html=True, + ) + + def test_view_index_with_method(self): + """ + Views that are methods are listed correctly. + """ + response = self.client.get(reverse('django-admindocs-views-index')) + self.assertContains( + response, + '

    /admin/

    ', + html=True + ) + + def test_view_detail(self): + url = reverse('django-admindocs-views-detail', args=['django.contrib.admindocs.views.BaseAdminDocsView']) + response = self.client.get(url) + # View docstring + self.assertContains(response, 'Base view for admindocs views.') + + @override_settings(ROOT_URLCONF='admin_docs.namespace_urls') + def test_namespaced_view_detail(self): + url = reverse('django-admindocs-views-detail', args=['admin_docs.views.XViewClass']) + response = self.client.get(url) + self.assertContains(response, '

    admin_docs.views.XViewClass

    ') + + def test_view_detail_illegal_import(self): + url = reverse('django-admindocs-views-detail', args=['urlpatterns_reverse.nonimported_module.view']) + response = self.client.get(url) + self.assertEqual(response.status_code, 404) + self.assertNotIn("urlpatterns_reverse.nonimported_module", sys.modules) + + def test_view_detail_as_method(self): + """ + Views that are methods can be displayed. + """ + url = reverse('django-admindocs-views-detail', args=['django.contrib.admin.sites.AdminSite.index']) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + + def test_model_index(self): + response = self.client.get(reverse('django-admindocs-models-index')) + self.assertContains( + response, + '

    Authentication and Authorization (django.contrib.auth)

    ', + html=True + ) + + def test_template_detail(self): + response = self.client.get(reverse('django-admindocs-templates', args=['admin_doc/template_detail.html'])) + self.assertContains(response, '

    Template: "admin_doc/template_detail.html"

    ', html=True) + + def test_missing_docutils(self): + utils.docutils_is_available = False + try: + response = self.client.get(reverse('django-admindocs-docroot')) + self.assertContains( + response, + '

    The admin documentation system requires Python\'s ' + 'docutils library.

    ', + html=True + ) + self.assertContains(response, '

    Django administration

    ') + finally: + utils.docutils_is_available = True + + @modify_settings(INSTALLED_APPS={'remove': 'django.contrib.sites'}) + @override_settings(SITE_ID=None) # will restore SITE_ID after the test + def test_no_sites_framework(self): + """ + Without the sites framework, should not access SITE_ID or Site + objects. Deleting settings is fine here as UserSettingsHolder is used. + """ + Site.objects.all().delete() + del settings.SITE_ID + response = self.client.get(reverse('django-admindocs-views-index')) + self.assertContains(response, 'View documentation') + + +@override_settings(TEMPLATES=[{ + 'NAME': 'ONE', + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'APP_DIRS': True, +}, { + 'NAME': 'TWO', + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'APP_DIRS': True, +}]) +@unittest.skipUnless(utils.docutils_is_available, "no docutils installed.") +class AdminDocViewWithMultipleEngines(AdminDocViewTests): + + def test_templatefilter_index(self): + # Overridden because non-trivial TEMPLATES settings aren't supported + # but the page shouldn't crash (#24125). + response = self.client.get(reverse('django-admindocs-filters')) + self.assertContains(response, 'Template filters', html=True) + + def test_templatetag_index(self): + # Overridden because non-trivial TEMPLATES settings aren't supported + # but the page shouldn't crash (#24125). + response = self.client.get(reverse('django-admindocs-tags')) + self.assertContains(response, 'Template tags', html=True) + + +@unittest.skipUnless(utils.docutils_is_available, "no docutils installed.") +class TestModelDetailView(TestDataMixin, AdminDocsTestCase): + + def setUp(self): + self.client.force_login(self.superuser) + with captured_stderr() as self.docutils_stderr: + self.response = self.client.get(reverse('django-admindocs-models-detail', args=['admin_docs', 'Person'])) + + def test_method_excludes(self): + """ + Methods that begin with strings defined in + ``django.contrib.admindocs.views.MODEL_METHODS_EXCLUDE`` + shouldn't be displayed in the admin docs. + """ + self.assertContains(self.response, "get_full_name") + self.assertNotContains(self.response, "_get_full_name") + self.assertNotContains(self.response, "add_image") + self.assertNotContains(self.response, "delete_image") + self.assertNotContains(self.response, "set_status") + self.assertNotContains(self.response, "save_changes") + + def test_methods_with_arguments(self): + """ + Methods that take arguments should also displayed. + """ + self.assertContains(self.response, "

    Methods with arguments

    ") + self.assertContains(self.response, "rename_company") + self.assertContains(self.response, "dummy_function") + self.assertContains(self.response, "suffix_company_name") + + def test_methods_with_arguments_display_arguments(self): + """ + Methods with arguments should have their arguments displayed. + """ + self.assertContains(self.response, "new_name") + + def test_methods_with_arguments_display_arguments_default_value(self): + """ + Methods with keyword arguments should have their arguments displayed. + """ + self.assertContains(self.response, "suffix='ltd'") + + def test_methods_with_multiple_arguments_display_arguments(self): + """ + Methods with multiple arguments should have all their arguments + displayed, but omitting 'self'. + """ + self.assertContains(self.response, "baz, rox, *some_args, **some_kwargs") + + def test_method_data_types(self): + company = Company.objects.create(name="Django") + person = Person.objects.create(first_name="Human", last_name="User", company=company) + self.assertEqual(get_return_data_type(person.get_status_count.__name__), 'Integer') + self.assertEqual(get_return_data_type(person.get_groups_list.__name__), 'List') + + def test_descriptions_render_correctly(self): + """ + The ``description`` field should render correctly for each field type. + """ + # help text in fields + self.assertContains(self.response, "first name - The person's first name") + self.assertContains(self.response, "last name - The person's last name") + + # method docstrings + self.assertContains(self.response, "

    Get the full name of the person

    ") + + link = '%s' + markup = '

    the related %s object

    ' + company_markup = markup % (link % ("admin_docs.company", "admin_docs.Company")) + + # foreign keys + self.assertContains(self.response, company_markup) + + # foreign keys with help text + self.assertContains(self.response, "%s\n - place of work" % company_markup) + + # many to many fields + self.assertContains( + self.response, + "number of related %s objects" % (link % ("admin_docs.group", "admin_docs.Group")) + ) + self.assertContains( + self.response, + "all related %s objects" % (link % ("admin_docs.group", "admin_docs.Group")) + ) + + # "raw" and "include" directives are disabled + self.assertContains(self.response, '

    "raw" directive disabled.

    ',) + self.assertContains(self.response, '.. raw:: html\n :file: admin_docs/evilfile.txt') + self.assertContains(self.response, '

    "include" directive disabled.

    ',) + self.assertContains(self.response, '.. include:: admin_docs/evilfile.txt') + out = self.docutils_stderr.getvalue() + self.assertIn('"raw" directive disabled', out) + self.assertIn('"include" directive disabled', out) + + def test_model_with_many_to_one(self): + link = '%s' + response = self.client.get( + reverse('django-admindocs-models-detail', args=['admin_docs', 'company']) + ) + self.assertContains( + response, + "number of related %s objects" % (link % ("admin_docs.person", "admin_docs.Person")) + ) + self.assertContains( + response, + "all related %s objects" % (link % ("admin_docs.person", "admin_docs.Person")) + ) + + def test_model_with_no_backward_relations_render_only_relevant_fields(self): + """ + A model with ``related_name`` of `+` shouldn't show backward + relationship links. + """ + response = self.client.get(reverse('django-admindocs-models-detail', args=['admin_docs', 'family'])) + fields = response.context_data.get('fields') + self.assertEqual(len(fields), 2) + + def test_model_docstring_renders_correctly(self): + summary = ( + '

    Stores information about a person, related to myapp.Company.

    ' + ) + subheading = '

    Notes

    ' + body = '

    Use save_changes() when saving this object.

    ' + model_body = ( + '
    company
    Field storing ' + 'myapp.Company where the person works.
    ' + ) + self.assertContains(self.response, 'DESCRIPTION') + self.assertContains(self.response, summary, html=True) + self.assertContains(self.response, subheading, html=True) + self.assertContains(self.response, body, html=True) + self.assertContains(self.response, model_body, html=True) + + def test_model_detail_title(self): + self.assertContains(self.response, '

    admin_docs.Person

    ', html=True) + + def test_app_not_found(self): + response = self.client.get(reverse('django-admindocs-models-detail', args=['doesnotexist', 'Person'])) + self.assertEqual(response.context['exception'], "App 'doesnotexist' not found") + self.assertEqual(response.status_code, 404) + + def test_model_not_found(self): + response = self.client.get(reverse('django-admindocs-models-detail', args=['admin_docs', 'doesnotexist'])) + self.assertEqual(response.context['exception'], "Model 'doesnotexist' not found in app 'admin_docs'") + self.assertEqual(response.status_code, 404) + + +class CustomField(models.Field): + description = "A custom field type" + + +class DescriptionLackingField(models.Field): + pass + + +class TestFieldType(unittest.TestCase): + def setUp(self): + pass + + def test_field_name(self): + with self.assertRaises(AttributeError): + views.get_readable_field_data_type("NotAField") + + def test_builtin_fields(self): + self.assertEqual( + views.get_readable_field_data_type(fields.BooleanField()), + 'Boolean (Either True or False)' + ) + + def test_custom_fields(self): + self.assertEqual(views.get_readable_field_data_type(CustomField()), 'A custom field type') + self.assertEqual( + views.get_readable_field_data_type(DescriptionLackingField()), + 'Field of type: DescriptionLackingField' + ) + + +class AdminDocViewFunctionsTests(SimpleTestCase): + + def test_simplify_regex(self): + tests = ( + (r'^a', '/a'), + (r'^(?P\w+)/b/(?P\w+)/$', '//b//'), + (r'^(?P\w+)/b/(?P\w+)$', '//b/'), + (r'^(?P\w+)/b/(\w+)$', '//b/'), + (r'^(?P\w+)/b/((x|y)\w+)$', '//b/'), + (r'^(?P(x|y))/b/(?P\w+)$', '//b/'), + (r'^(?P(x|y))/b/(?P\w+)ab', '//b/ab'), + (r'^(?P(x|y)(\(|\)))/b/(?P\w+)ab', '//b/ab'), + (r'^a/?$', '/a/'), + ) + for pattern, output in tests: + with self.subTest(pattern=pattern): + self.assertEqual(simplify_regex(pattern), output) diff --git a/tests/django_tests/tests/v21/tests/admin_docs/tests.py b/tests/django_tests/tests/v21/tests/admin_docs/tests.py new file mode 100644 index 00000000..dfe6104a --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_docs/tests.py @@ -0,0 +1,15 @@ +from django.contrib.auth.models import User +from django.test import TestCase, modify_settings, override_settings + + +class TestDataMixin: + + @classmethod + def setUpTestData(cls): + cls.superuser = User.objects.create_superuser(username='super', password='secret', email='super@example.com') + + +@override_settings(ROOT_URLCONF='admin_docs.urls') +@modify_settings(INSTALLED_APPS={'append': 'django.contrib.admindocs'}) +class AdminDocsTestCase(TestCase): + pass diff --git a/tests/django_tests/tests/v21/tests/admin_docs/urls.py b/tests/django_tests/tests/v21/tests/admin_docs/urls.py new file mode 100644 index 00000000..67c72b24 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_docs/urls.py @@ -0,0 +1,18 @@ +from django.conf.urls import include, url +from django.contrib import admin + +from . import views + +ns_patterns = ([ + url(r'^xview/func/$', views.xview_dec(views.xview), name='func'), +], 'test') + +urlpatterns = [ + url(r'^admin/', admin.site.urls), + url(r'^admindocs/', include('django.contrib.admindocs.urls')), + url(r'^', include(ns_patterns, namespace='test')), + url(r'^xview/func/$', views.xview_dec(views.xview)), + url(r'^xview/class/$', views.xview_dec(views.XViewClass.as_view())), + url(r'^xview/callable_object/$', views.xview_dec(views.XViewCallableObject())), + url(r'^xview/callable_object_without_xview/$', views.XViewCallableObject()), +] diff --git a/tests/django_tests/tests/v21/tests/admin_docs/views.py b/tests/django_tests/tests/v21/tests/admin_docs/views.py new file mode 100644 index 00000000..21fe382b --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_docs/views.py @@ -0,0 +1,20 @@ +from django.contrib.admindocs.middleware import XViewMiddleware +from django.http import HttpResponse +from django.utils.decorators import decorator_from_middleware +from django.views.generic import View + +xview_dec = decorator_from_middleware(XViewMiddleware) + + +def xview(request): + return HttpResponse() + + +class XViewClass(View): + def get(self, request): + return HttpResponse() + + +class XViewCallableObject(View): + def __call__(self, request): + return HttpResponse() diff --git a/tests/django_tests/tests/v21/tests/admin_filters/__init__.py b/tests/django_tests/tests/v21/tests/admin_filters/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/admin_filters/models.py b/tests/django_tests/tests/v21/tests/admin_filters/models.py new file mode 100644 index 00000000..ae78282d --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_filters/models.py @@ -0,0 +1,79 @@ +from django.contrib.auth.models import User +from django.contrib.contenttypes.fields import ( + GenericForeignKey, GenericRelation, +) +from django.contrib.contenttypes.models import ContentType +from django.db import models + + +class Book(models.Model): + title = models.CharField(max_length=50) + year = models.PositiveIntegerField(null=True, blank=True) + author = models.ForeignKey( + User, + models.SET_NULL, + verbose_name="Verbose Author", + related_name='books_authored', + blank=True, null=True, + ) + contributors = models.ManyToManyField( + User, + verbose_name="Verbose Contributors", + related_name='books_contributed', + blank=True, + ) + employee = models.ForeignKey( + 'Employee', + models.SET_NULL, + verbose_name='Employee', + blank=True, null=True, + ) + is_best_seller = models.BooleanField(default=0, null=True) + is_best_seller2 = models.NullBooleanField(default=0) + date_registered = models.DateField(null=True) + # This field name is intentionally 2 characters long (#16080). + no = models.IntegerField(verbose_name='number', blank=True, null=True) + + def __str__(self): + return self.title + + +class Department(models.Model): + code = models.CharField(max_length=4, unique=True) + description = models.CharField(max_length=50, blank=True, null=True) + + def __str__(self): + return self.description + + +class Employee(models.Model): + department = models.ForeignKey(Department, models.CASCADE, to_field="code") + name = models.CharField(max_length=100) + + def __str__(self): + return self.name + + +class TaggedItem(models.Model): + tag = models.SlugField() + content_type = models.ForeignKey(ContentType, models.CASCADE, related_name='tagged_items') + object_id = models.PositiveIntegerField() + content_object = GenericForeignKey('content_type', 'object_id') + + def __str__(self): + return self.tag + + +class Bookmark(models.Model): + url = models.URLField() + tags = GenericRelation(TaggedItem) + + CHOICES = [ + ('a', 'A'), + (None, 'None'), + ('', '-'), + ] + none_or_null = models.CharField(max_length=20, choices=CHOICES, blank=True, null=True) + + def __str__(self): + return self.url diff --git a/tests/django_tests/tests/v21/tests/admin_filters/tests.py b/tests/django_tests/tests/v21/tests/admin_filters/tests.py new file mode 100644 index 00000000..2e16909d --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_filters/tests.py @@ -0,0 +1,1212 @@ +import datetime +import sys +import unittest + +from django.contrib.admin import ( + AllValuesFieldListFilter, BooleanFieldListFilter, ModelAdmin, + RelatedOnlyFieldListFilter, SimpleListFilter, site, +) +from django.contrib.admin.options import IncorrectLookupParameters +from django.contrib.auth.admin import UserAdmin +from django.contrib.auth.models import User +from django.core.exceptions import ImproperlyConfigured +from django.test import RequestFactory, TestCase, override_settings + +from .models import Book, Bookmark, Department, Employee, TaggedItem + + +def select_by(dictlist, key, value): + return [x for x in dictlist if x[key] == value][0] + + +class DecadeListFilter(SimpleListFilter): + + def lookups(self, request, model_admin): + return ( + ('the 80s', "the 1980's"), + ('the 90s', "the 1990's"), + ('the 00s', "the 2000's"), + ('other', "other decades"), + ) + + def queryset(self, request, queryset): + decade = self.value() + if decade == 'the 80s': + return queryset.filter(year__gte=1980, year__lte=1989) + if decade == 'the 90s': + return queryset.filter(year__gte=1990, year__lte=1999) + if decade == 'the 00s': + return queryset.filter(year__gte=2000, year__lte=2009) + + +class NotNinetiesListFilter(SimpleListFilter): + title = "Not nineties books" + parameter_name = "book_year" + + def lookups(self, request, model_admin): + return ( + ('the 90s', "the 1990's"), + ) + + def queryset(self, request, queryset): + if self.value() == 'the 90s': + return queryset.filter(year__gte=1990, year__lte=1999) + else: + return queryset.exclude(year__gte=1990, year__lte=1999) + + +class DecadeListFilterWithTitleAndParameter(DecadeListFilter): + title = 'publication decade' + parameter_name = 'publication-decade' + + +class DecadeListFilterWithoutTitle(DecadeListFilter): + parameter_name = 'publication-decade' + + +class DecadeListFilterWithoutParameter(DecadeListFilter): + title = 'publication decade' + + +class DecadeListFilterWithNoneReturningLookups(DecadeListFilterWithTitleAndParameter): + + def lookups(self, request, model_admin): + pass + + +class DecadeListFilterWithFailingQueryset(DecadeListFilterWithTitleAndParameter): + + def queryset(self, request, queryset): + raise 1 / 0 + + +class DecadeListFilterWithQuerysetBasedLookups(DecadeListFilterWithTitleAndParameter): + + def lookups(self, request, model_admin): + qs = model_admin.get_queryset(request) + if qs.filter(year__gte=1980, year__lte=1989).exists(): + yield ('the 80s', "the 1980's") + if qs.filter(year__gte=1990, year__lte=1999).exists(): + yield ('the 90s', "the 1990's") + if qs.filter(year__gte=2000, year__lte=2009).exists(): + yield ('the 00s', "the 2000's") + + +class DecadeListFilterParameterEndsWith__In(DecadeListFilter): + title = 'publication decade' + parameter_name = 'decade__in' # Ends with '__in" + + +class DecadeListFilterParameterEndsWith__Isnull(DecadeListFilter): + title = 'publication decade' + parameter_name = 'decade__isnull' # Ends with '__isnull" + + +class DepartmentListFilterLookupWithNonStringValue(SimpleListFilter): + title = 'department' + parameter_name = 'department' + + def lookups(self, request, model_admin): + return sorted({ + (employee.department.id, # Intentionally not a string (Refs #19318) + employee.department.code) + for employee in model_admin.get_queryset(request).all() + }) + + def queryset(self, request, queryset): + if self.value(): + return queryset.filter(department__id=self.value()) + + +class DepartmentListFilterLookupWithUnderscoredParameter(DepartmentListFilterLookupWithNonStringValue): + parameter_name = 'department__whatever' + + +class DepartmentListFilterLookupWithDynamicValue(DecadeListFilterWithTitleAndParameter): + + def lookups(self, request, model_admin): + if self.value() == 'the 80s': + return (('the 90s', "the 1990's"),) + elif self.value() == 'the 90s': + return (('the 80s', "the 1980's"),) + else: + return (('the 80s', "the 1980's"), ('the 90s', "the 1990's"),) + + +class CustomUserAdmin(UserAdmin): + list_filter = ('books_authored', 'books_contributed') + + +class BookAdmin(ModelAdmin): + list_filter = ('year', 'author', 'contributors', 'is_best_seller', 'date_registered', 'no') + ordering = ('-id',) + + +class BookAdmin2(ModelAdmin): + list_filter = ('year', 'author', 'contributors', 'is_best_seller2', 'date_registered', 'no') + + +class BookAdminWithTupleBooleanFilter(BookAdmin): + list_filter = ( + 'year', + 'author', + 'contributors', + ('is_best_seller', BooleanFieldListFilter), + 'date_registered', + 'no', + ) + + +class BookAdminWithUnderscoreLookupAndTuple(BookAdmin): + list_filter = ( + 'year', + ('author__email', AllValuesFieldListFilter), + 'contributors', + 'is_best_seller', + 'date_registered', + 'no', + ) + + +class BookAdminWithCustomQueryset(ModelAdmin): + + def __init__(self, user, *args, **kwargs): + self.user = user + super().__init__(*args, **kwargs) + + list_filter = ('year',) + + def get_queryset(self, request): + return super().get_queryset(request).filter(author=self.user) + + +class BookAdminRelatedOnlyFilter(ModelAdmin): + list_filter = ( + 'year', 'is_best_seller', 'date_registered', 'no', + ('author', RelatedOnlyFieldListFilter), + ('contributors', RelatedOnlyFieldListFilter), + ('employee__department', RelatedOnlyFieldListFilter), + ) + ordering = ('-id',) + + +class DecadeFilterBookAdmin(ModelAdmin): + list_filter = ('author', DecadeListFilterWithTitleAndParameter) + ordering = ('-id',) + + +class NotNinetiesListFilterAdmin(ModelAdmin): + list_filter = (NotNinetiesListFilter,) + + +class DecadeFilterBookAdminWithoutTitle(ModelAdmin): + list_filter = (DecadeListFilterWithoutTitle,) + + +class DecadeFilterBookAdminWithoutParameter(ModelAdmin): + list_filter = (DecadeListFilterWithoutParameter,) + + +class DecadeFilterBookAdminWithNoneReturningLookups(ModelAdmin): + list_filter = (DecadeListFilterWithNoneReturningLookups,) + + +class DecadeFilterBookAdminWithFailingQueryset(ModelAdmin): + list_filter = (DecadeListFilterWithFailingQueryset,) + + +class DecadeFilterBookAdminWithQuerysetBasedLookups(ModelAdmin): + list_filter = (DecadeListFilterWithQuerysetBasedLookups,) + + +class DecadeFilterBookAdminParameterEndsWith__In(ModelAdmin): + list_filter = (DecadeListFilterParameterEndsWith__In,) + + +class DecadeFilterBookAdminParameterEndsWith__Isnull(ModelAdmin): + list_filter = (DecadeListFilterParameterEndsWith__Isnull,) + + +class EmployeeAdmin(ModelAdmin): + list_display = ['name', 'department'] + list_filter = ['department'] + + +class DepartmentFilterEmployeeAdmin(EmployeeAdmin): + list_filter = [DepartmentListFilterLookupWithNonStringValue] + + +class DepartmentFilterUnderscoredEmployeeAdmin(EmployeeAdmin): + list_filter = [DepartmentListFilterLookupWithUnderscoredParameter] + + +class DepartmentFilterDynamicValueBookAdmin(EmployeeAdmin): + list_filter = [DepartmentListFilterLookupWithDynamicValue] + + +class BookmarkAdminGenericRelation(ModelAdmin): + list_filter = ['tags__tag'] + + +class ListFiltersTests(TestCase): + + def setUp(self): + self.today = datetime.date.today() + self.tomorrow = self.today + datetime.timedelta(days=1) + self.one_week_ago = self.today - datetime.timedelta(days=7) + if self.today.month == 12: + self.next_month = self.today.replace(year=self.today.year + 1, month=1, day=1) + else: + self.next_month = self.today.replace(month=self.today.month + 1, day=1) + self.next_year = self.today.replace(year=self.today.year + 1, month=1, day=1) + + self.request_factory = RequestFactory() + + # Users + self.alfred = User.objects.create_superuser('alfred', 'alfred@example.com', 'password') + self.bob = User.objects.create_user('bob', 'bob@example.com') + self.lisa = User.objects.create_user('lisa', 'lisa@example.com') + + # Books + self.djangonaut_book = Book.objects.create( + title='Djangonaut: an art of living', year=2009, + author=self.alfred, is_best_seller=True, date_registered=self.today, + is_best_seller2=True, + ) + self.bio_book = Book.objects.create( + title='Django: a biography', year=1999, author=self.alfred, + is_best_seller=False, no=207, + is_best_seller2=False, + ) + self.django_book = Book.objects.create( + title='The Django Book', year=None, author=self.bob, + is_best_seller=None, date_registered=self.today, no=103, + is_best_seller2=None, + ) + self.guitar_book = Book.objects.create( + title='Guitar for dummies', year=2002, is_best_seller=True, + date_registered=self.one_week_ago, + is_best_seller2=True, + ) + self.guitar_book.contributors.set([self.bob, self.lisa]) + + # Departments + self.dev = Department.objects.create(code='DEV', description='Development') + self.design = Department.objects.create(code='DSN', description='Design') + + # Employees + self.john = Employee.objects.create(name='John Blue', department=self.dev) + self.jack = Employee.objects.create(name='Jack Red', department=self.design) + + def test_choicesfieldlistfilter_has_none_choice(self): + """ + The last choice is for the None value. + """ + class BookmarkChoicesAdmin(ModelAdmin): + list_display = ['none_or_null'] + list_filter = ['none_or_null'] + + modeladmin = BookmarkChoicesAdmin(Bookmark, site) + request = self.request_factory.get('/', {}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + filterspec = changelist.get_filters(request)[0][0] + choices = list(filterspec.choices(changelist)) + self.assertEqual(choices[-1]['display'], 'None') + self.assertEqual(choices[-1]['query_string'], '?none_or_null__isnull=True') + + def test_datefieldlistfilter(self): + modeladmin = BookAdmin(Book, site) + + request = self.request_factory.get('/') + request.user = self.alfred + changelist = modeladmin.get_changelist(request) + + request = self.request_factory.get('/', {'date_registered__gte': self.today, + 'date_registered__lt': self.tomorrow}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.django_book, self.djangonaut_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][4] + self.assertEqual(filterspec.title, 'date registered') + choice = select_by(filterspec.choices(changelist), "display", "Today") + self.assertIs(choice['selected'], True) + self.assertEqual( + choice['query_string'], + '?date_registered__gte=%s&date_registered__lt=%s' % ( + self.today, + self.tomorrow, + ) + ) + + request = self.request_factory.get('/', {'date_registered__gte': self.today.replace(day=1), + 'date_registered__lt': self.next_month}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + if (self.today.year, self.today.month) == (self.one_week_ago.year, self.one_week_ago.month): + # In case one week ago is in the same month. + self.assertEqual(list(queryset), [self.guitar_book, self.django_book, self.djangonaut_book]) + else: + self.assertEqual(list(queryset), [self.django_book, self.djangonaut_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][4] + self.assertEqual(filterspec.title, 'date registered') + choice = select_by(filterspec.choices(changelist), "display", "This month") + self.assertIs(choice['selected'], True) + self.assertEqual( + choice['query_string'], + '?date_registered__gte=%s&date_registered__lt=%s' % ( + self.today.replace(day=1), + self.next_month, + ) + ) + + request = self.request_factory.get('/', {'date_registered__gte': self.today.replace(month=1, day=1), + 'date_registered__lt': self.next_year}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + if self.today.year == self.one_week_ago.year: + # In case one week ago is in the same year. + self.assertEqual(list(queryset), [self.guitar_book, self.django_book, self.djangonaut_book]) + else: + self.assertEqual(list(queryset), [self.django_book, self.djangonaut_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][4] + self.assertEqual(filterspec.title, 'date registered') + choice = select_by(filterspec.choices(changelist), "display", "This year") + self.assertIs(choice['selected'], True) + self.assertEqual( + choice['query_string'], + '?date_registered__gte=%s&date_registered__lt=%s' % ( + self.today.replace(month=1, day=1), + self.next_year, + ) + ) + + request = self.request_factory.get('/', { + 'date_registered__gte': str(self.one_week_ago), + 'date_registered__lt': str(self.tomorrow), + }) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.guitar_book, self.django_book, self.djangonaut_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][4] + self.assertEqual(filterspec.title, 'date registered') + choice = select_by(filterspec.choices(changelist), "display", "Past 7 days") + self.assertIs(choice['selected'], True) + self.assertEqual( + choice['query_string'], + '?date_registered__gte=%s&date_registered__lt=%s' % ( + str(self.one_week_ago), + str(self.tomorrow), + ) + ) + + # Null/not null queries + request = self.request_factory.get('/', {'date_registered__isnull': 'True'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(queryset.count(), 1) + self.assertEqual(queryset[0], self.bio_book) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][4] + self.assertEqual(filterspec.title, 'date registered') + choice = select_by(filterspec.choices(changelist), 'display', 'No date') + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?date_registered__isnull=True') + + request = self.request_factory.get('/', {'date_registered__isnull': 'False'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(queryset.count(), 3) + self.assertEqual(list(queryset), [self.guitar_book, self.django_book, self.djangonaut_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][4] + self.assertEqual(filterspec.title, 'date registered') + choice = select_by(filterspec.choices(changelist), 'display', 'Has date') + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?date_registered__isnull=False') + + @unittest.skipIf( + sys.platform.startswith('win'), + "Windows doesn't support setting a timezone that differs from the " + "system timezone." + ) + @override_settings(USE_TZ=True) + def test_datefieldlistfilter_with_time_zone_support(self): + # Regression for #17830 + self.test_datefieldlistfilter() + + def test_allvaluesfieldlistfilter(self): + modeladmin = BookAdmin(Book, site) + + request = self.request_factory.get('/', {'year__isnull': 'True'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.django_book]) + + # Make sure the last choice is None and is selected + filterspec = changelist.get_filters(request)[0][0] + self.assertEqual(filterspec.title, 'year') + choices = list(filterspec.choices(changelist)) + self.assertIs(choices[-1]['selected'], True) + self.assertEqual(choices[-1]['query_string'], '?year__isnull=True') + + request = self.request_factory.get('/', {'year': '2002'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][0] + self.assertEqual(filterspec.title, 'year') + choices = list(filterspec.choices(changelist)) + self.assertIs(choices[2]['selected'], True) + self.assertEqual(choices[2]['query_string'], '?year=2002') + + def test_allvaluesfieldlistfilter_custom_qs(self): + # Make sure that correct filters are returned with custom querysets + modeladmin = BookAdminWithCustomQueryset(self.alfred, Book, site) + request = self.request_factory.get('/') + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + filterspec = changelist.get_filters(request)[0][0] + choices = list(filterspec.choices(changelist)) + # Should have 'All', 1999 and 2009 options i.e. the subset of years of + # books written by alfred (which is the filtering criteria set by + # BookAdminWithCustomQueryset.get_queryset()) + self.assertEqual(3, len(choices)) + self.assertEqual(choices[0]['query_string'], '?') + self.assertEqual(choices[1]['query_string'], '?year=1999') + self.assertEqual(choices[2]['query_string'], '?year=2009') + + def test_relatedfieldlistfilter_foreignkey(self): + modeladmin = BookAdmin(Book, site) + + request = self.request_factory.get('/') + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure that all users are present in the author's list filter + filterspec = changelist.get_filters(request)[0][1] + expected = [(self.alfred.pk, 'alfred'), (self.bob.pk, 'bob'), (self.lisa.pk, 'lisa')] + self.assertEqual(sorted(filterspec.lookup_choices), sorted(expected)) + + request = self.request_factory.get('/', {'author__isnull': 'True'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.guitar_book]) + + # Make sure the last choice is None and is selected + filterspec = changelist.get_filters(request)[0][1] + self.assertEqual(filterspec.title, 'Verbose Author') + choices = list(filterspec.choices(changelist)) + self.assertIs(choices[-1]['selected'], True) + self.assertEqual(choices[-1]['query_string'], '?author__isnull=True') + + request = self.request_factory.get('/', {'author__id__exact': self.alfred.pk}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][1] + self.assertEqual(filterspec.title, 'Verbose Author') + # order of choices depends on User model, which has no order + choice = select_by(filterspec.choices(changelist), "display", "alfred") + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?author__id__exact=%d' % self.alfred.pk) + + def test_relatedfieldlistfilter_manytomany(self): + modeladmin = BookAdmin(Book, site) + + request = self.request_factory.get('/') + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure that all users are present in the contrib's list filter + filterspec = changelist.get_filters(request)[0][2] + expected = [(self.alfred.pk, 'alfred'), (self.bob.pk, 'bob'), (self.lisa.pk, 'lisa')] + self.assertEqual(sorted(filterspec.lookup_choices), sorted(expected)) + + request = self.request_factory.get('/', {'contributors__isnull': 'True'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.django_book, self.bio_book, self.djangonaut_book]) + + # Make sure the last choice is None and is selected + filterspec = changelist.get_filters(request)[0][2] + self.assertEqual(filterspec.title, 'Verbose Contributors') + choices = list(filterspec.choices(changelist)) + self.assertIs(choices[-1]['selected'], True) + self.assertEqual(choices[-1]['query_string'], '?contributors__isnull=True') + + request = self.request_factory.get('/', {'contributors__id__exact': self.bob.pk}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][2] + self.assertEqual(filterspec.title, 'Verbose Contributors') + choice = select_by(filterspec.choices(changelist), "display", "bob") + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?contributors__id__exact=%d' % self.bob.pk) + + def test_relatedfieldlistfilter_reverse_relationships(self): + modeladmin = CustomUserAdmin(User, site) + + # FK relationship ----- + request = self.request_factory.get('/', {'books_authored__isnull': 'True'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.lisa]) + + # Make sure the last choice is None and is selected + filterspec = changelist.get_filters(request)[0][0] + self.assertEqual(filterspec.title, 'book') + choices = list(filterspec.choices(changelist)) + self.assertIs(choices[-1]['selected'], True) + self.assertEqual(choices[-1]['query_string'], '?books_authored__isnull=True') + + request = self.request_factory.get('/', {'books_authored__id__exact': self.bio_book.pk}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][0] + self.assertEqual(filterspec.title, 'book') + choice = select_by(filterspec.choices(changelist), "display", self.bio_book.title) + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?books_authored__id__exact=%d' % self.bio_book.pk) + + # M2M relationship ----- + request = self.request_factory.get('/', {'books_contributed__isnull': 'True'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.alfred]) + + # Make sure the last choice is None and is selected + filterspec = changelist.get_filters(request)[0][1] + self.assertEqual(filterspec.title, 'book') + choices = list(filterspec.choices(changelist)) + self.assertIs(choices[-1]['selected'], True) + self.assertEqual(choices[-1]['query_string'], '?books_contributed__isnull=True') + + request = self.request_factory.get('/', {'books_contributed__id__exact': self.django_book.pk}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][1] + self.assertEqual(filterspec.title, 'book') + choice = select_by(filterspec.choices(changelist), "display", self.django_book.title) + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?books_contributed__id__exact=%d' % self.django_book.pk) + + # With one book, the list filter should appear because there is also a + # (None) option. + Book.objects.exclude(pk=self.djangonaut_book.pk).delete() + filterspec = changelist.get_filters(request)[0] + self.assertEqual(len(filterspec), 2) + # With no books remaining, no list filters should appear. + Book.objects.all().delete() + filterspec = changelist.get_filters(request)[0] + self.assertEqual(len(filterspec), 0) + + def test_relatedonlyfieldlistfilter_foreignkey(self): + modeladmin = BookAdminRelatedOnlyFilter(Book, site) + + request = self.request_factory.get('/') + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure that only actual authors are present in author's list filter + filterspec = changelist.get_filters(request)[0][4] + expected = [(self.alfred.pk, 'alfred'), (self.bob.pk, 'bob')] + self.assertEqual(sorted(filterspec.lookup_choices), sorted(expected)) + + def test_relatedonlyfieldlistfilter_underscorelookup_foreignkey(self): + Department.objects.create(code='TEST', description='Testing') + self.djangonaut_book.employee = self.john + self.djangonaut_book.save() + self.bio_book.employee = self.jack + self.bio_book.save() + + modeladmin = BookAdminRelatedOnlyFilter(Book, site) + request = self.request_factory.get('/') + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Only actual departments should be present in employee__department's + # list filter. + filterspec = changelist.get_filters(request)[0][6] + expected = [ + (self.dev.code, str(self.dev)), + (self.design.code, str(self.design)), + ] + self.assertEqual(sorted(filterspec.lookup_choices), sorted(expected)) + + def test_relatedonlyfieldlistfilter_manytomany(self): + modeladmin = BookAdminRelatedOnlyFilter(Book, site) + + request = self.request_factory.get('/') + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure that only actual contributors are present in contrib's list filter + filterspec = changelist.get_filters(request)[0][5] + expected = [(self.bob.pk, 'bob'), (self.lisa.pk, 'lisa')] + self.assertEqual(sorted(filterspec.lookup_choices), sorted(expected)) + + def test_listfilter_genericrelation(self): + django_bookmark = Bookmark.objects.create(url='https://www.djangoproject.com/') + python_bookmark = Bookmark.objects.create(url='https://www.python.org/') + kernel_bookmark = Bookmark.objects.create(url='https://www.kernel.org/') + + TaggedItem.objects.create(content_object=django_bookmark, tag='python') + TaggedItem.objects.create(content_object=python_bookmark, tag='python') + TaggedItem.objects.create(content_object=kernel_bookmark, tag='linux') + + modeladmin = BookmarkAdminGenericRelation(Bookmark, site) + + request = self.request_factory.get('/', {'tags__tag': 'python'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + queryset = changelist.get_queryset(request) + + expected = [python_bookmark, django_bookmark] + self.assertEqual(list(queryset), expected) + + def test_booleanfieldlistfilter(self): + modeladmin = BookAdmin(Book, site) + self.verify_booleanfieldlistfilter(modeladmin) + + def test_booleanfieldlistfilter_tuple(self): + modeladmin = BookAdminWithTupleBooleanFilter(Book, site) + self.verify_booleanfieldlistfilter(modeladmin) + + def verify_booleanfieldlistfilter(self, modeladmin): + request = self.request_factory.get('/') + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + request = self.request_factory.get('/', {'is_best_seller__exact': 0}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.bio_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][3] + self.assertEqual(filterspec.title, 'is best seller') + choice = select_by(filterspec.choices(changelist), "display", "No") + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?is_best_seller__exact=0') + + request = self.request_factory.get('/', {'is_best_seller__exact': 1}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.guitar_book, self.djangonaut_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][3] + self.assertEqual(filterspec.title, 'is best seller') + choice = select_by(filterspec.choices(changelist), "display", "Yes") + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?is_best_seller__exact=1') + + request = self.request_factory.get('/', {'is_best_seller__isnull': 'True'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.django_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][3] + self.assertEqual(filterspec.title, 'is best seller') + choice = select_by(filterspec.choices(changelist), "display", "Unknown") + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?is_best_seller__isnull=True') + + def test_booleanfieldlistfilter_nullbooleanfield(self): + modeladmin = BookAdmin2(Book, site) + + request = self.request_factory.get('/') + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + request = self.request_factory.get('/', {'is_best_seller2__exact': 0}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.bio_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][3] + self.assertEqual(filterspec.title, 'is best seller2') + choice = select_by(filterspec.choices(changelist), "display", "No") + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?is_best_seller2__exact=0') + + request = self.request_factory.get('/', {'is_best_seller2__exact': 1}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.guitar_book, self.djangonaut_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][3] + self.assertEqual(filterspec.title, 'is best seller2') + choice = select_by(filterspec.choices(changelist), "display", "Yes") + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?is_best_seller2__exact=1') + + request = self.request_factory.get('/', {'is_best_seller2__isnull': 'True'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.django_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][3] + self.assertEqual(filterspec.title, 'is best seller2') + choice = select_by(filterspec.choices(changelist), "display", "Unknown") + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?is_best_seller2__isnull=True') + + def test_fieldlistfilter_underscorelookup_tuple(self): + """ + Ensure ('fieldpath', ClassName ) lookups pass lookup_allowed checks + when fieldpath contains double underscore in value (#19182). + """ + modeladmin = BookAdminWithUnderscoreLookupAndTuple(Book, site) + request = self.request_factory.get('/') + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + request = self.request_factory.get('/', {'author__email': 'alfred@example.com'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.bio_book, self.djangonaut_book]) + + def test_fieldlistfilter_invalid_lookup_parameters(self): + """Filtering by an invalid value.""" + modeladmin = BookAdmin(Book, site) + request = self.request_factory.get('/', {'author__id__exact': 'StringNotInteger!'}) + request.user = self.alfred + with self.assertRaises(IncorrectLookupParameters): + modeladmin.get_changelist_instance(request) + + def test_simplelistfilter(self): + modeladmin = DecadeFilterBookAdmin(Book, site) + + # Make sure that the first option is 'All' --------------------------- + request = self.request_factory.get('/', {}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), list(Book.objects.all().order_by('-id'))) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][1] + self.assertEqual(filterspec.title, 'publication decade') + choices = list(filterspec.choices(changelist)) + self.assertEqual(choices[0]['display'], 'All') + self.assertIs(choices[0]['selected'], True) + self.assertEqual(choices[0]['query_string'], '?') + + # Look for books in the 1980s ---------------------------------------- + request = self.request_factory.get('/', {'publication-decade': 'the 80s'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), []) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][1] + self.assertEqual(filterspec.title, 'publication decade') + choices = list(filterspec.choices(changelist)) + self.assertEqual(choices[1]['display'], 'the 1980\'s') + self.assertIs(choices[1]['selected'], True) + self.assertEqual(choices[1]['query_string'], '?publication-decade=the+80s') + + # Look for books in the 1990s ---------------------------------------- + request = self.request_factory.get('/', {'publication-decade': 'the 90s'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.bio_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][1] + self.assertEqual(filterspec.title, 'publication decade') + choices = list(filterspec.choices(changelist)) + self.assertEqual(choices[2]['display'], 'the 1990\'s') + self.assertIs(choices[2]['selected'], True) + self.assertEqual(choices[2]['query_string'], '?publication-decade=the+90s') + + # Look for books in the 2000s ---------------------------------------- + request = self.request_factory.get('/', {'publication-decade': 'the 00s'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.guitar_book, self.djangonaut_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][1] + self.assertEqual(filterspec.title, 'publication decade') + choices = list(filterspec.choices(changelist)) + self.assertEqual(choices[3]['display'], 'the 2000\'s') + self.assertIs(choices[3]['selected'], True) + self.assertEqual(choices[3]['query_string'], '?publication-decade=the+00s') + + # Combine multiple filters ------------------------------------------- + request = self.request_factory.get('/', {'publication-decade': 'the 00s', 'author__id__exact': self.alfred.pk}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.djangonaut_book]) + + # Make sure the correct choices are selected + filterspec = changelist.get_filters(request)[0][1] + self.assertEqual(filterspec.title, 'publication decade') + choices = list(filterspec.choices(changelist)) + self.assertEqual(choices[3]['display'], 'the 2000\'s') + self.assertIs(choices[3]['selected'], True) + self.assertEqual( + choices[3]['query_string'], + '?author__id__exact=%s&publication-decade=the+00s' % self.alfred.pk + ) + + filterspec = changelist.get_filters(request)[0][0] + self.assertEqual(filterspec.title, 'Verbose Author') + choice = select_by(filterspec.choices(changelist), "display", "alfred") + self.assertIs(choice['selected'], True) + self.assertEqual(choice['query_string'], '?author__id__exact=%s&publication-decade=the+00s' % self.alfred.pk) + + def test_listfilter_without_title(self): + """ + Any filter must define a title. + """ + modeladmin = DecadeFilterBookAdminWithoutTitle(Book, site) + request = self.request_factory.get('/', {}) + request.user = self.alfred + msg = "The list filter 'DecadeListFilterWithoutTitle' does not specify a 'title'." + with self.assertRaisesMessage(ImproperlyConfigured, msg): + modeladmin.get_changelist_instance(request) + + def test_simplelistfilter_without_parameter(self): + """ + Any SimpleListFilter must define a parameter_name. + """ + modeladmin = DecadeFilterBookAdminWithoutParameter(Book, site) + request = self.request_factory.get('/', {}) + request.user = self.alfred + msg = "The list filter 'DecadeListFilterWithoutParameter' does not specify a 'parameter_name'." + with self.assertRaisesMessage(ImproperlyConfigured, msg): + modeladmin.get_changelist_instance(request) + + def test_simplelistfilter_with_none_returning_lookups(self): + """ + A SimpleListFilter lookups method can return None but disables the + filter completely. + """ + modeladmin = DecadeFilterBookAdminWithNoneReturningLookups(Book, site) + request = self.request_factory.get('/', {}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + filterspec = changelist.get_filters(request)[0] + self.assertEqual(len(filterspec), 0) + + def test_filter_with_failing_queryset(self): + """ + When a filter's queryset method fails, it fails loudly and + the corresponding exception doesn't get swallowed (#17828). + """ + modeladmin = DecadeFilterBookAdminWithFailingQueryset(Book, site) + request = self.request_factory.get('/', {}) + request.user = self.alfred + with self.assertRaises(ZeroDivisionError): + modeladmin.get_changelist_instance(request) + + def test_simplelistfilter_with_queryset_based_lookups(self): + modeladmin = DecadeFilterBookAdminWithQuerysetBasedLookups(Book, site) + request = self.request_factory.get('/', {}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + filterspec = changelist.get_filters(request)[0][0] + self.assertEqual(filterspec.title, 'publication decade') + choices = list(filterspec.choices(changelist)) + self.assertEqual(len(choices), 3) + + self.assertEqual(choices[0]['display'], 'All') + self.assertIs(choices[0]['selected'], True) + self.assertEqual(choices[0]['query_string'], '?') + + self.assertEqual(choices[1]['display'], 'the 1990\'s') + self.assertIs(choices[1]['selected'], False) + self.assertEqual(choices[1]['query_string'], '?publication-decade=the+90s') + + self.assertEqual(choices[2]['display'], 'the 2000\'s') + self.assertIs(choices[2]['selected'], False) + self.assertEqual(choices[2]['query_string'], '?publication-decade=the+00s') + + def test_two_characters_long_field(self): + """ + list_filter works with two-characters long field names (#16080). + """ + modeladmin = BookAdmin(Book, site) + request = self.request_factory.get('/', {'no': '207'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.bio_book]) + + filterspec = changelist.get_filters(request)[0][-1] + self.assertEqual(filterspec.title, 'number') + choices = list(filterspec.choices(changelist)) + self.assertIs(choices[2]['selected'], True) + self.assertEqual(choices[2]['query_string'], '?no=207') + + def test_parameter_ends_with__in__or__isnull(self): + """ + A SimpleListFilter's parameter name is not mistaken for a model field + if it ends with '__isnull' or '__in' (#17091). + """ + # When it ends with '__in' ----------------------------------------- + modeladmin = DecadeFilterBookAdminParameterEndsWith__In(Book, site) + request = self.request_factory.get('/', {'decade__in': 'the 90s'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.bio_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][0] + self.assertEqual(filterspec.title, 'publication decade') + choices = list(filterspec.choices(changelist)) + self.assertEqual(choices[2]['display'], 'the 1990\'s') + self.assertIs(choices[2]['selected'], True) + self.assertEqual(choices[2]['query_string'], '?decade__in=the+90s') + + # When it ends with '__isnull' --------------------------------------- + modeladmin = DecadeFilterBookAdminParameterEndsWith__Isnull(Book, site) + request = self.request_factory.get('/', {'decade__isnull': 'the 90s'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.bio_book]) + + # Make sure the correct choice is selected + filterspec = changelist.get_filters(request)[0][0] + self.assertEqual(filterspec.title, 'publication decade') + choices = list(filterspec.choices(changelist)) + self.assertEqual(choices[2]['display'], 'the 1990\'s') + self.assertIs(choices[2]['selected'], True) + self.assertEqual(choices[2]['query_string'], '?decade__isnull=the+90s') + + def test_lookup_with_non_string_value(self): + """ + Ensure choices are set the selected class when using non-string values + for lookups in SimpleListFilters (#19318). + """ + modeladmin = DepartmentFilterEmployeeAdmin(Employee, site) + request = self.request_factory.get('/', {'department': self.john.department.pk}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + queryset = changelist.get_queryset(request) + + self.assertEqual(list(queryset), [self.john]) + + filterspec = changelist.get_filters(request)[0][-1] + self.assertEqual(filterspec.title, 'department') + choices = list(filterspec.choices(changelist)) + self.assertEqual(choices[1]['display'], 'DEV') + self.assertIs(choices[1]['selected'], True) + self.assertEqual(choices[1]['query_string'], '?department=%s' % self.john.department.pk) + + def test_lookup_with_non_string_value_underscored(self): + """ + Ensure SimpleListFilter lookups pass lookup_allowed checks when + parameter_name attribute contains double-underscore value (#19182). + """ + modeladmin = DepartmentFilterUnderscoredEmployeeAdmin(Employee, site) + request = self.request_factory.get('/', {'department__whatever': self.john.department.pk}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + queryset = changelist.get_queryset(request) + + self.assertEqual(list(queryset), [self.john]) + + filterspec = changelist.get_filters(request)[0][-1] + self.assertEqual(filterspec.title, 'department') + choices = list(filterspec.choices(changelist)) + self.assertEqual(choices[1]['display'], 'DEV') + self.assertIs(choices[1]['selected'], True) + self.assertEqual(choices[1]['query_string'], '?department__whatever=%s' % self.john.department.pk) + + def test_fk_with_to_field(self): + """ + A filter on a FK respects the FK's to_field attribute (#17972). + """ + modeladmin = EmployeeAdmin(Employee, site) + + request = self.request_factory.get('/', {}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.jack, self.john]) + + filterspec = changelist.get_filters(request)[0][-1] + self.assertEqual(filterspec.title, 'department') + choices = list(filterspec.choices(changelist)) + + self.assertEqual(choices[0]['display'], 'All') + self.assertIs(choices[0]['selected'], True) + self.assertEqual(choices[0]['query_string'], '?') + + self.assertEqual(choices[1]['display'], 'Development') + self.assertIs(choices[1]['selected'], False) + self.assertEqual(choices[1]['query_string'], '?department__code__exact=DEV') + + self.assertEqual(choices[2]['display'], 'Design') + self.assertIs(choices[2]['selected'], False) + self.assertEqual(choices[2]['query_string'], '?department__code__exact=DSN') + + # Filter by Department=='Development' -------------------------------- + + request = self.request_factory.get('/', {'department__code__exact': 'DEV'}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + + # Make sure the correct queryset is returned + queryset = changelist.get_queryset(request) + self.assertEqual(list(queryset), [self.john]) + + filterspec = changelist.get_filters(request)[0][-1] + self.assertEqual(filterspec.title, 'department') + choices = list(filterspec.choices(changelist)) + + self.assertEqual(choices[0]['display'], 'All') + self.assertIs(choices[0]['selected'], False) + self.assertEqual(choices[0]['query_string'], '?') + + self.assertEqual(choices[1]['display'], 'Development') + self.assertIs(choices[1]['selected'], True) + self.assertEqual(choices[1]['query_string'], '?department__code__exact=DEV') + + self.assertEqual(choices[2]['display'], 'Design') + self.assertIs(choices[2]['selected'], False) + self.assertEqual(choices[2]['query_string'], '?department__code__exact=DSN') + + def test_lookup_with_dynamic_value(self): + """ + Ensure SimpleListFilter can access self.value() inside the lookup. + """ + modeladmin = DepartmentFilterDynamicValueBookAdmin(Book, site) + + def _test_choices(request, expected_displays): + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + filterspec = changelist.get_filters(request)[0][0] + self.assertEqual(filterspec.title, 'publication decade') + choices = tuple(c['display'] for c in filterspec.choices(changelist)) + self.assertEqual(choices, expected_displays) + + _test_choices(self.request_factory.get('/', {}), + ("All", "the 1980's", "the 1990's")) + + _test_choices(self.request_factory.get('/', {'publication-decade': 'the 80s'}), + ("All", "the 1990's")) + + _test_choices(self.request_factory.get('/', {'publication-decade': 'the 90s'}), + ("All", "the 1980's")) + + def test_list_filter_queryset_filtered_by_default(self): + """ + A list filter that filters the queryset by default gives the correct + full_result_count. + """ + modeladmin = NotNinetiesListFilterAdmin(Book, site) + request = self.request_factory.get('/', {}) + request.user = self.alfred + changelist = modeladmin.get_changelist_instance(request) + changelist.get_results(request) + self.assertEqual(changelist.full_result_count, 4) diff --git a/tests/django_tests/tests/v21/tests/admin_inlines/__init__.py b/tests/django_tests/tests/v21/tests/admin_inlines/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/django_tests/tests/v21/tests/admin_inlines/admin.py b/tests/django_tests/tests/v21/tests/admin_inlines/admin.py new file mode 100644 index 00000000..b5f343a5 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_inlines/admin.py @@ -0,0 +1,259 @@ +from django import forms +from django.contrib import admin +from django.db import models + +from .models import ( + Author, BinaryTree, CapoFamiglia, Chapter, ChildModel1, ChildModel2, + Consigliere, EditablePKBook, ExtraTerrestrial, Fashionista, Holder, + Holder2, Holder3, Holder4, Inner, Inner2, Inner3, Inner4Stacked, + Inner4Tabular, NonAutoPKBook, NonAutoPKBookChild, Novel, + NovelReadonlyChapter, ParentModelWithCustomPk, Poll, Profile, + ProfileCollection, Question, ReadOnlyInline, ShoppingWeakness, Sighting, + SomeChildModel, SomeParentModel, SottoCapo, Title, TitleCollection, +) + +site = admin.AdminSite(name="admin") + + +class BookInline(admin.TabularInline): + model = Author.books.through + + +class NonAutoPKBookTabularInline(admin.TabularInline): + model = NonAutoPKBook + classes = ('collapse',) + + +class NonAutoPKBookChildTabularInline(admin.TabularInline): + model = NonAutoPKBookChild + classes = ('collapse',) + + +class NonAutoPKBookStackedInline(admin.StackedInline): + model = NonAutoPKBook + classes = ('collapse',) + + +class EditablePKBookTabularInline(admin.TabularInline): + model = EditablePKBook + + +class EditablePKBookStackedInline(admin.StackedInline): + model = EditablePKBook + + +class AuthorAdmin(admin.ModelAdmin): + inlines = [ + BookInline, NonAutoPKBookTabularInline, NonAutoPKBookStackedInline, + EditablePKBookTabularInline, EditablePKBookStackedInline, + NonAutoPKBookChildTabularInline, + ] + + +class InnerInline(admin.StackedInline): + model = Inner + can_delete = False + readonly_fields = ('readonly',) # For bug #13174 tests. + + +class HolderAdmin(admin.ModelAdmin): + + class Media: + js = ('my_awesome_admin_scripts.js',) + + +class ReadOnlyInlineInline(admin.TabularInline): + model = ReadOnlyInline + readonly_fields = ['name'] + + +class InnerInline2(admin.StackedInline): + model = Inner2 + + class Media: + js = ('my_awesome_inline_scripts.js',) + + +class InnerInline2Tabular(admin.TabularInline): + model = Inner2 + + +class CustomNumberWidget(forms.NumberInput): + class Media: + js = ('custom_number.js',) + + +class InnerInline3(admin.StackedInline): + model = Inner3 + formfield_overrides = { + models.IntegerField: {'widget': CustomNumberWidget}, + } + + class Media: + js = ('my_awesome_inline_scripts.js',) + + +class TitleForm(forms.ModelForm): + title1 = forms.CharField(max_length=100) + + def clean(self): + cleaned_data = self.cleaned_data + title1 = cleaned_data.get("title1") + title2 = cleaned_data.get("title2") + if title1 != title2: + raise forms.ValidationError("The two titles must be the same") + return cleaned_data + + +class TitleInline(admin.TabularInline): + model = Title + form = TitleForm + extra = 1 + + +class Inner4StackedInline(admin.StackedInline): + model = Inner4Stacked + show_change_link = True + + +class Inner4TabularInline(admin.TabularInline): + model = Inner4Tabular + show_change_link = True + + +class Holder4Admin(admin.ModelAdmin): + inlines = [Inner4StackedInline, Inner4TabularInline] + + +class InlineWeakness(admin.TabularInline): + model = ShoppingWeakness + extra = 1 + + +class QuestionInline(admin.TabularInline): + model = Question + readonly_fields = ['call_me'] + + def call_me(self, obj): + return 'Callable in QuestionInline' + + +class PollAdmin(admin.ModelAdmin): + inlines = [QuestionInline] + + def call_me(self, obj): + return 'Callable in PollAdmin' + + +class ChapterInline(admin.TabularInline): + model = Chapter + readonly_fields = ['call_me'] + + def call_me(self, obj): + return 'Callable in ChapterInline' + + +class NovelAdmin(admin.ModelAdmin): + inlines = [ChapterInline] + + +class ReadOnlyChapterInline(admin.TabularInline): + model = Chapter + + def has_change_permission(self, request, obj=None): + return False + + +class NovelReadonlyChapterAdmin(admin.ModelAdmin): + inlines = [ReadOnlyChapterInline] + + +class ConsigliereInline(admin.TabularInline): + model = Consigliere + + +class SottoCapoInline(admin.TabularInline): + model = SottoCapo + + +class ProfileInline(admin.TabularInline): + model = Profile + extra = 1 + + +# admin for #18433 +class ChildModel1Inline(admin.TabularInline): + model = ChildModel1 + + +class ChildModel2Inline(admin.StackedInline): + model = ChildModel2 + + +# admin for #19425 and #18388 +class BinaryTreeAdmin(admin.TabularInline): + model = BinaryTree + + def get_extra(self, request, obj=None, **kwargs): + extra = 2 + if obj: + return extra - obj.binarytree_set.count() + return extra + + def get_max_num(self, request, obj=None, **kwargs): + max_num = 3 + if obj: + return max_num - obj.binarytree_set.count() + return max_num + + +# admin for #19524 +class SightingInline(admin.TabularInline): + model = Sighting + + +# admin and form for #18263 +class SomeChildModelForm(forms.ModelForm): + + class Meta: + fields = '__all__' + model = SomeChildModel + widgets = { + 'position': forms.HiddenInput, + } + labels = {'readonly_field': 'Label from ModelForm.Meta'} + help_texts = {'readonly_field': 'Help text from ModelForm.Meta'} + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['name'].label = 'new label' + + +class SomeChildModelInline(admin.TabularInline): + model = SomeChildModel + form = SomeChildModelForm + readonly_fields = ('readonly_field',) + + +site.register(TitleCollection, inlines=[TitleInline]) +# Test bug #12561 and #12778 +# only ModelAdmin media +site.register(Holder, HolderAdmin, inlines=[InnerInline]) +# ModelAdmin and Inline media +site.register(Holder2, HolderAdmin, inlines=[InnerInline2, InnerInline2Tabular]) +# only Inline media +site.register(Holder3, inlines=[InnerInline3]) + +site.register(Poll, PollAdmin) +site.register(Novel, NovelAdmin) +site.register(NovelReadonlyChapter, NovelReadonlyChapterAdmin) +site.register(Fashionista, inlines=[InlineWeakness]) +site.register(Holder4, Holder4Admin) +site.register(Author, AuthorAdmin) +site.register(CapoFamiglia, inlines=[ConsigliereInline, SottoCapoInline, ReadOnlyInlineInline]) +site.register(ProfileCollection, inlines=[ProfileInline]) +site.register(ParentModelWithCustomPk, inlines=[ChildModel1Inline, ChildModel2Inline]) +site.register(BinaryTree, inlines=[BinaryTreeAdmin]) +site.register(ExtraTerrestrial, inlines=[SightingInline]) +site.register(SomeParentModel, inlines=[SomeChildModelInline]) +site.register([Question, Inner4Stacked, Inner4Tabular]) diff --git a/tests/django_tests/tests/v21/tests/admin_inlines/models.py b/tests/django_tests/tests/v21/tests/admin_inlines/models.py new file mode 100644 index 00000000..cb1ec39a --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_inlines/models.py @@ -0,0 +1,269 @@ +""" +Testing of admin inline formsets. +""" +import random + +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.models import ContentType +from django.db import models + + +class Parent(models.Model): + name = models.CharField(max_length=50) + + def __str__(self): + return self.name + + +class Teacher(models.Model): + name = models.CharField(max_length=50) + + def __str__(self): + return self.name + + +class Child(models.Model): + name = models.CharField(max_length=50) + teacher = models.ForeignKey(Teacher, models.CASCADE) + + content_type = models.ForeignKey(ContentType, models.CASCADE) + object_id = models.PositiveIntegerField() + parent = GenericForeignKey() + + def __str__(self): + return 'I am %s, a child of %s' % (self.name, self.parent) + + +class Book(models.Model): + name = models.CharField(max_length=50) + + +class Author(models.Model): + name = models.CharField(max_length=50) + books = models.ManyToManyField(Book) + + +class NonAutoPKBook(models.Model): + rand_pk = models.IntegerField(primary_key=True, editable=False) + author = models.ForeignKey(Author, models.CASCADE) + title = models.CharField(max_length=50) + + def save(self, *args, **kwargs): + while not self.rand_pk: + test_pk = random.randint(1, 99999) + if not NonAutoPKBook.objects.filter(rand_pk=test_pk).exists(): + self.rand_pk = test_pk + super().save(*args, **kwargs) + + +class NonAutoPKBookChild(NonAutoPKBook): + pass + + +class EditablePKBook(models.Model): + manual_pk = models.IntegerField(primary_key=True) + author = models.ForeignKey(Author, models.CASCADE) + title = models.CharField(max_length=50) + + +class Holder(models.Model): + dummy = models.IntegerField() + + +class Inner(models.Model): + dummy = models.IntegerField() + holder = models.ForeignKey(Holder, models.CASCADE) + readonly = models.CharField("Inner readonly label", max_length=1) + + def get_absolute_url(self): + return '/inner/' + + +class Holder2(models.Model): + dummy = models.IntegerField() + + +class Inner2(models.Model): + dummy = models.IntegerField() + holder = models.ForeignKey(Holder2, models.CASCADE) + + +class Holder3(models.Model): + dummy = models.IntegerField() + + +class Inner3(models.Model): + dummy = models.IntegerField() + holder = models.ForeignKey(Holder3, models.CASCADE) + +# Models for ticket #8190 + + +class Holder4(models.Model): + dummy = models.IntegerField() + + +class Inner4Stacked(models.Model): + dummy = models.IntegerField(help_text="Awesome stacked help text is awesome.") + holder = models.ForeignKey(Holder4, models.CASCADE) + + +class Inner4Tabular(models.Model): + dummy = models.IntegerField(help_text="Awesome tabular help text is awesome.") + holder = models.ForeignKey(Holder4, models.CASCADE) + +# Models for #12749 + + +class Person(models.Model): + firstname = models.CharField(max_length=15) + + +class OutfitItem(models.Model): + name = models.CharField(max_length=15) + + +class Fashionista(models.Model): + person = models.OneToOneField(Person, models.CASCADE, primary_key=True) + weaknesses = models.ManyToManyField(OutfitItem, through='ShoppingWeakness', blank=True) + + +class ShoppingWeakness(models.Model): + fashionista = models.ForeignKey(Fashionista, models.CASCADE) + item = models.ForeignKey(OutfitItem, models.CASCADE) + +# Models for #13510 + + +class TitleCollection(models.Model): + pass + + +class Title(models.Model): + collection = models.ForeignKey(TitleCollection, models.SET_NULL, blank=True, null=True) + title1 = models.CharField(max_length=100) + title2 = models.CharField(max_length=100) + +# Models for #15424 + + +class Poll(models.Model): + name = models.CharField(max_length=40) + + +class Question(models.Model): + poll = models.ForeignKey(Poll, models.CASCADE) + + +class Novel(models.Model): + name = models.CharField(max_length=40) + + +class NovelReadonlyChapter(Novel): + + class Meta: + proxy = True + + +class Chapter(models.Model): + name = models.CharField(max_length=40) + novel = models.ForeignKey(Novel, models.CASCADE) + + +class FootNote(models.Model): + """ + Model added for ticket 19838 + """ + chapter = models.ForeignKey(Chapter, models.PROTECT) + note = models.CharField(max_length=40) + +# Models for #16838 + + +class CapoFamiglia(models.Model): + name = models.CharField(max_length=100) + + +class Consigliere(models.Model): + name = models.CharField(max_length=100, help_text='Help text for Consigliere') + capo_famiglia = models.ForeignKey(CapoFamiglia, models.CASCADE, related_name='+') + + +class SottoCapo(models.Model): + name = models.CharField(max_length=100) + capo_famiglia = models.ForeignKey(CapoFamiglia, models.CASCADE, related_name='+') + + +class ReadOnlyInline(models.Model): + name = models.CharField(max_length=100, help_text='Help text for ReadOnlyInline') + capo_famiglia = models.ForeignKey(CapoFamiglia, models.CASCADE) + + +# Models for #18433 + +class ParentModelWithCustomPk(models.Model): + my_own_pk = models.CharField(max_length=100, primary_key=True) + name = models.CharField(max_length=100) + + +class ChildModel1(models.Model): + my_own_pk = models.CharField(max_length=100, primary_key=True) + name = models.CharField(max_length=100) + parent = models.ForeignKey(ParentModelWithCustomPk, models.CASCADE) + + def get_absolute_url(self): + return '/child_model1/' + + +class ChildModel2(models.Model): + my_own_pk = models.CharField(max_length=100, primary_key=True) + name = models.CharField(max_length=100) + parent = models.ForeignKey(ParentModelWithCustomPk, models.CASCADE) + + def get_absolute_url(self): + return '/child_model2/' + + +# Models for #19425 +class BinaryTree(models.Model): + name = models.CharField(max_length=100) + parent = models.ForeignKey('self', models.SET_NULL, null=True, blank=True) + +# Models for #19524 + + +class LifeForm(models.Model): + pass + + +class ExtraTerrestrial(LifeForm): + name = models.CharField(max_length=100) + + +class Sighting(models.Model): + et = models.ForeignKey(ExtraTerrestrial, models.CASCADE) + place = models.CharField(max_length=100) + + +# Models for #18263 +class SomeParentModel(models.Model): + name = models.CharField(max_length=1) + + +class SomeChildModel(models.Model): + name = models.CharField(max_length=1) + position = models.PositiveIntegerField() + parent = models.ForeignKey(SomeParentModel, models.CASCADE) + readonly_field = models.CharField(max_length=1) + +# Other models + + +class ProfileCollection(models.Model): + pass + + +class Profile(models.Model): + collection = models.ForeignKey(ProfileCollection, models.SET_NULL, blank=True, null=True) + first_name = models.CharField(max_length=100) + last_name = models.CharField(max_length=100) diff --git a/tests/django_tests/tests/v21/tests/admin_inlines/test_templates.py b/tests/django_tests/tests/v21/tests/admin_inlines/test_templates.py new file mode 100644 index 00000000..5c8d7ce0 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_inlines/test_templates.py @@ -0,0 +1,23 @@ +import json + +from django.template.loader import render_to_string +from django.test import SimpleTestCase + + +class TestTemplates(SimpleTestCase): + def test_javascript_escaping(self): + context = { + 'inline_admin_formset': { + 'inline_formset_data': json.dumps({ + 'formset': {'prefix': 'my-prefix'}, + 'opts': {'verbose_name': 'verbose name\\'}, + }), + }, + } + output = render_to_string('admin/edit_inline/stacked.html', context) + self.assertIn('"prefix": "my-prefix"', output) + self.assertIn('"verbose_name": "verbose name\\\\"', output) + + output = render_to_string('admin/edit_inline/tabular.html', context) + self.assertIn('"prefix": "my-prefix"', output) + self.assertIn('"verbose_name": "verbose name\\\\"', output) diff --git a/tests/django_tests/tests/v21/tests/admin_inlines/tests.py b/tests/django_tests/tests/v21/tests/admin_inlines/tests.py new file mode 100644 index 00000000..749b3dd7 --- /dev/null +++ b/tests/django_tests/tests/v21/tests/admin_inlines/tests.py @@ -0,0 +1,964 @@ +from django.contrib.admin import ModelAdmin, TabularInline +from django.contrib.admin.helpers import InlineAdminForm +from django.contrib.admin.tests import AdminSeleniumTestCase +from django.contrib.auth.models import Permission, User +from django.contrib.contenttypes.models import ContentType +from django.test import RequestFactory, TestCase, override_settings +from django.urls import reverse + +from .admin import InnerInline, site as admin_site +from .models import ( + Author, BinaryTree, Book, Chapter, Child, ChildModel1, ChildModel2, + Fashionista, FootNote, Holder, Holder2, Holder3, Holder4, Inner, Inner2, + Inner3, Inner4Stacked, Inner4Tabular, Novel, OutfitItem, Parent, + ParentModelWithCustomPk, Person, Poll, Profile, ProfileCollection, + Question, Sighting, SomeChildModel, SomeParentModel, Teacher, +) + +INLINE_CHANGELINK_HTML = 'class="inlinechangelink">Change' + + +class TestDataMixin: + + @classmethod + def setUpTestData(cls): + cls.superuser = User.objects.create_superuser(username='super', email='super@example.com', password='secret') + + +@override_settings(ROOT_URLCONF='admin_inlines.urls') +class TestInline(TestDataMixin, TestCase): + + def setUp(self): + holder = Holder(dummy=13) + holder.save() + Inner(dummy=42, holder=holder).save() + + self.client.force_login(self.superuser) + self.factory = RequestFactory() + + def test_can_delete(self): + """ + can_delete should be passed to inlineformset factory. + """ + holder = Holder.objects.get(dummy=13) + response = self.client.get( + reverse('admin:admin_inlines_holder_change', args=(holder.id,)) + ) + inner_formset = response.context['inline_admin_formsets'][0].formset + expected = InnerInline.can_delete + actual = inner_formset.can_delete + self.assertEqual(expected, actual, 'can_delete must be equal') + + def test_readonly_stacked_inline_label(self): + """Bug #13174.""" + holder = Holder.objects.create(dummy=42) + Inner.objects.create(holder=holder, dummy=42, readonly='') + response = self.client.get( + reverse('admin:admin_inlines_holder_change', args=(holder.id,)) + ) + self.assertContains(response, '') + + def test_many_to_many_inlines(self): + "Autogenerated many-to-many inlines are displayed correctly (#13407)" + response = self.client.get(reverse('admin:admin_inlines_author_add')) + # The heading for the m2m inline block uses the right text + self.assertContains(response, '

    Author-book relationships

    ') + # The "add another" label is correct + self.assertContains(response, 'Add another Author-book relationship') + # The '+' is dropped from the autogenerated form prefix (Author_books+) + self.assertContains(response, 'id="id_Author_books-TOTAL_FORMS"') + + def test_inline_primary(self): + person = Person.objects.create(firstname='Imelda') + item = OutfitItem.objects.create(name='Shoes') + # Imelda likes shoes, but can't carry her own bags. + data = { + 'shoppingweakness_set-TOTAL_FORMS': 1, + 'shoppingweakness_set-INITIAL_FORMS': 0, + 'shoppingweakness_set-MAX_NUM_FORMS': 0, + '_save': 'Save', + 'person': person.id, + 'max_weight': 0, + 'shoppingweakness_set-0-item': item.id, + } + response = self.client.post(reverse('admin:admin_inlines_fashionista_add'), data) + self.assertEqual(response.status_code, 302) + self.assertEqual(len(Fashionista.objects.filter(person__firstname='Imelda')), 1) + + def test_custom_form_tabular_inline_label(self): + """ + A model form with a form field specified (TitleForm.title1) should have + its label rendered in the tabular inline. + """ + response = self.client.get(reverse('admin:admin_inlines_titlecollection_add')) + self.assertContains(response, 'Title1', html=True) + + def test_custom_form_tabular_inline_overridden_label(self): + """ + SomeChildModelForm.__init__() overrides the label of a form field. + That label is displayed in the TabularInline. + """ + response = self.client.get(reverse('admin:admin_inlines_someparentmodel_add')) + field = list(response.context['inline_admin_formset'].fields())[0] + self.assertEqual(field['label'], 'new label') + self.assertContains(response, 'New label', html=True) + + def test_tabular_non_field_errors(self): + """ + non_field_errors are displayed correctly, including the correct value + for colspan. + """ + data = { + 'title_set-TOTAL_FORMS': 1, + 'title_set-INITIAL_FORMS': 0, + 'title_set-MAX_NUM_FORMS': 0, + '_save': 'Save', + 'title_set-0-title1': 'a title', + 'title_set-0-title2': 'a different title', + } + response = self.client.post(reverse('admin:admin_inlines_titlecollection_add'), data) + # Here colspan is "4": two fields (title1 and title2), one hidden field and the delete checkbox. + self.assertContains( + response, + '
      ' + '
    • The two titles must be the same
    ' + ) + + def test_no_parent_callable_lookup(self): + """Admin inline `readonly_field` shouldn't invoke parent ModelAdmin callable""" + # Identically named callable isn't present in the parent ModelAdmin, + # rendering of the add view shouldn't explode + response = self.client.get(reverse('admin:admin_inlines_novel_add')) + self.assertEqual(response.status_code, 200) + # View should have the child inlines section + self.assertContains( + response, + '
    Callable in QuestionInline

    ') + + def test_help_text(self): + """ + The inlines' model field help texts are displayed when using both the + stacked and tabular layouts. + """ + response = self.client.get(reverse('admin:admin_inlines_holder4_add')) + self.assertContains(response, '
    Awesome stacked help text is awesome.
    ', 4) + self.assertContains( + response, + '', + 1 + ) + # ReadOnly fields + response = self.client.get(reverse('admin:admin_inlines_capofamiglia_add')) + self.assertContains( + response, + '', + 1 + ) + + def test_tabular_model_form_meta_readonly_field(self): + """ + Tabular inlines use ModelForm.Meta.help_texts and labels for read-only + fields. + """ + response = self.client.get(reverse('admin:admin_inlines_someparentmodel_add')) + self.assertContains( + response, + '' + ) + self.assertContains(response, 'Label from ModelForm.Meta') + + def test_inline_hidden_field_no_column(self): + """#18263 -- Make sure hidden fields don't get a column in tabular inlines""" + parent = SomeParentModel.objects.create(name='a') + SomeChildModel.objects.create(name='b', position='0', parent=parent) + SomeChildModel.objects.create(name='c', position='1', parent=parent) + response = self.client.get(reverse('admin:admin_inlines_someparentmodel_change', args=(parent.pk,))) + self.assertNotContains(response, '') + self.assertInHTML( + '', + response.rendered_content, + ) + + def test_non_related_name_inline(self): + """ + Multiple inlines with related_name='+' have correct form prefixes. + """ + response = self.client.get(reverse('admin:admin_inlines_capofamiglia_add')) + self.assertContains(response, '', html=True) + self.assertContains( + response, + '', + html=True + ) + self.assertContains( + response, + '', + html=True + ) + self.assertContains(response, '', html=True) + self.assertContains( + response, + '', + html=True + ) + self.assertContains( + response, + '', + html=True + ) + + @override_settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=True) + def test_localize_pk_shortcut(self): + """ + The "View on Site" link is correct for locales that use thousand + separators. + """ + holder = Holder.objects.create(pk=123456789, dummy=42) + inner = Inner.objects.create(pk=987654321, holder=holder, dummy=42, readonly='') + response = self.client.get(reverse('admin:admin_inlines_holder_change', args=(holder.id,))) + inner_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(inner).pk, inner.pk) + self.assertContains(response, inner_shortcut) + + def test_custom_pk_shortcut(self): + """ + The "View on Site" link is correct for models with a custom primary key + field. + """ + parent = ParentModelWithCustomPk.objects.create(my_own_pk="foo", name="Foo") + child1 = ChildModel1.objects.create(my_own_pk="bar", name="Bar", parent=parent) + child2 = ChildModel2.objects.create(my_own_pk="baz", name="Baz", parent=parent) + response = self.client.get(reverse('admin:admin_inlines_parentmodelwithcustompk_change', args=('foo',))) + child1_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(child1).pk, child1.pk) + child2_shortcut = 'r/%s/%s/' % (ContentType.objects.get_for_model(child2).pk, child2.pk) + self.assertContains(response, child1_shortcut) + self.assertContains(response, child2_shortcut) + + def test_create_inlines_on_inherited_model(self): + """ + An object can be created with inlines when it inherits another class. + """ + data = { + 'name': 'Martian', + 'sighting_set-TOTAL_FORMS': 1, + 'sighting_set-INITIAL_FORMS': 0, + 'sighting_set-MAX_NUM_FORMS': 0, + 'sighting_set-0-place': 'Zone 51', + '_save': 'Save', + } + response = self.client.post(reverse('admin:admin_inlines_extraterrestrial_add'), data) + self.assertEqual(response.status_code, 302) + self.assertEqual(Sighting.objects.filter(et__name='Martian').count(), 1) + + def test_custom_get_extra_form(self): + bt_head = BinaryTree.objects.create(name="Tree Head") + BinaryTree.objects.create(name="First Child", parent=bt_head) + # The maximum number of forms should respect 'get_max_num' on the + # ModelAdmin + max_forms_input = ( + '' + ) + # The total number of forms will remain the same in either case + total_forms_hidden = ( + '' + ) + response = self.client.get(reverse('admin:admin_inlines_binarytree_add')) + self.assertInHTML(max_forms_input % 3, response.rendered_content) + self.assertInHTML(total_forms_hidden, response.rendered_content) + + response = self.client.get(reverse('admin:admin_inlines_binarytree_change', args=(bt_head.id,))) + self.assertInHTML(max_forms_input % 2, response.rendered_content) + self.assertInHTML(total_forms_hidden, response.rendered_content) + + def test_min_num(self): + """ + min_num and extra determine number of forms. + """ + class MinNumInline(TabularInline): + model = BinaryTree + min_num = 2 + extra = 3 + + modeladmin = ModelAdmin(BinaryTree, admin_site) + modeladmin.inlines = [MinNumInline] + min_forms = ( + '' + ) + total_forms = ( + '' + ) + request = self.factory.get(reverse('admin:admin_inlines_binarytree_add')) + request.user = User(username='super', is_superuser=True) + response = modeladmin.changeform_view(request) + self.assertInHTML(min_forms, response.rendered_content) + self.assertInHTML(total_forms, response.rendered_content) + + def test_custom_min_num(self): + bt_head = BinaryTree.objects.create(name="Tree Head") + BinaryTree.objects.create(name="First Child", parent=bt_head) + + class MinNumInline(TabularInline): + model = BinaryTree + extra = 3 + + def get_min_num(self, request, obj=None, **kwargs): + if obj: + return 5 + return 2 + + modeladmin = ModelAdmin(BinaryTree, admin_site) + modeladmin.inlines = [MinNumInline] + min_forms = ( + '' + ) + total_forms = ( + '' + ) + request = self.factory.get(reverse('admin:admin_inlines_binarytree_add')) + request.user = User(username='super', is_superuser=True) + response = modeladmin.changeform_view(request) + self.assertInHTML(min_forms % 2, response.rendered_content) + self.assertInHTML(total_forms % 5, response.rendered_content) + + request = self.factory.get(reverse('admin:admin_inlines_binarytree_change', args=(bt_head.id,))) + request.user = User(username='super', is_superuser=True) + response = modeladmin.changeform_view(request, object_id=str(bt_head.id)) + self.assertInHTML(min_forms % 5, response.rendered_content) + self.assertInHTML(total_forms % 8, response.rendered_content) + + def test_inline_nonauto_noneditable_pk(self): + response = self.client.get(reverse('admin:admin_inlines_author_add')) + self.assertContains( + response, + '', + html=True + ) + self.assertContains( + response, + '', + html=True + ) + + def test_inline_nonauto_noneditable_inherited_pk(self): + response = self.client.get(reverse('admin:admin_inlines_author_add')) + self.assertContains( + response, + '', + html=True + ) + self.assertContains( + response, + '', + html=True + ) + + def test_inline_editable_pk(self): + response = self.client.get(reverse('admin:admin_inlines_author_add')) + self.assertContains( + response, + '', + html=True, count=1 + ) + self.assertContains( + response, + '', + html=True, count=1 + ) + + def test_stacked_inline_edit_form_contains_has_original_class(self): + holder = Holder.objects.create(dummy=1) + holder.inner_set.create(dummy=1) + response = self.client.get(reverse('admin:admin_inlines_holder_change', args=(holder.pk,))) + self.assertContains( + response, + '