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..55cf710a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,17 @@ dist/ +build/ .idea/ -_site/ +.tox/ *__pycache__* +*egg-info/ + +docs/.sass-cache/* +docs/_site/* +tests/logs + +Gemfile.lock + +/docs/.jekyll-metadata +/docs/djongocs/assets/* + +.vscode/ \ 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/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..87a57d6b --- /dev/null +++ b/djongo/models/fields.py @@ -0,0 +1,1091 @@ +""" +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 + +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) 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..b8e0d0c6 --- /dev/null +++ b/djongo/sql2mongo/sql_tokens.py @@ -0,0 +1,440 @@ +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', + 'SQLConstIntIdentifier', + 'SQLConstParameterizedIdentifier', + '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: + # TMiles-2022.XI.18 - Specify int identifier to match original functionality. + yield SQLConstIntIdentifier(token, query) + elif isinstance(token[0], Function): + yield SQLFunc.token2sql(token, query) + elif token[0].ttype == tokens.Name.Placeholder: + # TMiles-2022.XI.18 + # Use a parameterized const identifier to handle newer django foreign key lookup queries. + yield SQLConstParameterizedIdentifier(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 + + +# TMiles-2022.XI.18 +# Break ConstIdentifier into Int and Parameterized subclasses to allow for django 4 +# foreign key lookups and for future expansion to other non-int constants. +class SQLConstIdentifier(AliasableToken): + + def __init__(self, *args): + super().__init__(*args) + + def to_mongo(self) -> dict: + return {'$literal': self.value} + +class SQLConstIntIdentifier(SQLConstIdentifier): + + def __init__(self, *args): + super().__init__(*args) + + @property + def value(self) -> int: + return int(self._token[0][1].value) + +class SQLConstParameterizedIdentifier(SQLConstIdentifier): + + def __init__(self, *args): + tok = args[0] + if (tok[0].ttype != tokens.Name.Placeholder): + raise Exception("Token is not a placeholder") + super().__init__(*args) + + @property + def value(self): + return self.query.params[self.placeholder_index(self._token[0])] + + +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..8a471882 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1,184 @@ -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: "markdown/documentation" + 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" + - scope: + path: "markdown/legal" + type: pages + values: + toc: true + toc_sticky: false + 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/assets/css/custom.css b/docs/assets/css/custom.css new file mode 100644 index 00000000..84014ca3 --- /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}.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:#b2231f}.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}}.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}.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}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)}.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 a:not(.btn,.cta),.pitch-white a:not(.btn,.cta),.pitch-grey a:not(.btn,.cta){text-decoration:none;color:#457d5b}.pitch a:not(.btn,.cta):hover,.pitch-white a:not(.btn,.cta):hover,.pitch-grey a:not(.btn,.cta):hover{color:#09411f}.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;color:#fff}.btn--theme:hover{background-color:#457d5b;color:#fff}.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 #b6b7b7;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..b70e3d35 --- /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..b70e3d35 --- /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/enterprise/index.html b/docs/djongocs/enterprise/index.html new file mode 100644 index 00000000..b70e3d35 --- /dev/null +++ b/docs/djongocs/enterprise/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..b70e3d35 --- /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..b70e3d35 --- /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.0a7c18a5b8d2331f.js b/docs/djongocs/main.0a7c18a5b8d2331f.js new file mode 100644 index 00000000..23bfa948 --- /dev/null +++ b/docs/djongocs/main.0a7c18a5b8d2331f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdjongo_FE=self.webpackChunkdjongo_FE||[]).push([[179],{536:()=>{function $n(e){return"function"==typeof e}let Do=!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 Do&&console.log("RxJS: Back to a better error behavior. Thank you. <3");Do=e},get useDeprecatedSynchronousErrorHandling(){return Do}};function Sn(e){setTimeout(()=>{throw e},0)}const Ui={closed:!0,next(e){},error(e){if(vt.useDeprecatedSynchronousErrorHandling)throw e;Sn(e)},complete(){}},$i=Array.isArray||(e=>e&&"number"==typeof e.length);function rl(e){return null!==e&&"object"==typeof e}const Gi=(()=>{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 Gi?n.errors:n),[])}ye.EMPTY=((e=new ye).closed=!0,e);const qi="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=Ui;break;case 1:if(!t){this.destination=Ui;break}if("object"==typeof t){t instanceof fe?(this.syncErrorThrowable=t.syncErrorThrowable,this.destination=t,t.add(this)):(this.syncErrorThrowable=!0,this.destination=new Tf(this,t));break}default:this.syncErrorThrowable=!0,this.destination=new Tf(this,t,n,r)}}[qi](){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 Tf extends fe{constructor(t,n,r,o){super(),this._parentSubscriber=t;let i,s=this;$n(n)?i=n:n&&(i=n.next,r=n.error,o=n.complete,n!==Ui&&(s=Object.create(n),$n(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):Sn(t),this.unsubscribe();else{if(this.unsubscribe(),r)throw t;Sn(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;Sn(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):(Sn(o),!0)}return!1}_unsubscribe(){const{_parentSubscriber:t}=this;this._context=null,this._parentSubscriber=null,t.unsubscribe()}}const Co="function"==typeof Symbol&&Symbol.observable||"@@observable";function zi(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 $C(e,t,n){if(e){if(e instanceof fe)return e;if(e[qi])return e[qi]()}return e||t||n?new fe(e,t,n):new fe(Ui)}(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 UC(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=Nf(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)}[Co](){return this}pipe(...n){return 0===n.length?this:function xf(e){return 0===e.length?zi:1===e.length?e[0]:function(n){return e.reduce((r,o)=>o(r),n)}}(n)(this)}toPromise(n){return new(n=Nf(n))((r,o)=>{let i;this.subscribe(s=>i=s,s=>o(s),()=>r(i))})}}return e.create=t=>new e(t),e})();function Nf(e){if(e||(e=vt.Promise||Promise),!e)throw new Error("no Promise impl found");return e}const gr=(()=>{function e(){return Error.call(this),this.message="object unsubscribed",this.name="ObjectUnsubscribedError",this}return e.prototype=Object.create(Error.prototype),e})();class GC 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 Rf extends fe{constructor(t){super(t),this.destination=t}}let $t=(()=>{class e extends pe{constructor(){super(),this.observers=[],this.closed=!1,this.isStopped=!1,this.hasError=!1,this.thrownError=null}[qi](){return new Rf(this)}lift(n){const r=new Ff(this,this);return r.operator=n,r}next(n){if(this.closed)throw new gr;if(!this.isStopped){const{observers:r}=this,o=r.length,i=r.slice();for(let s=0;snew Ff(t,n),e})();class Ff extends $t{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 Wi(e){return e&&"function"==typeof e.schedule}function ee(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 qC(e,t))}}class qC{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 Of=e=>t=>{for(let n=0,r=e.length;ne&&"number"==typeof e.length&&"function"!=typeof e;function kf(e){return!!e&&"function"!=typeof e.subscribe&&"function"==typeof e.then}const ol=e=>{if(e&&"function"==typeof e[Co])return(e=>t=>{const n=e[Co]();if("function"!=typeof n.subscribe)throw new TypeError("Provided object does not correctly implement Symbol.observable");return n.subscribe(t)})(e);if(Pf(e))return Of(e);if(kf(e))return(e=>t=>(e.then(n=>{t.closed||(t.next(n),t.complete())},n=>t.error(n)).then(null,Sn),t))(e);if(e&&"function"==typeof e[Ki])return(e=>t=>{const n=e[Ki]();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 ${rl(e)?"an invalid object":`'${e}'`} where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.`;throw new TypeError(n)}};function il(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 ke(e,t){return t?function nw(e,t){if(null!=e){if(function ew(e){return e&&"function"==typeof e[Co]}(e))return function YC(e,t){return new pe(n=>{const r=new ye;return r.add(t.schedule(()=>{const o=e[Co]();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(kf(e))return function JC(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(Pf(e))return il(e,t);if(function tw(e){return e&&"function"==typeof e[Ki]}(e)||"string"==typeof e)return function XC(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[Ki](),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(ol(e))}class sl 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 al extends fe{notifyNext(t){this.destination.next(t)}notifyError(t){this.destination.error(t)}notifyComplete(){this.destination.complete()}}function ll(e,t){if(t.closed)return;if(e instanceof pe)return e.subscribe(t);let n;try{n=ol(e)(t)}catch(r){t.error(r)}return n}function Le(e,t,n=Number.POSITIVE_INFINITY){return"function"==typeof t?r=>r.pipe(Le((o,i)=>ke(e(o,i)).pipe(ee((s,a)=>t(o,s,i,a))),n)):("number"==typeof t&&(n=t),r=>r.lift(new rw(e,n)))}class rw{constructor(t,n=Number.POSITIVE_INFINITY){this.project=t,this.concurrent=n}call(t,n){return n.subscribe(new ow(t,this.project,this.concurrent))}}class ow extends al{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 mr(e=Number.POSITIVE_INFINITY){return Le(zi,e)}function ul(e,t){return t?il(e,t):new pe(Of(e))}function Qi(){return function(t){return t.lift(new sw(t))}}class sw{constructor(t){this.connectable=t}call(t,n){const{connectable:r}=this;r._refCount++;const o=new aw(t,r),i=n.subscribe(o);return o.closed||(o.connection=r.connect()),i}}class aw 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 cl 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 uw(this.getSubject(),this))),t.closed&&(this._connection=null,t=ye.EMPTY)),t}refCount(){return Qi()(this)}}const lw=(()=>{const e=cl.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 uw extends Rf{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 fw{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 hw(){return new $t}function ie(e){for(let t in e)if(e[t]===ie)return t;throw Error("Could not find renamed property on target object.")}function dl(e,t){for(const n in t)t.hasOwnProperty(n)&&!e.hasOwnProperty(n)&&(e[n]=t[n])}function se(e){if("string"==typeof e)return e;if(Array.isArray(e))return"["+e.map(se).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 fl(e,t){return null==e||""===e?null===t?"":t:null==t||""===t?e:e+" "+t}const gw=ie({__forward_ref__:ie});function ue(e){return e.__forward_ref__=ue,e.toString=function(){return se(this())},e}function F(e){return hl(e)?e():e}function hl(e){return"function"==typeof e&&e.hasOwnProperty(gw)&&e.__forward_ref__===ue}class U extends Error{constructor(t,n){super(function Zi(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 Yi(e,t){throw new U(-201,!1)}function lt(e,t){null==e&&function te(e,t,n,r){throw new Error(`ASSERTION ERROR: ${e}`+(null==r?"":` [Expected=> ${n} ${r} ${t} <=Actual]`))}(t,e,null,"!=")}function P(e){return{token:e.token,providedIn:e.providedIn||null,factory:e.factory,value:void 0}}function ut(e){return{providers:e.providers||[],imports:e.imports||[]}}function pl(e){return Vf(e,Ji)||Vf(e,jf)}function Vf(e,t){return e.hasOwnProperty(t)?e[t]:null}function Lf(e){return e&&(e.hasOwnProperty(gl)||e.hasOwnProperty(bw))?e[gl]:null}const Ji=ie({\u0275prov:ie}),gl=ie({\u0275inj:ie}),jf=ie({ngInjectableDef:ie}),bw=ie({ngInjectorDef:ie});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 ml;function Gt(e){const t=ml;return ml=e,t}function Bf(e,t,n){const r=pl(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 Yi(se(e))}function In(e){return{toString:e}.toString()}var At=(()=>((At=At||{})[At.OnPush=0]="OnPush",At[At.Default=1]="Default",At))(),qt=(()=>(function(e){e[e.Emulated=0]="Emulated",e[e.None=2]="None",e[e.ShadowDom=3]="ShadowDom"}(qt||(qt={})),qt))();const re=(()=>typeof globalThis<"u"&&globalThis||typeof global<"u"&&global||typeof window<"u"&&window||typeof self<"u"&&typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&self)(),yr={},J=[],Xi=ie({\u0275cmp:ie}),yl=ie({\u0275dir:ie}),vl=ie({\u0275pipe:ie}),Hf=ie({\u0275mod:ie}),cn=ie({\u0275fac:ie}),wo=ie({__NG_ELEMENT_ID__:ie});let Mw=0;function Tt(e){return In(()=>{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||J,viewQuery:e.viewQuery||null,features:e.features||null,data:e.data||{},encapsulation:e.encapsulation||qt.Emulated,id:"c"+Mw++,styles:e.styles||J,_:null,setInput:null,schemas:e.schemas||null,tView:null},i=e.dependencies,s=e.features;return o.inputs=Gf(e.inputs,r),o.outputs=Gf(e.outputs),s&&s.forEach(a=>a(o)),o.directiveDefs=i?()=>("function"==typeof i?i():i).map(Uf).filter($f):null,o.pipeDefs=i?()=>("function"==typeof i?i():i).map(Ke).filter($f):null,o})}function Uf(e){return ae(e)||We(e)}function $f(e){return null!==e}const Iw={};function _t(e){return In(()=>{const t={type:e.type,bootstrap:e.bootstrap||J,declarations:e.declarations||J,imports:e.imports||J,exports:e.exports||J,transitiveCompileScopes:null,schemas:e.schemas||null,id:e.id||null};return null!=e.id&&(Iw[e.id]=e.type),t})}function Gf(e,t){if(null==e)return yr;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=Tt;function ae(e){return e[Xi]||null}function We(e){return e[yl]||null}function Ke(e){return e[vl]||null}function ct(e,t){const n=e[Hf]||null;if(!n&&!0===t)throw new Error(`Type ${se(e)} does not have '\u0275mod' property.`);return n}const $=11;function ot(e){return Array.isArray(e)&&"object"==typeof e[1]}function Nt(e){return Array.isArray(e)&&!0===e[1]}function Cl(e){return 0!=(8&e.flags)}function rs(e){return 2==(2&e.flags)}function os(e){return 1==(1&e.flags)}function Rt(e){return null!==e.template}function Rw(e){return 0!=(256&e[2])}function Kn(e,t){return e.hasOwnProperty(cn)?e[cn]:null}class Pw{constructor(t,n,r){this.previousValue=t,this.currentValue=n,this.firstChange=r}isFirstChange(){return this.firstChange}}function Ct(){return Wf}function Wf(e){return e.type.prototype.ngOnChanges&&(e.setInput=Vw),kw}function kw(){const e=Qf(this),t=e?.current;if(t){const n=e.previous;if(n===yr)e.previous=t;else for(let r in t)n[r]=t[r];e.current=null,this.ngOnChanges(t)}}function Vw(e,t,n,r){const o=Qf(e)||function Lw(e,t){return e[Kf]=t}(e,{previous:yr,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===yr),e[r]=t}Ct.ngInherit=!0;const Kf="__ngSimpleChanges__";function Qf(e){return e[Kf]||null}let Sl;function ve(e){return!!e.listen}const Zf={createRenderer:(e,t)=>function Il(){return void 0!==Sl?Sl:typeof document<"u"?document:void 0}()};function be(e){for(;Array.isArray(e);)e=e[0];return e}function is(e,t){return be(t[e])}function bt(e,t){return be(t[e.index])}function Al(e,t){return e.data[t]}function ft(e,t){const n=t[e];return ot(n)?n:n[0]}function Yf(e){return 4==(4&e[2])}function Tl(e){return 64==(64&e[2])}function An(e,t){return null==t?null:e[t]}function Jf(e){e[18]=0}function xl(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:ah(null),bindingsEnabled:!0};function eh(){return k.bindingsEnabled}function y(){return k.lFrame.lView}function Q(){return k.lFrame.tView}function Qn(e){return k.lFrame.contextLView=e,e[8]}function Zn(e){return k.lFrame.contextLView=null,e}function Te(){let e=th();for(;null!==e&&64===e.type;)e=e.parent;return e}function th(){return k.lFrame.currentTNode}function zt(e,t){const n=k.lFrame;n.currentTNode=e,n.isParent=t}function Nl(){return k.lFrame.isParent}function br(){return k.lFrame.bindingIndex++}function fn(e){const t=k.lFrame,n=t.bindingIndex;return t.bindingIndex=t.bindingIndex+e,n}function tb(e,t){const n=k.lFrame;n.bindingIndex=n.bindingRootIndex=e,Fl(t)}function Fl(e){k.lFrame.currentDirectiveIndex=e}function oh(){return k.lFrame.currentQueryIndex}function Pl(e){k.lFrame.currentQueryIndex=e}function rb(e){const t=e[1];return 2===t.type?t.declTNode:1===t.type?e[6]:null}function ih(e,t,n){if(n&x.SkipSelf){let o=t,i=e;for(;!(o=o.parent,null!==o||n&x.Host||(o=rb(i),null===o||(i=i[15],10&o.type))););if(null===o)return!1;t=o,e=i}const r=k.lFrame=sh();return r.currentTNode=t,r.lView=e,!0}function as(e){const t=sh(),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 sh(){const e=k.lFrame,t=null===e?null:e.child;return null===t?ah(e):t}function ah(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 lh(){const e=k.lFrame;return k.lFrame=e.parent,e.currentTNode=null,e.lView=null,e}const uh=lh;function ls(){const e=lh();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 Tn(e){k.lFrame.selectedIndex=e}function _e(){const e=k.lFrame;return Al(e.tView,e.selectedIndex)}function Er(){k.lFrame.currentNamespace="svg"}function Io(){!function ab(){k.lFrame.currentNamespace=null}()}function us(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 Ao{constructor(t,n,r){this.factory=t,this.resolving=!1,this.canSeeViewProviders=n,this.injectImpl=r}}function fs(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 jl=!0;function ps(e){const t=jl;return jl=e,t}let mb=0;const Wt={};function xo(e,t){const n=Hl(e,t);if(-1!==n)return n;const r=t[1];r.firstCreatePass&&(e.injectorIndex=t.length,Bl(r.data,e),Bl(t,null),Bl(r.blueprint,null));const o=gs(e,t),i=e.injectorIndex;if(hh(o)){const s=Mr(o),a=Sr(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 Bl(e,t){e.push(0,0,0,0,0,0,0,0,t)}function Hl(e,t){return-1===e.injectorIndex||e.parent&&e.parent.injectorIndex===e.injectorIndex||null===t[e.injectorIndex+8]?-1:e.injectorIndex}function gs(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=wh(o),null===r)return-1;if(n++,o=o[15],-1!==r.injectorIndex)return r.injectorIndex|n<<16}return-1}function ms(e,t,n){!function yb(e,t,n){let r;"string"==typeof n?r=n.charCodeAt(0)||0:n.hasOwnProperty(wo)&&(r=n[wo]),null==r&&(r=n[wo]=mb++);const o=255&r;t.data[e+(o>>5)]|=1<=0?255&t:Cb:t}(n);if("function"==typeof i){if(!ih(t,e,r))return r&x.Host?mh(o,0,r):yh(t,n,r,o);try{const s=i(r);if(null!=s||r&x.Optional)return s;Yi()}finally{uh()}}else if("number"==typeof i){let s=null,a=Hl(e,t),l=-1,u=r&x.Host?t[16][6]:null;for((-1===a||r&x.SkipSelf)&&(l=-1===a?gs(e,t):t[a+8],-1!==l&&Ch(r,!1)?(s=t[1],a=Mr(l),t=Sr(l,t)):a=-1);-1!==a;){const c=t[1];if(Dh(i,a,c.data)){const d=_b(a,t,n,s,r,u);if(d!==Wt)return d}l=t[a+8],-1!==l&&Ch(r,t[1].data[a+8]===u)&&Dh(i,a,t)?(s=c,a=Mr(l),t=Sr(l,t)):a=-1}}return o}function _b(e,t,n,r,o,i){const s=t[1],a=s.data[e+8],c=ys(a,s,n,null==r?rs(a)&&jl:r!=s&&0!=(3&a.type),o&x.Host&&i===a);return null!==c?No(t,s,c,a):Wt}function ys(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&&Rt(h)&&h.type===n)return l}return null}function No(e,t,n,r){let o=e[n];const i=t.data;if(function db(e){return e instanceof Ao}(o)){const s=o;s.resolving&&function mw(e,t){const n=t?`. Dependency path: ${t.join(" > ")} > ${e}`:"";throw new U(-200,`Circular dependency in DI detected for ${e}${n}`)}(function Y(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=ps(s.canSeeViewProviders);s.resolving=!0;const l=s.injectImpl?Gt(s.injectImpl):null;ih(e,r,x.Default);try{o=e[n]=s.factory(void 0,i,e,r),t.firstCreatePass&&n>=r.directiveStart&&function ub(e,t,n){const{ngOnChanges:r,ngOnInit:o,ngDoCheck:i}=t.type.prototype;if(r){const s=Wf(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&&Gt(l),ps(a),s.resolving=!1,uh()}}return o}function Dh(e,t,n){return!!(n[t+(e>>5)]&1<{const t=e.prototype.constructor,n=t[cn]||Ul(t),r=Object.prototype;let o=Object.getPrototypeOf(e.prototype).constructor;for(;o&&o!==r;){const i=o[cn]||Ul(o);if(i&&i!==n)return i;o=Object.getPrototypeOf(o)}return i=>new i})}function Ul(e){return hl(e)?()=>{const t=Ul(F(e));return t&&t()}:Kn(e)}function wh(e){const t=e[1],n=t.type;return 2===n?t.declTNode:1===n?e[6]:null}function Ro(e){return function vb(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 $l(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(Tr)?l[Tr]:Object.defineProperty(l,Tr,{value:[]})[Tr];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 O{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=P({token:this,providedIn:n.providedIn||"root",factory:n.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}}const Eb=new O("AnalyzeForEntryComponents");function ht(e,t){void 0===t&&(t=e);for(let n=0;nArray.isArray(n)?hn(n,t):t(n))}function Eh(e,t,n){t>=e.length?e.push(n):e.splice(t,0,n)}function vs(e,t){return t>=e.length-1?e.pop():e.splice(t,1)[0]}function pt(e,t,n){let r=Rr(e,t);return r>=0?e[1|r]=n:(r=~r,function Ib(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 ql(e,t){const n=Rr(e,t);if(n>=0)return e[1|n]}function Rr(e,t){return function Ih(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),pn=Lo(Nr("Optional"),8),jo=Lo(Nr("SkipSelf"),4);function ru(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&&ru(t);for(;n&&ru(n);)n=ru(n);return n||null}}const ou=new Map;let NE=0;const su="__ngContext__";function Ue(e,t){ot(t)?(e[su]=t[20],function FE(e){ou.set(e[20],e)}(t)):e[su]=t}function qo(e){const t=e[su];return"number"==typeof t?function Zh(e){return ou.get(e)||null}(t):t||null}function au(e){const t=qo(e);return t?ot(t)?t:t.lView:null}const UE=(()=>(typeof requestAnimationFrame<"u"&&requestAnimationFrame||setTimeout).bind(re))();function gn(e){return e instanceof Function?e():e}var gt=(()=>((gt=gt||{})[gt.Important=1]="Important",gt[gt.DashCase=2]="DashCase",gt))();function uu(e,t){return undefined(e,t)}function zo(e){const t=e[3];return Nt(t)?t[3]:t}function cu(e){return ip(e[13])}function du(e){return ip(e[4])}function ip(e){for(;null!==e&&!Nt(e);)e=e[4];return e}function Vr(e,t,n,r,o){if(null!=r){let i,s=!1;Nt(r)?i=r:ot(r)&&(s=!0,r=r[0]);const a=be(r);0===e&&null!==n?null==o?dp(t,n,a):Yn(t,n,a,o||null,!0):1===e&&null!==n?Yn(t,n,a,o||null,!0):2===e?function _p(e,t,n){const r=Ts(e,t);r&&function rM(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 sM(e,t,n,r,o){const i=n[7];i!==be(n)&&Vr(t,e,r,i,o);for(let a=10;a0&&(e[n-1][4]=r[4]);const i=vs(e,10+t);!function QE(e,t){Wo(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 lp(e,t){if(!(128&t[2])){const n=t[$];ve(n)&&n.destroyNode&&Wo(e,t,n,3,null,null),function JE(e){let t=e[13];if(!t)return gu(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)&&gu(t[1],t),t=t[3];null===t&&(t=e),ot(t)&&gu(t[1],t),n=t&&t[4]}t=n}}(t)}}function gu(e,t){if(!(128&t[2])){t[2]&=-65,t[2]|=128,function nM(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!==wp(h,u,0)||2&r&&u!==f){if(Ft(r))return!1;s=!0}}}}else{if(!s&&!Ft(r)&&!Ft(l))return!1;if(s&&Ft(l))continue;s=!1,r=l|1&r}}return Ft(r)||s}function Ft(e){return 0==(1&e)}function dM(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&&!Ft(s)&&(t+=Sp(i,o),o=""),r=s,i=i||!Ft(r);n++}return""!==o&&(t+=Sp(i,o)),t}const B={};function K(e){Ip(Q(),y(),Ze()+e,!1)}function Ip(e,t,n,r){if(!r)if(3==(3&t[2])){const i=e.preOrderCheckHooks;null!==i&&cs(t,i,n)}else{const i=e.preOrderHooks;null!==i&&ds(t,i,0,n)}Tn(n)}const Np=new O("ENVIRONMENT_INITIALIZER"),Rp=new O("INJECTOR_DEF_TYPES");function EM(...e){return{\u0275providers:Fp(0,e)}}function Fp(e,...t){const n=[],r=new Set;let o;return hn(t,i=>{const s=i;Du(s,n,[],r)&&(o||(o=[]),o.push(s))}),void 0!==o&&Op(o,n),n}function Op(e,t){for(let n=0;n{t.push(i)})}}function Du(e,t,n,r){if(!(e=F(e)))return!1;let o=null,i=Lf(e);const s=!i&&ae(e);if(i||s){if(s&&!s.standalone)return!1;o=e}else{const l=e.ngModule;if(i=Lf(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)Du(u,t,n,r)}}else{if(!i)return!1;{if(null!=i.imports&&!a){let u;r.add(o);try{hn(i.imports,c=>{Du(c,t,n,r)&&(u||(u=[]),u.push(c))})}finally{}void 0!==u&&Op(u,t)}if(!a){const u=Kn(o)||(()=>new o);t.push({provide:o,useFactory:u,deps:J},{provide:Rp,useValue:o,multi:!0},{provide:Np,useValue:()=>S(o),multi:!0})}const l=i.providers;null==l||a||hn(l,c=>{t.push(c)})}}return o!==e&&void 0!==e.providers}const MM=ie({provide:String,useValue:ie});function Cu(e){return null!==e&&"object"==typeof e&&MM in e}function Jn(e){return"function"==typeof e}const wu=new O("INJECTOR",-1);class Vp{get(t,n=ko){if(n===ko){const r=new Error(`NullInjectorError: No provider for ${se(t)}!`);throw r.name="NullInjectorError",r}return n}}const bu=new O("Set Injector scope."),Rs={},IM={};let Eu;function Mu(){return void 0===Eu&&(Eu=new Vp),Eu}class Xn{}class Lp extends Xn{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,Iu(t,s=>this.processProvider(s)),this.records.set(wu,Lr(void 0,this)),o.has("environment")&&this.records.set(Xn,Lr(void 0,this));const i=this.records.get(bu);null!=i&&"string"==typeof i.value&&this.scopes.add(i.value),this.injectorDefTypes=new Set(this.get(Rp.multi,J,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=ko,r=x.Default){this.assertNotDestroyed();const o=Cs(this),i=Gt(void 0);try{if(!(r&x.SkipSelf)){let a=this.records.get(t);if(void 0===a){const l=function RM(e){return"function"==typeof e||"object"==typeof e&&e instanceof O}(t)&&pl(t);a=l&&this.injectableDefInScope(l)?Lr(Su(t),Rs):null,this.records.set(t,a)}if(null!=a)return this.hydrate(t,a)}return(r&x.Self?Mu():this.parent).get(t,n=r&x.Optional&&n===ko?null:n)}catch(s){if("NullInjectorError"===s.name){if((s[Ds]=s[Ds]||[]).unshift(se(t)),o)throw s;return function Bb(e,t,n,r){const o=e[Ds];throw t[Ah]&&o.unshift(t[Ah]),e.message=function Hb(e,t,n,r=null){e=e&&"\n"===e.charAt(0)&&"\u0275"==e.charAt(1)?e.slice(2):e;let o=se(t);if(Array.isArray(t))o=t.map(se).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):se(a)))}o=`{${i.join(", ")}}`}return`${n}${r?"("+r+")":""}[${o}]: ${e.replace(Pb,"\n ")}`}("\n"+e.message,o,n,r),e.ngTokenPath=o,e[Ds]=null,e}(s,t,"R3InjectorError",this.source)}throw s}finally{Gt(i),Cs(o)}}resolveInjectorInitializers(){const t=Cs(this),n=Gt(void 0);try{const r=this.get(Np.multi,J,x.Self);for(const o of r)o()}finally{Cs(t),Gt(n)}}toString(){const t=[],n=this.records;for(const r of n.keys())t.push(se(r));return`R3Injector[${t.join(", ")}]`}assertNotDestroyed(){if(this._destroyed)throw new U(205,!1)}processProvider(t){let n=Jn(t=F(t))?t:F(t&&t.provide);const r=function TM(e){return Cu(e)?Lr(void 0,e.useValue):Lr(jp(e),Rs)}(t);if(Jn(t)||!0!==t.multi)this.records.get(n);else{let o=this.records.get(n);o||(o=Lr(void 0,Rs,!0),o.factory=()=>Kl(o.multi),this.records.set(n,o)),n=t,o.multi.push(t)}this.records.set(n,r)}hydrate(t,n){return n.value===Rs&&(n.value=IM,n.value=n.factory()),"object"==typeof n.value&&n.value&&function NM(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 Su(e){const t=pl(e),n=null!==t?t.factory:Kn(e);if(null!==n)return n;if(e instanceof O)throw new U(204,!1);if(e instanceof Function)return function AM(e){const t=e.length;if(t>0)throw function Po(e,t){const n=[];for(let r=0;rn.factory(e):()=>new e}(e);throw new U(204,!1)}function jp(e,t,n){let r;if(Jn(e)){const o=F(e);return Kn(o)||Su(o)}if(Cu(e))r=()=>F(e.useValue);else if(function kp(e){return!(!e||!e.useFactory)}(e))r=()=>e.useFactory(...Kl(e.deps||[]));else if(function Pp(e){return!(!e||!e.useExisting)}(e))r=()=>S(F(e.useExisting));else{const o=F(e&&(e.useClass||e.provide));if(!function xM(e){return!!e.deps}(e))return Kn(o)||Su(o);r=()=>new o(...Kl(e.deps))}return r}function Lr(e,t,n=!1){return{factory:e,value:t,multi:n?[]:void 0}}function FM(e){return!!e.\u0275providers}function Iu(e,t){for(const n of e)Array.isArray(n)?Iu(n,t):FM(n)?Iu(n.\u0275providers,t):t(n)}function Bp(e,t=null,n=null,r){const o=Hp(e,t,n,r);return o.resolveInjectorInitializers(),o}function Hp(e,t=null,n=null,r,o=new Set){const i=[n||J,EM(e)];return r=r||("object"==typeof e?void 0:se(e)),new Lp(i,t||Mu(),r||null,o)}let Je=(()=>{class e{static create(n,r){if(Array.isArray(n))return Bp({name:""},r,n,"");{var o;const i=null!==(o=n.name)&&void 0!==o?o:"";return Bp({name:i},n.parent,n.providers,i)}}}return e.THROW_IF_NOT_FOUND=ko,e.NULL=new Vp,e.\u0275prov=P({token:e,providedIn:"any",factory:()=>S(wu)}),e.__NG_ELEMENT_ID__=-1,e})();function v(e,t=x.Default){const n=y();return null===n?S(e,t):vh(Te(),n,F(e),t)}function Ru(){throw new Error("invalid")}function Os(e,t){return e<<17|t<<2}function Ot(e){return e>>17&32767}function ku(e){return 2|e}function mn(e){return(131068&e)>>2}function Vu(e,t){return-131069&e|t<<2}function Lu(e){return 1|e}function ag(e,t){const n=e.contentQueries;if(null!==n)for(let r=0;r22&&Ip(e,t,22,!1),n(r,o)}finally{Tn(i)}}function Ku(e,t,n){!eh()||(function _0(e,t,n,r){const o=n.directiveStart,i=n.directiveEnd;e.firstCreatePass||xo(n,t),Ue(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 mg(e,t){null!==e.hostBindings&&e.hostBindings(1,t)}function yg(e,t){t.flags|=2,(e.components||(e.components=[])).push(t.index)}function b0(e,t,n){if(n){if(t.exportAs)for(let r=0;r0&&Ju(n)}}function Ju(e){for(let r=cu(e);null!==r;r=du(r))for(let o=10;o0&&Ju(i)}const n=e[1].components;if(null!==n)for(let r=0;r0&&Ju(o)}}function x0(e,t){const n=ft(t,e),r=n[1];(function N0(e,t){for(let n=t.length;nPromise.resolve(null))();function wg(e){return e[7]||(e[7]=[])}function bg(e){return e.cleanup||(e.cleanup=[])}function Mg(e,t){const n=e[9],r=n?n.get(Pr,null):null;r&&r.handleError(t)}function Sg(e,t,n,r,o){for(let i=0;i=0;r--){const o=e[r];o.hostVars=t+=o.hostVars,o.hostAttrs=hs(o.hostAttrs,n=hs(n,o.hostAttrs))}}(r)}function oc(e){return e===yr?{}:e===J?[]:e}function z0(e,t){const n=e.viewQuery;e.viewQuery=n?(r,o)=>{t(r,o),n(r,o)}:t}function W0(e,t){const n=e.contentQueries;e.contentQueries=n?(r,o,i)=>{t(r,o,i),n(r,o,i)}:t}function K0(e,t){const n=e.hostBindings;e.hostBindings=n?(r,o)=>{t(r,o),n(r,o)}:t}let Bs=null;function er(){if(!Bs){const e=re.Symbol;if(e&&e.iterator)Bs=e.iterator;else{const t=Object.getOwnPropertyNames(Map.prototype);for(let n=0;na(be(I[r.index])):r.index;if(ve(n)){let I=null;if(!a&&l&&(I=function iS(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=cc(r,t,d,i,!1);const L=n.listen(D,o,i);f.push(i,L),c&&c.push(o,m,b,b+1)}}else i=cc(r,t,d,i,!0),D.addEventListener(o,i,s),f.push(i),c&&c.push(o,m,b,s)}else i=cc(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 oe=t[g[D]][g[D+1]].subscribe(i),pr=f.length;f.push(i,oe),c&&c.push(o,r.index,pr,-(pr+1))}}}(i,o,o[$],s,e,t,!!n,r),Z}function Jg(e,t,n,r){try{return!1!==n(r)}catch(o){return Mg(e,o),!1}}function cc(e,t,n,r,o){return function i(s){if(s===Function)return r;Xu(2&e.flags?ft(e.index,t):t);let l=Jg(t,0,r,s),u=i.__ngNextListenerFn__;for(;u;)l=Jg(t,0,u,s)&&l,u=u.__ngNextListenerFn__;return o&&!1===l&&(s.preventDefault(),s.returnValue=!1),l}}function Jt(e=1){return function ob(e){return(k.lFrame.contextLView=function ib(e,t){for(;e>0;)t=t[15],e--;return t}(e,k.lFrame.contextLView))[8]}(e)}function lm(e,t,n,r,o){const i=e[n+1],s=null===t;let a=r?Ot(i):mn(i),l=!1;for(;0!==a&&(!1===l||s);){const c=e[a+1];dS(e[a],t)&&(l=!0,e[a+1]=r?Lu(c):ku(c)),a=r?Ot(c):mn(c)}l&&(e[n+1]=r?ku(i):Lu(i))}function dS(e,t){return null===e||null==t||(Array.isArray(e)?e[1]:e)===t||!(!Array.isArray(e)||"string"!=typeof t)&&Rr(e,t)>=0}function $s(e,t){return function kt(e,t,n,r){const o=y(),i=Q(),s=fn(2);i.firstUpdatePass&&function ym(e,t,n,r){const o=e.data;if(null===o[n+1]){const i=o[Ze()],s=function mm(e,t){return t>=e.expandoStartIndex}(e,n);(function Cm(e,t){return 0!=(e.flags&(t?16:32))})(i,r)&&null===t&&!s&&(t=!1),t=function DS(e,t,n,r){const o=function Ol(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=ei(n=fc(null,e,t,n,r),t.attrs,r),i=null);else{const s=t.directiveStylingLast;if(-1===s||e[s]!==o)if(n=fc(o,e,t,n,r),null===i){let l=function CS(e,t,n){const r=n?t.classBindings:t.styleBindings;if(0!==mn(r))return e[Ot(r)]}(e,t,r);void 0!==l&&Array.isArray(l)&&(l=fc(null,e,t,l[1],r),l=ei(l,t.attrs,r),function wS(e,t,n,r){e[Ot(n?t.classBindings:t.styleBindings)]=r}(e,t,r,l))}else i=function bS(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=Ot(e[a+1]);e[r+1]=Os(f,a),0!==f&&(e[f+1]=Vu(e[f+1],r)),e[a+1]=function ZM(e,t){return 131071&e|t<<17}(e[a+1],r)}else e[r+1]=Os(a,0),0!==a&&(e[a+1]=Vu(e[a+1],r)),a=r;else e[r+1]=Os(l,0),0===a?a=r:e[l+1]=Vu(e[l+1],r),l=r;u&&(e[r+1]=ku(e[r+1])),lm(e,c,r,!0),lm(e,c,r,!1),function cS(e,t,n,r,o){const i=o?e.residualClasses:e.residualStyles;null!=i&&"string"==typeof t&&Rr(i,t)>=0&&(n[r+1]=Lu(n[r+1]))}(t,c,e,r,i),s=Os(a,l),i?t.classBindings=s:t.styleBindings=s}(o,i,t,n,s,r)}}(i,e,s,r),t!==B&&$e(o,s,t)&&function _m(e,t,n,r,o,i,s,a){if(!(3&t.type))return;const l=e.data,u=l[a+1];Gs(function Xp(e){return 1==(1&e)}(u)?Dm(l,t,n,o,mn(u),s):void 0)||(Gs(i)||function Jp(e){return 2==(2&e)}(u)&&(i=Dm(l,null,n,o,a,s)),function aM(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:gt.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|=gt.Important),i?e.setStyle(n,r,o,s):n.style.setProperty(r,o,a?"important":"")}}}(r,s,is(Ze(),n),o,i))}(i,i.data[Ze()],o,o[$],e,o[s+1]=function SS(e,t){return null==e||("string"==typeof t?e+=t:"object"==typeof e&&(e=se(function Nn(e){return e instanceof class Bh{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),$s}function fc(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?J:void 0);let h=d?ql(f,r):c===r?f:void 0;if(u&&!Gs(h)&&(h=ql(l,r)),Gs(h)&&(a=h,s))return a;const p=e[o+1];o=s?Ot(p):mn(p)}if(null!==t){let l=i?t.residualClasses:t.residualStyles;null!=l&&(a=ql(l,r))}return a}function Gs(e){return void 0!==e}function A(e,t=""){const n=y(),r=Q(),o=e+22,i=r.firstCreatePass?Br(r,o,1,t,null):r.data[o],s=n[o]=function fu(e,t){return ve(e)?e.createText(t):e.createTextNode(t)}(n[$],t);xs(r,n,s,i),zt(i,!1)}function ti(e){return ni("",e,""),ti}function ni(e,t,n){const r=y(),o=function Gr(e,t,n,r){return $e(e,br(),n)?t+j(n)+r:B}(r,e,t,n);return o!==B&&yn(r,Ze(),o),ni}function hc(e,t,n,r,o){const i=y(),s=qr(i,e,t,n,r,o);return s!==B&&yn(i,Ze(),s),hc}const eo="en-US";let Um=eo;function mc(e,t,n,r,o){if(e=F(e),Array.isArray(e))for(let i=0;i>20;if(Jn(e)||!e.multi){const h=new Ao(l,o,v),p=vc(a,t,o?c:c+f,d);-1===p?(ms(xo(u,s),i,a),yc(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=vc(a,t,c+f,d),p=vc(a,t,c,c+f),g=h>=0&&n[h],_=p>=0&&n[p];if(o&&!_||!o&&!g){ms(xo(u,s),i,a);const D=function GI(e,t,n,r,o){const i=new Ao(e,n,v);return i.multi=[],i.index=t,i.componentProviders=0,hy(i,o,r&&!n),i}(o?$I:UI,n.length,o,r,l);!o&&_&&(n[p].providerFactory=D),yc(i,e,t.length,0),t.push(a),u.directiveStart++,u.directiveEnd++,o&&(u.providerIndexes+=1048576),n.push(D),s.push(D)}else yc(i,e,h>-1?h:p,hy(n[o?p:h],l,!o&&r));!o&&r&&_&&n[p].componentProviders++}}}function yc(e,t,n,r){const o=Jn(t),i=function SM(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 hy(e,t,n){return n&&e.componentProviders++,e.multi.push(t)-1}function vc(e,t,n,r){for(let o=n;o{n.providersResolver=(r,o)=>function HI(e,t,n){const r=Q();if(r.firstCreatePass){const o=Rt(e);mc(n,r.data,r.blueprint,o,!0),mc(t,r.data,r.blueprint,o,!1)}}(r,o?o(e):e,t)}}class zI{resolveComponentFactory(t){throw function qI(e){const t=Error(`No component factory found for ${se(e)}. Did you add it to @NgModule.entryComponents?`);return t.ngComponent=e,t}(t)}}let ai=(()=>{class e{}return e.NULL=new zI,e})();class On{}class gy{}class my{}function KI(){return no(Te(),y())}function no(e,t){return new yt(bt(e,t))}let yt=(()=>{class e{constructor(n){this.nativeElement=n}}return e.__NG_ELEMENT_ID__=KI,e})();function QI(e){return e instanceof yt?e.nativeElement:e}class yy{}let vn=(()=>{class e{}return e.__NG_ELEMENT_ID__=()=>function YI(){const e=y(),n=ft(Te().index,e);return function ZI(e){return e[$]}(ot(n)?n:e)}(),e})(),JI=(()=>{class e{}return e.\u0275prov=P({token:e,providedIn:"root",factory:()=>null}),e})();class li{constructor(t){this.full=t,this.major=t.split(".")[0],this.minor=t.split(".")[1],this.patch=t.split(".").slice(2).join(".")}}const XI=new li("14.0.1"),Dc={};function Qs(e,t,n,r,o=!1){for(;null!==n;){const i=t[n.index];if(null!==i&&r.push(be(i)),Nt(i))for(let a=10;a-1&&(pu(t,r),vs(n,r))}this._attachedToViewContainer=!1}lp(this._lView[1],this._lView)}onDestroy(t){hg(this._lView[1],this._lView,null,t)}markForCheck(){Xu(this._cdRefInjectingView||this._lView)}detach(){this._lView[2]&=-65}reattach(){this._lView[2]|=64}detectChanges(){!function tc(e,t,n){const r=t[10];r.begin&&r.begin();try{Ur(e,t,e.template,n)}catch(o){throw Mg(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 YE(e,t){Wo(e,t,t[$],2,null,null)}(this._lView[1],this._lView)}attachToAppRef(t){if(this._attachedToViewContainer)throw new U(902,"");this._appRef=t}}class eA extends ui{constructor(t){super(t),this._view=t}detectChanges(){Cg(this._view)}checkNoChanges(){}get context(){return null}}class Cc extends ai{constructor(t){super(),this.ngModule=t}resolveComponentFactory(t){const n=ae(t);return new wc(n,this.ngModule)}}function vy(e){const t=[];for(let n in e)e.hasOwnProperty(n)&&t.push({propName:e[n],templateName:n});return t}class nA{constructor(t,n){this.injector=t,this.parentInjector=n}get(t,n,r){const o=this.injector.get(t,Dc,r);return o!==Dc||n===Dc?o:this.parentInjector.get(t,n,r)}}class wc extends my{constructor(t,n){super(),this.componentDef=t,this.ngModule=n,this.componentType=t.type,this.selector=function yM(e){return e.map(mM).join(",")}(t.selectors),this.ngContentSelectors=t.ngContentSelectors?t.ngContentSelectors:[],this.isBoundToModule=!!n}get inputs(){return vy(this.componentDef.inputs)}get outputs(){return vy(this.componentDef.outputs)}create(t,n,r,o){var i;let s=(o=o||this.ngModule)instanceof Xn?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 nA(t,s):t,l=a.get(yy,Zf),u=a.get(JI,null),c=l.createRenderer(null,this.componentDef),d=this.componentDef.selectors[0][0]||"div",f=r?function fg(e,t,n){if(ve(e))return e.selectRootElement(t,n===qt.ShadowDom);let r="string"==typeof t?e.querySelector(t):t;return r.textContent="",r}(c,r,this.componentDef.encapsulation):hu(l.createRenderer(null,this.componentDef),d,function tA(e){const t=e.toLowerCase();return"svg"===t?"svg":"math"===t?"math":null}(d)),h=this.componentDef.onPush?288:272,p=function Vg(e,t){return{components:[],scheduler:e||UE,clean:F0,playerHandler:t||null,flags:0}}(),g=Vs(0,null,null,1,0,null,null,null,null,null),_=Ko(null,g,p,h,null,null,l,c,u,a,null);let D,b;as(_);try{const m=function Pg(e,t,n,r,o,i){const s=n[1];n[22]=e;const l=Br(s,22,2,"#host",null),u=l.mergedAttrs=t.hostAttrs;null!==u&&(js(l,u,!0),null!==e&&(fs(o,e,u),null!==l.classes&&_u(o,e,l.classes),null!==l.styles&&Cp(o,e,l.styles)));const c=r.createRenderer(e,t),d=Ko(n,cg(t),null,t.onPush?32:16,n[22],l,r,c,i||null,null,null);return s.firstCreatePass&&(ms(xo(l,n),s,t.type),yg(s,l),vg(l,n.length,1)),Ls(n,d),n[22]=d}(f,this.componentDef,_,l,c);if(f)if(r)fs(c,f,["ng-version",XI.full]);else{const{attrs:I,classes:L}=function vM(e){const t=[],n=[];let r=1,o=2;for(;r0&&_u(c,f,L.join(" "))}if(b=Al(g,22),void 0!==n){const I=b.projection=[];for(let L=0;Ln()),this.destroyCbs=null}onDestroy(t){this.destroyCbs.push(t)}}class bc extends gy{constructor(t){super(),this.moduleType=t}create(t){return new _y(this.moduleType,t)}}class sA extends On{constructor(t,n,r){super(),this.componentFactoryResolver=new Cc(this),this.instance=null;const o=new Lp([...t,{provide:On,useValue:this},{provide:ai,useValue:this.componentFactoryResolver}],n||Mu(),r,new Set(["environment"]));this.injector=o,o.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(t){this.injector.onDestroy(t)}}function Zs(e,t=null,n=null){return new sA(e,t,n).injector}function Ec(e){return t=>{setTimeout(e,void 0,t)}}const Ce=class IA extends $t{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=Ec(i),o&&(o=Ec(o)),s&&(s=Ec(s)));const c=super.subscribe({next:o,error:i,complete:s});return t instanceof ye&&t.add(c),c}};function AA(){return this._results[er()]()}class Mc{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=er(),r=Mc.prototype;r[n]||(r[n]=AA)}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=ht(t);(this._changesDetected=!function Mb(e,t,n){if(e.length!==t.length)return!1;for(let r=0;r{class e{}return e.__NG_ELEMENT_ID__=NA,e})();const TA=_n,xA=class extends TA{constructor(t,n,r){super(),this._declarationLView=t,this._declarationTContainer=n,this.elementRef=r}createEmbeddedView(t,n){const r=this._declarationTContainer.tViews,o=Ko(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)),Qo(r,o,t),new ui(o)}};function NA(){return Ys(Te(),y())}function Ys(e,t){return 4&e.type?new xA(t,e,no(e,t)):null}let Lt=(()=>{class e{}return e.__NG_ELEMENT_ID__=RA,e})();function RA(){return Iy(Te(),y())}const FA=Lt,My=class extends FA{constructor(t,n,r){super(),this._lContainer=t,this._hostTNode=n,this._hostLView=r}get element(){return no(this._hostTNode,this._hostLView)}get injector(){return new Ir(this._hostTNode,this._hostLView)}get parentInjector(){const t=gs(this._hostTNode,this._hostLView);if(hh(t)){const n=Sr(t,this._hostLView),r=Mr(t);return new Ir(n[1].data[r+8],n)}return new Ir(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(t){const n=Sy(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 Oo(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 wc(ae(t)),u=r||this.parentInjector;if(!i&&null==l.ngModule){const f=(s?u:this.parentInjector).get(Xn,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 Ww(e){return Nt(e[3])}(r)){const c=this.indexOf(t);if(-1!==c)this.detach(c);else{const d=r[3],f=new My(d,d[6],d[3]);f.detach(f.indexOf(t))}}const i=this._adjustIndex(n),s=this._lContainer;!function XE(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=ta,this.reject=ta,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(Vc,8))},e.\u0275prov=P({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const hi=new O("AppId",{providedIn:"root",factory:function Xy(){return`${Lc()}${Lc()}${Lc()}`}});function Lc(){return String.fromCharCode(97+Math.floor(25*Math.random()))}const ev=new O("Platform Initializer"),jc=new O("Platform ID",{providedIn:"platform",factory:()=>"unknown"}),tv=new O("appBootstrapListener");let aT=(()=>{class e{log(n){console.log(n)}warn(n){console.warn(n)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=P({token:e,factory:e.\u0275fac,providedIn:"platform"}),e})();const Dn=new O("LocaleId",{providedIn:"root",factory:()=>function Lb(e,t=x.Default){return S(e,t)}(Dn,x.Optional|x.SkipSelf)||function lT(){return typeof $localize<"u"&&$localize.locale||eo}()});class cT{constructor(t,n){this.ngModuleFactory=t,this.componentFactories=n}}let Bc=(()=>{class e{compileModuleSync(n){return new bc(n)}compileModuleAsync(n){return Promise.resolve(this.compileModuleSync(n))}compileModuleAndAllComponentsSync(n){const r=this.compileModuleSync(n),i=gn(ct(n).declarations).reduce((s,a)=>{const l=ae(a);return l&&s.push(new wc(l)),s},[]);return new cT(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=P({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const fT=(()=>Promise.resolve(0))();function Hc(e){typeof Zone>"u"?fT.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 hT(){let e=re.requestAnimationFrame,t=re.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 mT(e){const t=()=>{!function gT(e){e.isCheckStableRunning||-1!==e.lastRequestAnimationFrameId||(e.lastRequestAnimationFrameId=e.nativeRequestAnimationFrame.call(re,()=>{e.fakeTopEventTask||(e.fakeTopEventTask=Zone.root.scheduleEventTask("fakeTopEventTask",()=>{e.lastRequestAnimationFrameId=-1,$c(e),e.isCheckStableRunning=!0,Uc(e),e.isCheckStableRunning=!1},void 0,()=>{},()=>{})),e.fakeTopEventTask.invoke()}),$c(e))}(e)};e._inner=e._inner.fork({name:"angular",properties:{isAngularZone:!0},onInvokeTask:(n,r,o,i,s,a)=>{try{return nv(e),n.invokeTask(o,i,s,a)}finally{(e.shouldCoalesceEventChangeDetection&&"eventTask"===i.type||e.shouldCoalesceRunChangeDetection)&&t(),rv(e)}},onInvoke:(n,r,o,i,s,a,l)=>{try{return nv(e),n.invoke(o,i,s,a,l)}finally{e.shouldCoalesceRunChangeDetection&&t(),rv(e)}},onHasTask:(n,r,o,i)=>{n.hasTask(o,i),r===o&&("microTask"==i.change?(e._hasPendingMicrotasks=i.microTask,$c(e),Uc(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,pT,ta,ta);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 pT={};function Uc(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 $c(e){e.hasPendingMicrotasks=!!(e._hasPendingMicrotasks||(e.shouldCoalesceEventChangeDetection||e.shouldCoalesceRunChangeDetection)&&-1!==e.lastRequestAnimationFrameId)}function nv(e){e._nesting++,e.isStable&&(e.isStable=!1,e.onUnstable.emit(null))}function rv(e){e._nesting--,Uc(e)}class yT{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 ov=new O(""),ra=new O("");let zc,Gc=(()=>{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,zc||(function vT(e){zc=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(),Hc(()=>{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())Hc(()=>{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(qc),S(ra))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})(),qc=(()=>{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=zc)||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=P({token:e,factory:e.\u0275fac,providedIn:"platform"}),e})(),Pn=null;const iv=new O("AllowMultipleToken"),sv=new O("PlatformOnDestroy");class av{constructor(t,n){this.name=t,this.token=n}}function uv(e,t,n=[]){const r=`Platform: ${t}`,o=new O(r);return(i=[])=>{let s=Wc();if(!s||s.injector.get(iv,!1)){const a=[...n,...i,{provide:o,useValue:!0}];e?e(a):function CT(e){if(Pn&&!Pn.get(iv,!1))throw new U(400,"");Pn=e;const t=e.get(dv);(function lv(e){const t=e.get(ev,null);t&&t.forEach(n=>n())})(e)}(function cv(e=[],t){return Je.create({name:t,providers:[{provide:bu,useValue:"platform"},{provide:sv,useValue:()=>Pn=null},...e]})}(a,r))}return function bT(e){const t=Wc();if(!t)throw new U(401,"");return t}()}}function Wc(){var e,t;return null!==(e=null===(t=Pn)||void 0===t?void 0:t.get(dv))&&void 0!==e?e:null}let dv=(()=>{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 yT:("zone.js"===e?void 0:e)||new Me(t),n}(r?.ngZone,function fv(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(()=>{ia(this._modules,a),u.unsubscribe()})}),function hv(e,t,n){try{const r=n();return Xo(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(na);return u.runInitializers(),u.donePromise.then(()=>(function $m(e){lt(e,"Expected localeId to be defined"),"string"==typeof e&&(Um=e.toLowerCase().replace(/_/g,"-"))}(a.injector.get(Dn,eo)||eo),this._moduleDoBootstrap(a),a))})})}bootstrapModule(n,r=[]){const o=pv({},r);return function _T(e,t,n){const r=new bc(n);return Promise.resolve(r)}(0,0,n).then(i=>this.bootstrapModuleFactory(i,o))}_moduleDoBootstrap(n){const r=n.injector.get(oa);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(sv,null)?.(),this._destroyed=!0}get destroyed(){return this._destroyed}}return e.\u0275fac=function(n){return new(n||e)(S(Je))},e.\u0275prov=P({token:e,factory:e.\u0275fac,providedIn:"platform"}),e})();function pv(e,t){return Array.isArray(t)?t.reduce(pv,e):{...e,...t}}let oa=(()=>{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(),Hc(()=>{!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 iw(...e){let t=Number.POSITIVE_INFINITY,n=null,r=e[e.length-1];return Wi(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]:mr(t)(ul(e,n))}(s,a.pipe(function pw(){return e=>Qi()(function dw(e,t){return function(r){let o;if(o="function"==typeof e?e:function(){return e},"function"==typeof t)return r.lift(new fw(o,t));const i=Object.create(r,lw);return i.source=r,i.subjectFactory=o,i}}(hw)(e))}()))}get destroyed(){return this._destroyed}get injector(){return this._injector}bootstrap(n,r){const o=n instanceof my;if(!this._initStatus.done)throw!o&&function oo(e){const t=ae(e)||We(e)||Ke(e);return null!==t&&t.standalone}(n),new U(405,false);let i;i=o?n:this._injector.get(ai).resolveComponentFactory(n),this.componentTypes.push(i.componentType);const s=function DT(e){return e.isBoundToModule}(i)?void 0:this._injector.get(On),l=i.create(Je.NULL,[],r||i.selector,s),u=l.location.nativeElement,c=l.injector.get(ov,null);return c?.registerApplication(u),l.onDestroy(()=>{this.detachView(l.hostView),ia(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;ia(this._views,r),r.detachFromAppRef()}_loadComponent(n){this.attachView(n.hostView),this.tick(),this.components.push(n),this._injector.get(tv,[]).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),()=>ia(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(na))},e.\u0275prov=P({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();function ia(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}let mv=!0,sa=(()=>{class e{}return e.__NG_ELEMENT_ID__=IT,e})();function IT(e){return function AT(e,t,n){if(rs(e)&&!n){const r=ft(e.index,t);return new ui(r,r)}return 47&e.type?new ui(t[16],t):null}(Te(),y(),16==(16&e))}const HT=uv(null,"core",[]);let UT=(()=>{class e{constructor(n){}}return e.\u0275fac=function(n){return new(n||e)(S(oa))},e.\u0275mod=_t({type:e}),e.\u0275inj=ut({}),e})();function Cn(e){return"boolean"==typeof e?e:null!=e&&"false"!==e}let ca=null;function nn(){return ca}const tt=new O("DocumentToken");let gi=(()=>{class e{historyGo(n){throw new Error("Not implemented")}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=P({token:e,factory:function(){return function zT(){return S(Iv)}()},providedIn:"platform"}),e})();const WT=new O("Location Initialized");let Iv=(()=>{class e extends gi{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){Av()?this._history.pushState(n,r,o):this.location.hash=o}replaceState(n,r,o){Av()?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=P({token:e,factory:function(){return function KT(){return new Iv(S(tt))}()},providedIn:"platform"}),e})();function Av(){return!!window.history.pushState}function Jc(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 Tv(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 wn(e){return e&&"?"!==e[0]?"?"+e:e}let so=(()=>{class e{historyGo(n){throw new Error("Not implemented")}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=P({token:e,factory:function(){return function QT(){const e=S(tt).location;return new xv(S(gi),e&&e.origin||"")}()},providedIn:"root"}),e})();const Xc=new O("appBaseHref");let xv=(()=>{class e extends so{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 Jc(this._baseHref,n)}path(n=!1){const r=this._platformLocation.pathname+wn(this._platformLocation.search),o=this._platformLocation.hash;return o&&n?`${r}${o}`:r}pushState(n,r,o,i){const s=this.prepareExternalUrl(o+wn(i));this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){const s=this.prepareExternalUrl(o+wn(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(gi),S(Xc,8))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})(),ZT=(()=>{class e extends so{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=Jc(this._baseHref,n);return r.length>0?"#"+r:r}pushState(n,r,o,i){let s=this.prepareExternalUrl(o+wn(i));0==s.length&&(s=this._platformLocation.pathname),this._platformLocation.pushState(n,r,s)}replaceState(n,r,o,i){let s=this.prepareExternalUrl(o+wn(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(gi),S(Xc,8))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})(),ed=(()=>{class e{constructor(n){this._subject=new Ce,this._urlChangeListeners=[],this._urlChangeSubscription=null,this._locationStrategy=n;const r=this._locationStrategy.getBaseHref();this._baseHref=Tv(Nv(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+wn(r))}normalize(n){return e.stripTrailingSlash(function JT(e,t){return e&&t.startsWith(e)?t.substring(e.length):t}(this._baseHref,Nv(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+wn(r)),o)}replaceState(n,r="",o=null){this._locationStrategy.replaceState(o,"",n,r),this._notifyUrlChangeListeners(this.prepareExternalUrl(n+wn(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=wn,e.joinWithSlash=Jc,e.stripTrailingSlash=Tv,e.\u0275fac=function(n){return new(n||e)(S(so))},e.\u0275prov=P({token:e,factory:function(){return function YT(){return new ed(S(so))}()},providedIn:"root"}),e})();function Nv(e){return e.replace(/\/index.html$/,"")}function Bv(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 ao=(()=>{class e{constructor(n,r){this._viewContainer=n,this._context=new jx,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){$v("ngIfThen",n),this._thenTemplateRef=n,this._thenViewRef=null,this._updateView()}set ngIfElse(n){$v("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(Lt),v(_n))},e.\u0275dir=R({type:e,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"}}),e})();class jx{constructor(){this.$implicit=null,this.ngIf=null}}function $v(e,t){if(t&&!t.createEmbeddedView)throw new Error(`${e} must be a TemplateRef, but received '${se(t)}'.`)}let fN=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=ut({}),e})();let mN=(()=>{class e{}return e.\u0275prov=P({token:e,providedIn:"root",factory:()=>new yN(S(tt),window)}),e})();class yN{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 vN(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=Wv(this.window.history)||Wv(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 Wv(e){return Object.getOwnPropertyDescriptor(e,"scrollRestoration")}class Kv{}class pd extends class _N extends class qT{}{constructor(){super(...arguments),this.supportsDOMEvents=!0}}{static makeCurrent(){!function GT(e){ca||(ca=e)}(new pd)}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 DN(){return vi=vi||document.querySelector("base"),vi?vi.getAttribute("href"):null}();return null==n?null:function CN(e){Da=Da||document.createElement("a"),Da.setAttribute("href",e);const t=Da.pathname;return"/"===t.charAt(0)?t:`/${t}`}(n)}resetBaseElement(){vi=null}getUserAgent(){return window.navigator.userAgent}getCookie(t){return Bv(document.cookie,t)}}let Da,vi=null;const Qv=new O("TRANSITION_ID"),bN=[{provide:Vc,useFactory:function wN(e,t,n){return()=>{n.get(na).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=P({token:e,factory:e.\u0275fac}),e})();const Ca=new O("EventManagerPlugins");let wa=(()=>{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=P({token:e,factory:e.\u0275fac}),e})(),_i=(()=>{class e extends Yv{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(Jv),this._hostNodes.delete(n)}onStylesAdded(n){this._hostNodes.forEach((r,o)=>{this._addStylesToHost(n,o,r)})}ngOnDestroy(){this._hostNodes.forEach(n=>n.forEach(Jv))}}return e.\u0275fac=function(n){return new(n||e)(S(tt))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})();function Jv(e){nn().remove(e)}const gd={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/"},md=/%COMP%/g;function ba(e,t,n){for(let r=0;r{if("__ngUnwrap__"===t)return e;!1===e(t)&&(t.preventDefault(),t.returnValue=!1)}}let yd=(()=>{class e{constructor(n,r,o){this.eventManager=n,this.sharedStylesHost=r,this.appId=o,this.rendererByCompId=new Map,this.defaultRenderer=new vd(n)}createRenderer(n,r){if(!n||!r)return this.defaultRenderer;switch(r.encapsulation){case qt.Emulated:{let o=this.rendererByCompId.get(r.id);return o||(o=new NN(this.eventManager,this.sharedStylesHost,r,this.appId),this.rendererByCompId.set(r.id,o)),o.applyToHost(n),o}case 1:case qt.ShadowDom:return new RN(this.eventManager,this.sharedStylesHost,n,r);default:if(!this.rendererByCompId.has(r.id)){const o=ba(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(wa),S(_i),S(hi))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})();class vd{constructor(t){this.eventManager=t,this.data=Object.create(null),this.destroyNode=null}destroy(){}createElement(t,n){return n?document.createElementNS(gd[n]||n,t):document.createElement(t)}createComment(t){return document.createComment(t)}createText(t){return document.createTextNode(t)}appendChild(t,n){(r_(t)?t.content:t).appendChild(n)}insertBefore(t,n,r){t&&(r_(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=gd[o];i?t.setAttributeNS(i,n,r):t.setAttribute(n,r)}else t.setAttribute(n,r)}removeAttribute(t,n,r){if(r){const o=gd[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&(gt.DashCase|gt.Important)?t.style.setProperty(n,r,o>.Important?"important":""):t.style[n]=r}removeStyle(t,n,r){r>.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,t_(r)):this.eventManager.addEventListener(t,n,t_(r))}}function r_(e){return"TEMPLATE"===e.tagName&&void 0!==e.content}class NN extends vd{constructor(t,n,r,o){super(t),this.component=r;const i=ba(o+"-"+r.id,r.styles,[]);n.addStyles(i),this.contentAttr=function AN(e){return"_ngcontent-%COMP%".replace(md,e)}(o+"-"+r.id),this.hostAttr=function TN(e){return"_nghost-%COMP%".replace(md,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 RN extends vd{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=ba(o.id,o.styles,[]);for(let s=0;s{class e extends Zv{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=P({token:e,factory:e.\u0275fac}),e})();const o_=["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"},i_={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"},kN={alt:e=>e.altKey,control:e=>e.ctrlKey,meta:e=>e.metaKey,shift:e=>e.shiftKey};let VN=(()=>{class e extends Zv{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(o_.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 LN(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&&i_.hasOwnProperty(t)&&(t=i_[t]))}return PN[t]||t}(n);return o=o.toLowerCase()," "===o?o="space":"."===o&&(o="dot"),o_.forEach(i=>{i!=o&&kN[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=P({token:e,factory:e.\u0275fac}),e})();const s_=[{provide:jc,useValue:"browser"},{provide:ev,useValue:function jN(){pd.makeCurrent()},multi:!0},{provide:tt,useFactory:function HN(){return function $w(e){Sl=e}(document),document},deps:[]}],UN=uv(HT,"browser",s_),a_=new O(""),l_=[{provide:ra,useClass:class EN{addToWindow(t){re.getAngularTestability=(r,o=!0)=>{const i=t.findTestabilityInTree(r,o);if(null==i)throw new Error("Could not find testability for element.");return i},re.getAllAngularTestabilities=()=>t.getAllTestabilities(),re.getAllAngularRootElements=()=>t.getAllRootElements(),re.frameworkStabilizers||(re.frameworkStabilizers=[]),re.frameworkStabilizers.push(r=>{const o=re.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:ov,useClass:Gc,deps:[Me,qc,ra]},{provide:Gc,useClass:Gc,deps:[Me,qc,ra]}],u_=[{provide:bu,useValue:"root"},{provide:Pr,useFactory:function BN(){return new Pr},deps:[]},{provide:Ca,useClass:FN,multi:!0,deps:[tt,Me,jc]},{provide:Ca,useClass:VN,multi:!0,deps:[tt]},{provide:yd,useClass:yd,deps:[wa,_i,hi]},{provide:yy,useExisting:yd},{provide:Yv,useExisting:_i},{provide:_i,useClass:_i,deps:[tt]},{provide:wa,useClass:wa,deps:[Ca,Me]},{provide:Kv,useClass:MN,deps:[]},[]];let $N=(()=>{class e{constructor(n){}static withServerTransition(n){return{ngModule:e,providers:[{provide:hi,useValue:n.appId},{provide:Qv,useExisting:hi},bN]}}}return e.\u0275fac=function(n){return new(n||e)(S(a_,12))},e.\u0275mod=_t({type:e}),e.\u0275inj=ut({providers:[...u_,...l_],imports:[fN,UT]}),e})(),c_=(()=>{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=P({token:e,factory:function(n){let r=null;return r=n?new n:function qN(){return new c_(S(tt))}(),r},providedIn:"root"}),e})();function V(...e){let t=e[e.length-1];return Wi(t)?(e.pop(),il(e,t)):ul(e)}typeof window<"u"&&window;class Ht extends $t{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 gr;return this._value}next(t){super.next(this._value=t)}}class eR 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 tR 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 nR(e,t,n,r,o=new tR(e,n,r)){if(!o.closed)return t instanceof pe?t.subscribe(o):ol(t)(o)}const h_={};function p_(...e){let t,n;return Wi(e[e.length-1])&&(n=e.pop()),"function"==typeof e[e.length-1]&&(t=e.pop()),1===e.length&&$i(e[0])&&(e=e[0]),ul(e,n).lift(new rR(t))}class rR{constructor(t){this.resultSelector=t}call(t,n){return n.subscribe(new oR(t,this.resultSelector))}}class oR extends eR{constructor(t,n){super(t),this.resultSelector=n,this.active=0,this.values=[],this.observables=[]}_next(t){this.values.push(h_),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(iR,0,{error:e,subscriber:n}):n=>n.error(e))}function iR({error:e,subscriber:t}){t.error(e)}const Ci=(()=>{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 Cd(...e){return function sR(){return mr(1)}()(V(...e))}const lo=new pe(e=>e.complete());function wd(e){return e?function aR(e){return new pe(t=>e.schedule(()=>t.complete()))}(e):lo}function g_(e){return new pe(t=>{let n;try{n=e()}catch(o){return void t.error(o)}return(n?ke(n):wd()).subscribe(t)})}function Vn(e,t){return"function"==typeof t?n=>n.pipe(Vn((r,o)=>ke(e(r,o)).pipe(ee((i,s)=>t(r,i,o,s))))):n=>n.lift(new lR(e))}class lR{constructor(t){this.project=t}call(t,n){return n.subscribe(new uR(t,this.project))}}class uR extends al{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 sl(this),o=this.destination;o.add(r),this.innerSubscription=ll(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 m_=(()=>{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 Ea(e){return t=>0===e?wd():t.lift(new cR(e))}class cR{constructor(t){if(this.total=t,this.total<0)throw new m_}call(t,n){return n.subscribe(new dR(t,this.total))}}class dR 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 y_(e,t){let n=!1;return arguments.length>=2&&(n=!0),function(o){return o.lift(new hR(e,t,n))}}class hR{constructor(t,n,r=!1){this.accumulator=t,this.seed=n,this.hasSeed=r}call(t,n){return n.subscribe(new pR(t,this.accumulator,this.seed,this.hasSeed))}}class pR 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 or(e,t){return function(r){return r.lift(new gR(e,t))}}class gR{constructor(t,n){this.predicate=t,this.thisArg=n}call(t,n){return n.subscribe(new mR(t,this.predicate,this.thisArg))}}class mR 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 ir(e){return function(n){const r=new yR(e),o=n.lift(r);return r.caught=o}}class yR{constructor(t){this.selector=t}call(t,n){return n.subscribe(new vR(t,this.selector,this.caught))}}class vR extends al{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 sl(this);this.add(r);const o=ll(n,r);o!==r&&this.add(o)}}}function uo(e,t){return Le(e,t,1)}function bd(e){return function(n){return 0===e?wd():n.lift(new _R(e))}}class _R{constructor(t){if(this.total=t,this.total<0)throw new m_}call(t,n){return n.subscribe(new DR(t,this.total))}}class DR 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 CR(e))}class CR{constructor(t){this.errorFactory=t}call(t,n){return n.subscribe(new wR(t,this.errorFactory))}}class wR 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 bR(){return new Ci}function Ed(e=null){return t=>t.lift(new ER(e))}class ER{constructor(t){this.defaultValue=t}call(t,n){return n.subscribe(new MR(t,this.defaultValue))}}class MR 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 sr(e,t){const n=arguments.length>=2;return r=>r.pipe(e?or((o,i)=>e(o,i,r)):zi,Ea(1),n?Ed(t):v_(()=>new Ci))}function Ln(){}function Ge(e,t,n){return function(o){return o.lift(new IR(e,t,n))}}class IR{constructor(t,n,r){this.nextOrObserver=t,this.error=n,this.complete=r}call(t,n){return n.subscribe(new AR(t,this.nextOrObserver,this.error,this.complete))}}class AR extends fe{constructor(t,n,r,o){super(t),this._tapNext=Ln,this._tapError=Ln,this._tapComplete=Ln,this._tapError=r||Ln,this._tapComplete=o||Ln,$n(n)?(this._context=this,this._tapNext=n):n&&(this._context=n,this._tapNext=n.next||Ln,this._tapError=n.error||Ln,this._tapComplete=n.complete||Ln)}_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 xR{constructor(t){this.value=t}call(t,n){return n.subscribe(new NR(t,this.value))}}class NR extends fe{constructor(t,n){super(t),this.value=n}_next(t){this.destination.next(this.value)}}function Md(e){return t=>t.lift(new RR(e))}class RR{constructor(t){this.callback=t}call(t,n){return n.subscribe(new FR(t,this.callback))}}class FR extends fe{constructor(t,n){super(t),this.add(new ye(n))}}class En{constructor(t,n){this.id=t,this.url=n}}class Sd 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 wi 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 __ 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 OR 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 kR 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 VR 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 LR 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 jR 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 BR{constructor(t){this.route=t,this.type=9}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}}class HR{constructor(t){this.route=t,this.type=10}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}}class UR{constructor(t){this.snapshot=t,this.type=11}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class $R{constructor(t){this.snapshot=t,this.type=12}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class GR{constructor(t){this.snapshot=t,this.type=13}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class qR{constructor(t){this.snapshot=t,this.type=14}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}}class D_{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 q="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 co(e){return new zR(e)}const C_="ngNavigationCancelingError";function Id(e){const t=Error("NavigationCancelingError: "+e);return t[C_]=!0,t}function KR(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 b_(e){return Array.prototype.concat.apply([],e)}function E_(e){return e.length>0?e[e.length-1]:null}function Ve(e,t){for(const n in e)e.hasOwnProperty(n)&&t(e[n],n)}function Ut(e){return uc(e)?e:Xo(e)?ke(Promise.resolve(e)):V(e)}const YR={exact:function I_(e,t,n){if(!lr(e.segments,t.segments)||!Ma(e.segments,t.segments,n)||e.numberOfChildren!==t.numberOfChildren)return!1;for(const r in t.children)if(!e.children[r]||!I_(e.children[r],t.children[r],n))return!1;return!0},subset:A_},M_={exact:function JR(e,t){return rn(e,t)},subset:function XR(e,t){return Object.keys(t).length<=Object.keys(e).length&&Object.keys(t).every(n=>w_(e[n],t[n]))},ignored:()=>!0};function S_(e,t,n){return YR[n.paths](e.root,t.root,n.matrixParams)&&M_[n.queryParams](e.queryParams,t.queryParams)&&!("exact"===n.fragment&&e.fragment!==t.fragment)}function A_(e,t,n){return T_(e,t,t.segments,n)}function T_(e,t,n,r){if(e.segments.length>n.length){const o=e.segments.slice(0,n.length);return!(!lr(o,n)||t.hasChildren()||!Ma(o,n,r))}if(e.segments.length===n.length){if(!lr(e.segments,n)||!Ma(e.segments,n,r))return!1;for(const o in t.children)if(!e.children[o]||!A_(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!!(lr(e.segments,o)&&Ma(e.segments,o,r)&&e.children[q])&&T_(e.children[q],t,i,r)}}function Ma(e,t,n){return t.every((r,o)=>M_[n](e[o].parameters,r.parameters))}class ar{constructor(t,n,r){this.root=t,this.queryParams=n,this.fragment=r}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=co(this.queryParams)),this._queryParamMap}toString(){return nF.serialize(this)}}class W{constructor(t,n){this.segments=t,this.children=n,this.parent=null,Ve(n,(r,o)=>r.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return Sa(this)}}class bi{constructor(t,n){this.path=t,this.parameters=n}get parameterMap(){return this._parameterMap||(this._parameterMap=co(this.parameters)),this._parameterMap}toString(){return O_(this)}}function lr(e,t){return e.length===t.length&&e.every((n,r)=>n.path===t[r].path)}class x_{}class N_{parse(t){const n=new dF(t);return new ar(n.parseRootSegment(),n.parseQueryParams(),n.parseFragment())}serialize(t){const n=`/${Ei(t.root,!0)}`,r=function iF(e){const t=Object.keys(e).map(n=>{const r=e[n];return Array.isArray(r)?r.map(o=>`${Ia(n)}=${Ia(o)}`).join("&"):`${Ia(n)}=${Ia(r)}`}).filter(n=>!!n);return t.length?`?${t.join("&")}`:""}(t.queryParams),o="string"==typeof t.fragment?`#${function rF(e){return encodeURI(e)}(t.fragment)}`:"";return`${n}${r}${o}`}}const nF=new N_;function Sa(e){return e.segments.map(t=>O_(t)).join("/")}function Ei(e,t){if(!e.hasChildren())return Sa(e);if(t){const n=e.children[q]?Ei(e.children[q],!1):"",r=[];return Ve(e.children,(o,i)=>{i!==q&&r.push(`${i}:${Ei(o,!1)}`)}),r.length>0?`${n}(${r.join("//")})`:n}{const n=function tF(e,t){let n=[];return Ve(e.children,(r,o)=>{o===q&&(n=n.concat(t(r,o)))}),Ve(e.children,(r,o)=>{o!==q&&(n=n.concat(t(r,o)))}),n}(e,(r,o)=>o===q?[Ei(e.children[q],!1)]:[`${o}:${Ei(r,!1)}`]);return 1===Object.keys(e.children).length&&null!=e.children[q]?`${Sa(e)}/${n[0]}`:`${Sa(e)}/(${n.join("//")})`}}function R_(e){return encodeURIComponent(e).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function Ia(e){return R_(e).replace(/%3B/gi,";")}function Ad(e){return R_(e).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function Aa(e){return decodeURIComponent(e)}function F_(e){return Aa(e.replace(/\+/g,"%20"))}function O_(e){return`${Ad(e.path)}${function oF(e){return Object.keys(e).map(t=>`;${Ad(t)}=${Ad(e[t])}`).join("")}(e.parameters)}`}const sF=/^[^\/()?;=#]+/;function Ta(e){const t=e.match(sF);return t?t[0]:""}const aF=/^[^=?&#]+/,uF=/^[^&#]+/;class dF{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[q]=new W(t,n)),r}parseSegment(){const t=Ta(this.remaining);if(""===t&&this.peekStartsWith(";"))throw new Error(`Empty path url segment cannot have parameters: '${this.remaining}'.`);return this.capture(t),new bi(Aa(t),this.parseMatrixParams())}parseMatrixParams(){const t={};for(;this.consumeOptional(";");)this.parseParam(t);return t}parseParam(t){const n=Ta(this.remaining);if(!n)return;this.capture(n);let r="";if(this.consumeOptional("=")){const o=Ta(this.remaining);o&&(r=o,this.capture(r))}t[Aa(n)]=Aa(r)}parseQueryParam(t){const n=function lF(e){const t=e.match(aF);return t?t[0]:""}(this.remaining);if(!n)return;this.capture(n);let r="";if(this.consumeOptional("=")){const s=function cF(e){const t=e.match(uF);return t?t[0]:""}(this.remaining);s&&(r=s,this.capture(r))}const o=F_(n),i=F_(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=Ta(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=q);const s=this.parseChildren();n[i]=1===Object.keys(s).length?s[q]: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 P_{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=Td(t,this._root);return n?n.children.map(r=>r.value):[]}firstChild(t){const n=Td(t,this._root);return n&&n.children.length>0?n.children[0].value:null}siblings(t){const n=xd(t,this._root);return n.length<2?[]:n[n.length-2].children.map(o=>o.value).filter(o=>o!==t)}pathFromRoot(t){return xd(t,this._root).map(n=>n.value)}}function Td(e,t){if(e===t.value)return t;for(const n of t.children){const r=Td(e,n);if(r)return r}return null}function xd(e,t){if(e===t.value)return[t];for(const n of t.children){const r=xd(e,n);if(r.length)return r.unshift(t),r}return[]}class Mn{constructor(t,n){this.value=t,this.children=n}toString(){return`TreeNode(${this.value})`}}function fo(e){const t={};return e&&e.children.forEach(n=>t[n.value.outlet]=n),t}class k_ extends P_{constructor(t,n){super(t),this.snapshot=n,Nd(this,t)}toString(){return this.snapshot.toString()}}function V_(e,t){const n=function fF(e,t){const s=new xa([],{},{},"",{},q,t,null,e.root,-1,{});return new j_("",new Mn(s,[]))}(e,t),r=new Ht([new bi("",{})]),o=new Ht({}),i=new Ht({}),s=new Ht({}),a=new Ht(""),l=new ho(r,o,s,a,i,q,t,n.root);return l.snapshot=n.root,new k_(new Mn(l,[]),n)}class ho{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(ee(t=>co(t)))),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=this.queryParams.pipe(ee(t=>co(t)))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}}function L_(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 hF(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 xa{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=co(this.params)),this._paramMap}get queryParamMap(){return this._queryParamMap||(this._queryParamMap=co(this.queryParams)),this._queryParamMap}toString(){return`Route(url:'${this.url.map(r=>r.toString()).join("/")}', path:'${this.routeConfig?this.routeConfig.path:""}')`}}class j_ extends P_{constructor(t,n){super(n),this.url=t,Nd(this,n)}toString(){return B_(this._root)}}function Nd(e,t){t.value._routerState=e,t.children.forEach(n=>Nd(e,n))}function B_(e){const t=e.children.length>0?` { ${e.children.map(B_).join(", ")} } `:"";return`${e.value}${t}`}function Rd(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 QR(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||Fd(e.parent,t.parent))}function Mi(e,t,n){if(n&&e.shouldReuseRoute(t.value,n.value.snapshot)){const r=n.value;r._futureSnapshot=t.value;const o=function gF(e,t,n){return t.children.map(r=>{for(const o of n.children)if(e.shouldReuseRoute(r.value,o.value.snapshot))return Mi(e,r,o);return Mi(e,r)})}(e,t,n);return new Mn(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=>Mi(e,a)),s}}const r=function mF(e){return new ho(new Ht(e.url),new Ht(e.params),new Ht(e.queryParams),new Ht(e.fragment),new Ht(e.data),e.outlet,e.component,e)}(t.value),o=t.children.map(i=>Mi(e,i));return new Mn(r,o)}}function Na(e){return"object"==typeof e&&null!=e&&!e.outlets&&!e.segmentPath}function Si(e){return"object"==typeof e&&null!=e&&e.outlets}function Od(e,t,n,r,o){let i={};if(r&&Ve(r,(a,l)=>{i[l]=Array.isArray(a)?a.map(u=>`${u}`):`${a}`}),e===t)return new ar(n,i,o);const s=H_(e,t,n);return new ar(s,i,o)}function H_(e,t,n){const r={};return Ve(e.children,(o,i)=>{r[i]=o===t?n:H_(o,t,n)}),new W(e.segments,r)}class U_{constructor(t,n,r){if(this.isAbsolute=t,this.numberOfDoubleDots=n,this.commands=r,t&&r.length>0&&Na(r[0]))throw new Error("Root segment cannot have matrix parameters");const o=r.find(Si);if(o&&o!==E_(r))throw new Error("{outlets:{}} has to be the last command")}toRoot(){return this.isAbsolute&&1===this.commands.length&&"/"==this.commands[0]}}class Pd{constructor(t,n,r){this.segmentGroup=t,this.processChildren=n,this.index=r}}function $_(e,t,n){if(e||(e=new W([],{})),0===e.segments.length&&e.hasChildren())return Ra(e,t,n);const r=function wF(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(Si(a))break;const l=`${a}`,u=r0&&void 0===l)break;if(l&&u&&"object"==typeof u&&void 0===u.outlets){if(!q_(l,u,s))return i;r+=2}else{if(!q_(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]=$_(e.children[s],t,i))}),Ve(e.children,(i,s)=>{void 0===r[s]&&(o[s]=i)}),new W(e.segments,o)}}function kd(e,t,n){const r=e.segments.slice(0,t);let o=0;for(;o{"string"==typeof n&&(n=[n]),null!==n&&(t[r]=kd(new W([],{}),0,n))}),t}function G_(e){const t={};return Ve(e,(n,r)=>t[r]=`${n}`),t}function q_(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 Ii,this.attachRef=null}}class Ii{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 Vd=(()=>{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||q,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 MF(n,a,o.injector);if(r&&function SF(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(Ii),v(Lt),Ro("name"),v(sa),v(Xn))},e.\u0275dir=R({type:e,selectors:[["router-outlet"]],outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"]}),e})();class MF{constructor(t,n,r){this.route=t,this.childContexts=n,this.parent=r}get(t,n){return t===ho?this.route:t===Ii?this.childContexts:this.parent.get(t,n)}}let z_=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=Tt({type:e,selectors:[["ng-component"]],decls:1,vars:0,template:function(n,r){1&n&&Oe(0,"router-outlet")},dependencies:[Vd],encapsulation:2}),e})();function W_(e,t){var n;return e.providers&&!e._injector&&(e._injector=Zs(e.providers,t,`Route: ${e.path}`)),null!==(n=e._injector)&&void 0!==n?n:t}function jd(e){const t=e.children&&e.children.map(jd),n=t?{...e,children:t}:{...e};return!n.component&&!n.loadComponent&&(t||n.loadChildren)&&n.outlet&&n.outlet!==q&&(n.component=z_),n}function It(e){return e.outlet||q}function K_(e,t){const n=e.filter(r=>It(r)===t);return n.push(...e.filter(r=>It(r)!==t)),n}function Q_(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 NF{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),Rd(this.futureState.root),this.activateChildRoutes(n,r,t)}deactivateChildRoutes(t,n,r){const o=fo(n);t.children.forEach(i=>{const s=i.value.outlet;this.deactivateRoutes(i,o[s],r),delete o[s]}),Ve(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=fo(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=fo(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=fo(n);t.children.forEach(i=>{this.activateRoutes(i,o[i.value.outlet],r),this.forwardEvent(new qR(i.value.snapshot))}),t.children.length&&this.forwardEvent(new $R(t.value.snapshot))}activateRoutes(t,n,r){const o=t.value,i=n?n.value:null;if(Rd(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),Rd(l.route.value),this.activateChildRoutes(t,null,a.children)}else{var s;const l=Q_(o.snapshot),u=null!==(s=l?.get(ai))&&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 jn(e){return"function"==typeof e}function ur(e){return e instanceof ar}const Ai=Symbol("INITIAL_VALUE");function Ti(){return Vn(e=>p_(e.map(t=>t.pipe(Ea(1),function fR(...e){const t=e[e.length-1];return Wi(t)?(e.pop(),n=>Cd(e,n,t)):n=>Cd(e,n)}(Ai)))).pipe(y_((t,n)=>{let r=!1;return n.reduce((o,i,s)=>o!==Ai?o:(i===Ai&&(r=!0),r||!1!==i&&s!==n.length-1&&!ur(i)?o:i),t)},Ai),or(t=>t!==Ai),ee(t=>ur(t)?t:!0===t),Ea(1)))}const Z_={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function Fa(e,t,n){var r;if(""===t.path)return"full"===t.pathMatch&&(e.hasChildren()||n.length>0)?{...Z_}:{matched:!0,consumedSegments:[],remainingSegments:n,parameters:{},positionalParamSegments:{}};const i=(t.matcher||KR)(n,e,t);if(!i)return{...Z_};const s={};Ve(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 Oa(e,t,n,r,o="corrected"){if(n.length>0&&function jF(e,t,n){return n.some(r=>Pa(e,t,r)&&It(r)!==q)}(e,n,r)){const s=new W(t,function LF(e,t,n,r){const o={};o[q]=r,r._sourceSegment=e,r._segmentIndexShift=t.length;for(const i of n)if(""===i.path&&It(i)!==q){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 BF(e,t,n){return n.some(r=>Pa(e,t,r))}(e,n,r)){const s=new W(e.segments,function VF(e,t,n,r,o,i){const s={};for(const a of r)if(Pa(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 Pa(e,t,n){return(!(e.hasChildren()||t.length>0)||"full"!==n.pathMatch)&&""===n.path}function Y_(e,t,n,r){return!!(It(e)===r||r!==q&&Pa(t,n,e))&&("**"===e.path||Fa(t,e,n).matched)}function J_(e,t,n){return 0===t.length&&!e.children[n]}class ka{constructor(t){this.segmentGroup=t||null}}class X_{constructor(t){this.urlTree=t}}function xi(e){return Di(new ka(e))}function eD(e){return Di(new X_(e))}function HF(e){return Di(new Error(`Only absolute redirects can have named outlets. redirectTo: '${e}'`))}class GF{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=Oa(this.urlTree.root,[],[],this.config).segmentGroup,n=new W(t.segments,t.children);return this.expandSegmentGroup(this.injector,this.config,n,q).pipe(ee(i=>this.createUrlTree(Bd(i),this.urlTree.queryParams,this.urlTree.fragment))).pipe(ir(i=>{if(i instanceof X_)return this.allowRedirects=!1,this.match(i.urlTree);throw i instanceof ka?this.noMatchError(i):i}))}match(t){return this.expandSegmentGroup(this.injector,this.config,t.root,q).pipe(ee(o=>this.createUrlTree(Bd(o),t.queryParams,t.fragment))).pipe(ir(o=>{throw o instanceof ka?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([],{[q]:t}):t;return new ar(o,n,r)}expandSegmentGroup(t,n,r,o){return 0===r.segments.length&&r.hasChildren()?this.expandChildren(t,n,r).pipe(ee(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 ke(o).pipe(uo(i=>{const s=r.children[i],a=K_(n,i);return this.expandSegmentGroup(t,a,s,i).pipe(ee(l=>({segment:l,outlet:i})))}),y_((i,s)=>(i[s.outlet]=s.segment,i),{}),function SR(e,t){const n=arguments.length>=2;return r=>r.pipe(e?or((o,i)=>e(o,i,r)):zi,bd(1),n?Ed(t):v_(()=>new Ci))}())}expandSegment(t,n,r,o,i,s){return ke(r).pipe(uo(a=>this.expandSegmentAgainstRoute(t,n,r,a,o,i,s).pipe(ir(u=>{if(u instanceof ka)return V(null);throw u}))),sr(a=>!!a),ir((a,l)=>{if(a instanceof Ci||"EmptyError"===a.name)return J_(n,o,i)?V(new W([],{})):xi(n);throw a}))}expandSegmentAgainstRoute(t,n,r,o,i,s,a){return Y_(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):xi(n):xi(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("/")?eD(i):this.lineralizeSegments(r,i).pipe(Le(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}=Fa(n,o,i);if(!a)return xi(n);const d=this.applyRedirectCommands(l,o.redirectTo,c);return o.redirectTo.startsWith("/")?eD(d):this.lineralizeSegments(o,d).pipe(Le(f=>this.expandSegment(t,n,r,f.concat(u),s,!1)))}matchSegmentAgainstRoute(t,n,r,o,i){if("**"===r.path)return t=W_(r,t),r.loadChildren?(r._loadedRoutes?V({routes:r._loadedRoutes,injector:r._loadedInjector}):this.configLoader.loadChildren(t,r)).pipe(ee(d=>(r._loadedRoutes=d.routes,r._loadedInjector=d.injector,new W(o,{})))):V(new W(o,{}));const{matched:s,consumedSegments:a,remainingSegments:l}=Fa(n,r,o);return s?(t=W_(r,t),this.getChildConfig(t,r,o).pipe(Le(c=>{var d;const f=null!==(d=c.injector)&&void 0!==d?d:t,h=c.routes,{segmentGroup:p,slicedSegments:g}=Oa(n,a,l,h),_=new W(p.segments,p.children);if(0===g.length&&_.hasChildren())return this.expandChildren(f,h,_).pipe(ee(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?q:i,!0).pipe(ee(m=>new W(a.concat(m.segments),m.children)))}))):xi(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(Le(o=>o?this.configLoader.loadChildren(t,n).pipe(Ge(i=>{n._loadedRoutes=i.routes,n._loadedInjector=i.injector})):function UF(e){return Di(Id(`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 FF(e){return e&&jn(e.canLoad)}(a))l=a.canLoad(n,r);else{if(!jn(a))throw new Error("Invalid CanLoad guard");l=a(n,r)}return Ut(l)});return V(i).pipe(Ti(),Ge(s=>{if(!ur(s))return;const a=Id(`Redirecting to "${this.urlSerializer.serialize(s)}"`);throw a.url=s,a}),ee(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[q])return HF(t.redirectTo);o=o.children[q]}}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 ar(i,this.createQueryParams(n.queryParams,this.urlTree.queryParams),n.fragment)}createQueryParams(t,n){const r={};return Ve(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 Ve(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 Bd(e){const t={};for(const r of Object.keys(e.children)){const i=Bd(e.children[r]);(i.segments.length>0||i.hasChildren())&&(t[r]=i)}return function qF(e){if(1===e.numberOfChildren&&e.children[q]){const t=e.children[q];return new W(e.segments.concat(t.segments),t.children)}return e}(new W(e.segments,t))}class tD{constructor(t){this.path=t,this.route=this.path[this.path.length-1]}}class Va{constructor(t,n){this.component=t,this.route=n}}function WF(e,t,n){const r=e._root;return Ni(r,t?t._root:null,n,[r.value])}function La(e,t,n){return(Q_(t)??n).get(e)}function Ni(e,t,n,r,o={canDeactivateChecks:[],canActivateChecks:[]}){const i=fo(t);return e.children.forEach(s=>{(function QF(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 ZF(e,t,n){if("function"==typeof n)return n(e,t);switch(n){case"pathParamsChange":return!lr(e.url,t.url);case"pathParamsOrQueryParamsChange":return!lr(e.url,t.url)||!rn(e.queryParams,t.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!Fd(e,t)||!rn(e.queryParams,t.queryParams);default:return!Fd(e,t)}}(s,i,i.routeConfig.runGuardsAndResolvers);l?o.canActivateChecks.push(new tD(r)):(i.data=s.data,i._resolvedData=s._resolvedData),Ni(e,t,i.component?a?a.children:null:n,r,o),l&&a&&a.outlet&&a.outlet.isActivated&&o.canDeactivateChecks.push(new Va(a.outlet.component,s))}else s&&Ri(t,a,o),o.canActivateChecks.push(new tD(r)),Ni(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]}),Ve(i,(s,a)=>Ri(s,n.getContext(a),o)),o}function Ri(e,t,n){const r=fo(e),o=e.value;Ve(r,(i,s)=>{Ri(i,o.component?t?t.children.getContext(s):null:t,n)}),n.canDeactivateChecks.push(new Va(o.component&&t&&t.outlet&&t.outlet.isActivated?t.outlet.component:null,o))}class s1{}function rD(e){return new pe(t=>t.error(e))}class l1{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=Oa(this.urlTree.root,[],[],this.config.filter(s=>void 0===s.redirectTo),this.relativeLinkResolution).segmentGroup,n=this.processSegmentGroup(this.config,t,q);if(null===n)return null;const r=new xa([],Object.freeze({}),Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,{},q,this.rootComponentType,null,this.urlTree.root,-1,{}),o=new Mn(r,n),i=new j_(this.url,o);return this.inheritParamsAndData(i._root),i}inheritParamsAndData(t){const n=t.value,r=L_(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=K_(t,i),l=this.processSegmentGroup(a,s,i);if(null===l)return null;r.push(...l)}const o=oD(r);return function u1(e){e.sort((t,n)=>t.value.outlet===q?-1:n.value.outlet===q?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 J_(n,r,o)?[]:null}processSegmentAgainstRoute(t,n,r,o){if(t.redirectTo||!Y_(t,n,r,o))return null;let i,s=[],a=[];if("**"===t.path){var l,u;const D=r.length>0?E_(r).parameters:{},b=sD(n)+r.length;i=new xa(r,D,Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,lD(t),It(t),null!==(l=null!==(u=t.component)&&void 0!==u?u:t._loadedComponent)&&void 0!==l?l:null,t,iD(n),b,uD(t),b)}else{var c,d;const D=Fa(n,t,r);if(!D.matched)return null;s=D.consumedSegments,a=D.remainingSegments;const b=sD(n)+s.length;i=new xa(s,D.parameters,Object.freeze({...this.urlTree.queryParams}),this.urlTree.fragment,lD(t),It(t),null!==(c=null!==(d=t.component)&&void 0!==d?d:t._loadedComponent)&&void 0!==c?c:null,t,iD(n),b,uD(t),b)}const f=function c1(e){return e.children?e.children:e.loadChildren?e._loadedRoutes:[]}(t),{segmentGroup:h,slicedSegments:p}=Oa(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 Mn(i,D)]}if(0===f.length&&0===p.length)return[new Mn(i,[])];const g=It(t)===o,_=this.processSegment(f,h,p,g?q:o);return null===_?null:[new Mn(i,_)]}}function d1(e){const t=e.value.routeConfig;return t&&""===t.path&&void 0===t.redirectTo}function oD(e){const t=[],n=new Set;for(const r of e){if(!d1(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=oD(r.children);t.push(new Mn(r.value,o))}return t.filter(r=>!n.has(r))}function iD(e){let t=e;for(;t._sourceSegment;)t=t._sourceSegment;return t}function sD(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 lD(e){return e.data||{}}function uD(e){return e.resolve||{}}const Hd=Symbol("RouteTitle");function cD(e){return"string"==typeof e.title||null===e.title}function ja(e){return Vn(t=>{const n=e(t);return n?ke(n).pipe(ee(()=>t)):V(t)})}class D1 extends class _1{shouldDetach(t){return!1}store(t,n){}shouldAttach(t){return!1}retrieve(t){return null}shouldReuseRoute(t,n){return t.routeConfig===n.routeConfig}}{}const Ud=new O("ROUTES");let $d=(()=>{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=Ut(n.loadComponent()).pipe(Ge(i=>{this.onLoadEndListener&&this.onLoadEndListener(n),n._loadedComponent=i}),Md(()=>{this.componentLoaders.delete(n)})),o=new cl(r,()=>new $t).pipe(Qi());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(ee(a=>{this.onLoadEndListener&&this.onLoadEndListener(r);let l,u,c=!1;Array.isArray(a)?u=a:(l=a.create(n).injector,u=b_(l.get(Ud,[],x.Self|x.Optional)));return{routes:u.map(jd),injector:l}}),Md(()=>{this.childrenLoaders.delete(r)})),s=new cl(i,()=>new $t).pipe(Qi());return this.childrenLoaders.set(r,s),s}loadModuleFactoryOrRoutes(n){return Ut(n()).pipe(Le(r=>r instanceof gy||Array.isArray(r)?V(r):ke(this.compiler.compileModuleAsync(r))))}}return e.\u0275fac=function(n){return new(n||e)(S(Je),S(Bc))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})();class w1{shouldProcessUrl(t){return!0}extract(t){return t}merge(t,n){return t}}function E1(e){throw e}function M1(e,t,n){return t.parse("/")}function fD(e,t){return V(null)}const S1={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},I1={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"};let qe=(()=>{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 $t,this.errorHandler=E1,this.malformedUriErrorHandler=M1,this.navigated=!1,this.lastSuccessfulId=-1,this.hooks={beforePreactivation:fD,afterPreactivation:fD},this.urlHandlingStrategy=new w1,this.routeReuseStrategy=new D1,this.onSameUrlNavigation="ignore",this.paramsInheritanceStrategy="emptyOnly",this.urlUpdateStrategy="deferred",this.relativeLinkResolution="corrected",this.canceledNavigationResolution="replace",this.configLoader=s.get($d),this.configLoader.onLoadEndListener=f=>this.triggerEvent(new HR(f)),this.configLoader.onLoadStartListener=f=>this.triggerEvent(new BR(f)),this.ngModule=s.get(On),this.console=s.get(aT);const d=s.get(Me);this.isNgZoneEnabled=d instanceof Me&&Me.isInAngularZone(),this.resetConfig(l),this.currentUrlTree=function ZR(){return new ar(new W([],{}),{},null)}(),this.rawUrlTree=this.currentUrlTree,this.browserUrlTree=this.currentUrlTree,this.routerState=V_(this.currentUrlTree,this.rootComponentType),this.transitions=new Ht({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(or(o=>0!==o.id),ee(o=>({...o,extractedUrl:this.urlHandlingStrategy.extract(o.rawUrl)})),Vn(o=>{let i=!1,s=!1;return V(o).pipe(Ge(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}}),Vn(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 hD(a.source)&&(this.browserUrlTree=a.extractedUrl),V(a).pipe(Vn(d=>{const f=this.transitions.getValue();return r.next(new Sd(d.id,this.serializeUrl(d.extractedUrl),d.source,d.restoredState)),f!==this.transitions.getValue()?lo:Promise.resolve(d)}),function zF(e,t,n,r){return Vn(o=>function $F(e,t,n,r,o){return new GF(e,t,n,r,o).apply()}(e,t,n,o.extractedUrl,r).pipe(ee(i=>({...o,urlAfterRedirects:i}))))}(this.ngModule.injector,this.configLoader,this.urlSerializer,this.config),Ge(d=>{this.currentNavigation={...this.currentNavigation,finalUrl:d.urlAfterRedirects}}),function f1(e,t,n,r,o){return Le(i=>function a1(e,t,n,r,o="emptyOnly",i="legacy"){try{const s=new l1(e,t,n,r,o,i).recognize();return null===s?rD(new s1):V(s)}catch(s){return rD(s)}}(e,t,i.urlAfterRedirects,n(i.urlAfterRedirects),r,o).pipe(ee(s=>({...i,targetSnapshot:s}))))}(this.rootComponentType,this.config,d=>this.serializeUrl(d),this.paramsInheritanceStrategy,this.relativeLinkResolution),Ge(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 Sd(f,this.serializeUrl(h),p,g);r.next(D);const b=V_(h,this.rootComponentType).snapshot;return V({...a,targetSnapshot:b,urlAfterRedirects:h,extras:{..._,skipLocationChange:!1,replaceUrl:!1}})}return this.rawUrlTree=a.rawUrl,a.resolve(null),lo}),ja(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})}),Ge(a=>{const l=new kR(a.id,this.serializeUrl(a.extractedUrl),this.serializeUrl(a.urlAfterRedirects),a.targetSnapshot);this.triggerEvent(l)}),ee(a=>({...a,guards:WF(a.targetSnapshot,a.currentSnapshot,this.rootContexts)})),function YF(e,t){return Le(n=>{const{targetSnapshot:r,currentSnapshot:o,guards:{canActivateChecks:i,canDeactivateChecks:s}}=n;return 0===s.length&&0===i.length?V({...n,guardsResult:!0}):function JF(e,t,n,r){return ke(e).pipe(Le(o=>function o1(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=La(a,t,o);let u;if(function kF(e){return e&&jn(e.canDeactivate)}(l))u=Ut(l.canDeactivate(e,t,n,r));else{if(!jn(l))throw new Error("Invalid CanDeactivate guard");u=Ut(l(e,t,n,r))}return u.pipe(sr())})).pipe(Ti()):V(!0)}(o.component,o.route,n,t,r)),sr(o=>!0!==o,!0))}(s,r,o,e).pipe(Le(a=>a&&function RF(e){return"boolean"==typeof e}(a)?function XF(e,t,n,r){return ke(t).pipe(uo(o=>Cd(function t1(e,t){return null!==e&&t&&t(new UR(e)),V(!0)}(o.route.parent,r),function e1(e,t){return null!==e&&t&&t(new GR(e)),V(!0)}(o.route,r),function r1(e,t,n){const r=t[t.length-1],i=t.slice(0,t.length-1).reverse().map(s=>function KF(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=>g_(()=>V(s.guards.map(l=>{const u=La(l,s.node,n);let c;if(function PF(e){return e&&jn(e.canActivateChild)}(u))c=Ut(u.canActivateChild(r,e));else{if(!jn(u))throw new Error("Invalid CanActivateChild guard");c=Ut(u(r,e))}return c.pipe(sr())})).pipe(Ti())));return V(i).pipe(Ti())}(e,o.path,n),function n1(e,t,n){const r=t.routeConfig?t.routeConfig.canActivate:null;if(!r||0===r.length)return V(!0);const o=r.map(i=>g_(()=>{const s=La(i,t,n);let a;if(function OF(e){return e&&jn(e.canActivate)}(s))a=Ut(s.canActivate(t,e));else{if(!jn(s))throw new Error("Invalid CanActivate guard");a=Ut(s(t,e))}return a.pipe(sr())}));return V(o).pipe(Ti())}(e,o.route,n))),sr(o=>!0!==o,!0))}(r,i,e,t):V(a)),ee(a=>({...n,guardsResult:a})))})}(this.ngModule.injector,a=>this.triggerEvent(a)),Ge(a=>{if(ur(a.guardsResult)){const u=Id(`Redirecting to "${this.serializeUrl(a.guardsResult)}"`);throw u.url=a.guardsResult,u}const l=new VR(a.id,this.serializeUrl(a.extractedUrl),this.serializeUrl(a.urlAfterRedirects),a.targetSnapshot,!!a.guardsResult);this.triggerEvent(l)}),or(a=>!!a.guardsResult||(this.restoreHistory(a),this.cancelNavigationTransition(a,""),!1)),ja(a=>{if(a.guards.canActivateChecks.length)return V(a).pipe(Ge(l=>{const u=new LR(l.id,this.serializeUrl(l.extractedUrl),this.serializeUrl(l.urlAfterRedirects),l.targetSnapshot);this.triggerEvent(u)}),Vn(l=>{let u=!1;return V(l).pipe(function h1(e,t){return Le(n=>{const{targetSnapshot:r,guards:{canActivateChecks:o}}=n;if(!o.length)return V(n);let i=0;return ke(o).pipe(uo(s=>function p1(e,t,n,r){const o=e.routeConfig,i=e._resolve;return void 0!==o?.title&&!cD(o)&&(i[Hd]=o.title),function g1(e,t,n,r){const o=function m1(e){return[...Object.keys(e),...Object.getOwnPropertySymbols(e)]}(e);if(0===o.length)return V({});const i={};return ke(o).pipe(Le(s=>function y1(e,t,n,r){const o=La(e,t,r);return Ut(o.resolve?o.resolve(t,n):o(t,n))}(e[s],t,n,r).pipe(sr(),Ge(a=>{i[s]=a}))),bd(1),function TR(e){return t=>t.lift(new xR(e))}(i),ir(s=>s instanceof Ci?lo:Di(s)))}(i,e,t,r).pipe(ee(s=>(e._resolvedData=s,e.data=L_(e,n).resolve,o&&cD(o)&&(e.data[Hd]=o.title),null)))}(s.route,r,e,t)),Ge(()=>i++),bd(1),Le(s=>i===o.length?V(n):lo))})}(this.paramsInheritanceStrategy,this.ngModule.injector),Ge({next:()=>u=!0,complete:()=>{u||(this.restoreHistory(l),this.cancelNavigationTransition(l,"At least one route resolver didn't emit any value."))}}))}),Ge(l=>{const u=new jR(l.id,this.serializeUrl(l.extractedUrl),this.serializeUrl(l.urlAfterRedirects),l.targetSnapshot);this.triggerEvent(u)}))}),ja(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})}),ja(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(Ge(f=>{u.component=f}),ee(()=>{})));for(const f of u.children)d.push(...l(f));return d};return p_(l(a.targetSnapshot.root)).pipe(Ed(),Ea(1))}),ee(a=>{const l=function pF(e,t,n){const r=Mi(e,t._root,n?n._root:void 0);return new k_(r,t)}(this.routeReuseStrategy,a.targetSnapshot,a.currentRouterState);return{...a,targetRouterState:l}}),Ge(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)=>ee(r=>(new NF(t,r.targetRouterState,r.currentRouterState,n).activate(e),r)))(this.rootContexts,this.routeReuseStrategy,a=>this.triggerEvent(a)),Ge({next(){i=!0},complete(){i=!0}}),Md(()=>{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)}),ir(a=>{if(s=!0,function WR(e){return e&&e[C_]}(a)){const l=ur(a.url);l||(this.navigated=!0,this.restoreHistory(o,!0));const u=new __(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||hD(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 OR(o.id,this.serializeUrl(o.extractedUrl),a);r.next(l);try{o.resolve(this.errorHandler(a))}catch(u){o.reject(u)}}return lo}))}))}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(jd),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 yF(e,t,n,r,o){var i;if(0===n.length)return Od(t.root,t.root,t.root,r,o);const s=function vF(e){if("string"==typeof e[0]&&1===e.length&&"/"===e[0])return new U_(!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 Ve(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 U_(n,t,r)}(n);if(s.toRoot())return Od(t.root,t.root,new W([],{}),r,o);const l=function a(c){var d;const f=function _F(e,t,n,r){return e.isAbsolute?new Pd(t.root,!0,0):-1===r?new Pd(n,n===t.root,0):function DF(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 Pd(r,!1,o-i)}(n,r+(Na(e.commands[0])?0:1),e.numberOfDoubleDots)}(s,t,null===(d=e.snapshot)||void 0===d?void 0:d._urlSegment,c),h=f.processChildren?Ra(f.segmentGroup,f.index,s.commands):$_(f.segmentGroup,f.index,s.commands);return Od(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=ur(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 A1(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 wi(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 __(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){Ru()},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})();function hD(e){return"imperative"!==e}let Ba=(()=>{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 $t,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:Cn(this.skipLocationChange),replaceUrl:Cn(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:Cn(this.preserveFragment)})}}return e.\u0275fac=function(n){return new(n||e)(v(qe),v(ho),Ro("tabindex"),v(vn),v(yt))},e.\u0275dir=R({type:e,selectors:[["","routerLink","",5,"a",5,"area"]],hostBindings:function(n,r){1&n&&Z("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 pD{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===q)}return n}getResolvedTitleForRoute(t){return t.data[Hd]}}let N1=(()=>{class e extends pD{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(c_))},e.\u0275prov=P({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();class gD{}class mD{preload(t,n){return V(null)}}let yD=(()=>{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(or(n=>n instanceof wi),uo(()=>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=Zs(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 ke(o).pipe(mr())}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(Le(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?ke([i,this.loader.loadComponent(r)]).pipe(mr()):i})}}return e.\u0275fac=function(n){return new(n||e)(S(qe),S(Bc),S(Xn),S(gD),S($d))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})(),qd=(()=>{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 Sd?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=n.navigationTrigger,this.restoredId=n.restoredState?n.restoredState.navigationId:0):n instanceof wi&&(this.lastId=n.id,this.scheduleScrollEvent(n,this.router.parseUrl(n.urlAfterRedirects).fragment))})}consumeScrollEvents(){return this.router.events.subscribe(n=>{n instanceof D_&&(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 D_(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){Ru()},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})();const cr=new O("ROUTER_CONFIGURATION"),vD=new O("ROUTER_FORROOT_GUARD"),F1=[ed,{provide:x_,useClass:N_},{provide:qe,useFactory:function L1(e,t,n,r,o,i,s={},a,l,u,c){const d=new qe(null,e,t,n,r,o,b_(i));return u&&(d.urlHandlingStrategy=u),c&&(d.routeReuseStrategy=c),d.titleStrategy=l??a,function j1(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:[x_,Ii,ed,Je,Bc,Ud,cr,N1,[pD,new pn],[class C1{},new pn],[class v1{},new pn]]},Ii,{provide:ho,useFactory:function B1(e){return e.routerState.root},deps:[qe]},yD,mD,class R1{preload(t,n){return n().pipe(ir(()=>V(null)))}},{provide:cr,useValue:{enableTracing:!1}},$d];function O1(){return new av("Router",qe)}let _D=(()=>{class e{constructor(n,r){}static forRoot(n,r){return{ngModule:e,providers:[F1,DD(n),{provide:vD,useFactory:V1,deps:[[qe,new pn,new jo]]},{provide:cr,useValue:r||{}},{provide:so,useFactory:k1,deps:[gi,[new ws(Xc),new pn],cr]},{provide:qd,useFactory:P1,deps:[qe,mN,cr]},{provide:gD,useExisting:r&&r.preloadingStrategy?r.preloadingStrategy:mD},{provide:av,multi:!0,useFactory:O1},[zd,{provide:Vc,multi:!0,useFactory:H1,deps:[zd]},{provide:CD,useFactory:U1,deps:[zd]},{provide:tv,multi:!0,useExisting:CD}]]}}static forChild(n){return{ngModule:e,providers:[DD(n)]}}}return e.\u0275fac=function(n){return new(n||e)(S(vD,8),S(qe,8))},e.\u0275mod=_t({type:e}),e.\u0275inj=ut({}),e})();function P1(e,t,n){return n.scrollOffset&&t.setOffset(n.scrollOffset),new qd(e,t,n)}function k1(e,t,n={}){return n.useHash?new ZT(e,t):new xv(e,t)}function V1(e){return"guarded"}function DD(e){return[{provide:Eb,multi:!0,useValue:e},{provide:Ud,multi:!0,useValue:e}]}let zd=(()=>{class e{constructor(n){this.injector=n,this.initNavigation=!1,this.destroyed=!1,this.resultOfPreactivationDone=new $t}appInitializer(){return this.injector.get(WT,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(qe),s=this.injector.get(cr);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(cr),o=this.injector.get(yD),i=this.injector.get(qd),s=this.injector.get(qe),a=this.injector.get(oa);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=P({token:e,factory:e.\u0275fac}),e})();function H1(e){return e.appInitializer.bind(e)}function U1(e){return e.bootstrapListener.bind(e)}const CD=new O("Router Initializer");let G1=(()=>{class e{constructor(){this.title="djongo-FE"}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=Tt({type:e,selectors:[["app-root"]],decls:1,vars:0,template:function(n,r){1&n&&Oe(0,"router-outlet")},dependencies:[Vd]}),e})();var Pe=(()=>(function(e){e.createAccount="create-account/",e.login="login/",e.dashboard="dashboard/",e.enterprise="enterprise/"}(Pe||(Pe={})),Pe))(),Fi=(()=>(function(e){e.intention="intention/",e.payment="payment/"}(Fi||(Fi={})),Fi))(),Ha=(()=>(function(e){e[e.OK=0]="OK",e[e.EMAIL_EXISTS=1]="EMAIL_EXISTS",e[e.OTHER=2]="OTHER"}(Ha||(Ha={})),Ha))(),po=(()=>(function(e){e[e.OK=0]="OK",e[e.STRIPE_REJ=1]="STRIPE_REJ",e[e.OTHER=2]="OTHER"}(po||(po={})),po))();class wD{}class bD{}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 q1{encodeKey(t){return ED(t)}encodeValue(t){return ED(t)}decodeKey(t){return decodeURIComponent(t)}decodeValue(t){return decodeURIComponent(t)}}const W1=/%(\d[a-f0-9])/gi,K1={40:"@","3A":":",24:"$","2C":",","3B":";","3D":"=","3F":"?","2F":"/"};function ED(e){return encodeURIComponent(e).replace(W1,(t,n)=>{var r;return null!==(r=K1[n])&&void 0!==r?r:t})}function Ua(e){return`${e}`}class sn{constructor(t={}){if(this.updates=null,this.cloneFrom=null,this.encoder=t.encoder||new q1,t.fromString){if(t.fromObject)throw new Error("Cannot specify both fromString and fromObject.");this.map=function z1(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(Ua):[Ua(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(Ua(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(Ua(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 Q1{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 MD(e){return typeof ArrayBuffer<"u"&&e instanceof ArrayBuffer}function SD(e){return typeof Blob<"u"&&e instanceof Blob}function ID(e){return typeof FormData<"u"&&e instanceof FormData}class Oi{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 Z1(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 Q1),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 Oi(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 Wd{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 Kd extends Wd{constructor(t={}){super(t),this.type=Ae.ResponseHeader}clone(t={}){return new Kd({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 $a extends Wd{constructor(t={}){super(t),this.type=Ae.Response,this.body=void 0!==t.body?t.body:null}clone(t={}){return new $a({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 AD extends Wd{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 Qd(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 TD=(()=>{class e{constructor(n){this.handler=n}request(n,r,o={}){let i;if(n instanceof Oi)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 Oi(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(uo(l=>this.handler.handle(l)));if(n instanceof Oi||"events"===o.observe)return s;const a=s.pipe(or(l=>l instanceof $a));switch(o.observe||"body"){case"body":switch(i.responseType){case"arraybuffer":return a.pipe(ee(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(ee(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(ee(l=>{if(null!==l.body&&"string"!=typeof l.body)throw new Error("Response is not a string.");return l.body}));default:return a.pipe(ee(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,Qd(o,r))}post(n,r,o={}){return this.request("POST",n,Qd(o,r))}put(n,r,o={}){return this.request("PUT",n,Qd(o,r))}}return e.\u0275fac=function(n){return new(n||e)(S(wD))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})();class xD{constructor(t,n){this.next=t,this.interceptor=n}handle(t){return this.interceptor.intercept(t,this.next)}}const ND=new O("HTTP_INTERCEPTORS");let J1=(()=>{class e{intercept(n,r){return r.handle(n)}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})();const X1=/^\)\]\}',?\n/;let RD=(()=>{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 eO(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 Kd({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 b=p>=200&&p<300;if("json"===n.responseType&&"string"==typeof D){const m=D;D=D.replace(X1,"");try{D=""!==D?JSON.parse(D):null}catch(I){D=m,b&&(b=!1,D={error:I,text:D})}}b?(r.next(new $a({body:D,headers:h,status:p,statusText:g,url:_||void 0})),r.complete()):r.error(new AD({error:D,headers:h,status:p,statusText:g,url:_||void 0}))},u=h=>{const{url:p}=a(),g=new AD({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(Kv))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})();const Zd=new O("XSRF_COOKIE_NAME"),Yd=new O("XSRF_HEADER_NAME");class FD{}let tO=(()=>{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=Bv(n,this.cookieName),this.lastCookieString=n),this.lastToken}}return e.\u0275fac=function(n){return new(n||e)(S(tt),S(jc),S(Zd))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})(),Jd=(()=>{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(FD),S(Yd))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})(),nO=(()=>{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(ND,[]);this.chain=r.reduceRight((o,i)=>new xD(o,i),this.backend)}return this.chain.handle(n)}}return e.\u0275fac=function(n){return new(n||e)(S(bD),S(Je))},e.\u0275prov=P({token:e,factory:e.\u0275fac}),e})(),rO=(()=>{class e{static disable(){return{ngModule:e,providers:[{provide:Jd,useClass:J1}]}}static withOptions(n={}){return{ngModule:e,providers:[n.cookieName?{provide:Zd,useValue:n.cookieName}:[],n.headerName?{provide:Yd,useValue:n.headerName}:[]]}}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=ut({providers:[Jd,{provide:ND,useExisting:Jd,multi:!0},{provide:FD,useClass:tO},{provide:Zd,useValue:"XSRF-TOKEN"},{provide:Yd,useValue:"X-XSRF-TOKEN"}]}),e})(),oO=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=ut({providers:[TD,{provide:wD,useClass:nO},RD,{provide:bD,useExisting:RD}],imports:[rO.withOptions({cookieName:"XSRF-TOKEN",headerName:"X-XSRF-TOKEN"})]}),e})();const Pi_baseUrl="https://api.djongomapper.com/mapper/";class OD{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 an=(()=>{class e{constructor(n){this.http=n}post(n,r){let o={"Content-Type":"text/plain"},i=OD.get("csrftoken");i&&(o["X-CSRFTOKEN"]=i);let s={withCredentials:!0};return s.headers=new on(o),this.http.post(Pi_baseUrl+n,r,s)}postForm(n,r){let o=new sn({fromObject:r}),i=OD.get("csrftoken");return i&&(o=o.set("csrfmiddlewaretoken",i)),this.http.post(Pi_baseUrl+n,o,{withCredentials:!0})}get(n,r){let o={withCredentials:!0};return r&&(o.params=new sn({fromObject:r})),this.http.get(Pi_baseUrl+n,o)}}return e.\u0275fac=function(n){return new(n||e)(S(TD))},e.\u0275prov=P({token:e,factory:e.\u0275fac,providedIn:"root"}),e})();const Xd={dashboard:[{provide:an,useClass:an}],createAccount:[{provide:an,useClass:an}],enterprise:[{provide:an,useClass:an}]};function Ga(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(vn),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=He(e)))(r||e)}}(),e.\u0275dir=R({type:e,features:[ne]}),e})();const ln=new O("NgValueAccessor"),aO={provide:ln,useExisting:ue(()=>fr),multi:!0},uO=new O("CompositionEventMode");let fr=(()=>{class e extends PD{constructor(n,r,o){super(n,r),this._compositionMode=o,this._composing=!1,null==this._compositionMode&&(this._compositionMode=!function lO(){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(vn),v(yt),v(uO,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&&Z("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:[le([aO]),ne]}),e})();function Bn(e){return null==e||("string"==typeof e||Array.isArray(e))&&0===e.length}const ze=new O("NgValidators"),Hn=new O("NgAsyncValidators");function BD(e){return Bn(e.value)?{required:!0}:null}function qa(e){return null}function zD(e){return null!=e}function WD(e){const t=Xo(e)?ke(e):e;return uc(t),t}function KD(e){let t={};return e.forEach(n=>{t=null!=n?{...t,...n}:t}),0===Object.keys(t).length?null:t}function QD(e,t){return t.map(n=>n(e))}function ZD(e){return e.map(t=>function dO(e){return!e.validate}(t)?t:n=>t.validate(n))}function ef(e){return null!=e?function YD(e){if(!e)return null;const t=e.filter(zD);return 0==t.length?null:function(n){return KD(QD(n,t))}}(ZD(e)):null}function tf(e){return null!=e?function JD(e){if(!e)return null;const t=e.filter(zD);return 0==t.length?null:function(n){return function iO(...e){if(1===e.length){const t=e[0];if($i(t))return Ga(t,null);if(rl(t)&&Object.getPrototypeOf(t)===Object.prototype){const n=Object.keys(t);return Ga(n.map(r=>t[r]),n)}}if("function"==typeof e[e.length-1]){const t=e.pop();return Ga(e=1===e.length&&$i(e[0])?e[0]:e,null).pipe(ee(n=>t(...n)))}return Ga(e,null)}(QD(n,t).map(WD)).pipe(ee(KD))}}(ZD(e)):null}function XD(e,t){return null===e?[t]:Array.isArray(e)?[...e,t]:[e,t]}function nf(e){return e?Array.isArray(e)?e:[e]:[]}function za(e,t){return Array.isArray(e)?e.includes(t):e===t}function nC(e,t){const n=nf(t);return nf(e).forEach(o=>{za(n,o)||n.push(o)}),n}function rC(e,t){return nf(t).filter(n=>!za(e,n))}class oC{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=ef(this._rawValidators)}_setAsyncValidators(t){this._rawAsyncValidators=t||[],this._composedAsyncValidatorFn=tf(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 oC{get formDirective(){return null}get path(){return null}}class Un extends oC{constructor(){super(...arguments),this._parent=null,this.name=null,this.valueAccessor=null}}class iC{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 ki=(()=>{class e extends iC{constructor(n){super(n)}}return e.\u0275fac=function(n){return new(n||e)(v(Un,2))},e.\u0275dir=R({type:e,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(n,r){2&n&&$s("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:[ne]}),e})(),Wa=(()=>{class e extends iC{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&&$s("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:[ne]}),e})();const Vi="VALID",Qa="INVALID",go="PENDING",Li="DISABLED";function af(e){return(Za(e)?e.validators:e)||null}function aC(e){return Array.isArray(e)?ef(e):e||null}function lf(e,t){return(Za(t)?t.asyncValidators:e)||null}function lC(e){return Array.isArray(e)?tf(e):e||null}function Za(e){return null!=e&&!Array.isArray(e)&&"object"==typeof e}class dC{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=aC(this._rawValidators),this._composedAsyncValidatorFn=lC(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===Vi}get invalid(){return this.status===Qa}get pending(){return this.status==go}get disabled(){return this.status===Li}get enabled(){return this.status!==Li}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=aC(t)}setAsyncValidators(t){this._rawAsyncValidators=t,this._composedAsyncValidatorFn=lC(t)}addValidators(t){this.setValidators(nC(t,this._rawValidators))}addAsyncValidators(t){this.setAsyncValidators(nC(t,this._rawAsyncValidators))}removeValidators(t){this.setValidators(rC(t,this._rawValidators))}removeAsyncValidators(t){this.setAsyncValidators(rC(t,this._rawAsyncValidators))}hasValidator(t){return za(this._rawValidators,t)}hasAsyncValidator(t){return za(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=go,!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=Li,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=Vi,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===Vi||this.status===go)&&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()?Li:Vi}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(t){if(this.asyncValidator){this.status=go,this._hasOwnPendingAsyncValidator=!0;const n=WD(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()?Li:this.errors?Qa:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(go)?go:this._anyControlsHaveStatus(Qa)?Qa:Vi}_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){Za(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 uf extends dC{constructor(t,n,r){super(af(n),lf(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 cC(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 uC(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 ji(e,t){var n,r;cf(e,t),t.valueAccessor.writeValue(e.value),e.disabled&&(null===(n=(r=t.valueAccessor).setDisabledState)||void 0===n||n.call(r,!0)),function DO(e,t){t.valueAccessor.registerOnChange(n=>{e._pendingValue=n,e._pendingChange=!0,e._pendingDirty=!0,"change"===e.updateOn&&fC(e,t)})}(e,t),function wO(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 CO(e,t){t.valueAccessor.registerOnTouched(()=>{e._pendingTouched=!0,"blur"===e.updateOn&&e._pendingChange&&fC(e,t),"submit"!==e.updateOn&&e.markAsTouched()})}(e,t),function _O(e,t){if(t.valueAccessor.setDisabledState){const n=r=>{t.valueAccessor.setDisabledState(r)};e.registerOnDisabledChange(n),t._registerOnDestroy(()=>{e._unregisterOnDisabledChange(n)})}}(e,t)}function Xa(e,t){e.forEach(n=>{n.registerOnValidatorChange&&n.registerOnValidatorChange(t)})}function cf(e,t){const n=function eC(e){return e._rawValidators}(e);null!==t.validator?e.setValidators(XD(n,t.validator)):"function"==typeof n&&e.setValidators([n]);const r=function tC(e){return e._rawAsyncValidators}(e);null!==t.asyncValidator?e.setAsyncValidators(XD(r,t.asyncValidator)):"function"==typeof r&&e.setAsyncValidators([r]);const o=()=>e.updateValueAndValidity();Xa(t._rawValidators,o),Xa(t._rawAsyncValidators,o)}function fC(e,t){e._pendingDirty&&e.markAsDirty(),e.setValue(e._pendingValue,{emitModelToViewChange:!1}),t.viewToModelUpdate(e._pendingValue),e._pendingChange=!1}const IO={provide:nt,useExisting:ue(()=>mo)},Bi=(()=>Promise.resolve(null))();let mo=(()=>{class e extends nt{constructor(n,r){super(),this.submitted=!1,this._directives=new Set,this.ngSubmit=new Ce,this.form=new uf({},ef(n),tf(r))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(n){Bi.then(()=>{const r=this._findContainer(n.path);n.control=r.registerControl(n.name,n.control),ji(n.control,n),n.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(n)})}getControl(n){return this.form.get(n.path)}removeControl(n){Bi.then(()=>{const r=this._findContainer(n.path);r&&r.removeControl(n.name),this._directives.delete(n)})}addFormGroup(n){Bi.then(()=>{const r=this._findContainer(n.path),o=new uf({});(function hC(e,t){cf(e,t)})(o,n),r.registerControl(n.name,o),o.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(n){Bi.then(()=>{const r=this._findContainer(n.path);r&&r.removeControl(n.name)})}getFormGroup(n){return this.form.get(n.path)}updateModel(n,r){Bi.then(()=>{this.form.get(n.path).setValue(r)})}setValue(n){this.control.setValue(n)}onSubmit(n){return this.submitted=!0,function gC(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(ze,10),v(Hn,10))},e.\u0275dir=R({type:e,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(n,r){1&n&&Z("submit",function(i){return r.onSubmit(i)})("reset",function(){return r.onReset()})},inputs:{options:["ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],features:[le([IO]),ne]}),e})();function mC(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}function yC(e){return"object"==typeof e&&null!==e&&2===Object.keys(e).length&&"value"in e&&"disabled"in e}const vC=class extends dC{constructor(t=null,n,r){super(af(n),lf(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}),Za(n)&&(n.nonNullable||n.initialValueIsDefault)&&(this.defaultValue=yC(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){mC(this._onChange,t)}registerOnDisabledChange(t){this._onDisabledChange.push(t)}_unregisterOnDisabledChange(t){mC(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){yC(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}},xO={provide:Un,useExisting:ue(()=>yo)},CC=(()=>Promise.resolve(null))();let yo=(()=>{class e extends Un{constructor(n,r,o,i,s){super(),this._changeDetectorRef=s,this.control=new vC,this._registered=!1,this.update=new Ce,this._parent=n,this._setValidators(r),this._setAsyncValidators(o),this.valueAccessor=function ff(e,t){if(!t)return null;let n,r,o;return Array.isArray(t),t.forEach(i=>{i.constructor===fr?n=i:function MO(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 df(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(){ji(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){CC.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&&Cn(r);CC.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 Ya(e,t){return[...t.path,e]}(n,this._parent):[n]}}return e.\u0275fac=function(n){return new(n||e)(v(nt,9),v(ze,10),v(Hn,10),v(ln,10),v(sa,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:[le([xO]),ne,Ct]}),e})(),hf=(()=>{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})(),bC=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=ut({}),e})(),hr=(()=>{class e{constructor(){this._validator=qa}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):qa,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 KO={provide:ze,useExisting:ue(()=>vo),multi:!0};let vo=(()=>{class e extends hr{constructor(){super(...arguments),this.inputName="required",this.normalizeInput=Cn,this.createValidator=n=>BD}enabled(n){return n}}return e.\u0275fac=function(){let t;return function(r){return(t||(t=He(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:[le([KO]),ne]}),e})();const XO={provide:ze,useExisting:ue(()=>Hi),multi:!0};let Hi=(()=>{class e extends hr{constructor(){super(...arguments),this.inputName="pattern",this.normalizeInput=n=>n,this.createValidator=n=>function qD(e){if(!e)return qa;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(Bn(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=He(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:[le([XO]),ne]}),e})(),eP=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=ut({imports:[bC]}),e})(),tP=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=ut({imports:[eP]}),e})(),BC=(()=>{class e{constructor(){}ngOnInit(){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=Tt({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),Oe(3,"stop",2)(4,"stop",3)(5,"stop",4),w()(),C(6,"g",5)(7,"g",6)(8,"path",7),Oe(9,"animateTransform",8),w(),C(10,"circle",9),Oe(11,"animateTransform",8),w()()()())}}),e})();function oP(e,t){if(1&e){const n=Us();C(0,"div")(1,"div",1)(2,"div",2),Er(),C(3,"svg",3),Z("click",function(){return Qn(n),Zn(Jt().prev())}),C(4,"g",4),Oe(5,"path",5),w()()(),Io(),C(6,"div",6),A(7,"DjongoCS Instance"),w(),C(8,"div",2),Er(),C(9,"svg",3),Z("click",function(){return Qn(n),Zn(Jt().next())}),C(10,"g",4),Oe(11,"path",7),w()()()(),Io(),C(12,"div",8),A(13,"$15"),w(),C(14,"div",9),A(15," PER MONTH "),w(),C(16,"div",10)(17,"ul")(18,"li"),A(19,"The DjongoCS Package."),w(),C(20,"li"),A(21,"DjongoCS Cloud Services."),w(),C(22,"li"),A(23,"Email Support."),w()()()()}}function iP(e,t){if(1&e){const n=Us();C(0,"div")(1,"div",1)(2,"div",2),Er(),C(3,"svg",3),Z("click",function(){return Qn(n),Zn(Jt().prev())}),C(4,"g",4),Oe(5,"path",5),w()()(),Io(),C(6,"div",6),A(7,"DjongoCS Support"),w(),C(8,"div",2),Er(),C(9,"svg",3),Z("click",function(){return Qn(n),Zn(Jt().next())}),C(10,"g",4),Oe(11,"path",7),w()()()(),Io(),C(12,"div",8),A(13,"$149"),w(),C(14,"div",9),A(15," PER HOUR "),w(),C(16,"div",10)(17,"ul")(18,"li"),A(19,"For existing DjongoCS users"),w(),C(20,"li"),A(21,"Issue resolved within the next day."),w(),C(22,"li"),A(23,"Chat support."),w()()()()}}let HC=(()=>{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=Tt({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&&(it(0,oP,24,0,"div",0),it(1,iP,24,0,"div",0)),2&n&&(X("ngIf",r.show.server),K(1),X("ngIf",r.show.support))},dependencies:[ao]}),e})();const sP=["cardErrorEl"];function aP(e,t){1&e&&(C(0,"div",21),Oe(1,"app-spinner"),w())}function lP(e,t){if(1&e&&(C(0,"div",22)(1,"div",23)(2,"p"),A(3," The Base URL for your endpoints: "),C(4,"em"),A(5),w()(),C(6,"p"),A(7," Your username on VM instance: "),C(8,"em"),A(9),w()()()()),2&e){const n=Jt();K(5),ni("https://api.djongomapper.com/",n.formData.userName,"/"),K(4),ti(n.formData.userName)}}function uP(e,t){1&e&&(C(0,"div",22)(1,"p",24)(2,"strong"),A(3,"Oops!"),w(),A(4," Passwords do not match."),w()())}function cP(e,t){1&e&&(C(0,"div",21),Oe(1,"app-spinner"),w())}function dP(e,t){1&e&&(C(0,"div",22)(1,"div",23)(2,"p"),A(3,"Your instance is being setup. This can take several minutes."),w(),C(4,"div",21),Oe(5,"app-spinner"),w()()())}let fP=(()=>{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=Ha,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)})}onIntention(){this.confirmPassword==this.formData.password?(this.submitted.intention=!0,this.show.buttonSpinner=!0,this.backend.get(Pe.createAccount+Fi.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(Pe.createAccount+Fi.payment,{status:po.OK,userName:this.formData.userName,email:this.formData.email,password:this.formData.password,stripeCustomerId:this.intentionResponse.stripeCustomerId}).subscribe(i=>{i.status===po.OK?this.router.navigateByUrl(Pe.dashboard.slice(0,-1)):alert("Request failed with status: "+po[i.status])})}}return e.\u0275fac=function(n){return new(n||e)(v(an),v(qe))},e.\u0275cmp=Tt({type:e,selectors:[["app-create-account"]],viewQuery:function(n,r){if(1&n&&xy(sP,5),2&n){let o;Js(o=function Xs(){return function BA(e,t){return e[19].queries[t].queryList}(y(),oh())}())&&(r.cardErrorEl=o.first)}},features:[le(Xd.createAccount)],decls:38,vars:12,consts:[[1,"splash","page__content"],[1,"h1-title"],[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"],[1,"tac"],["href","/legal/djongocs/terms-and-conditions"],["class","text-center",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,"spinner"],[1,"text-center"],[1,"message","notice--success"],[1,"message","notice--warning"]],template:function(n,r){if(1&n&&(C(0,"div",0)(1,"h1",1),A(2,"Create Endpoint"),w(),C(3,"div",2)(4,"div",3)(5,"form",4,5),Z("ngSubmit",function(){return r.onIntention()}),C(7,"label"),A(8,"Username: "),C(9,"input",6),Z("ngModelChange",function(i){return r.formData.userName=i}),w()(),C(10,"label"),A(11,"Password: "),C(12,"input",7),Z("ngModelChange",function(i){return r.formData.password=i})("blur",function(){return r.onBlur()}),w()(),C(13,"label"),A(14,"Confirm Password: "),C(15,"input",8),Z("ngModelChange",function(i){return r.confirmPassword=i})("blur",function(){return r.onBlur()}),w()(),C(16,"label"),A(17,"Email: "),C(18,"input",9),Z("ngModelChange",function(i){return r.formData.email=i}),w()(),C(19,"button",10),A(20," Create Endpoint "),w(),it(21,aP,2,0,"div",11),w(),C(22,"p",12),A(23," By creating an account you agree to our "),C(24,"a",13),A(25,"Terms and conditions"),w()(),it(26,lP,10,2,"div",14),it(27,uP,5,0,"div",14),C(28,"form",15),Oe(29,"div",16)(30,"div",17,18),C(32,"button",19),Z("click",function(){return r.onPayment()}),A(33,"Confirm Payment "),w(),it(34,cP,2,0,"div",11),w(),it(35,dP,6,0,"div",14),w(),C(36,"div",20),Oe(37,"app-features"),w()()()),2&n){const o=Jo(6);K(9),X("ngModel",r.formData.userName),K(3),X("ngModel",r.formData.password),K(3),X("ngModel",r.confirmPassword),K(3),X("ngModel",r.formData.email),K(1),X("disabled",!o.valid||r.show.passwordMismatch||r.submitted.intention),K(2),X("ngIf",r.show.buttonSpinner),K(5),X("ngIf",r.showMessage()),K(1),X("ngIf",r.show.passwordMismatch),K(1),X("hidden",r.intentionResponse.status!==r.intentionResponseStatus.OK),K(4),X("disabled",r.submitted.payment),K(2),X("ngIf",r.submitted.payment&&r.show.waitingPaymentConfirm),K(1),X("ngIf",r.show.waitingBackendConfirm)}},dependencies:[ao,hf,fr,ki,Wa,vo,Hi,yo,mo,BC,HC],styles:[".h1-message[_ngcontent-%COMP%]{margin:3em auto 0}.card[_ngcontent-%COMP%]{background-color:#fff;padding:10px;margin-bottom:.75em}.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}.tac[_ngcontent-%COMP%]{font-size:.7em;margin:2em 0}"]}),e})();var _o=(()=>(function(e){e[e.OK=0]="OK",e[e.LOGIN_REQUIRED=1]="LOGIN_REQUIRED",e[e.VALUE_ERR=2]="VALUE_ERR"}(_o||(_o={})),_o))();function hP(e,t){if(1&e&&(C(0,"td"),A(1),w()),2&e){const n=Jt(2);K(1),hc("ssh ",n.body.username,"@api.djongomapper.com -p ",n.body.sshPort,"")}}function pP(e,t){1&e&&(C(0,"td"),A(1,""),w())}function gP(e,t){if(1&e){const n=Us();C(0,"table")(1,"thead")(2,"tr")(3,"th"),A(4,"Property"),w(),C(5,"th"),A(6,"Value"),w()()(),C(7,"tbody")(8,"tr")(9,"td"),A(10,"Username"),w(),C(11,"td"),A(12),w()(),C(13,"tr")(14,"td"),A(15,"Base URL"),w(),C(16,"td"),A(17),w()(),C(18,"tr")(19,"td"),A(20,"Status"),w(),C(21,"td"),A(22),w()(),C(23,"tr")(24,"td"),A(25,"SSH Command"),w(),it(26,hP,2,2,"td",2),it(27,pP,2,0,"ng-template",null,3,Oy),w(),C(29,"tr")(30,"td"),A(31,"SSH Public Key"),w(),C(32,"td")(33,"textarea",4),Z("ngModelChange",function(o){return Qn(n),Zn(Jt().body.sshPublicKey=o)}),A(34," "),w(),C(35,"button",5),Z("click",function(){return Qn(n),Zn(Jt().onSubmit())}),A(36,"Update"),w()()()()()}if(2&e){const n=Jo(28),r=Jt();K(12),ti(r.body.username),K(5),ni("https://api.djongomapper.com/",r.body.username,""),K(5),ti(r.body.state),K(4),X("ngIf",r.body.sshPort&&r.body.sshPublicKey)("ngIfElse",n),K(7),X("ngModel",r.body.sshPublicKey),K(2),X("disabled","setup"!=r.body.state)}}let mP=(()=>{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(Pe.dashboard).subscribe(n=>{n.status===_o.LOGIN_REQUIRED?this.router.navigateByUrl(Pe.login.slice(0,-1)):(this.show=!0,this.body=n.body)},n=>{this.router.navigateByUrl(Pe.login.slice(0,-1))})}onSubmit(){this.backend.post(Pe.dashboard,{sshPublicKey:this.body.sshPublicKey}).subscribe(n=>{n.status===_o.LOGIN_REQUIRED?this.router.navigateByUrl(Pe.login.slice(0,-1)):n.status===_o.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(an),v(qe))},e.\u0275cmp=Tt({type:e,selectors:[["app-dashboard"]],features:[le(Xd.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),it(1,gP,37,7,"table",1),w()),2&n&&(K(1),X("ngIf",r.show))},dependencies:[ao,fr,ki,yo],styles:["td[_ngcontent-%COMP%]:first-child, th[_ngcontent-%COMP%]:first-child{padding-left:1em}table[_ngcontent-%COMP%]{margin:3em auto 1em;display:table}"]}),e})();var tl=(()=>(function(e){e[e.OK=0]="OK",e[e.DOES_NOT_EXIST=1]="DOES_NOT_EXIST"}(tl||(tl={})),tl))();function yP(e,t){1&e&&(C(0,"div",13),Oe(1,"app-spinner"),w())}function vP(e,t){1&e&&(C(0,"div",14)(1,"div",15)(2,"p"),A(3,"Username or Password is incorrect."),w(),C(4,"p"),A(5,"Do not have an endpoint yet? "),C(6,"a",16),A(7,"Create an endpoint."),w()()()())}let _P=(()=>{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(Pe.login,this.formData).subscribe(n=>{this.show.buttonSpinner=!1,n.status===tl.OK?this.router.navigateByUrl(Pe.dashboard.slice(0,-1)):(this.show.loginFail=!0,this.submitted=!1)})}}return e.\u0275fac=function(n){return new(n||e)(v(an),v(qe))},e.\u0275cmp=Tt({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),A(2,"MongoDB Django Hosting Server"),w(),C(3,"div",2)(4,"div",3)(5,"form",4,5),Z("ngSubmit",function(){return r.onSubmit()}),C(7,"label"),A(8,"Username: "),C(9,"input",6),Z("ngModelChange",function(i){return r.formData.userName=i}),w()(),C(10,"label"),A(11,"Password: "),C(12,"input",7),Z("ngModelChange",function(i){return r.formData.password=i}),w()(),C(13,"button",8),A(14," Login "),w(),it(15,yP,2,0,"div",9),w(),it(16,vP,8,0,"div",10),w(),C(17,"div",11),Oe(18,"app-features"),C(19,"button",12),A(20," Create Account "),w()()()()),2&n){const o=Jo(6);K(9),X("ngModel",r.formData.userName),K(3),X("ngModel",r.formData.password),K(1),X("disabled",!o.valid||r.submitted),K(2),X("ngIf",r.show.buttonSpinner),K(1),X("ngIf",r.show.loginFail)}},dependencies:[ao,hf,fr,ki,Wa,vo,Hi,yo,mo,Ba,BC,HC]}),e})(),DP=(()=>{class e{constructor(){}ngOnInit(){}}return e.\u0275fac=function(n){return new(n||e)},e.\u0275cmp=Tt({type:e,selectors:[["app-not-found"]],decls:2,vars:0,consts:[[1,"h1-title"]],template:function(n,r){1&n&&(C(0,"h1",0),A(1,"Oops! The page you are looking for does not exist"),w())}}),e})();var nl=(()=>(function(e){e[e.OK=0]="OK",e[e.OTHER=1]="OTHER"}(nl||(nl={})),nl))();function CP(e,t){1&e&&(C(0,"div",10)(1,"div",11)(2,"p")(3,"strong"),A(4,"Thank you!"),w(),A(5," Message received. We will get back soon."),w()()())}let wP=(()=>{class e{constructor(n){this.backend=n,this.formData={name:"",organisation:"",email:"",message:""},this.clicked=!1,this.show={messageReceived:!1}}ngOnInit(){}onSubmit(){this.clicked=!0,this.backend.get(Pe.enterprise,this.formData).subscribe(n=>{n.status==nl.OK&&(this.show.messageReceived=!0),console.log(n.status)},n=>{})}}return e.\u0275fac=function(n){return new(n||e)(v(an))},e.\u0275cmp=Tt({type:e,selectors:[["app-enterprise"]],features:[le(Xd.createAccount)],decls:20,vars:6,consts:[[1,"splash","page__content"],[1,"h1-title"],["ngNativeValidate","",1,"form-2-col",3,"ngSubmit"],["formRef","ngForm"],["type","text","name","name","required","",3,"ngModel","ngModelChange"],["type","text","name","organisation","required","",3,"ngModel","ngModelChange"],["type","email","name","email","placeholder","name@org.com","required","","autocomplete","email","pattern","\\w+@\\w+\\.\\w+",3,"ngModel","ngModelChange"],["name","message","rows","4","required","",3,"ngModel","ngModelChange"],["type","submit",1,"btn","btn--primary","btn--large",3,"disabled"],["class","text-center",4,"ngIf"],[1,"text-center"],[1,"message","notice--success"]],template:function(n,r){if(1&n&&(C(0,"div",0)(1,"h1",1),A(2,"Contact Us"),w(),C(3,"form",2,3),Z("ngSubmit",function(){return r.onSubmit()}),C(5,"label"),A(6,"Name: "),C(7,"input",4),Z("ngModelChange",function(i){return r.formData.name=i}),w()(),C(8,"label"),A(9,"Organisation: "),C(10,"input",5),Z("ngModelChange",function(i){return r.formData.organisation=i}),w()(),C(11,"label"),A(12,"Email: "),C(13,"input",6),Z("ngModelChange",function(i){return r.formData.email=i}),w()(),C(14,"label"),A(15,"Message: "),C(16,"textarea",7),Z("ngModelChange",function(i){return r.formData.message=i}),w()(),C(17,"button",8),A(18," Send "),w(),it(19,CP,6,0,"div",9),w()()),2&n){const o=Jo(4);K(7),X("ngModel",r.formData.name),K(3),X("ngModel",r.formData.organisation),K(3),X("ngModel",r.formData.email),K(3),X("ngModel",r.formData.message),K(1),X("disabled",!o.valid||r.show.messageReceived||r.clicked),K(2),X("ngIf",r.show.messageReceived)}},dependencies:[ao,fr,ki,Wa,vo,Hi,yo,mo]}),e})();const bP=[{path:Pe.createAccount.slice(0,-1),title:"DjongoCS - Create Account",component:fP},{path:Pe.dashboard.slice(0,-1),title:"DjongoCS - Dashboard",component:mP},{path:Pe.login.slice(0,-1),title:"DjongoCS - Login",component:_P},{path:Pe.enterprise.slice(0,-1),title:"DjongoCS - Enterprise Contact Us",component:wP},{path:"**",component:DP}];let EP=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e}),e.\u0275inj=ut({imports:[_D.forRoot(bP),_D]}),e})(),MP=(()=>{class e{}return e.\u0275fac=function(n){return new(n||e)},e.\u0275mod=_t({type:e,bootstrap:[G1]}),e.\u0275inj=ut({imports:[$N,tP,EP,oO]}),e})();(function ST(){mv=!1})(),UN().bootstrapModule(MP).catch(e=>console.error(e))}},$n=>{$n($n.s=536)}]); \ 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}label:last-of-type input,textarea{margin-bottom:.75em} 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..a254ba53 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,618 @@ + + + + + + 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/docs/markdown/documentation/djongo/integrating-django-with-mongodb.md b/docs/markdown/documentation/djongo/integrating-django-with-mongodb.md new file mode 100644 index 00000000..c181adce --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongo/mongodb-field-reference.md b/docs/markdown/documentation/djongo/mongodb-field-reference.md new file mode 100644 index 00000000..068c416a --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongo/using-django-with-mongodb-array-field.md b/docs/markdown/documentation/djongo/using-django-with-mongodb-array-field.md new file mode 100644 index 00000000..a27b77e9 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongo/using-django-with-mongodb-array-reference-field.md b/docs/markdown/documentation/djongo/using-django-with-mongodb-array-reference-field.md new file mode 100644 index 00000000..8b1fa534 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongo/using-django-with-mongodb-data-fields.md b/docs/markdown/documentation/djongo/using-django-with-mongodb-data-fields.md new file mode 100644 index 00000000..e682f109 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongo/using-django-with-mongodb-gridfs.md b/docs/markdown/documentation/djongo/using-django-with-mongodb-gridfs.md new file mode 100644 index 00000000..2d6503f6 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongo/using-django-with-other-fields.md b/docs/markdown/documentation/djongo/using-django-with-other-fields.md new file mode 100644 index 00000000..01cf7416 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongoCS/aggregation.md b/docs/markdown/documentation/djongoCS/aggregation.md new file mode 100644 index 00000000..b7d340cd --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongoCS/creating-django-capped-models-using-mongodb.md b/docs/markdown/documentation/djongoCS/creating-django-capped-models-using-mongodb.md new file mode 100644 index 00000000..12fd9b8a --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongoCS/database-transactions.md b/docs/markdown/documentation/djongoCS/database-transactions.md new file mode 100644 index 00000000..b2ffc879 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongoCS/indexes.md b/docs/markdown/documentation/djongoCS/indexes.md new file mode 100644 index 00000000..f356dfba --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongoCS/model-creation.md b/docs/markdown/documentation/djongoCS/model-creation.md new file mode 100644 index 00000000..bed1ad6d --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongoCS/model-query.md b/docs/markdown/documentation/djongoCS/model-query.md new file mode 100644 index 00000000..6a1e18f6 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongoCS/model-update.md b/docs/markdown/documentation/djongoCS/model-update.md new file mode 100644 index 00000000..3c62c4b3 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/djongoCS/more-info.md b/docs/markdown/documentation/djongoCS/more-info.md new file mode 100644 index 00000000..9f802341 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/get-started.md b/docs/markdown/documentation/get-started.md new file mode 100644 index 00000000..417559d8 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/side-stuff/donate.md b/docs/markdown/documentation/side-stuff/donate.md new file mode 100644 index 00000000..a223f701 --- /dev/null +++ b/docs/markdown/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/markdown/documentation/side-stuff/forum.md b/docs/markdown/documentation/side-stuff/forum.md new file mode 100644 index 00000000..629116d3 --- /dev/null +++ b/docs/markdown/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/markdown/legal/commercial-license.md b/docs/markdown/legal/commercial-license.md new file mode 100644 index 00000000..a68665c1 --- /dev/null +++ b/docs/markdown/legal/commercial-license.md @@ -0,0 +1,398 @@ +--- +title: DJONGO LICENSE AGREEMENT +permalink: /legal/enterprise/commercial-license +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 +--- + +Agreement version 1.0.0 + +This License Agreement (“Agreementâ€) is a legal agreement for the licensing of Licensed Software (as defined below) between The Licensor (as defined below) and the Licensee who has accepted the terms of this Agreement by signing this Agreement or by downloading or using the Licensed Software or in any other appropriate means. + +Capitalized terms used herein are defined in Section 1. + +WHEREAS: + +A. Licensee wishes to use the Licensed Software for the purpose of developing and distributing Applications. + +B. The Licensor is willing to grant the Licensee a right to use Licensed Software for such a purpose pursuant to term and conditions of this Agreement; and + +C. Parties wish to enable that their respective Affiliates also can sell and purchase licenses to serve Licensee Affiliates’ needs to use Licensed Software pursuant to terms of the Agreement. Any such license purchases by Licensee Affiliates from The Licensor or its Affiliates will create contractual relationship directly between the relevant The Licensor and the respective ordering Licensee Affiliate (“Acceding Agreementâ€). Accordingly, Licensee shall not be a party to any such Acceding Agreement, and no rights or obligations are created to the Licensee thereunder but all rights and obligations under such Acceding Agreement are vested and borne solely by the ordering Licensee Affiliate and the relevant The Licensor as a contracting parties under such Acceding Agreement. + +NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: + +## 1. DEFINITIONS + +“Affiliate†of a Party shall mean an entity (i) which is directly or indirectly controlling such Party; (ii) which is under the same direct or indirect ownership or control as such Party; or (iii) which is directly or indirectly owned or controlled by such Party. For these purposes, an entity shall be treated as being controlled by another if that other entity has fifty percent (50 %) or more of the votes in such entity, is able to direct its affairs and/or to control the composition of its board of directors or equivalent body. + +“Add-on Products†shall mean The Licensor’s specific add-on software products which are not licensed as part of The Licensor’s standard product offering, but shall be included into the scope of Licensed Software only if so specifically agreed between the Parties. + +“Agreement Term†shall mean the validity period of this Agreement, as set forth in Section 12. + +“Applications†shall mean software products created using the Licensed Software, which include the Redistributables, or part thereof. + +“Contractor(s)†shall mean third party consultants, distributors and contractors performing services to the Licensee under applicable contractual arrangement. + +“Customer(s)†shall mean Licensee’s customers to whom Licensee, directly or indirectly, distributes copies of the Redistributables as integrated or incorporated into Applications. + +“Data Protection Legislation†shall mean the General Data Protection Regulation (EU 2016/679) (GDPR) and any national implementing laws, regulations and secondary legislation, as may be amended or updated from time to time, as well as any other data protection laws or regulations applicable in relevant territory. + +“Deployment Platforms†shall mean target operating systems and/or hardware specified in the License Certificate, on which the Redistributables can be distributed pursuant to the terms and conditions of this Agreement. + +“Designated User(s)†shall mean the employee(s) of Licensee or Licensee’s Affiliates acting within the scope of their employment or Licensee's Contractors acting within the scope of their services on behalf of Licensee. + +“Development License†shall mean the license needed by the Licensee for each Designated User to use the Licensed Software under the license grant described in Section 3.1 of this Agreement. Development Licenses are available per respective Licensed Software products, each product having its designated scope and purpose of use. + +“Development License Term†shall mean the agreed validity period of the Development License during which time the relevant Licensed Software product can be used pursuant to this Agreement. Agreed Development License Term, as ordered and paid for by the Licensee, shall be memorialized in the applicable License Certificate. + +“Development Platforms†shall mean those host operating systems specified in the License Certificate, in which the Licensed Software can be used under the Development License. + +“Distribution License Packs†shall mean set of prepaid Distribution Licenses for distribution of Redistributables, as defined in The Licensor’s standard price list, quote or Purchase Order confirmation. + +“End User†shall mean the final end user of the Application or a Device. + +“Evaluation License Term†shall mean a time period specified in the License Certificate for the Licensee to use the relevant Licensed Software for evaluation purposes according to Section 3.6 herein. + +“Intellectual Property Rights†shall mean patents (including utility models), design patents, and designs (whether or not capable of registration), chip topography rights and other like protection, copyrights, trademarks, service marks, trade names, logos or other words or symbols and any other form of statutory protection of any kind and applications for any of the foregoing as well as any trade secrets. + +“License Certificate†shall mean a certificate generated by The Licensor for each Designated User respectively upon them downloading the Licensed Software, which will be available under respective Designated User’s Djongomapper Account at https://djongomapper.com/djongocs/dashboard. License Certificates will specify relevant information pertaining the Licensed Software purchased by Licensee and Designated User’s license to the Licensed Software. + +“License Fee†shall mean the fee charged to the Licensee for rights granted under the terms of this Agreement. + +“Licensed Software†shall mean specified product of commercially licensed version of Djongo Software, which Licensee has purchased and which is provided to Licensee under the terms of this Agreement. Licensed Software shall include corresponding online or electronic documentation, associated media and printed materials, including the source code (where applicable), example programs and the documentation. Licensed Software does not include Third Party Software (as defined in Section 4) or Open Source Djongo. The Licensor may, in the course of its development activities, at its free and absolute discretion and without any obligation to send or publish any notifications to the Licensee or in general, make changes, additions or deletions in the components and functionalities of the Licensed Software, provided that no such changes, additions or deletions will affect the already released version of the Licensed Software, but only upcoming version(s). + +“Licensee†shall mean the individual or legal entity that is party to this Agreement. + +“Licensee’s Records†shall mean books and records that contain information bearing on Licensee’s compliance with this Agreement, Licensee’s use of Open Source Djongo and/or the payments due to The Licensor under this Agreement, including, but not limited to user information, assembly logs, sales records and distribution records. + +“Modified Software†shall have the meaning as set forth in Section 2.3. + +“Online Services†shall mean any services or access to systems made available by The Licensor to the Licensee over the Internet relating to the Licensed Software or for the purpose of use by the Licensee of the Licensed Software or Support. Use of any such Online Services is discretionary for the Licensee and some of them may be subject to additional fees. + +“Open Source Djongo†shall mean Djongo Software available under the terms of the GNU Affero General Public License, version 3.0 or later (“AGPLâ€) or the GNU General Public License, version 2.0 or later (“GPLâ€). For clarity, Open Source Djongo shall not be provided, governed or used under this Agreement. + +â€Party†or “Parties†shall mean Licensee and/or The Licensor. + +“Permitted Software†shall mean (i) third party open source software products that are generally available for public in source code form and free of any charge under any of the licenses approved by Open Source Initiative as listed on https://opensource.org/licenses, which may include parts of Open Source Djongo or be developed using Open Source Djongo; and (ii) software The Licensor has made available via its online distribution channel. + +“Pre-Release Code†shall have the meaning as set forth in Section 4. + +“Prohibited Combination†shall mean any effort to use, combine, incorporate, link or integrate Licensed Software with any software created with or incorporating Open Source Djongo, or use Licensed Software for creation of any such software. + +“Purchase Order†shall have the meaning as set forth in Section 10.2. + +“Djongo Software†shall mean the software libraries and tools of The Licensor, which The Licensor makes available under commercial and/or open source licenses. + +“Redistributables" shall mean the portions of the Licensed Software that may be distributed pursuant to the terms of this Agreement in object code form only, including any relevant documentation. Where relevant, any reference to Licensed Software in this Agreement shall include and refer also to Redistributables. + +“Renewal Term†shall mean an extension of previous Development License Term as agreed between the Parties. + +“Submitted Modified Software†shall have the meaning as set forth in Section 2.3. + +“Support†shall mean standard developer support that is provided by The Licensor to assist Designated Users in using the Licensed Software in accordance with this Agreement and the Support Terms. + +“Taxes†shall have the meaning set forth in Section 10.5. + +“The Licensor†shall mean: + +i. The Doableware, a Swedish company with its registered office at Bertrandsgatan 2b, 21214 Malmö, Sweden. + +"Third-Party Software" shall have the meaning set forth in Section 4. + +“Updates†shall mean a release or version of the Licensed Software containing bug fixes, error corrections and other changes that are generally made available to users of the Licensed Software that have contracted for Support. Updates are generally depicted as a change to the digits following the decimal in the Licensed Software version number. The Licensor shall make Updates available to the Licensee under the Support. Updates shall be considered as part of the Licensed Software hereunder. + +“Upgrades†shall mean a release or version of the Licensed Software containing enhancements and new features and are generally depicted as a change to the first digit of the Licensed Software version number. In the event Upgrades are provided to the Licensee under this Agreement, they shall be considered as part of the Licensed Software hereunder. + +## 2. OWNERSHIP + +2.1. Ownership of The Licensor + +The Licensed Software is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The Licensed Software is licensed, not sold. + +All of The Licensor's Intellectual Property Rights are and shall remain the exclusive property of The Licensor or its licensors respectively. No rights to The Licensor’s Intellectual Property Rights are assigned or granted to Licensee under this Agreement, except when and to the extent expressly specified herein. + +2.2. Ownership of Licensee + +All the Licensee’s Intellectual Property Rights are and shall remain the exclusive property of the Licensee or its licensors respectively. + +All Intellectual Property Rights to the Modified Software and Applications shall remain with the Licensee and no rights thereto shall be granted by the Licensee to The Licensor under this Agreement (except as set forth in Section 2.3 below). + +2.3. Modified Software + +Licensee may create bug-fixes, error corrections, patches or modifications to the Licensed Software (“Modified Softwareâ€). Such Modified Software may break the source or binary compatibility with the Licensed Software (including without limitation through changing the application programming interfaces (“APIâ€) or by adding, changing or deleting any variable, method, or class signature in the Licensed Software and/or any inter-process protocols, services or standards in the Licensed Software libraries). To the extent that Licensee’s Modified Software so breaks source or binary compatibility with the Licensed Software, Licensee acknowledges that The Licensor’s ability to provide Support may be prevented or limited and Licensee’s ability to make use of Updates may be restricted. + +Licensee may, at its sole and absolute discretion, choose to submit Modified Software to The Licensor (“Submitted Modified Softwareâ€) in connection with Licensee’s Support request, service request or otherwise. In the event Licensee does so, then, Licensee hereby grants The Licensor a sublicensable, assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and fully paid-up license, under all of Licensee’s Intellectual Property Rights, to reproduce, adapt, translate, modify, and prepare derivative works of, publicly display, publicly perform, sublicense, make available and distribute such Submitted Modified Software as The Licensor sees fit at its free and absolute discretion. + +## 3. LICENSES GRANTED + +3.1. Development with Licensed Software + +Subject to the terms of this Agreement, The Licensor grants to Licensee a worldwide, non-exclusive, non-transferable license, valid for each Development License Term, to use, modify and copy the Licensed Software by the Licensee on the Development Platforms for the sole purposes of designing, developing, demonstrating and testing Application(s), and to provide thereto related support and other related services to Customers. + +Licensee may install copies of the Licensed Software on multiple computers, provided that only the Users who use the Licensed Software are the direct employees of the Licensee. + +Upon expiry of the initially agreed Development License Term, the respective Development License Term shall be automatically extended to one or more Renewal Term(s), unless and until either Party notifies the other Party in writing, or any other method acceptable to The Licensor (it being specifically acknowledged and understood that verbal notification is explicitly deemed inadequate in all circumstances), that it does not wish to continue the Development License Term, such notification to be provided to the other Party no less than thirty (30) days before expiry of the respective Development License Term. The Licensor shall, in good time before the due date for the above notification, remind the Licensee on the coming Renewal Term. Unless otherwise agreed between the Parties, Renewal Term shall be 12 months. + +Any such Renewal Term shall be subject to License Fees agreed between the Parties or, if no advance agreement exists, subject to The Licensor’s standard list pricing applicable at the commencement date of any such Renewal Term. + +The Licensor may either request the Licensee to place a purchase order corresponding to a quote by The Licensor, or use Licensee’s stored Credit Card information in the Djongomapper.com Account to automatically charge the Licensee for the relevant Renewal Term. + +3.2. Distribution of Applications + +Subject to the terms of this Agreement, The Licensor grants to Licensee a worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to this Agreement), right and license, valid for the Agreement Term, to + +i. distribute, by itself or through its Contractors, Redistributables as installed, incorporated or integrated into Applications for execution on the Deployment Platforms, and + +ii. grant perpetual and irrevocable sublicenses to Redistributables, as distributed hereunder, for Customers solely to the extent necessary in order for the Customers to use the Applications for their respective intended purposes. + +Right to distribute the Redistributables as part of an Application as provided herein is not royalty-bearing but is conditional upon the Application having been created, updated and maintained under a valid and duly paid Development Licenses. + +3.3. Further Requirements + +The licenses granted above in this Section 3 by The Licensor to Licensee are conditional and subject to Licensee's compliance with the following terms: + +i. Licensee acknowledges that The Licensor has separate products of Licensed Software for the purpose of Applications respectively. Licensee shall make sure and bear the burden of proof that Licensee is using a correct product of Licensed Software entitling Licensee to development; + +ii. Licensee shall not remove or alter any copyright, trademark or other proprietary rights notice(s) contained in any portion of the Licensed Software; + +iii. Applications must add primary and substantial functionality to the Licensed Software so as not to compete with the Licensed Software; + +iv. Applications may not pass on functionality which in any way makes it possible for others to create software with the Licensed Software; provided however that Licensee may use the Licensed Software's functionality solely in order to enable scripting, themes and styles that augment the functionality and appearance of the Application(s) without adding primary and substantial functionality to the Application(s); + +v. Licensee shall not use Licensed Software in any manner or for any purpose that infringes, misappropriates or otherwise violates any Intellectual property or right of any third party, or that violates any applicable law; + +vi. Licensee shall not use The Licensor's or any of its suppliers' names, logos, or trademarks to market Applications, except that Licensee may use “Djongo†logo to indicate that Application(s) or Device(s) was developed using the Licensed Software; + +vii. Licensee shall not distribute, sublicense or disclose source code of Licensed Software to any third party (provided however that Licensee may appoint employee(s) of Contractors and Affiliates as Designated Users to use Licensed Software pursuant to this Agreement). Such right may be available for the Licensee subject to a separate software development kit (“SDKâ€) license agreement to be concluded with The Licensor; + +viii. Licensee shall not grant the Customers a right to (a) make copies of the Redistributables except when and to the extent required to use the Applications for their intended purpose, (b) modify the Redistributables or create derivative works thereof, (c) decompile, disassemble or otherwise reverse engineer Redistributables, or (d) redistribute any copy or portion of the Redistributables to any third party, except as part of the onward sale of the Application or Device on which the Redistributables are installed; + +ix. Licensee shall not and shall cause that its Affiliates or Contractors shall not use Licensed Software in any Prohibited Combination, unless Licensee has received an advance written permission from The Licensor to do so. Absent such written permission, any and all distribution by the Licensee during the Agreement Term of a hardware device or product a) which incorporate or integrate any part of Licensed Software or Open Source Djongo; or b) where substantial functionality is provided by software built with Licensed Software or Open Source Djongo or otherwise depends on the Licensed Software or Open Source Djongo, shall be considered to be Device distribution under this Agreement and shall be dependent on Licensee’s compliance thereof (including but not limited to obligation to pay applicable License Fees for such distribution). Notwithstanding what is provided above in this sub-section (ix), Licensee is entitled to use and combine Licensed Software with any Permitted Software; + +x. Licensee shall cause all of its Affiliates, Contractors and Customers entitled to make use of the licenses granted under this Agreement, to be contractually bound to comply with the relevant terms of this Agreement and not to use the Licensed Software beyond the terms hereof and for any purposes other than operating within the scope of their services for Licensee. Licensee shall be responsible for any and all actions and omissions of its Affiliates and Contractors relating to the Licensed Software and use thereof (including but not limited to payment of all applicable License Fees); + +xi. Except when and to the extent explicitly provided in this Section 3, Licensee shall not transfer, publish, disclose, display or otherwise make available the Licensed Software; and + +xii. Licensee shall not attempt or enlist a third party to conduct or attempt to conduct any of the above. + +Above terms shall not be applicable if and to the extent they conflict with any mandatory provisions of any applicable laws. + +Any use of Licensed Software beyond the provisions of this Agreement is strictly prohibited and requires an additional license from The Licensor. + +3.4 Evaluation License + +Subject to the terms of this Agreement, The Licensor grants to Licensee a worldwide, non-exclusive, non-transferable license, valid for the Evaluation License Term to use the Licensed Software solely for the Licensee’s internal use to evaluate and determine whether the Licensed Software meets Licensee's business requirements, specifically excluding any commercial use of the Licensed Software or any derived work thereof. + +Upon the expiry of the Evaluation License Term, Licensee must either discontinue use of the relevant Licensed Software or acquire a commercial Development License specified herein. + +## 4. THIRD-PARTY SOFTWARE + +The Licensed Software may provide links or access to third party libraries or code (collectively "Third-Party Software") to implement various functions. Third-Party Software does not, however, comprise part of the Licensed Software, but is provided to Licensee complimentary and use thereof is discretionary for the Licensee. Third-Party Software will be listed in requirements.txt file delivered with the Licensed Software or documented in the Licensed Software, as such may be amended from time to time. Licensee acknowledges that use or distribution of Third-Party Software is in all respects subject to applicable license terms of applicable third-party right holders. + +## 5. PRE-RELEASE CODE + +The Licensed Software may contain pre-release code and functionality, or sample code marked or otherwise stated with appropriate designation such as “Technology Previewâ€, “Alphaâ€, “Betaâ€, “Sampleâ€, “Example†etc. (“Pre-Release Codeâ€). + +Such Pre-Release Code may be present complimentary for the Licensee, in order to provide experimental support or information for new platforms or preliminary versions of one or more new functionalities or for other similar reasons. The Pre-Release Code may not be at the level of performance and compatibility of a final, generally available, product offering. The Pre-Release Code may not operate correctly, may contain errors and may be substantially modified by The Licensor prior to the first commercial product release, if any. The Licensor is under no obligation to make Pre-Release Code commercially available, or provide any Support or Updates relating thereto. The Licensor assumes no liability whatsoever regarding any Pre-Release Code, but any use thereof is exclusively at Licensee’s own risk and expense. + +For clarity, unless Licensed Software specifies different license terms for the respective Pre-Release Code, the Licensee is entitled to use such pre-release code pursuant to Section 3, just like other Licensed Software. + +## 6. LIMITED WARRANTY AND WARRANTY DISCLAIMER + +The Licensor hereby represents and warrants that (i) it has the power and authority to grant the rights and licenses granted to Licensee under this Agreement, and (ii) Licensed Software will operate materially in accordance with its specifications. + +Except as set forth above, the Licensed Software is licensed to Licensee "as is" and Licensee’s exclusive remedy and The Licensor’s entire liability for errors in the Licensed Software shall be limited, at The Licensor’s option, to correction of the error, replacement of the Licensed Software or return of the applicable fees paid for the defective Licensed Software for the time period during which the License is not able to utilize the Licensed Software under the terms of this Agreement. + +TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSOR ON BEHALF OF ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL OTHER WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE LICENSOR DOES NOT WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE’S REQUIREMENTS OR THAT IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF WILL BE UNINTERRUPTED. + +## 7. LIMITATION OF LIABILITY + +EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOSS OF PROFIT, LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. + +EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL EITHER PARTY’S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT EXCEED THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE LICENSOR BY LICENSEE DURING THE DEVELOPMENT LICENSE TERM DURING WHICH THE EVENT RESULTING IN SUCH LIABILITY OCCURRED. + +THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE RISKS UNDER THIS AGREEMENT BETWEEN THE LICENSOR AND LICENSEE AND THE PARTIES HAVE RELIED UPON THE LIMITATIONS SET FORTH HEREIN IN DETERMINING WHETHER TO ENTER INTO THIS AGREEMENT. + +NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THIS AGREEMENT, LICENSEE SHALL ALWAYS BE LIABLE TO PAY THE APPLICABLE LICENSE FEES CORRESPONDING TO ITS ACTUAL USE OF LICENSED SOFTWARE. + +## 8. SUPPORT, UPDATES AND ONLINE SERVICES + +Upon due payment of the agreed License Fees the Licensee will be eligible to receive Support and Updates and to use the Online Services during the agreed Development License Term or other agreed fixed time period. Support is provided according to agreed support level and subject to applicable requirements and restrictions, as specified in the Support Terms. + +Unless otherwise decided by The Licensor at its free and absolute discretion, Upgrades will not be included in the Support but may be available subject to additional fees. + +From time to time The Licensor may change the Support Terms, provided that during the respective ongoing Support period the level of Support may not be reduced without the consent of the Licensee. + +Unless otherwise agreed, The Licensor shall not be responsible for providing any service or support to Customers. + +## 9. CONFIDENTIALITY + +Each Party acknowledges that during the Agreement Term each Party may receive information about the other Party's business, business methods, business plans, customers, business relations, technology, and other information, including the terms of this Agreement, that is confidential and of great value to the other Party, and the value of which would be significantly reduced if disclosed to third parties (“Confidential Informationâ€). Accordingly, when a Party (the “Receiving Partyâ€) receives Confidential Information from the other Party (the “Disclosing Partyâ€), the Receiving Party shall only disclose such information to employees and Contractors on a need to know basis, and shall cause its employees and employees of its Affiliates to: (i) maintain any and all Confidential Information in confidence; (ii) not disclose the Confidential Information to a third party without the Disclosing Party's prior written approval; and (iii) not, directly or indirectly, use the Confidential Information for any purpose other than for exercising its rights and fulfilling its responsibilities pursuant to this Agreement. Each Party shall take reasonable measures to protect the Confidential Information of the other Party, which measures shall not be less than the measures taken by such Party to protect its own confidential and proprietary information. + +Obligation of confidentiality shall not apply to information that (i) is or becomes generally known to the public through no act or omission of the Receiving Party; (ii) was in the Receiving Party's lawful possession prior to the disclosure hereunder and was not subject to limitations on disclosure or use; (iii) is developed independently by employees or Contractors of the Receiving Party or other persons working for the Receiving Party who have not had access to the Confidential Information of the Disclosing Party, as proven by the written records of the Receiving Party; (iv) is lawfully disclosed to the Receiving Party without restrictions, by a third party not under an obligation of confidentiality; or (v) the Receiving Party is legally compelled to disclose, in which case the Receiving Party shall notify the Disclosing Party of such compelled disclosure and assert the privileged and confidential nature of the information and cooperate fully with the Disclosing Party to limit the scope of disclosure and the dissemination of disclosed Confidential Information to the minimum extent necessary. + +The obligations under this Section 9 shall continue to remain in force for a period of five (5) years after the last disclosure, and, with respect to trade secrets, for so long as such trade secrets are protected under applicable trade secret laws. + +## 10. FEES, DELIVERY AND PAYMENT + +10.1. License Fees + +License Fees are described in The Licensor’s standard price list, quote or Purchase Order confirmation. + +Unless otherwise expressly provided in this Agreement, the License Fees shall not be refunded or claimed as a credit in any event or for any reason whatsoever. + +10.2. Ordering Licenses + +Licensee may purchase Development Licenses, Distribution Licenses pursuant to agreed pricing terms or, if no specific pricing terms have been agreed upon, at The Licensor's standard pricing terms applicable at the time of purchase. + +Unless expressly otherwise agreed, any price or other term quoted to the Licensee or specified herein shall only be valid for the thirty (30) days from the effective date of this Agreement, or the date of the quote, as applicable. + +Licensee shall submit all purchase orders for Development Licenses and Distribution Licenses to The Licensor by email or any other method acceptable to The Licensor (each such order is referred to herein as a “Purchase Orderâ€) for confirmation, whereupon the Purchase Order shall become binding between the Parties. + +Licensee acknowledges and agrees that all Purchase Orders for Licensed Software the Licensee makes during the Agreement Term shall be governed exclusively under the terms of this Agreement. + +10.3. Distribution License Packs + +Unless otherwise agreed, Distribution Licenses shall be purchased by way of Distribution License Packs. + +Upon due payment of the ordered Distribution License Pack(s), the Licensee will have an account of Distribution Licenses available for distributing the Redistributables in accordance with this Agreement. + +Each time Licensee distributes a copy of Redistributables, then one Distribution License is used, and Licensee’s account of available Distribution Licenses is decreased accordingly. + +Licensee may distribute copies of the Redistributables so long as Licensee has Distribution Licenses remaining on its account. + +10.4. Payment Terms + +License Fees and any other charges under this Agreement shall be paid by Licensee no later than thirty (30) days from the date of the applicable invoice from The Licensor. + +The Licensor will submit an invoice to Licensee after the date of this Agreement and/or after The Licensor receives a Purchase Order from Licensee. + +A late payment charge of the lower of (a) one percent per month; or (b) the interest rate stipulated by applicable law, shall be charged on any unpaid balances that remain past due and which have not been disputed by the Licensee in good faith. + +10.5. Taxes + +All License Fees and other charges payable hereunder are gross amounts but exclusive of any value added tax, use tax, sales tax, withholding tax and other taxes, duties or tariffs (“Taxesâ€) levied directly for the sale, delivery or use of Licensed Software hereunder pursuant to any applicable law. Such applicable Taxes shall be paid by Licensee to The Licensor, or, where applicable, in lieu of payment of such Taxes to The Licensor, Licensee shall provide an exemption certificate to The Licensor and any applicable authority. + +## 11. RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS + +11.1. Licensee’s Record-keeping + +Licensee shall at all times during the Agreement Term and for a period of two (2) years thereafter maintain Licensee’s Records in an accurate and up-to-date form. Licensee’s Records shall be adequate to reasonably enable The Licensor to determine Licensee’s compliance with the provisions of this Agreement. The records shall conform to general good accounting practices. + +Licensee shall, within thirty (30) days from receiving The Licensor’s request to that effect, deliver to The Licensor a report based on Licensee’s Records, such report to contain information, in sufficient detail, on (i) number and identity of users working with Licensed Software or Open Source Djongo, (ii) copies of Redistributables distributed by Licensee during the most recent calendar quarter and/or any other term specified by The Licensor, and (iii) any other information pertaining to Licensee’s compliance with the terms of this Agreement (like e.g. information on products and/or projects relating to use of Distribution Licenses), as The Licensor may reasonably require from time to time. + +11.2. The Licensor’s Audit Rights + +The Licensor or an independent auditor acting on behalf of The Licensor’s, may, upon at least thirty (30) days’ prior written notice and at its expense, audit Licensee with respect to the Licensee’s use of the Licensed Software, but not more frequently than once during each 6-month period. Such audit may be conducted by mail, electronic means or through an in-person visit to Licensee’s place of business. Any possible in-person audit shall be conducted during regular business hours at Licensee's facilities and shall not unreasonably interfere with Licensee's business activities and shall be limited in scope to verify Licensee’s compliance with the terms of this Agreement. The Licensor or the independent auditor acting on behalf of The Licensor shall be entitled to inspect Licensee’s Records and conduct necessary interviews of Licensee’s relevant employees and Contractors. All such Licensee’s Records and use thereof shall be subject to an obligation of confidentiality under this Agreement. + +If an audit reveals that Licensee is using the Licensed Software beyond scope of the licenses Licensee has paid for, Licensee shall pay to The Licensor any amounts owed for such unauthorized use within 30 days from receipt of the corresponding invoice from The Licensor. + +In addition, in the event the audit reveals a material violation of the terms of this Agreement (without limitation, either (i) underpayment of more than 10 % of License Fees or 10,000 euros (whichever is more) or (ii) distribution of products, which include or result from Prohibited Combination, shall be deemed a material violation for purposes of this section), then the Licensee shall pay The Licensor's reasonable cost of conducting such audit. + +## 12. TERM AND TERMINATION + +12.1. Agreement Term + +This Agreement shall enter into force upon due acceptance by both Parties and remain in force until terminated pursuant to the terms of this Section 12 (“Agreement Termâ€). + +12.2. Termination for breach and suspension of rights + +Either Party shall have the right to terminate this Agreement upon thirty (30) days prior written notice if the other Party commits a material breach of any obligation of this Agreement and fails to remedy such breach within such notice period. + +Instead of termination, The Licensor shall have the right to suspend or withhold grants of all rights to the Licensed Software hereunder, including but not limited to the Development Licenses, Distribution License, and Support, should Licensee fail to make payment in timely fashion or otherwise violates or is reasonably suspected to violate its obligations or terms of this Agreement, and where such violation or breach is not cured within ten (10) business days following The Licensor’s written notice thereof. + +12.3. Termination for insolvency + +Either Party shall have the right to terminate this Agreement immediately upon written notice in the event that the other Party becomes insolvent, files for any form of bankruptcy, makes any assignment for the benefit of creditors, has a receiver, administrative receiver or officer appointed over the whole or a substantial part of its assets, ceases to conduct business, or an act equivalent to any of the above occurs under the laws of the jurisdiction of the other Party. + +12.4. Parties´ Rights and Duties upon Termination + +Upon expiry or termination of the Agreement, Licensee shall cease and shall cause all Designated Users (including those of its Affiliates’ and Contractors’) to cease using the Licensed Software under this Agreement. For clarity, a Development License of a Designated User, and all rights relating thereto, shall always terminate at the expiry of the respective Development License Term, even if the Agreement continues to remain in force. + +Upon such termination the Licensee shall destroy or return to The Licensor all copies of the Licensed Software and all related materials and will certify the same by Licensee’s duly authorized officer to The Licensor upon its request, provided however that Licensee may retain and exploit such copies of the Licensed Software as it may reasonably require in providing continued support to Customers. + +Except when this Agreement is terminated by The Licensor due to Licensee’s material breach as set forth in Section 12.2, the Licensee may continue distribution of Applications under the terms of this Agreement despite the termination of this Agreement. In such event the terms hereof will continue to be applicable and govern any such distribution of Applications beyond the expiry or termination of this Agreement. In case of termination by The Licensor due to Licensee’s material breach, Licensee must cease any distribution of Applications at the date of termination of this Agreement. + +Expiry or termination of this Agreement for any reason whatsoever shall not relieve Licensee of its obligation to pay any License Fees accrued or payable to The Licensor prior to the effective date of termination, and Licensee pay to The Licensor all such fees within 30 days from the effective date of termination of this Agreement. + +Termination of this Agreement shall not affect any rights of Customers to continue use of Applications (and therein incorporated Redistributables). + +12.5. Extension of Rights under Special Circumstances + +In the event of The Licensor choosing not to renew the Development License(s), as set forth in Section 3.1 and 3.5 respectively, and where such decision of non-renewal is not due to any ongoing breach or alleged breach (as reasonably determined by The Licensor) by Licensee of the terms of this Agreement or any applicable license terms of Open Source Djongo, then all valid and affected Development Licenses possessed by the Licensee at such date shall be extended to be valid in perpetuity under the terms of this Agreement and Licensee is entitled to purchase additional licenses as set forth in Section 10.2. + +In the event The Licensor is declared bankrupt under a final, non-cancellable decision by relevant court of law, and this Agreement is not, at the date of expiry of the Development License(s), assigned to party, who has assumed The Licensor’s position as a legitimate licensor of Licensed Software under this Agreement, then all valid Development Licenses possessed by the Licensee at such date of expiry, and which the Licensee has not notified for expiry, shall be extended to be valid in perpetuity under the terms of this Agreement. + +For clarity, in case of an extension under this Section 12.5, any such extension shall not apply to The Licensor’s Support obligations, but Support shall be provided only up until the end of the respective fixed Development License Term regardless of the extension of relevant Development License, unless otherwise agreed between the Parties. + +## 13. GOVERNING LAW AND LEGAL VENUE + +In the event this Agreement is in the name of The Doableware, a Swedish Company, then: + +i. this Agreement shall be construed and interpreted in accordance with the laws of Sweden, excluding its choice of law provisions; + +ii. the United Nations Convention on Contracts for the International Sale of Goods will not apply to this Agreement; and + +iii. any disputes, controversy or claim arising out of or relating to this Agreement, or the breach, termination or validity thereof shall be finally settled by arbitration in accordance with the Arbitration Rules of International Chamber of Commerce. The arbitration tribunal shall consist of one (1), or if either Party so requires, of three (3), arbitrators. The award shall be final and binding and enforceable in any court of competent jurisdiction. The arbitration shall be held in Malmö, Sweden and the process shall be conducted in the English language. This Section shall not preclude parties from seeking provisional remedies in aid of arbitration from a court of appropriate jurisdiction. + +## 14. GENERAL PROVISIONS + +14.1. No Assignment + +Except in the case of a merger or sale of substantially all of its corporate assets, Licensee shall not be entitled to assign or transfer all or any of its rights, benefits and obligations under this Agreement without the prior written consent of The Licensor, which shall not be unreasonably withheld or delayed. The Licensor shall be entitled to freely assign or transfer any of its rights, benefits or obligations under this Agreement. + +14.2. No Third-Party Representations + +Licensee shall make no representations or warranties concerning the Licensed Software on behalf of The Licensor. Any representation or warranty Licensee makes or purports to make on The Licensor’s behalf shall be void as to The Licensor. + +14.3. Surviving Sections + +Any terms and conditions that by their nature or otherwise reasonably should survive termination of this Agreement shall so be deemed to survive. Such sections include especially the following: 1, 2, 6, 7, 9, 11, 12.4, 13 and 14. + +14.4. Entire Agreement + +This Agreement, the Appendices hereto, the License Certificate and any applicable quote and Purchase Order accepted by The Licensor constitute the complete agreement between the Parties and supersedes all prior or contemporaneous discussions, representations, and proposals, written or oral, with respect to the subject matters discussed herein. + +In the event of any conflict or inconsistency between this Agreement and any Purchase Order, the terms of this Agreement will prevail over the terms of the Purchase Order with respect to such conflict or inconsistency. + +Parties specifically acknowledge and agree that this Agreement prevails over any click-to-accept or similar agreements the Designated Users may need to accept online upon download of the Licensed Software, as may be required by The Licensor’s applicable processes relating to Licensed Software. + +14.5. Modifications + +No modification of this Agreement shall be effective unless contained in a writing executed by an authorized representative of each Party. No term or condition contained in Licensee's Purchase Order (“Deviating Termsâ€) shall apply unless The Licensor has expressly agreed such Deviating Terms in writing. Unless and to the extent expressly agreed by The Licensor, any such Deviating Terms shall be deemed void and with no legal effect. For clarity, delivery of the Licensed Software following the receipt of the Purchase Order including Deviating Terms shall not constitute acceptance of such Deviating Terms. + +14.6. Force Majeure + +Except for the payment obligations hereunder, neither Party shall be liable to the other for any delay or non-performance of its obligations hereunder in the event and to the extent that such delay or non-performance is due to an event of act of God, terrorist attack or other similar unforeseeable catastrophic event that prevents either Party for fulfilling its obligations under this Agreement and which such Party cannot avoid or circumvent (“Force Majeure Eventâ€). If the Force Majeure Event results in a delay or non-performance of a Party for a period of three (3) months or longer, then either Party shall have the right to terminate this Agreement with immediate effect without any liability (except for the obligations of payment arising prior to the event of Force Majeure) towards the other Party. + +14.7. Notices + +Any notice given by one Party to the other shall be deemed properly given and deemed received if specifically acknowledged by the receiving Party in writing or when successfully delivered to the recipient by hand, fax, or special courier during normal business hours on a business day to the addresses specified for each Party on the signature page. Each communication and document made or delivered by one Party to the other Party pursuant to this Agreement shall be in the English language. + +14.8. Export Control + +Licensee acknowledges that the Redistributables, as incorporated in Applications, may be subject to export control restrictions under the applicable laws of respective countries. Licensee shall fully comply with all applicable export license restrictions and requirements as well as with all laws and regulations relating to the Redistributables and exercise of licenses hereunder and shall procure all necessary governmental authorizations, including without limitation, all necessary licenses, approvals, permissions or consents, where necessary for the re-exportation of the Redistributables, and Applications. + +14.9. No Implied License + +There are no implied licenses or other implied rights granted under this Agreement, and all rights, save for those expressly granted hereunder, shall remain with The Licensor and its licensors. In addition, no licenses or immunities are granted to the combination of the Licensed Software with any other software or hardware not delivered by The Licensor under this Agreement. + +14.10. Attorney Fees + +The prevailing Party in any action to enforce this Agreement shall be entitled to recover its attorney’s fees and costs in connection with such action, as to be ordered by the relevant dispute resolution body. + +14.11. Privacy + +Licensee acknowledges and agrees that for the purpose of this Agreement, The Licensor may collect, use, transfer and disclose personal data pertaining to Designated Users as well as any other employees and directors of the Licensee and its Contractors relevant for carrying out the intent of this Agreement. Such personal data will be primarily collected from the relevant individuals but may be collected also from Licensee (e.g. in the course of Licensee’s reporting obligations). The Parties acknowledge that as The Licensor determines the purpose and means for such collection and processing of the applicable personal data, The Licensor shall be regarded as the Data Controller under the applicable Data Protection Legislation. The Licensor shall process any such personal data in accordance with its privacy and security policies and practices, which will comply with all applicable requirements of the Data Protection Legislation. + +14.12. Severability + +If any provision of this Agreement shall be adjudged by any court of competent jurisdiction to be unenforceable or invalid, that provision shall be limited or eliminated to the minimum extent necessary so that this Agreement shall otherwise remain in full force and effect and enforceable. + +14.13. Marketing Rights + +Parties have agreed upon no Marketing rights. + + + diff --git a/docs/markdown/legal/terms-and-conditions.md b/docs/markdown/legal/terms-and-conditions.md new file mode 100644 index 00000000..522f44d5 --- /dev/null +++ b/docs/markdown/legal/terms-and-conditions.md @@ -0,0 +1,235 @@ +--- +title: Terms and Conditions +permalink: /legal/djongocs/terms-and-conditions +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 +--- + +## 1. AGREEMENT TO TERMS + +These Terms and Conditions constitute a legally binding agreement made between you, whether personally or on behalf of an entity (“youâ€) and Doableware ("Company", “weâ€, “usâ€, or “ourâ€), concerning your access to and use of the https://www.djongomapper.com website as well as any other media form, media channel, mobile website or mobile application related, linked, or otherwise connected thereto (collectively, the “Siteâ€). We are registered in Sweden and have our registered office at Bertrandsgatan 2B, Malmö, skane 21214. Our VAT number is SE850602255001. You agree that by accessing the Site, you have read, understood, and agree to be bound by all of these Terms and Conditions. IF YOU DO NOT AGREE WITH ALL OF THESE TERMS AND CONDITIONS, THEN YOU ARE EXPRESSLY PROHIBITED FROM USING THE SITE AND YOU MUST DISCONTINUE USE IMMEDIATELY. + +Supplemental terms and conditions or documents that may be posted on the Site from time to time are hereby expressly incorporated herein by reference. We reserve the right, in our sole discretion, to make changes or modifications to these Terms and Conditions from time to time. We will alert you about any changes by updating the “Last updated†date of these Terms and Conditions, and you waive any right to receive specific notice of each such change. Please ensure that you check the applicable Terms every time you use our Site so that you understand which Terms apply. You will be subject to, and will be deemed to have been made aware of and to have accepted, the changes in any revised Terms and Conditions by your continued use of the Site after the date such revised Terms and Conditions are posted. + +The information provided on the Site is not intended for distribution to or use by any person or entity in any jurisdiction or country where such distribution or use would be contrary to law or regulation or which would subject us to any registration requirement within such jurisdiction or country. Accordingly, those persons who choose to access the Site from other locations do so on their own initiative and are solely responsible for compliance with local laws, if and to the extent local laws are applicable. + +The Site is not tailored to comply with industry-specific regulations (Health Insurance Portability and Accountability Act (HIPAA), Federal Information Security Management Act (FISMA), etc.), so if your interactions would be subjected to such laws, you may not use this Site. You may not use the Site in a way that would violate the Gramm-Leach-Bliley Act (GLBA). + +All users who are minors in the jurisdiction in which they reside (generally under the age of 18) must have the permission of, and be directly supervised by, their parent or guardian to use the Site. If you are a minor, you must have your parent or guardian read and agree to these Terms and Conditions prior to you using the Site. + + +## 2. INTELLECTUAL PROPERTY RIGHTS + +Unless otherwise indicated, the Site is our proprietary property and all source code, databases, functionality, software, website designs, audio, video, text, photographs, and graphics on the Site (collectively, the “Contentâ€) and the trademarks, service marks, and logos contained therein (the “Marksâ€) are owned or controlled by us or licensed to us, and are protected by copyright and trademark laws and various other intellectual property rights and unfair competition laws of the United States, international copyright laws, and international conventions. The Content and the Marks are provided on the Site “AS IS†for your information and personal use only. Except as expressly provided in these Terms and Conditions, no part of the Site and no Content or Marks may be copied, reproduced, aggregated, republished, uploaded, posted, publicly displayed, encoded, translated, transmitted, distributed, sold, licensed, or otherwise exploited for any commercial purpose whatsoever, without our express prior written permission. + +Provided that you are eligible to use the Site, you are granted a limited license to access and use the Site and to download or print a copy of any portion of the Content to which you have properly gained access solely for your personal, non-commercial use. We reserve all rights not expressly granted to you in and to the Site, the Content and the Marks. + + +## 3. USER REPRESENTATIONS + +By using the Site, you represent and warrant that: (1) all registration information you submit will be true, accurate, current, and complete; (2) you will maintain the accuracy of such information and promptly update such registration information as necessary; (3) you have the legal capacity and you agree to comply with these Terms and Conditions; (4) you are not a minor in the jurisdiction in which you reside, or if a minor, you have received parental permission to use the Site; (5) you will not access the Site through automated or non-human means, whether through a bot, script or otherwise; (6) you will not use the Site for any illegal or unauthorized purpose; and (7) your use of the Site will not violate any applicable law or regulation. + +If you provide any information that is untrue, inaccurate, not current, or incomplete, we have the right to suspend or terminate your account and refuse any and all current or future use of the Site (or any portion thereof). + + +## 4. USER REGISTRATION + +You may be required to register with the Site. You agree to keep your password confidential and will be responsible for all use of your account and password. We reserve the right to remove, reclaim, or change a username you select if we determine, in our sole discretion, that such username is inappropriate, obscene, or otherwise objectionable. + + +## 5. FEES AND PAYMENT + +You may be required to purchase or pay a fee to access some of our services. You agree to provide current, complete, and accurate purchase and account information for all purchases made via the Site. You further agree to promptly update account and payment information, including email address, payment method, and payment card expiration date, so that we can complete your transactions and contact you as needed. We bill you through an online billing account for purchases made via the Site. Sales tax will be added to the price of purchases as deemed required by us. We may change prices at any time. All payments shall be in U.S. dollars. + +You agree to pay all charges or fees at the prices then in effect for your purchases, and you authorize us to charge your chosen payment provider for any such amounts upon making your purchase. If your purchase is subject to recurring charges, then you consent to our charging your payment method on a recurring basis without requiring your prior approval for each recurring charge, until you notify us of your cancellation. + +We reserve the right to correct any errors or mistakes in pricing, even if we have already requested or received payment. We also reserve the right to refuse any order placed through the Site. + + +## 6. CANCELLATION + +All purchases are non-refundable. You can cancel your subscription at any time by logging into your account or contacting us using the contact information provided below. Your cancellation will take effect at the end of the current paid term. + +If you are unsatisfied with our services, please email us at supportATdoablewareDOTcom + + +## 7. SOFTWARE + +We may include software for use in connection with our services. If such software is accompanied by an end user license agreement (“EULAâ€), the terms of the EULA will govern your use of the software. If such software is not accompanied by a EULA, then we grant to you a non-exclusive, revocable, personal, and non-transferable license to use such software solely in connection with our services and in accordance with these Terms and Conditions. Any Software and any related documentation is provided “as is†without warranty of any kind, either express or implied, including, without limitation, the implied warranties of merchantability, fitness for a particular purpose, or non-infringement. You accept any and all risk arising out of use or performance of any Software. You may not reproduce or redistribute any software except in accordance with the EULA or these Terms and Conditions. + + +## 8. PROHIBITED ACTIVITIES + +You may not access or use the Site for any purpose other than that for which we make the Site available. The Site may not be used in connection with any commercial endeavors except those that are specifically endorsed or approved by us. + +As a user of the Site, you agree not to: +Systematically retrieve data or other content from the Site to create or compile, directly or indirectly, a collection, compilation, database, or directory without written permission from us. +Trick, defraud, or mislead us and other users, especially in any attempt to learn sensitive account information such as user passwords. +Circumvent, disable, or otherwise interfere with security-related features of the Site, including features that prevent or restrict the use or copying of any Content or enforce limitations on the use of the Site and/or the Content contained therein. +Disparage, tarnish, or otherwise harm, in our opinion, us and/or the Site. +Use any information obtained from the Site in order to harass, abuse, or harm another person. +Make improper use of our support services or submit false reports of abuse or misconduct. +Use the Site in a manner inconsistent with any applicable laws or regulations. +Engage in unauthorized framing of or linking to the Site. +Upload or transmit (or attempt to upload or to transmit) viruses, Trojan horses, or other material, including excessive use of capital letters and spamming (continuous posting of repetitive text), that interferes with any party’s uninterrupted use and enjoyment of the Site or modifies, impairs, disrupts, alters, or interferes with the use, features, functions, operation, or maintenance of the Site. +Engage in any automated use of the system, such as using scripts to send comments or messages, or using any data mining, robots, or similar data gathering and extraction tools. +Delete the copyright or other proprietary rights notice from any Content. +Attempt to impersonate another user or person or use the username of another user. +Upload or transmit (or attempt to upload or to transmit) any material that acts as a passive or active information collection or transmission mechanism, including without limitation, clear graphics interchange formats (“gifsâ€), 1×1 pixels, web bugs, cookies, or other similar devices (sometimes referred to as “spyware†or “passive collection mechanisms†or “pcmsâ€). +Interfere with, disrupt, or create an undue burden on the Site or the networks or services connected to the Site. +Harass, annoy, intimidate, or threaten any of our employees or agents engaged in providing any portion of the Site to you. +Attempt to bypass any measures of the Site designed to prevent or restrict access to the Site, or any portion of the Site. +Copy or adapt the Site’s software, including but not limited to Flash, PHP, HTML, JavaScript, or other code. +Except as permitted by applicable law, decipher, decompile, disassemble, or reverse engineer any of the software comprising or in any way making up a part of the Site. +Except as may be the result of standard search engine or Internet browser usage, use, launch, develop, or distribute any automated system, including without limitation, any spider, robot, cheat utility, scraper, or offline reader that accesses the Site, or using or launching any unauthorized script or other software. +Use a buying agent or purchasing agent to make purchases on the Site. +Make any unauthorized use of the Site, including collecting usernames and/or email addresses of users by electronic or other means for the purpose of sending unsolicited email, or creating user accounts by automated means or under false pretenses. +Use the Site as part of any effort to compete with us or otherwise use the Site and/or the Content for any revenue-generating endeavor or commercial enterprise. + + +## 9. USER GENERATED CONTRIBUTIONS + +The Site may invite you to chat, contribute to, or participate in blogs, message boards, online forums, and other functionality, and may provide you with the opportunity to create, submit, post, display, transmit, perform, publish, distribute, or broadcast content and materials to us or on the Site, including but not limited to text, writings, video, audio, photographs, graphics, comments, suggestions, or personal information or other material (collectively, "Contributions"). Contributions may be viewable by other users of the Site and through third-party websites. As such, any Contributions you transmit may be treated as non-confidential and non-proprietary. When you create or make available any Contributions, you thereby represent and warrant that: +The creation, distribution, transmission, public display, or performance, and the accessing, downloading, or copying of your Contributions do not and will not infringe the proprietary rights, including but not limited to the copyright, patent, trademark, trade secret, or moral rights of any third party. +You are the creator and owner of or have the necessary licenses, rights, consents, releases, and permissions to use and to authorize us, the Site, and other users of the Site to use your Contributions in any manner contemplated by the Site and these Terms and Conditions. +You have the written consent, release, and/or permission of each and every identifiable individual person in your Contributions to use the name or likeness of each and every such identifiable individual person to enable inclusion and use of your Contributions in any manner contemplated by the Site and these Terms and Conditions. +Your Contributions are not false, inaccurate, or misleading. +Your Contributions are not unsolicited or unauthorized advertising, promotional materials, pyramid schemes, chain letters, spam, mass mailings, or other forms of solicitation. +Your Contributions are not obscene, lewd, lascivious, filthy, violent, harassing, libelous, slanderous, or otherwise objectionable (as determined by us). +Your Contributions do not ridicule, mock, disparage, intimidate, or abuse anyone. +Your Contributions are not used to harass or threaten (in the legal sense of those terms) any other person and to promote violence against a specific person or class of people. +Your Contributions do not violate any applicable law, regulation, or rule. +Your Contributions do not violate the privacy or publicity rights of any third party. +Your Contributions do not violate any applicable law concerning child pornography, or otherwise intended to protect the health or well-being of minors. +Your Contributions do not include any offensive comments that are connected to race, national origin, gender, sexual preference, or physical handicap. +Your Contributions do not otherwise violate, or link to material that violates, any provision of these Terms and Conditions, or any applicable law or regulation. +Any use of the Site in violation of the foregoing violates these Terms and Conditions and may result in, among other things, termination or suspension of your rights to use the Site. + + +## 10. CONTRIBUTION LICENSE + +By posting your Contributions to any part of the Site, you automatically grant, and you represent and warrant that you have the right to grant, to us an unrestricted, unlimited, irrevocable, perpetual, non-exclusive, transferable, royalty-free, fully-paid, worldwide right, and license to host, use, copy, reproduce, disclose, sell, resell, publish, broadcast, retitle, archive, store, cache, publicly perform, publicly display, reformat, translate, transmit, excerpt (in whole or in part), and distribute such Contributions (including, without limitation, your image and voice) for any purpose, commercial, advertising, or otherwise, and to prepare derivative works of, or incorporate into other works, such Contributions, and grant and authorize sublicenses of the foregoing. The use and distribution may occur in any media formats and through any media channels. + +This license will apply to any form, media, or technology now known or hereafter developed, and includes our use of your name, company name, and franchise name, as applicable, and any of the trademarks, service marks, trade names, logos, and personal and commercial images you provide. You waive all moral rights in your Contributions, and you warrant that moral rights have not otherwise been asserted in your Contributions. + +We do not assert any ownership over your Contributions. You retain full ownership of all of your Contributions and any intellectual property rights or other proprietary rights associated with your Contributions. We are not liable for any statements or representations in your Contributions provided by you in any area on the Site. You are solely responsible for your Contributions to the Site and you expressly agree to exonerate us from any and all responsibility and to refrain from any legal action against us regarding your Contributions. + +We have the right, in our sole and absolute discretion, (1) to edit, redact, or otherwise change any Contributions; (2) to re-categorize any Contributions to place them in more appropriate locations on the Site; and (3) to pre-screen or delete any Contributions at any time and for any reason, without notice. We have no obligation to monitor your Contributions. + + +## 11. GUIDELINES FOR REVIEWS + +We may provide you areas on the Site to leave reviews or ratings. When posting a review, you must comply with the following criteria: (1) you should have firsthand experience with the person/entity being reviewed; (2) your reviews should not contain offensive profanity, or abusive, racist, offensive, or hate language; (3) your reviews should not contain discriminatory references based on religion, race, gender, national origin, age, marital status, sexual orientation, or disability; (4) your reviews should not contain references to illegal activity; (5) you should not be affiliated with competitors if posting negative reviews; (6) you should not make any conclusions as to the legality of conduct; (7) you may not post any false or misleading statements; and (8) you may not organize a campaign encouraging others to post reviews, whether positive or negative. + +We may accept, reject, or remove reviews in our sole discretion. We have absolutely no obligation to screen reviews or to delete reviews, even if anyone considers reviews objectionable or inaccurate. Reviews are not endorsed by us, and do not necessarily represent our opinions or the views of any of our affiliates or partners. We do not assume liability for any review or for any claims, liabilities, or losses resulting from any review. By posting a review, you hereby grant to us a perpetual, non-exclusive, worldwide, royalty-free, fully-paid, assignable, and sublicensable right and license to reproduce, modify, translate, transmit by any means, display, perform, and/or distribute all content relating to reviews. + + +## 12. SUBMISSIONS + +You acknowledge and agree that any questions, comments, suggestions, ideas, feedback, or other information regarding the Site ("Submissions") provided by you to us are non-confidential and shall become our sole property. We shall own exclusive rights, including all intellectual property rights, and shall be entitled to the unrestricted use and dissemination of these Submissions for any lawful purpose, commercial or otherwise, without acknowledgment or compensation to you. You hereby waive all moral rights to any such Submissions, and you hereby warrant that any such Submissions are original with you or that you have the right to submit such Submissions. You agree there shall be no recourse against us for any alleged or actual infringement or misappropriation of any proprietary right in your Submissions. + + +## 13. THIRD-PARTY WEBSITES AND CONTENT + +The Site may contain (or you may be sent via the Site) links to other websites ("Third-Party Websites") as well as articles, photographs, text, graphics, pictures, designs, music, sound, video, information, applications, software, and other content or items belonging to or originating from third parties ("Third-Party Content"). Such Third-Party Websites and Third-Party Content are not investigated, monitored, or checked for accuracy, appropriateness, or completeness by us, and we are not responsible for any Third-Party Websites accessed through the Site or any Third-Party Content posted on, available through, or installed from the Site, including the content, accuracy, offensiveness, opinions, reliability, privacy practices, or other policies of or contained in the Third-Party Websites or the Third-Party Content. Inclusion of, linking to, or permitting the use or installation of any Third-Party Websites or any Third-Party Content does not imply approval or endorsement thereof by us. If you decide to leave the Site and access the Third-Party Websites or to use or install any Third-Party Content, you do so at your own risk, and you should be aware these Terms and Conditions no longer govern. You should review the applicable terms and policies, including privacy and data gathering practices, of any website to which you navigate from the Site or relating to any applications you use or install from the Site. Any purchases you make through Third-Party Websites will be through other websites and from other companies, and we take no responsibility whatsoever in relation to such purchases which are exclusively between you and the applicable third party. You agree and acknowledge that we do not endorse the products or services offered on Third-Party Websites and you shall hold us harmless from any harm caused by your purchase of such products or services. Additionally, you shall hold us harmless from any losses sustained by you or harm caused to you relating to or resulting in any way from any Third-Party Content or any contact with Third-Party Websites. + + +## 14. U.S. GOVERNMENT RIGHTS + +Our services are “commercial items†as defined in Federal Acquisition Regulation (“FARâ€) 2.101. If our services are acquired by or on behalf of any agency not within the Department of Defense (“DODâ€), our services are subject to the terms of these Terms and Conditions in accordance with FAR 12.212 (for computer software) and FAR 12.211 (for technical data). If our services are acquired by or on behalf of any agency within the Department of Defense, our services are subject to the terms of these Terms and Conditions in accordance with Defense Federal Acquisition Regulation (“DFARSâ€) 227.7202-3. In addition, DFARS 252.227-7015 applies to technical data acquired by the DOD. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFARS, or other clause or provision that addresses government rights in computer software or technical data under these Terms and Conditions. + + +## 15. SITE MANAGEMENT + +We reserve the right, but not the obligation, to: (1) monitor the Site for violations of these Terms and Conditions; (2) take appropriate legal action against anyone who, in our sole discretion, violates the law or these Terms and Conditions, including without limitation, reporting such user to law enforcement authorities; (3) in our sole discretion and without limitation, refuse, restrict access to, limit the availability of, or disable (to the extent technologically feasible) any of your Contributions or any portion thereof; (4) in our sole discretion and without limitation, notice, or liability, to remove from the Site or otherwise disable all files and content that are excessive in size or are in any way burdensome to our systems; and (5) otherwise manage the Site in a manner designed to protect our rights and property and to facilitate the proper functioning of the Site. + + +## 16. PRIVACY POLICY + +We care about data privacy and security. Please review our Privacy Policy: https://www.djongomapper.com/legal/djongocs/privacy-policy/. By using the Site, you agree to be bound by our Privacy Policy, which is incorporated into these Terms and Conditions. Please be advised the Site is hosted in the United States. If you access the Site from any other region of the world with laws or other requirements governing personal data collection, use, or disclosure that differ from applicable laws in the United States, then through your continued use of the Site, you are transferring your data to the United States, and you agree to have your data transferred to and processed in the United States. + + +## 17. TERM AND TERMINATION + +These Terms and Conditions shall remain in full force and effect while you use the Site. WITHOUT LIMITING ANY OTHER PROVISION OF THESE TERMS AND CONDITIONS, WE RESERVE THE RIGHT TO, IN OUR SOLE DISCRETION AND WITHOUT NOTICE OR LIABILITY, DENY ACCESS TO AND USE OF THE SITE (INCLUDING BLOCKING CERTAIN IP ADDRESSES), TO ANY PERSON FOR ANY REASON OR FOR NO REASON, INCLUDING WITHOUT LIMITATION FOR BREACH OF ANY REPRESENTATION, WARRANTY, OR COVENANT CONTAINED IN THESE TERMS AND CONDITIONS OR OF ANY APPLICABLE LAW OR REGULATION. WE MAY TERMINATE YOUR USE OR PARTICIPATION IN THE SITE OR DELETE YOUR ACCOUNT AND ANY CONTENT OR INFORMATION THAT YOU POSTED AT ANY TIME, WITHOUT WARNING, IN OUR SOLE DISCRETION. + +If we terminate or suspend your account for any reason, you are prohibited from registering and creating a new account under your name, a fake or borrowed name, or the name of any third party, even if you may be acting on behalf of the third party. In addition to terminating or suspending your account, we reserve the right to take appropriate legal action, including without limitation pursuing civil, criminal, and injunctive redress. + + +## 18. MODIFICATIONS AND INTERRUPTIONS + +We reserve the right to change, modify, or remove the contents of the Site at any time or for any reason at our sole discretion without notice. However, we have no obligation to update any information on our Site. We also reserve the right to modify or discontinue all or part of the Site without notice at any time. We will not be liable to you or any third party for any modification, price change, suspension, or discontinuance of the Site. + +We cannot guarantee the Site will be available at all times. We may experience hardware, software, or other problems or need to perform maintenance related to the Site, resulting in interruptions, delays, or errors. We reserve the right to change, revise, update, suspend, discontinue, or otherwise modify the Site at any time or for any reason without notice to you. You agree that we have no liability whatsoever for any loss, damage, or inconvenience caused by your inability to access or use the Site during any downtime or discontinuance of the Site. Nothing in these Terms and Conditions will be construed to obligate us to maintain and support the Site or to supply any corrections, updates, or releases in connection therewith. + + +## 19. GOVERNING LAW + +These conditions are governed by and interpreted following the laws of Sweden, and the use of the United Nations Convention of Contracts for the International Sale of Goods is expressly excluded. If your habitual residence is in the EU, and you are a consumer, you additionally possess the protection provided to you by obligatory provisions of the law of your country of residence. Doableware and yourself both agree to submit to the non-exclusive jurisdiction of the courts of Malmö, which means that you may make a claim to defend your consumer protection rights in regards to these Conditions of Use in Sweden, or in the EU country in which you reside. + + +## 20. DISPUTE RESOLUTION + +Informal Negotiations + +To expedite resolution and control the cost of any dispute, controversy, or claim related to these Terms and Conditions (each "Dispute" and collectively, the “Disputesâ€) brought by either you or us (individually, a “Party†and collectively, the “Partiesâ€), the Parties agree to first attempt to negotiate any Dispute (except those Disputes expressly provided below) informally for at least thirty (30) days before initiating arbitration. Such informal negotiations commence upon written notice from one Party to the other Party. + +Binding Arbitration + +Any dispute arising from the relationships between the Parties to this contract shall be determined by one arbitrator who will be chosen in accordance with the Arbitration and Internal Rules of the European Court of Arbitration being part of the European Centre of Arbitration having its seat in Strasbourg, and which are in force at the time the application for arbitration is filed, and of which adoption of this clause constitutes acceptance. The seat of arbitration shall be Malmö, Sweden. The language of the proceedings shall be English. Applicable rules of substantive law shall be the law of Sweden. + +Restrictions + +The Parties agree that any arbitration shall be limited to the Dispute between the Parties individually. To the full extent permitted by law, (a) no arbitration shall be joined with any other proceeding; (b) there is no right or authority for any Dispute to be arbitrated on a class-action basis or to utilize class action procedures; and (c) there is no right or authority for any Dispute to be brought in a purported representative capacity on behalf of the general public or any other persons. + +Exceptions to Informal Negotiations and Arbitration + +The Parties agree that the following Disputes are not subject to the above provisions concerning informal negotiations and binding arbitration: (a) any Disputes seeking to enforce or protect, or concerning the validity of, any of the intellectual property rights of a Party; (b) any Dispute related to, or arising from, allegations of theft, piracy, invasion of privacy, or unauthorized use; and (c) any claim for injunctive relief. If this provision is found to be illegal or unenforceable, then neither Party will elect to arbitrate any Dispute falling within that portion of this provision found to be illegal or unenforceable and such Dispute shall be decided by a court of competent jurisdiction within the courts listed for jurisdiction above, and the Parties agree to submit to the personal jurisdiction of that court. + + +## 21. CORRECTIONS + +There may be information on the Site that contains typographical errors, inaccuracies, or omissions, including descriptions, pricing, availability, and various other information. We reserve the right to correct any errors, inaccuracies, or omissions and to change or update the information on the Site at any time, without prior notice. + + +## 22. DISCLAIMER + +THE SITE IS PROVIDED ON AN AS-IS AND AS-AVAILABLE BASIS. YOU AGREE THAT YOUR USE OF THE SITE AND OUR SERVICES WILL BE AT YOUR SOLE RISK. TO THE FULLEST EXTENT PERMITTED BY LAW, WE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, IN CONNECTION WITH THE SITE AND YOUR USE THEREOF, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. WE MAKE NO WARRANTIES OR REPRESENTATIONS ABOUT THE ACCURACY OR COMPLETENESS OF THE SITE’S CONTENT OR THE CONTENT OF ANY WEBSITES LINKED TO THE SITE AND WE WILL ASSUME NO LIABILITY OR RESPONSIBILITY FOR ANY (1) ERRORS, MISTAKES, OR INACCURACIES OF CONTENT AND MATERIALS, (2) PERSONAL INJURY OR PROPERTY DAMAGE, OF ANY NATURE WHATSOEVER, RESULTING FROM YOUR ACCESS TO AND USE OF THE SITE, (3) ANY UNAUTHORIZED ACCESS TO OR USE OF OUR SECURE SERVERS AND/OR ANY AND ALL PERSONAL INFORMATION AND/OR FINANCIAL INFORMATION STORED THEREIN, (4) ANY INTERRUPTION OR CESSATION OF TRANSMISSION TO OR FROM THE SITE, (5) ANY BUGS, VIRUSES, TROJAN HORSES, OR THE LIKE WHICH MAY BE TRANSMITTED TO OR THROUGH THE SITE BY ANY THIRD PARTY, AND/OR (6) ANY ERRORS OR OMISSIONS IN ANY CONTENT AND MATERIALS OR FOR ANY LOSS OR DAMAGE OF ANY KIND INCURRED AS A RESULT OF THE USE OF ANY CONTENT POSTED, TRANSMITTED, OR OTHERWISE MADE AVAILABLE VIA THE SITE. WE DO NOT WARRANT, ENDORSE, GUARANTEE, OR ASSUME RESPONSIBILITY FOR ANY PRODUCT OR SERVICE ADVERTISED OR OFFERED BY A THIRD PARTY THROUGH THE SITE, ANY HYPERLINKED WEBSITE, OR ANY WEBSITE OR MOBILE APPLICATION FEATURED IN ANY BANNER OR OTHER ADVERTISING, AND WE WILL NOT BE A PARTY TO OR IN ANY WAY BE RESPONSIBLE FOR MONITORING ANY TRANSACTION BETWEEN YOU AND ANY THIRD-PARTY PROVIDERS OF PRODUCTS OR SERVICES. AS WITH THE PURCHASE OF A PRODUCT OR SERVICE THROUGH ANY MEDIUM OR IN ANY ENVIRONMENT, YOU SHOULD USE YOUR BEST JUDGMENT AND EXERCISE CAUTION WHERE APPROPRIATE. + + +## 23. LIMITATIONS OF LIABILITY + +IN NO EVENT WILL WE OR OUR DIRECTORS, EMPLOYEES, OR AGENTS BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, EXEMPLARY, INCIDENTAL, SPECIAL, OR PUNITIVE DAMAGES, INCLUDING LOST PROFIT, LOST REVENUE, LOSS OF DATA, OR OTHER DAMAGES ARISING FROM YOUR USE OF THE SITE, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. NOTWITHSTANDING ANYTHING TO THE CONTRARY CONTAINED HEREIN, OUR LIABILITY TO YOU FOR ANY CAUSE WHATSOEVER AND REGARDLESS OF THE FORM OF THE ACTION, WILL AT ALL TIMES BE LIMITED TO THE AMOUNT PAID, IF ANY, BY YOU TO US DURING THE ONE (1) MONTH PERIOD PRIOR TO ANY CAUSE OF ACTION ARISING. CERTAIN US STATE LAWS AND INTERNATIONAL LAWS DO NOT ALLOW LIMITATIONS ON IMPLIED WARRANTIES OR THE EXCLUSION OR LIMITATION OF CERTAIN DAMAGES. IF THESE LAWS APPLY TO YOU, SOME OR ALL OF THE ABOVE DISCLAIMERS OR LIMITATIONS MAY NOT APPLY TO YOU, AND YOU MAY HAVE ADDITIONAL RIGHTS. + + +## 24. INDEMNIFICATION + +You agree to defend, indemnify, and hold us harmless, including our subsidiaries, affiliates, and all of our respective officers, agents, partners, and employees, from and against any loss, damage, liability, claim, or demand, including reasonable attorneys’ fees and expenses, made by any third party due to or arising out of: (1) your Contributions; (2) use of the Site; (3) breach of these Terms and Conditions; (4) any breach of your representations and warranties set forth in these Terms and Conditions; (5) your violation of the rights of a third party, including but not limited to intellectual property rights; or (6) any overt harmful act toward any other user of the Site with whom you connected via the Site. Notwithstanding the foregoing, we reserve the right, at your expense, to assume the exclusive defense and control of any matter for which you are required to indemnify us, and you agree to cooperate, at your expense, with our defense of such claims. We will use reasonable efforts to notify you of any such claim, action, or proceeding which is subject to this indemnification upon becoming aware of it. + + +## 25. USER DATA + +We will maintain certain data that you transmit to the Site for the purpose of managing the performance of the Site, as well as data relating to your use of the Site. Although we perform regular routine backups of data, you are solely responsible for all data that you transmit or that relates to any activity you have undertaken using the Site. You agree that we shall have no liability to you for any loss or corruption of any such data, and you hereby waive any right of action against us arising from any such loss or corruption of such data. + + +## 26. ELECTRONIC COMMUNICATIONS, TRANSACTIONS, AND SIGNATURES + +Visiting the Site, sending us emails, and completing online forms constitute electronic communications. You consent to receive electronic communications, and you agree that all agreements, notices, disclosures, and other communications we provide to you electronically, via email and on the Site, satisfy any legal requirement that such communication be in writing. YOU HEREBY AGREE TO THE USE OF ELECTRONIC SIGNATURES, CONTRACTS, ORDERS, AND OTHER RECORDS, AND TO ELECTRONIC DELIVERY OF NOTICES, POLICIES, AND RECORDS OF TRANSACTIONS INITIATED OR COMPLETED BY US OR VIA THE SITE. You hereby waive any rights or requirements under any statutes, regulations, rules, ordinances, or other laws in any jurisdiction which require an original signature or delivery or retention of non-electronic records, or to payments or the granting of credits by any means other than electronic means. + + +## 27. MISCELLANEOUS + +These Terms and Conditions and any policies or operating rules posted by us on the Site or in respect to the Site constitute the entire agreement and understanding between you and us. Our failure to exercise or enforce any right or provision of these Terms and Conditions shall not operate as a waiver of such right or provision. These Terms and Conditions operate to the fullest extent permissible by law. We may assign any or all of our rights and obligations to others at any time. We shall not be responsible or liable for any loss, damage, delay, or failure to act caused by any cause beyond our reasonable control. If any provision or part of a provision of these Terms and Conditions is determined to be unlawful, void, or unenforceable, that provision or part of the provision is deemed severable from these Terms and Conditions and does not affect the validity and enforceability of any remaining provisions. There is no joint venture, partnership, employment or agency relationship created between you and us as a result of these Terms and Conditions or use of the Site. You agree that these Terms and Conditions will not be construed against us by virtue of having drafted them. You hereby waive any and all defenses you may have based on the electronic form of these Terms and Conditions and the lack of signing by the parties hereto to execute these Terms and Conditions. + + +## 28. CONTACT US + +In order to resolve a complaint regarding the Site or to receive further information regarding use of the Site, please contact us at: + +Doableware +Bertrandsgatan 2B +Malmö, skane 21214 +Sweden + +supportATdoablewareDOTcom \ No newline at end of file diff --git a/docs/markdown/support/contact/book-a-debug.md b/docs/markdown/support/contact/book-a-debug.md new file mode 100644 index 00000000..7599a8cc --- /dev/null +++ b/docs/markdown/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/markdown/support/contact/discord-support.md b/docs/markdown/support/contact/discord-support.md new file mode 100644 index 00000000..d3b39621 --- /dev/null +++ b/docs/markdown/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/markdown/support/djongocs/create-account.md b/docs/markdown/support/djongocs/create-account.md new file mode 100644 index 00000000..a4830bc7 --- /dev/null +++ b/docs/markdown/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/markdown/support/payment/discord-support.md b/docs/markdown/support/payment/discord-support.md new file mode 100644 index 00000000..8657e87d --- /dev/null +++ b/docs/markdown/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/markdown/support/payment/payment-success.md b/docs/markdown/support/payment/payment-success.md new file mode 100644 index 00000000..d2f1f60e --- /dev/null +++ b/docs/markdown/support/payment/payment-success.md @@ -0,0 +1,5 @@ +--- +title: Sponsor Djongo +permalink: /support/payment-success/ +layout: splash +--- diff --git a/docs/markdown/support/payment/server.md b/docs/markdown/support/payment/server.md new file mode 100644 index 00000000..f946aa5c --- /dev/null +++ b/docs/markdown/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/markdown/support/request-success.md b/docs/markdown/support/request-success.md new file mode 100644 index 00000000..8fc6cb53 --- /dev/null +++ b/docs/markdown/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/markdown/support/support.md b/docs/markdown/support/support.md new file mode 100644 index 00000000..44866e67 --- /dev/null +++ b/docs/markdown/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/markdown/support/support.md.bak b/docs/markdown/support/support.md.bak new file mode 100644 index 00000000..a9539e35 --- /dev/null +++ b/docs/markdown/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/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..175fd55a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,10 @@ -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 +======= + # requirements.txt + # + # installs dependencies from ./setup.py, and the package itself, + # in editable mode + -e . 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, + '