Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

* Pre release 1.4.6

 * Added copyright note in almost all files
 * Added GPLv3 in COPYING file
 * cleaned code to compliant PEP-8
 * cleaned code for pylint and pyflakes
 * fix minor bug in access_account.views
 * removed generic_utils.autologin superseded from
   access_account with backends.TokenBackend
 * renamed send_mail.views to send_mail.__init__
 * added adaptive wsgi.py to project_template
 * better setup.py to install also project_template
 * added debian/changelog.git to reintroduce debian/changelog
  • Loading branch information...
commit 923d512c7c8fb8b6122cc736090efafd69b8dda0 1 parent 9c8cf56
Marco Bardelli authored
Showing with 2,806 additions and 1,653 deletions.
  1. +674 −0 COPYING
  2. +60 −0 debian/changelog.git
  3. +24 −0 debian/copyright
  4. +0 −34 debian/patch_for_lucid.diff
  5. +33 −10 debian/rules
  6. +23 −1 django-admin-aderit
  7. +24 −1 django/contrib/aderit/__init__.py
  8. +27 −0 django/contrib/aderit/access_account/__init__.py
  9. +60 −33 django/contrib/aderit/access_account/backends.py
  10. +0 −225 django/contrib/aderit/access_account/forms.py
  11. +45 −5 django/contrib/aderit/access_account/models.py
  12. +39 −6 django/contrib/aderit/access_account/tokens.py
  13. +182 −96 django/contrib/aderit/access_account/views.py
  14. +27 −1 django/contrib/aderit/generic_utils/__init__.py
  15. +45 −17 django/contrib/aderit/generic_utils/actions.py
  16. +0 −1  django/contrib/aderit/generic_utils/autologin/__init__.py
  17. +0 −15 django/contrib/aderit/generic_utils/autologin/admin.py
  18. +0 −32 django/contrib/aderit/generic_utils/autologin/models.py
  19. +0 −67 django/contrib/aderit/generic_utils/autologin/utils.py
  20. +0 −190 django/contrib/aderit/generic_utils/autologin/views.py
  21. +67 −27 django/contrib/aderit/generic_utils/forms/__init__.py
  22. +36 −7 django/contrib/aderit/generic_utils/forms/fields.py
  23. +69 −28 django/contrib/aderit/generic_utils/middleware.py
  24. +24 −1 django/contrib/aderit/generic_utils/models/__init__.py
  25. +26 −4 django/contrib/aderit/generic_utils/models/fields.py
  26. +27 −0 django/contrib/aderit/generic_utils/templatetags/__init__.py
  27. +73 −45 django/contrib/aderit/generic_utils/templatetags/breadcrumb.py
  28. +47 −23 django/contrib/aderit/generic_utils/templatetags/currentsitetags.py
  29. +46 −14 django/contrib/aderit/generic_utils/templatetags/currentusergroupstags.py
  30. +29 −2 django/contrib/aderit/generic_utils/templatetags/nice_name.py
  31. +32 −8 django/contrib/aderit/generic_utils/templatetags/order_by.py
  32. +407 −403 django/contrib/aderit/generic_utils/templatetags/smart_if.py
  33. +12 −8 django/contrib/aderit/generic_utils/templatetags/truncatesmart.py
  34. +24 −20 django/contrib/aderit/generic_utils/templatetags/usertags.py
  35. +103 −29 django/contrib/aderit/generic_utils/views/__init__.py
  36. +7 −9 django/contrib/aderit/news/admin.py
  37. +15 −10 django/contrib/aderit/news/models.py
  38. +16 −7 django/contrib/aderit/news/templatetags/news_tags.py
  39. +17 −7 django/contrib/aderit/news/urls.py
  40. +205 −0 django/contrib/aderit/send_mail/__init__.py
  41. +34 −8 django/contrib/aderit/send_mail/admin.py
  42. +58 −23 django/contrib/aderit/send_mail/models.py
  43. +74 −29 django/contrib/aderit/send_mail/utils.py
  44. +0 −161 django/contrib/aderit/send_mail/views.py
  45. +5 −3 project_template/account/admin.py
  46. +11 −13 project_template/account/models.py
  47. +6 −3 project_template/account/views.py
  48. +32 −22 project_template/settings.py
  49. +2 −2 project_template/urls.py
  50. +23 −0 project_template/wsgi.py
  51. +16 −3 setup.py
View
674 COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is 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. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ 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.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ 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 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. Use with the GNU Affero General Public License.
+
+ 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 Affero 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 special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 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 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 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ 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 GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
View
60 debian/changelog.git
@@ -0,0 +1,60 @@
+django-contrib-aderit (1.4.6~pre) veryunstable; urgency=low
+
+ * NMU: Pre release 1.4.6
+ * debian/rules: temporary symlink some moved pymodules
+ * debian/rules: do not override_dh_install, setup.py do all
+ * added debian/copyright
+ * git rev: 716aa89afdfecf0d6690ba13fb1757ed8ee2be9d
+ * temporary added debian/changelog.git to git branch copyright-added
+ to reintroduce debian/changelog in git, maybe using autoconf
+
+ -- Marco Bardelli <marco.bardelli@aderit.it> Mon, 03 Dec 2012 01:58:53 +0100
+
+django-contrib-aderit (1.4.5) unstable; urgency=low
+
+ * NMU: New release
+ * fix senf_mail in bulk
+ * generic_utils middlware reorganized
+
+ -- Marco Bardelli <marco.bardelli@aderit.it> Fri, 30 Nov 2012 10:33:30 +0100
+
+django-contrib-aderit (1.4.4.1) unstable; urgency=low
+
+ * NMU: New minor release bugfix in SignupView
+
+ -- Marco Bardelli <marco.bardelli@aderit.it> Mon, 19 Nov 2012 13:49:52 +0100
+
+django-contrib-aderit (1.4.4) unstable; urgency=low
+
+ * NMU: bump version
+ * added lintian-overrides
+ * several improvement in access_account
+ * fix send_mail
+ * some fix breadcrumb
+
+ -- Marco Bardelli <marco.bardelli@aderit.it> Thu, 08 Nov 2012 11:06:15 +0100
+
+django-contrib-aderit (1.4.3.3) unstable; urgency=low
+ * New minor release
+ * [FIX] generic_formclass_factory
+
+ -- Marco Bardelli <marco.bardelli@aderit.it> Wed, 07 Nov 2012 13:23:49 +0100
+
+django-contrib-aderit (1.4.3.2) veryunstable; urgency=low
+
+ * New minor release
+
+ -- Marco Bardelli <marco.bardelli@aderit.it> Wed, 07 Nov 2012 13:06:39 +0100
+
+django-contrib-aderit (1.4.3.1) veryunstable; urgency=low
+
+ * Fix syntax error in access_account/backends.py
+
+ -- Marco Bardelli <marco.bardelli@aderit.it> Wed, 07 Nov 2012 12:05:46 +0100
+
+django-contrib-aderit (1.4.3) veryunstable; urgency=low
+
+ * Fix send_mail error
+ * Improve access_account SignupView
+
+ -- Marco Bardelli <marco.bardelli@aderit.it> Wed, 07 Nov 2012 11:50:22 +0100
View
24 debian/copyright
@@ -0,0 +1,24 @@
+DjangoContribAderit -- Extensions to Django by Aderit
+
+Copyright (C) 2012 Aderit srl
+
+Authors: Marco Bardelli <marco.bardelli@aderit.it>, <bardelli.marco@gmail.com>
+ Matteo Atti <matteo.atti@aderit.it>, <attuch@gmail.com>
+
+This file is part of DjangoContribAderit.
+
+DjangoContribAderit is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+DjangoContribAderit 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with DjangoContribAderit. If not, see <http://www.gnu.org/licenses/>.
+
+Please see `/usr/share/common-licenses/GPL' for the full text of
+the license.
View
34 debian/patch_for_lucid.diff
@@ -1,34 +0,0 @@
-Questa patch va applicata per buildare con debhelper < 9 che non supporta dh_python2 addon (es: su lucid o squeeze)
-Per buildare su lucid o squeeze, eseguire dalla cartella radice del progetto:
-$ patch -p1 <debian/patch_for_lucid.diff && dch -v X.Y.Z "unreleased" && debuild -us -uc
-Nel repo apt non dovrebbero essere uploadati pacchetti buildati con debhelper < 9.
-Usando "dh --with python2" il codice viene installato in una posizione standard compatibile con qualsiasi distro.
-Su lucid e squeeze viene installato nelle gerarchie 'pymodules' incompatibili con versioni + nuove.
-
-diff --git a/debian/rules b/debian/rules
-index b116cd2..c5ca8e5 100755
---- a/debian/rules
-+++ b/debian/rules
-@@ -5,8 +5,13 @@ export DH_VERBOSE = 1
- ov=$(shell dpkg-parsechangelog | grep ^Version | cut -d' ' -f2 | cut -d'-' -f1)
- pn=$(shell dpkg-parsechangelog | grep ^Source | cut -d' ' -f2)
-
--override_dh_python2:
-- dh_python2 --skip-private
-+#override_dh_auto_install:
-+# NO_CHECK_MODULES=1 python setup.py install --root=$(CURDIR)/debian/tmp/ --install-layout=deb --no-compile
-+
-+override_dh_pysupport:
-+ dh_pysupport -X project_template
-+# #cp -rf django/contrib/aderit/generic_utils/templates django/contrib/aderit/generic_utils/templatetags debian/python-django-contrib-aderit/usr/share/pyshared/django/contrib/aderit/generic_utils/
-+# #cp -rf django/contrib/aderit/access_account/templates debian/python-django-contrib-aderit/usr/share/pyshared/django/contrib/aderit/access_account/
-
- override_dh_install:
- dh_testdir
-@@ -18,5 +23,5 @@ override_dh_install:
- chmod +x debian/python-django-contrib-aderit/usr/bin/django-admin-aderit
-
- %:
-- dh $@ --with python2
-+ dh $@
-
View
43 debian/rules
@@ -8,16 +8,39 @@ pn=$(shell dpkg-parsechangelog | grep ^Source | cut -d' ' -f2)
override_dh_python2:
dh_python2 --skip-private
-override_dh_install:
- dh_testdir
- dh_testroot
- dh_install
- -mkdir -p debian/python-django-contrib-aderit/usr/share/python-django-contrib-aderit debian/python-django-contrib-aderit/usr/bin
- cp -rf project_template debian/python-django-contrib-aderit/usr/share/python-django-contrib-aderit/
- cp -f django-admin-aderit debian/python-django-contrib-aderit/usr/bin
- chmod +x debian/python-django-contrib-aderit/usr/bin/django-admin-aderit
-
-
+## temporary fix incompatible changes introduced in 1.4.6
+## (needed for ULISSE and UDA)
+py26_libdir = usr/lib/python2.6/$(call py_sitename, 2.6)
+py27_libdir = usr/lib/python2.7/$(call py_sitename, 2.7)
+pyshared_dir = usr/share/pyshared
+g_utils = django/contrib/aderit/generic_utils
+send_mail_path = django/contrib/aderit/send_mail
+override_dh_link:
+ dh_link -v \
+ $(pyshared_dir)/$(g_utils)/middleware.py \
+ $(pyshared_dir)/$(g_utils)/currentUserMiddleware.py \
+ $(pyshared_dir)/$(g_utils)/middleware.py \
+ $(pyshared_dir)/$(g_utils)/langMiddleware.py \
+ $(pyshared_dir)/$(g_utils)/middleware.py \
+ $(pyshared_dir)/$(g_utils)/mobileMiddleware.py \
+ $(pyshared_dir)/$(send_mail_path)/__init__.py \
+ $(pyshared_dir)/$(send_mail_path)/views.py \
+ $(py26_libdir)/$(g_utils)/middleware.py \
+ $(py26_libdir)/$(g_utils)/currentUserMiddleware.py \
+ $(py26_libdir)/$(g_utils)/middleware.py \
+ $(py26_libdir)/$(g_utils)/langMiddleware.py \
+ $(py26_libdir)/$(g_utils)/middleware.py \
+ $(py26_libdir)/$(g_utils)/mobileMiddleware.py \
+ $(py26_libdir)/$(send_mail_path)/__init__.py \
+ $(py26_libdir)/$(send_mail_path)/views.py \
+ $(py27_libdir)/$(g_utils)/middleware.py \
+ $(py27_libdir)/$(g_utils)/currentUserMiddleware.py \
+ $(py27_libdir)/$(g_utils)/middleware.py \
+ $(py27_libdir)/$(g_utils)/langMiddleware.py \
+ $(py27_libdir)/$(g_utils)/middleware.py \
+ $(py27_libdir)/$(g_utils)/mobileMiddleware.py \
+ $(py27_libdir)/$(send_mail_path)/__init__.py \
+ $(py27_libdir)/$(send_mail_path)/views.py
git-orig-source:
-rm -rf $(pn)-$(ov)
View
24 django-admin-aderit
@@ -1,9 +1,31 @@
#!/bin/sh
+# django-admin-aderit -- bootstrap a django project
+#
+# Copyright (C) 2012 Aderit srl
+#
+# Author: Marco Bardelli <marco.bardelli@aderit.it>, <bardelli.marco@gmail.com>
+#
+# This file is part of DjangoContribAderit.
+#
+# DjangoContribAderit is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# DjangoContribAderit 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with DjangoContribAderit. If not, see <http://www.gnu.org/licenses/>.
+
set -e
oldpwd="$OLDPWD"
with_git=no
group_for_share=${SHARE_FOR_GROUP:-tecnici}
+prj_template_root=${DJANGO_PROJECT_TEMPLATE_ROOT:-/usr/share/python-django-contrib-aderit}
usage ()
{
@@ -105,7 +127,7 @@ NAME="$2"
case "$CMD" in
startproject)
test -n "$NAME" || usage 1
- cp -rf /usr/share/python-django-contrib-aderit/project_template "$NAME"
+ cp -rf $prj_template_root/project_template "$NAME"
SECRET=`pwgen -s -y 54 1 | sed -e "s_[\"']_+_g"`
sed -i -e "s,@PROJECT@,$NAME,g" -e "s'@SECRET@'$SECRET'g" "$NAME"/settings.py
touch "$NAME"/__init__.py
View
25 django/contrib/aderit/__init__.py
@@ -1 +1,24 @@
-__doc__ = '''Django Contrib Aderit, several utilities to reuse in aderit web development.'''
+# django.contrib.aderit -- python module
+#
+# Copyright (C) 2012 Aderit srl
+#
+# Author: Marco Bardelli <marco.bardelli@aderit.it>, <bardelli.marco@gmail.com>
+#
+# This file is part of DjangoContribAderit.
+#
+# DjangoContribAderit is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# DjangoContribAderit 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with DjangoContribAderit. If not, see <http://www.gnu.org/licenses/>.
+'''
+Django Contrib Aderit, several utilities to reuse in aderit web development.
+'''
+__copyright__ = '''Copyright (C) 2012 Aderit srl'''
View
27 django/contrib/aderit/access_account/__init__.py
@@ -1,8 +1,35 @@
+# pylint: disable-msg=C0301,C0103
+# -*- coding: utf-8 -*-
+# vim: set fileencoding=utf-8 :
+# django.contrib.aderit.access_account -- python module for auth management
+#
+# Copyright (C) 2012 Aderit srl
+#
+# Author: Marco Bardelli <marco.bardelli@aderit.it>, <bardelli.marco@gmail.com>
+#
+# This file is part of DjangoContribAderit.
+#
+# DjangoContribAderit is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# DjangoContribAderit 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with DjangoContribAderit. If not, see <http://www.gnu.org/licenses/>.
+'''User profile management'''
+__copyright__ = '''Copyright (C) 2012 Aderit srl'''
+
from django.conf import settings
from django.contrib.auth.models import SiteProfileNotAvailable
from django.utils.translation import ugettext as _
from django.db.models.loading import get_model
+
def _get_model_from_auth_profile_module():
"""
Get model for UserProfile.
View
93 django/contrib/aderit/access_account/backends.py
@@ -1,37 +1,53 @@
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
+# pylint: disable-msg=C0301,C0103,E1101,W0212
+# -*- coding: utf-8 -*-
+# vim: set fileencoding=utf-8 :
+# backends.py -- python module for auth backends
+#
+# Copyright (C) 2012 Aderit srl
+#
+# Authors: Marco Bardelli <marco.bardelli@aderit.it>,
+# <bardelli.marco@gmail.com>
+# Michele Pellegrini <michele.pellegini@aderit.it>
+#
+# This file is part of DjangoContribAderit.
+#
+# DjangoContribAderit is free software: you can redistribute it and/or modify
+# it under the terms of the GNU 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 General Public License for more details.
+# DjangoContribAderit 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 General Public License for more details.
#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# You should have received a copy of the GNU General Public License
+# along with DjangoContribAderit. If not, see <http://www.gnu.org/licenses/>.
+'''Authentication backends'''
-from django.conf import settings
from django.utils.log import getLogger
-from django.contrib.auth.models import User, check_password
+from django.contrib.auth.models import User
from django.contrib.auth.tokens import default_token_generator
-from django.contrib.aderit.access_account import _get_model_from_auth_profile_module
-from django.contrib.aderit.access_account.tokens import check_random_token_is_valid
+from django.contrib.aderit.access_account import \
+ _get_model_from_auth_profile_module
+from django.contrib.aderit.access_account.tokens import \
+ check_random_token_is_valid
logger = getLogger('aderit.access_account.auth_backend')
+
class TokenBackend(object):
"""
- Backend per l'autenticazione via token
+ Backend for authentication via token
"""
supports_inactive_user = False
def authenticate(self, token=None, user=None):
"""
- Se non posso cercare il @token nel DB (il modello non ha il campo token) ed ho @user
+ Se non posso cercare il @token nel DB
+ (il modello non ha il campo token) ed ho @user
provo default_token_generator.check_token
Se posso cercarlo sul DB:
@@ -40,48 +56,59 @@ def authenticate(self, token=None, user=None):
2 - non lo trovo:
+ provo usando default_token_generator.check_token
- Se @user e' passato ma non ha l'attributo last_login (usato nel chek_token), non autentico.
+ Se @user e' passato ma non ha l'attributo last_login
+ (usato nel chek_token), non autentico.
"""
- logger.debug("authenticate ( token=%s , user=%s )", token, user)
+ logger.debug("authenticate[%s] ( token=%s , user=%s )",
+ self, token, user)
if token is not None:
model = _get_model_from_auth_profile_module()
if 'token' in [f.name for f in model._meta.fields]:
try:
- user_profile = model.objects.get(token=token)
- if user is None and \
- check_random_token_is_valid(token):
+ user_profile = model.objects.get(token=token)
+ if user is None and check_random_token_is_valid(token):
return user_profile.user
elif user == user_profile.user and \
- check_random_token_is_valid(token):
+ check_random_token_is_valid(token):
return user
except model.MultipleObjectsReturned:
logger.error("token[\"%s\"] is not unique", token)
return None
except model.DoesNotExist:
try:
- if user is not None and default_token_generator.check_token(user, token):
- logger.debug("token DoenNotExist but (user: %s , token: %s) is valid, auth OK",
+ if user is not None and \
+ default_token_generator.\
+ check_token(user, token):
+ logger.debug("token DoenNotExist but "
+ "(user: %s , token: %s) "
+ "is valid, auth OK",
user, token)
return user
except AttributeError, e:
- logger.error("user[%s] can not be authenticate: %s", user, e)
- pass
+ logger.error("user[%s] can not be "
+ "authenticate: %s", user, e)
else:
try:
- if user is not None and default_token_generator.check_token(user, token):
- logger.debug("model[%s] have not token field (user: %s , token: %s) is valid, auth OK",
+ if user is not None and \
+ default_token_generator\
+ .check_token(user, token):
+ logger.debug("model[%s] have not token field "
+ "(user: %s , token: %s) is valid,"
+ " auth OK",
model, user, token)
return user
except AttributeError:
- logger.error("user[%s] can not be authenticate: %s", user, e)
- pass
+ logger.error("user[%s] can not be authenticate: %s",
+ user, e)
logger.debug("authenticate ( token=%s , user=%s ), fail", token, user)
return None
def get_user(self, user_id):
+ """
+ Return User with @user_id (pk) from database
+ """
+ logger.debug("get_user[%s] ( user_id=%s )", self, user_id)
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
-
-
View
225 django/contrib/aderit/access_account/forms.py
@@ -1,225 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: set fileencoding=utf-8 :
-from django.conf import settings
-from django.http import HttpResponseRedirect
-from django.forms import ModelForm, Form, fields as forms_fields
-from django.contrib.auth.models import User
-from django.contrib.auth.forms import (AuthenticationForm, PasswordResetForm,
- SetPasswordForm, PasswordChangeForm)
-from django.contrib.aderit.generic_utils.currentUserMiddleware import get_current_user
-from django.contrib.aderit.generic_utils.templatetags.nice_name import nice_name
-from account.models import Account, ResettablePassword
-
-import logging
-import os, re, time
-
-logger = logging.getLogger('django.debug')
-logger.addHandler(logging.StreamHandler())
-logger.handlers[0].setFormatter(logging.Formatter("%(name)s:%(levelname)s: %(message)s"))
-logger.setLevel(logging.DEBUG)
-
-if 'captcha' in settings.INSTALLED_APPS:
- from captcha.fields import CaptchaField
-
- class CaptchaForm(Form):
- captcha = CaptchaField(label="*Inserire Captcha", help_text = "(obbligatorio la per sicurezza)")
-
-
-def is_only_numbers(stringa):
- if re.match("^[0-9]+$",stringa): return True
- else: return False
-
-class ForgotPswUsernameForm(Form):
- username = forms_fields.RegexField(label="Username", max_length=125, regex=r'^[\w\s]+', required=True,
- help_text = "(inserire il proprio username)",
- error_messages = {'invalid': "This value may contain only letters, numbers and @/./+/-/_ characters."})
-
- def clean(self):
- cleaned_data = self.cleaned_data
- username = cleaned_data.get("username")
- if not username:
- username = "Utente non inserito"
- user = User.objects.filter(username=username)
-
-
- if len(user) == 0:
- msg = u"Il campo inserito non corrisponde a nessun account presente nel sistema"
- self._errors["username"] = self.error_class([msg])
- else:
- if not user[0].email:
- msg = u"Il campo inserito corrisponde ad un account presente nel sistema, ma non e' dotato di email quindi non e' possibile effettuare il reset della password, prego contattare gli amministratori di sistema"
- self._errors["username"] = self.error_class([msg])
-
-class AccessAccountProfileForm(Form):
- nickname = forms_fields.RegexField(label="*Username", max_length=125, regex=r'^[\w\s]+',
- help_text = "(da usare come username per il login)",
- error_messages = {'invalid': "This value may contain only letters, numbers and @/./+/-/_ characters."})
- first_name = forms_fields.RegexField(label="*Nome", max_length=125, regex=r'^[\w\s]+',
- help_text = "<br/>",
- error_messages = {'invalid': "This value may contain only letters, numbers and @/./+/-/_ characters."})
- last_name = forms_fields.RegexField(label="*Cognome", max_length=125, regex=r'^[\w\s]+',
- help_text = "<br/>",
- error_messages = {'invalid': "This value may contain only letters, numbers and @/./+/-/_ characters."})
- email = forms_fields.EmailField(label="*Email", help_text = "(inserire la mail di lavoro)", max_length=125)
- phone = forms_fields.CharField(label="Telefono Fisso", required=False,
- help_text = "(il numero telefonico dell'ufficio, non usare punteggiatura)")
- phone_mobile = forms_fields.CharField(label="Telefono Mobile", required=False,
- help_text = "(il numero cellulare, non usare punteggiatura)")
- company = forms_fields.CharField(label="Ragione Sociale", max_length=125, required=False,
- help_text = "(il nome dell'azienda per cui lavora)")
- address = forms_fields.CharField(label="Indirizzo", max_length=125, required=False,
- help_text = "(indirizzo di fatturazione)")
- cap = forms_fields.CharField(label="CAP", required=False,
- help_text = "(il cap associato all'indirizzo)")
- location = forms_fields.CharField(label="Localita'", max_length=125, required=False,
- help_text = "(la localita' presso cui si lavora)")
- paese = forms_fields.CharField(label="Paese", max_length=125, required=False,
- help_text = "(il paese presso cui si lavora)")
-
- def clean(self):
- cleaned_data = self.cleaned_data
- company = cleaned_data.get("company")
- address = cleaned_data.get("address")
- cap = cleaned_data.get("cap")
- phone = cleaned_data.get("phone")
- phone_mobile = cleaned_data.get("phone_mobile")
- location = cleaned_data.get("location")
- paese = cleaned_data.get("paese")
-
- if phone:
- if not is_only_numbers(phone):
- msg = u"Inserire correttamente il numero telefonico"
- self._errors["phone"] = self.error_class([msg])
-
- if phone_mobile:
- if not is_only_numbers(phone_mobile):
- msg = u"Inserire correttamente il numero telefonico mobile"
- self._errors["phone_mobile"] = self.error_class([msg])
- if cap:
- if not is_only_numbers(cap):
- msg = u"Inserire correttamente il cap"
- self._errors["cap"] = self.error_class([msg])
-
-
-class AccessAccountSignupForm(Form):
- nickname = forms_fields.RegexField(label="*Username", max_length=125, regex=r'^[\w\s]+',
- help_text = "(da usare come username per il login)",
- error_messages = {'invalid': "This value may contain only letters, numbers and @/./+/-/_ characters."})
- first_name = forms_fields.RegexField(label="*Nome", max_length=125, regex=r'^[\w\s]+',
- help_text = "<br/>",
- error_messages = {'invalid': "This value may contain only letters, numbers and @/./+/-/_ characters."})
- last_name = forms_fields.RegexField(label="*Cognome", max_length=125, regex=r'^[\w\s]+',
- help_text = "<br/>",
- error_messages = {'invalid': "This value may contain only letters, numbers and @/./+/-/_ characters."})
- email = forms_fields.EmailField(label="*Email", help_text = "(inserire la mail di lavoro)", max_length=125)
- phone = forms_fields.CharField(label="Telefono Fisso", required=False,
- help_text = "(il numero telefonico dell'ufficio, non usare punteggiatura)")
- phone_mobile = forms_fields.CharField(label="Telefono Mobile", required=False,
- help_text = "(il numero cellulare, non usare punteggiatura)")
- password = forms_fields.CharField(label="*Password", widget=forms_fields.PasswordInput, max_length=30,
- help_text = "(usare una password sicura, contenente numeri e lettere)")
- password_confirm = forms_fields.CharField(label="*Password confirmation", widget=forms_fields.PasswordInput, max_length=30,
- help_text = "(inserire la stessa password per verifica)")
- company = forms_fields.CharField(label="Ragione Sociale", max_length=125, required=False,
- help_text = "(il nome dell'azienda per cui lavora)")
- address = forms_fields.CharField(label="Indirizzo", max_length=125, required=False,
- help_text = "(indirizzo di fatturazione)")
- cap = forms_fields.CharField(label="CAP", required=False,
- help_text = "(il cap associato all'indirizzo)")
- location = forms_fields.CharField(label="Localita'", max_length=125, required=False,
- help_text = "(la localita' presso cui si lavora)")
- paese = forms_fields.CharField(label="Paese", max_length=125, required=False,
- help_text = "(il paese presso cui si lavora)")
-
- def clean(self):
- cleaned_data = self.cleaned_data
- psw1 = cleaned_data.get("password")
- psw2 = cleaned_data.get("password_confirm")
- email = cleaned_data.get("email")
- nickname = cleaned_data.get("nickname")
- company = cleaned_data.get("company")
- cap = cleaned_data.get("cap")
- phone = cleaned_data.get("phone")
- phone_mobile = cleaned_data.get("phone_mobile")
- location = cleaned_data.get("location")
- paese = cleaned_data.get("paese")
- address = cleaned_data.get("address")
-
- if phone:
- if not is_only_numbers(phone):
- msg = u"Inserire correttamente il numero telefonico"
- self._errors["phone"] = self.error_class([msg])
-
- if phone_mobile:
- if not is_only_numbers(phone_mobile):
- msg = u"Inserire correttamente il numero telefonico mobile"
- self._errors["phone_mobile"] = self.error_class([msg])
- if cap:
- if not is_only_numbers(cap):
- msg = u"Inserire correttamente il cap"
- self._errors["cap"] = self.error_class([msg])
-
-
- if len(User.objects.filter(username=nickname)) > 0:
- msg = u"Utente gia' esistente"
- self._errors["nickname"] = self.error_class([msg])
- del cleaned_data["nickname"]
-
- if psw1 != psw2:
- msg = u"Password differenti"
- self._errors["password_confirm"] = self.error_class([msg])
-
- # Always return the full collection of cleaned data.
- return cleaned_data
-
-
-class ResetPswForm(Form):
- password_new = forms_fields.CharField(label="*Nuova Password", widget=forms_fields.PasswordInput, max_length=30,
- help_text = "(inserire la nuova password)")
- password_new_confirm = forms_fields.CharField(label="*Conferma nuova Password", widget=forms_fields.PasswordInput, max_length=30,
- help_text = "(reinserire la nuova password, per conferma)",
- error_messages = {'invalid': "Password Check errato"})
-
- def clean(self):
- cleaned_data = self.cleaned_data
- psw1 = cleaned_data.get("password_new")
- psw2 = cleaned_data.get("password_new_confirm")
-
- if psw1 != psw2:
- msg = u"Password differenti"
- self._errors["password_new_confirm"] = self.error_class([msg])
-
- return cleaned_data
-
-
-class ChPsw(Form):
- password_old = forms_fields.CharField(label="*Vecchia Password", widget=forms_fields.PasswordInput,
- help_text = "(inserire la vecchia password)",
- error_messages = {'invalid': "Password errata"})
- password_new = forms_fields.CharField(label="*Nuova Password", widget=forms_fields.PasswordInput, max_length=30,
- help_text = "(inserire la nuova password)")
- password_new_confirm = forms_fields.CharField(label="*Conferma nuova Password", widget=forms_fields.PasswordInput, max_length=30,
- help_text = "(reinserire la nuova password, per conferma)",
- error_messages = {'invalid': "Password Check errato"})
-
- def clean(self):
- cleaned_data = self.cleaned_data
- user = get_current_user()
- psw = cleaned_data.get("password_old")
- psw1 = cleaned_data.get("password_new")
- psw2 = cleaned_data.get("password_new_confirm")
-
- if not psw:
- msg = u"Vecchia password obbligatoria"
- self._errors["password_old"] = self.error_class([msg])
-
- if not user.check_password(psw):
- msg = u"Reinserire vecchia password"
- self._errors["password_old"] = self.error_class([msg])
-
- if psw1 != psw2:
- msg = u"Password differenti"
- self._errors["password_new_confirm"] = self.error_class([msg])
-
- # Always return the full collection of cleaned data.
- return cleaned_data
View
50 django/contrib/aderit/access_account/models.py
@@ -1,13 +1,35 @@
+# pylint: disable-msg=C0301,C0103,C0111,W0232,W0613,E1101,R0903
# -*- coding: utf-8 -*-
# vim: set fileencoding=utf-8 :
+# models.py -- python module for auth/user profile model
+#
+# Copyright (C) 2012 Aderit srl
+#
+# Authors: Marco Bardelli <marco.bardelli@aderit.it>,
+# <bardelli.marco@gmail.com>
+#
+# This file is part of DjangoContribAderit.
+#
+# DjangoContribAderit is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# DjangoContribAderit 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with DjangoContribAderit. If not, see <http://www.gnu.org/licenses/>.
+'''User profile abstract model'''
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
-from django.contrib.aderit.access_account import _get_model_from_auth_profile_module
+from django.contrib.aderit.access_account import \
+ _get_model_from_auth_profile_module
-from django.db.models.signals import post_save
-from django.contrib.aderit.access_account import _get_model_from_auth_profile_module
class AccessAccount(models.Model):
user = models.OneToOneField(User)
@@ -22,31 +44,42 @@ def __unicode__(self):
def save(self, force_insert=False, force_update=False, using=None):
if self.pk is not None:
- self.user.save(force_insert=force_insert, force_update=force_update, using=using)
- super(AccessAccount, self).save(force_insert=force_insert, force_update=force_update, using=using)
+ self.user.save(force_insert=force_insert,
+ force_update=force_update,
+ using=using)
+ super(AccessAccount, self).save(force_insert=force_insert,
+ force_update=force_update, using=using)
def _set_username(self, value):
self.user.username = value
+
def _get_username(self):
return self.user.username
+
username = property(_get_username, _set_username)
def _set_email(self, value):
self.user.email = value
+
def _get_email(self):
return self.user.email
+
email = property(_get_email, _set_email)
def _set_firstname(self, value):
self.user.first_name = value
+
def _get_firstname(self):
return self.user.first_name
+
firstname = property(_get_firstname, _set_firstname)
def _set_lastname(self, value):
self.user.last_name = value
+
def _get_lastname(self):
return self.user.last_name
+
lastname = property(_get_lastname, _set_lastname)
@property
@@ -62,20 +95,26 @@ def fullname(self):
def _set_is_staff(self, value):
self.user.is_staff = value
+
def _get_is_staff(self):
return self.user.is_staff
+
is_staff = property(_get_is_staff, _set_is_staff)
def _set_is_admin(self, value):
self.user.is_admin = value
+
def _get_is_admin(self):
return self.user.is_admin
+
is_admin = property(_get_is_admin, _set_is_admin)
def _set_is_active(self, value):
self.user.is_active = value
+
def _get_is_active(self):
return self.user.is_active
+
is_active = property(_get_is_active, _set_is_active)
@property
@@ -94,6 +133,7 @@ def last_login(self):
def date_joined(self):
return self.user.date_joined
+
def create_access_account(sender, instance, created, **kwargs):
if created:
model = _get_model_from_auth_profile_module()
View
45 django/contrib/aderit/access_account/tokens.py
@@ -1,27 +1,60 @@
+# pylint: disable-msg=C0301,C0103,E1101,W0212,W0402
+# -*- coding: utf-8 -*-
+# vim: set fileencoding=utf-8 :
+# tokens.py -- random token generation
+#
+# Copyright (C) 2012 Aderit srl
+#
+# Author: Marco Bardelli <marco.bardelli@aderit.it>, <bardelli.marco@gmail.com>
+#
+# This file is part of DjangoContribAderit.
+#
+# DjangoContribAderit is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# DjangoContribAderit 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with DjangoContribAderit. If not, see <http://www.gnu.org/licenses/>.
+'''Generate random token for authentication'''
+
from django.conf import settings
from django.utils.http import int_to_base36, base36_to_int
-import random, string, time
+import random
+import string
+import time
+
+TOKEN_DURATION_SECONDS = \
+ getattr(settings, 'ACCESS_ACCOUNT_TOKEN_DURATION_SECONDS', 3600 * 48)
-TOKEN_DURATION_SECONDS = getattr(settings, 'ACCESS_ACCOUNT_TOKEN_DURATION_SECONDS', 3600*48)
def make_random_unexpirable_token(len_random_part=32):
population = string.ascii_letters + string.digits
return "".join(random.sample(population, len_random_part))
+
def make_random_expirable_token(len_random_part=32):
- random_part = make_random_unexpirable_token(len_random_part=len_random_part)
+ random_part = \
+ make_random_unexpirable_token(len_random_part=len_random_part)
prefix_part = int_to_base36(int(time.time()))
return "%s-%s" % (prefix_part, random_part)
+
def random_token_is_expired(token):
splitted = token.split('-', 1)
splitted_len = len(splitted)
if splitted_len == 1:
## no prefix for timestamp, unexpirable
return False
- else: ## splitted_len is 2, check for exipration
- return (int(time.time()) - base36_to_int(splitted[0])) > TOKEN_DURATION_SECONDS
+ else: # splitted_len is 2, check for exipration
+ return (int(time.time()) - base36_to_int(splitted[0])) > \
+ TOKEN_DURATION_SECONDS
+
def check_random_token_is_valid(token):
return not random_token_is_expired(token)
-
View
278 django/contrib/aderit/access_account/views.py
@@ -1,5 +1,29 @@
+# pylint: disable-msg=C0301,C0103,W0201,W0212,E1101
+# pep8: ignore=E201
# -*- coding: utf-8 -*-
# vim: set fileencoding=utf-8 :
+# views.py -- python module for auth management
+#
+# Copyright (C) 2012 Aderit srl
+#
+# Author: Marco Bardelli <marco.bardelli@aderit.it>, <bardelli.marco@gmail.com>
+#
+# This file is part of DjangoContribAderit.
+#
+# DjangoContribAderit is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# DjangoContribAderit 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with DjangoContribAderit. If not, see <http://www.gnu.org/licenses/>.
+'''Authentication and user profile views (controllers)'''
+
# TODO
# * prestabilire gli urls standard
# * minimizzare i templates necessarie usando
@@ -14,7 +38,6 @@
from django.template.response import TemplateResponse
from django.forms import (fields as forms_fields,
widgets as forms_widgets,
- models as forms_models,
forms as forms_forms)
from django.views.generic.base import TemplateView as _TemplateView
from django.views.generic.detail import DetailView as _DetailView
@@ -27,48 +50,62 @@
from django.contrib.sites.models import get_current_site
from django.contrib.auth import (authenticate, login as auth_login,
logout as auth_logout, REDIRECT_FIELD_NAME)
-from django.contrib.auth.models import User, SiteProfileNotAvailable
-from django.contrib.auth.forms import (AuthenticationForm, UserCreationForm, UserChangeForm,
- AdminPasswordChangeForm, PasswordChangeForm, PasswordResetForm, SetPasswordForm)
+from django.contrib.auth.models import User
+from django.contrib.auth.forms import (AuthenticationForm, UserCreationForm,
+ UserChangeForm, AdminPasswordChangeForm,
+ PasswordChangeForm, PasswordResetForm)
from django.contrib.auth.views import redirect_to_login
from django.contrib.auth.tokens import default_token_generator
-from django.contrib.aderit.generic_utils.views import (GenericUtilView,
- GenericProtectedView,
- GenericProtectedUncacheableView)
-from django.contrib.aderit.generic_utils.forms import generic_formclass_factory, SortedDict
-from django.contrib.aderit.send_mail.views import SendTypeMail
-from django.contrib.aderit.access_account import _get_model_from_auth_profile_module
-from django.contrib.aderit.access_account.tokens import (make_random_expirable_token,
- make_random_unexpirable_token)
+from django.contrib.aderit.generic_utils.views import \
+ (GenericUtilView, GenericProtectedView, GenericProtectedUncacheableView)
+from django.contrib.aderit.generic_utils.forms import \
+ generic_formclass_factory, SortedDict
+from django.contrib.aderit.send_mail import SendTypeMail
+from django.contrib.aderit.access_account import \
+ _get_model_from_auth_profile_module
+from django.contrib.aderit.access_account.tokens import \
+ (make_random_expirable_token, make_random_unexpirable_token)
## SignupView settings
-DO_LOGIN_AFTER_SIGNUP = getattr(settings, 'ACCESS_ACCOUNT_LOGIN_ON_SIGNUP', False)
-SIGNUP_USER_IS_ACTIVE = getattr(settings, 'ACCESS_ACCOUNT_SIGNUP_USER_IS_ACTIVE', True)
+DO_LOGIN_AFTER_SIGNUP = \
+ getattr(settings, 'ACCESS_ACCOUNT_LOGIN_ON_SIGNUP', False)
+SIGNUP_USER_IS_ACTIVE = \
+ getattr(settings, 'ACCESS_ACCOUNT_SIGNUP_USER_IS_ACTIVE', True)
## LoginView settings
-ALLOW_LOGIN_TO_AUTHENTICATED = getattr(settings, 'ACCESS_ACCOUNT_ALLOW_LOGIN_TO_AUTHENTICATED', False)
-ALLOW_LOGIN_VIA_TOKEN = getattr(settings, 'ACCESS_ACCOUNT_ALLOW_LOGIN_VIA_TOKEN', False)
+ALLOW_LOGIN_TO_AUTHENTICATED = \
+ getattr(settings, 'ACCESS_ACCOUNT_ALLOW_LOGIN_TO_AUTHENTICATED', False)
+ALLOW_LOGIN_VIA_TOKEN = \
+ getattr(settings, 'ACCESS_ACCOUNT_ALLOW_LOGIN_VIA_TOKEN', False)
## LoginView and ForgotPasswordView settings
-DELETE_TOKEN_AFTER_USE = getattr(settings, 'ACCESS_ACCOUNT_DELETE_TOKEN_AFTER_USE', True)
+DELETE_TOKEN_AFTER_USE = \
+ getattr(settings, 'ACCESS_ACCOUNT_DELETE_TOKEN_AFTER_USE', True)
## LogoutView settings
-CLEAN_COOKIES_ON_LOGOUT = getattr(settings, 'ACCESS_ACCOUNT_CLEAN_COOKIES_ON_LOGOUT', True)
+CLEAN_COOKIES_ON_LOGOUT = \
+ getattr(settings, 'ACCESS_ACCOUNT_CLEAN_COOKIES_ON_LOGOUT', True)
## ForgotPasswordView settings
-USE_DB_FOR_TOKEN = getattr(settings, 'ACCESS_ACCOUNT_USE_DB_FOR_TOKEN', True)
-USE_EXPIRABLE_TOKEN = getattr(settings, 'ACCESS_ACCOUNT_USE_EXPIRABLE_TOKEN', True)
+USE_DB_FOR_TOKEN = \
+ getattr(settings, 'ACCESS_ACCOUNT_USE_DB_FOR_TOKEN', True)
+USE_EXPIRABLE_TOKEN = \
+ getattr(settings, 'ACCESS_ACCOUNT_USE_EXPIRABLE_TOKEN', True)
## maybe in CaptchableView
HAS_CAPTCHA = 'captcha' in settings.INSTALLED_APPS
USE_CAPTCHA_SIGNUP = HAS_CAPTCHA and getattr(settings, 'CAPTCHA_SIGNUP', True)
USE_CAPTCHA_CHPSW = HAS_CAPTCHA and getattr(settings, 'CAPTCHA_CHPSW', False)
-USE_CAPTCHA_CHPROFILE = HAS_CAPTCHA and getattr(settings, 'CAPTCHA_CHPROFILE', False)
-USE_CAPTCHA_FORGOTPSW = HAS_CAPTCHA and getattr(settings, 'CAPTCHA_FORGOTPSW', True)
-USE_CAPTCHA_RESETPSW = HAS_CAPTCHA and getattr(settings, 'CAPTCHA_RESETPSW', False)
+USE_CAPTCHA_CHPROFILE = HAS_CAPTCHA and \
+ getattr(settings, 'CAPTCHA_CHPROFILE', False)
+USE_CAPTCHA_FORGOTPSW = HAS_CAPTCHA and \
+ getattr(settings, 'CAPTCHA_FORGOTPSW', True)
+USE_CAPTCHA_RESETPSW = HAS_CAPTCHA and \
+ getattr(settings, 'CAPTCHA_RESETPSW', False)
if HAS_CAPTCHA:
from captcha.fields import CaptchaField
CAPTCHA_FIELD_CLASS = (HAS_CAPTCHA and CaptchaField) or None
logger = getLogger('aderit.access_account.views')
+
def _try_callback(instanceview, attr_name_for_callback):
_callback = getattr(instanceview, attr_name_for_callback, None)
if _callback is None:
@@ -82,6 +119,7 @@ def _try_callback(instanceview, attr_name_for_callback):
_callback(instanceview)
return
+
def _consume_formfields(list_, *args):
for f in args:
try:
@@ -89,12 +127,17 @@ def _consume_formfields(list_, *args):
except ValueError:
pass
+
def _maybe_add_captcha(self, actual_fields):
- if self.use_captcha and HAS_CAPTCHA and self.captcha_field_class is not None:
+ if self.use_captcha and HAS_CAPTCHA and \
+ self.captcha_field_class is not None:
if self.captcha_field is None:
- self.captcha_field = self.captcha_field_class(label=_("Inserire Captcha"),
- help_text = _("(obbligatorio la per sicurezza)"))
- actual_fields.update({ self.captcha_field_name : self.captcha_field })
+ self.captcha_field = \
+ self.captcha_field_class(label=_("Inserire Captcha"),
+ help_text=_("(obbligatorio la per"
+ " sicurezza)"))
+ actual_fields.update({self.captcha_field_name: self.captcha_field})
+
class CaptchableView(GenericProtectedView):
use_captcha = False
@@ -102,6 +145,7 @@ class CaptchableView(GenericProtectedView):
captcha_field_name = 'captcha'
captcha_field = None
+
class LoginView(_FormView, CaptchableView):
"""
Class based view, copied from django.contrib.auth.views.login
@@ -125,7 +169,8 @@ class LoginView(_FormView, CaptchableView):
after_login_callback = None
def setup_attrs(self, **kwargs):
- self.redirect_to = self.request.REQUEST.get(self.redirect_field_name, self.redirect_to)
+ self.redirect_to = self.request.REQUEST.get(self.redirect_field_name,
+ self.redirect_to)
netloc = urlparse(self.redirect_to)[1]
if netloc and netloc != self.request.get_host():
@@ -145,7 +190,7 @@ def dispatch(self, request, *args, **kwargs):
def get(self, request, *args, **kwargs):
if self.request.user.is_authenticated() and \
- not self.allow_login_to_authenticated:
+ not self.allow_login_to_authenticated:
return HttpResponseRedirect(self.redirect_to)
if self.token is not None:
@@ -174,7 +219,7 @@ def get(self, request, *args, **kwargs):
def get_initial(self):
initial = super(LoginView, self).get_initial()
- initial.update({ self.redirect_field_name : self.redirect_to })
+ initial.update({self.redirect_field_name: self.redirect_to})
return initial
def get_form_class(self):
@@ -184,12 +229,14 @@ def get_form_class(self):
additional_fields = SortedDict()
# add input hidden for redirection
next_field = forms_fields.CharField(widget=forms_widgets.HiddenInput)
- additional_fields.update({ self.redirect_field_name: next_field })
+ additional_fields.update({self.redirect_field_name: next_field})
_maybe_add_captcha(self, additional_fields)
- return generic_formclass_factory([], fields_uniqueness=self.formfields_uniqueness,
- bases=[self.authentication_form_class],
+ uniqueness = self.formfields_uniqueness
+ base = self.authentication_form_class
+ return generic_formclass_factory([], fields_uniqueness=uniqueness,
+ bases=[base],
sorted_fields=additional_fields)
## POST related mathod
@@ -224,12 +271,14 @@ def form_invalid(self, form):
self.current_app = self.model.__name__.lower()
context = self.get_context_data(**{'form': form,
- self.redirect_field_name: self.redirect_to,
+ self.redirect_field_name:
+ self.redirect_to,
'site': current_site,
'site_name': current_site.name})
return TemplateResponse(self.request, self.template_name, context,
current_app=self.current_app)
+
class UpdateView(_UpdateView, CaptchableView):
model = _get_model_from_auth_profile_module()
slug = None
@@ -253,23 +302,25 @@ def get_form_class(self):
super_form_k = super(UpdateView, self).get_form_class()
super_form_k.base_fields = {}
- form_k = generic_formclass_factory([], sorted_fields=self.user_change_form_class.base_fields,
+ _sorted_fields = self.user_change_form_class.base_fields
+ _uniqueness = self.formfields_uniqueness
+ form_k = generic_formclass_factory([], sorted_fields=_sorted_fields,
prepend_fields=True,
- fields_uniqueness=self.formfields_uniqueness,
+ fields_uniqueness=_uniqueness,
bases=[super_form_k])
_exclude_formfields = self.exclude_formfields[:]
if self.additional_exclude_formfields is not None:
_exclude_formfields += self.additional_exclude_formfields[:]
for k in _exclude_formfields:
- if form_k.base_fields.has_key(k):
+ if k in form_k.base_fields:
del form_k.base_fields[k]
if self.require_formfields is not None:
for k in self.require_formfields:
- if form_k.base_fields.has_key(k) and \
- hasattr(form_k.base_fields.has_key(k), 'required') and \
- not getattr(form_k.base_fields.has_key(k), 'required'):
+ if k in form_k.base_fields and \
+ hasattr(form_k.base_fields[k], 'required') and \
+ not getattr(form_k.base_fields[k], 'required'):
form_k.base_fields[k].required = True
_maybe_add_captcha(self, form_k.base_fields)
@@ -277,30 +328,33 @@ def get_form_class(self):
return form_k
def get_initial(self):
- if self.object is None: return {}
+ if self.object is None:
+ return {}
initial = {}
rel_fields = []
for f in self.object._meta.fields:
if f.rel:
rel_fields.insert(0, f)
continue
- initial.update({ f.name : getattr(self.object, f.name) })
+ initial.update({f.name: getattr(self.object, f.name)})
## Too much invasive, should respect concrete model properties.
- ## Also have to prefix according with get_form_class / generic_formclass_factory
+ ## Also have to prefix according with
+ ## get_form_class / generic_formclass_factory
for rel_f in rel_fields:
related_obj = getattr(self.object, rel_f.name)
for f in related_obj._meta.fields:
- if initial.has_key(f.name):
- initial.update({ rel_f.name + "_" + f.name : getattr(related_obj, f.name) })
+ if f.name in initial:
+ initial.update({rel_f.name + "_" + f.name:
+ getattr(related_obj, f.name)})
else:
- initial.update({ f.name : getattr(related_obj, f.name) })
+ initial.update({f.name: getattr(related_obj, f.name)})
return initial
def get_object(self, queryset=None):
if self.model is None:
self.model = _get_model_from_auth_profile_module()
try:
- account = self.model.objects.get(**{ self.slug_field : self.slug })
+ account = self.model.objects.get(**{self.slug_field: self.slug})
except (self.model.DoesNotExist, AttributeError):
account = None
### TODO: rewite in a simpler way
@@ -309,7 +363,7 @@ def get_object(self, queryset=None):
except (self.model.DoesNotExist, AttributeError):
current_account = None
if (self.request.user.is_superuser and self.slug) or \
- (current_account is not None) and (account == current_account):
+ (current_account is not None) and (account == current_account):
return account
try:
return self.request.user.get_profile()
@@ -319,19 +373,23 @@ def get_object(self, queryset=None):
## POST related method
def form_valid(self, form):
### TODO: put interesting fields in an instance variable list
- if self.object is None: return redirect_to_login(self.request.path)
+ if self.object is None:
+ return redirect_to_login(self.request.path)
if form.has_changed():
for k, v in form.data.items():
if not k in form.changed_data:
continue
- if k in [f.name for f in self.model._meta.fields if not f.name in ['id', 'pk', 'user', 'user_id']]:
+ if k in [f.name for f in self.model._meta.fields
+ if not f.name in ['id', 'pk', 'user', 'user_id']]:
setattr(self.object, k, v)
- elif k in [f.name for f in self.object.user._meta.fields if not f.name in ['id', 'pk']]:
+ elif k in [f.name for f in self.object.user._meta.fields
+ if not f.name in ['id', 'pk']]:
setattr(self.object.user, k, v)
self.object.save()
_try_callback(self, 'after_update_profile_callback')
return HttpResponseRedirect(self.get_success_url())
+
class SignupView(_CreateView, GenericProtectedUncacheableView, CaptchableView):
model = _get_model_from_auth_profile_module()
template_name = "registration/signup_as_ul.html"
@@ -356,21 +414,22 @@ def get_form_class(self):
return super(SignupView, self).get_form_class()
super_form_k = super(SignupView, self).get_form_class()
+ _uniqueness = self.formfields_uniqueness
form_k = generic_formclass_factory([super_form_k, User],
- fields_uniqueness=self.formfields_uniqueness,
+ fields_uniqueness=_uniqueness,
bases=[self.user_create_form_class])
_exclude_formfields = self.exclude_formfields[:]
if self.additional_exclude_formfields is not None:
_exclude_formfields += self.additional_exclude_formfields[:]
for k in _exclude_formfields:
- if form_k.base_fields.has_key(k):
+ if k in form_k.base_fields:
del form_k.base_fields[k]
if self.require_formfields is not None:
for k in self.require_formfields:
- if form_k.base_fields.has_key(k) and \
- hasattr(form_k.base_fields[k], 'required') and \
- not getattr(form_k.base_fields[k], 'required'):
+ if k in form_k.base_fields and \
+ hasattr(form_k.base_fields[k], 'required') and \
+ not getattr(form_k.base_fields[k], 'required'):
form_k.base_fields[k].required = True
_maybe_add_captcha(self, form_k.base_fields)
@@ -383,17 +442,19 @@ def form_valid(self, form):
password=form.data['password1'],
email=form.data.get('email', None))
# consume username, password1 password2, email pk id user
- _user_related_to_consume = ['username', 'password1', 'password2', 'email', 'password']
+ _user_related_to_consume = ['username', 'password1', 'password2',
+ 'email', 'password']
_user_related_to_consume += ['last_login', 'date_joined']
_consume_formfields(form_keys, *_user_related_to_consume)
if self.model is None:
self.model = _get_model_from_auth_profile_module()
account_kwargs = {}
- _model_field_names = [f.name for f in self.model._meta.fields if not f.name in ['pk', 'id', 'user']]
+ _model_field_names = [f.name for f in self.model._meta.fields
+ if not f.name in ['pk', 'id', 'user']]
_consume_formfields(form_keys, 'pk', 'id', 'user')
for fname in form_keys[:]:
if fname in _model_field_names:
- account_kwargs.update({ fname : form.data[fname] })
+ account_kwargs.update({fname: form.data[fname]})
_consume_formfields(form_keys, fname)
try:
self.object = new_user.get_profile()
@@ -401,11 +462,12 @@ def form_valid(self, form):
self.object = self.model(user=new_user, **account_kwargs)
self.object.save()
else:
- rows = self.model.objects.filter(pk=self.object.pk).update(**account_kwargs)
+ rows = self.model.objects\
+ .filter(pk=self.object.pk).update(**account_kwargs)
assert(rows == 1 or rows == len(account_kwargs) == 0)
have_to_save = False
- if bool(form_keys): # remain some keys try them over User model
+ if bool(form_keys): # remain some keys try them over User model
for k in form_keys[:]:
if hasattr(new_user, k):
have_to_save = True
@@ -421,7 +483,8 @@ def form_valid(self, form):
logger.warning("remain some unused form fields: %s", form_keys)
if self.login_after_signup and new_user.is_active:
- u = authenticate(username=form.data['username'], password=form.data['password1'])
+ u = authenticate(username=form.data['username'],
+ password=form.data['password1'])
auth_login(self.request, u)
self.new_user = new_user
@@ -429,7 +492,9 @@ def form_valid(self, form):
delattr(self, 'new_user')
return HttpResponseRedirect(self.get_success_url())
-class ChangePasswordView(_FormView, GenericProtectedUncacheableView, CaptchableView):
+
+class ChangePasswordView(_FormView, GenericProtectedUncacheableView,
+ CaptchableView):
model = _get_model_from_auth_profile_module()
slug = None
slug_field = 'id'
@@ -448,14 +513,16 @@ def get_form_class(self):
return self.password_change_form_class
def get_form(self, form_class):
- logger.debug("Form for current user: %s", form_class(self.request.user).as_p())
+ logger.debug("Form for current user: %s",
+ form_class(self.request.user).as_p())
if self.slug is None:
return form_class(self.request.user, **self.get_form_kwargs())
if self.model is None:
self.model = _get_model_from_auth_profile_module()
try:
- account = self.model.objects.get(**{ self.slug_field : self.slug })
- if not (self.request.user.is_superuser or self.request.user == account.user):
+ account = self.model.objects.get(**{self.slug_field: self.slug})
+ if not (self.request.user.is_superuser or
+ self.request.user == account.user):
account = self.request.user.get_profile()
except (self.model.DoesNotExist, AttributeError):
return form_class(self.request.user, **self.get_form_kwargs())
@@ -471,6 +538,7 @@ def form_valid(self, form):
_try_callback(self, 'after_change_password_callback')
return TemplateResponse(self.request, self.change_done_template_name)
+
class ForgotPasswordView(_FormView, CaptchableView):
success_template_name = 'account/forgot_psw_ok.html'
send_mail_type_name = 'forgot password'
@@ -492,7 +560,7 @@ def setup_attrs(self, **kwargs):
def get_initial(self):
if self.request.user.is_authenticated():
- return {'email' : self.request.user.email }
+ return {'email': self.request.user.email}
return {}
def get_form_class(self):
@@ -500,13 +568,14 @@ def get_form_class(self):
## here, from link in email sent yet
return generic_formclass_factory(AdminPasswordChangeForm)
if self.request.user.is_authenticated() and \
- not self.authenticated_goto_change_password:
+ not self.authenticated_goto_change_password:
return generic_formclass_factory(AdminPasswordChangeForm)
## token is None, ask for email to send
return generic_formclass_factory(PasswordResetForm)
def form_valid(self, form):
- if self.token is not None and isinstance(form, AdminPasswordChangeForm):
+ if self.token is not None and \
+ isinstance(form, AdminPasswordChangeForm):
### form is valid, password1 and password2 are the same
self.request.user.set_password(form.cleaned_data['password1'])
self.request.user.save()
@@ -516,19 +585,22 @@ def form_valid(self, form):
try:
for_user = User.objects.get(**form.cleaned_data)
except User.DoesNotExist:
- _err_ = _("No user with this e-mail. Are you registered ?")
- form._errors[forms_forms.NON_FIELD_ERRORS] = form.error_class([_err_])
+ err = _("No user with this e-mail. Are you registered ?")
+ form._errors[forms_forms.NON_FIELD_ERRORS] = \
+ form.error_class([err])
except User.MultipleObjectsReturned:
- _err_ = _("More users with this e-mail. Are you registered more times ? "
- "Contacts the site administrator, please")
- form._errors[forms_forms.NON_FIELD_ERRORS] = form.error_class([_err_])
+ err = _("More users with this e-mail. "
+ "Are you registered more times ? "
+ "Contacts the site administrator, please")
+ form._errors[forms_forms.NON_FIELD_ERRORS] = \
+ form.error_class([err])
if form.is_valid():
try:
fullname = for_user.get_profile().fullname
except:
fullname = "%s %s" % (for_user.first_name, for_user.last_name)
- context = { 'fullname': fullname, 'username': for_user.username }
+ context = {'fullname': fullname, 'username': for_user.username}
if self.use_db_for_token:
if self.use_expirable_token:
token = make_random_expirable_token()
@@ -540,42 +612,53 @@ def form_valid(self, form):
token = default_token_generator.make_token(for_user)
## we have to send an email using SendMail
- context.update({ 'protocol': self.protocol_for_link,
- 'domain': get_current_site(self.request).domain,
- 'site_name': get_current_site(self.request).name })
+ context.update({
+ 'protocol': self.protocol_for_link,
+ 'domain': get_current_site(self.request).domain,
+ 'site_name': get_current_site(self.request).name
+ })
_linkpath = "%s%s/" % (reverse(self.named_url), token)
- context.update({ 'resetpasswordlinkpath': _linkpath })
- _link = "%s://%s%s" % (context['protocol'], context['domain'], context['resetpasswordlinkpath'])
- context.update({'link' : _link })
- context_for_mail = { 'type': self.send_mail_type_name,
- 'mailto': [for_user.email],
- 'smtp_host': getattr(settings, 'EMAIL_HOST', 'localhost') }
- context_for_mail.update({ for_user.email : context })
+ context.update({'resetpasswordlinkpath': _linkpath})
+ _link = "%s://%s%s" % (context['protocol'],
+ context['domain'],
+ context['resetpasswordlinkpath'])
+ context.update({'link': _link})
+ context_for_mail = {'type': self.send_mail_type_name,
+ 'mailto': [for_user.email],
+ 'smtp_host': getattr(settings,
+ 'EMAIL_HOST',
+ 'localhost')}
+ context_for_mail.update({for_user.email: context})
nsent = 0
try:
nsent = SendTypeMail(context_for_mail)
except ObjectDoesNotExist, exc:
logger.critical("SendMail of type '%s', does not exist: %s",
- self.send_mail_type_name, exc)
- context.update({'nsent':nsent})
- return TemplateResponse(self.request, self.success_template_name, context=context)
+ self.send_mail_type_name, exc)
+ context.update({'nsent': nsent})
+ return TemplateResponse(self.request,
+ self.success_template_name,
+ context=context)
## which user have this mail ??? retry !
return self.form_invalid(form)
def get(self, request, *args, **kw):
# if user is authenticated ??? redirect to change password
if self.request.user.is_authenticated() and \
- self.authenticated_goto_change_password:
- return HttpResponseRedirect(reverse(self.change_password_named_url))
+ self.authenticated_goto_change_password:
+ _reversed = reverse(self.change_password_named_url)
+ return HttpResponseRedirect(_reversed)
if self.token is not None:
user = authenticate(token=self.token)
if user is not None:
if user.is_active:
auth_login(self.request, user)
- logger.debug("Forgot: auth via token OK! -- delete: %s use_db: %s",
- self.delete_token_after_use, self.use_db_for_token)
+ logger.debug("Forgot: auth via token OK! -"
+ "- delete: %s use_db: %s",
+ self.delete_token_after_use,
+ self.use_db_for_token)
else:
self.inactive_user = user
@@ -600,6 +683,7 @@ def get(self, request, *args, **kw):
delattr(self, 'inactive_user')
return super(ForgotPasswordView, self).get(request, *args, **kw)
+
################## Without Form Views
class LogoutView(_TemplateView, GenericUtilView):
"""
@@ -637,19 +721,21 @@ def get(self, request, *args, **kwargs):
# Redirect to this page until the session has been cleared.
return HttpResponseRedirect(self.next_page or self.request.path)
+
class DetailView(_DetailView, GenericUtilView):
slug_field = 'pk'
- def get_object(self):
+ def get_object(self, queyset=None):
if self.model is None:
self.model = _get_model_from_auth_profile_module()
- if self.kwargs.get('slug', None) is None and self.request.user.is_authenticated():
+ if self.kwargs.get('slug', None) is None and \
+ self.request.user.is_authenticated():
try:
return self.request.user.get_profile()
except (self.model.DoesNotExist, AttributeError):
return None
try:
- return self.model.objects.get(**{ self.slug_field : self.kwargs.get('slug', None) })
+ return self.model.objects.get(**{self.slug_field:
+ self.kwargs.get('slug', None)})
except:
return None
-
View
28 django/contrib/aderit/generic_utils/__init__.py
@@ -1,2 +1,28 @@
-__doc__ = '''Django Contrib Aderit, generic utilities in aderit web development.'''
+# -*- coding: utf-8 -*-
+# vim: set fileencoding=utf-8 :
+
+# django.contrib.aderit.generic_utils -- python module for generic utilities
+#
+# Copyright (C) 2012 Aderit srl
+#
+# Author: Marco Bardelli <marco.bardelli@aderit.it>, <bardelli.marco@gmail.com>
+#
+# This file is part of DjangoContribAderit.
+#
+# DjangoContribAderit is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# DjangoContribAderit 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with DjangoContribAderit. If not, see <http://www.gnu.org/licenses/>.
+
+'''Django Contrib Aderit, generic utilities in aderit web development.'''