From 1d342b7a92ce8b74e0a594cf84d38522c7e07440 Mon Sep 17 00:00:00 2001 From: trow Date: Fri, 1 May 2009 01:09:11 -0500 Subject: [PATCH] Initial import of chirpradio into Hg. This code was previously in CHIRP's private svn repository. --- COPYING | 202 + README | 104 + __init__.py | 0 app.yaml | 16 + appengine_django/__init__.py | 537 + appengine_django/auth/__init__.py | 25 + appengine_django/auth/decorators.py | 31 + appengine_django/auth/middleware.py | 36 + appengine_django/auth/models.py | 172 + appengine_django/auth/templatetags.py | 62 + appengine_django/auth/tests.py | 58 + .../conf/app_template/__init__.py | 0 appengine_django/conf/app_template/models.py | 4 + appengine_django/conf/app_template/views.py | 1 + appengine_django/db/__init__.py | 20 + appengine_django/db/base.py | 150 + appengine_django/db/creation.py | 37 + appengine_django/mail.py | 93 + appengine_django/management/__init__.py | 0 .../management/commands/__init__.py | 0 .../management/commands/console.py | 49 + appengine_django/management/commands/flush.py | 36 + appengine_django/management/commands/reset.py | 32 + .../management/commands/rollback.py | 52 + .../management/commands/runserver.py | 77 + .../management/commands/startapp.py | 43 + .../management/commands/testserver.py | 71 + .../management/commands/update.py | 51 + .../management/commands/vacuum_indexes.py | 52 + appengine_django/models.py | 176 + appengine_django/replacement_imp.py | 26 + appengine_django/serializer/__init__.py | 0 appengine_django/serializer/python.py | 130 + appengine_django/serializer/xml.py | 147 + appengine_django/sessions/__init__.py | 0 .../sessions/backends/__init__.py | 0 appengine_django/sessions/backends/db.py | 82 + appengine_django/sessions/models.py | 22 + appengine_django/tests/__init__.py | 56 + appengine_django/tests/commands_test.py | 183 + appengine_django/tests/core_test.py | 37 + appengine_django/tests/db_test.py | 62 + appengine_django/tests/memcache_test.py | 43 + appengine_django/tests/model_test.py | 110 + appengine_django/tests/serialization_test.py | 313 + auth/__init__.py | 200 + auth/decorators.py | 65 + auth/forms.py | 151 + auth/middleware.py | 51 + auth/models.py | 113 + auth/roles.py | 31 + auth/tests.py | 335 + auth/urls.py | 44 + auth/views.py | 284 + common/__init__.py | 0 common/context_processors.py | 12 + common/decorators.py | 25 + django-extras/README | 5 + django-extras/__init__.py | 0 django-extras/_monkey_patch.py | 40 + django-extras/contrib/__init__.py | 0 django-extras/contrib/auth/__init__.py | 15 + django-extras/foo.py | 0 django.zip | Bin 0 -> 516844 bytes landing_page/__init__.py | 0 landing_page/views.py | 13 + main.py | 59 + manage.py | 38 + media/common/css/base.css | 3 + .../jquery-autocomplete/autocomplete_docs.txt | 153 + .../jquery.autocomplete.css | 46 + .../jquery.autocomplete.js | 502 + media/ext_js/jquery-ui-themeroller/demo.html | 318 + .../jquery-ui-themeroller/jquery-1.3.1.js | 4241 ++++++++ .../jquery-ui-themeroller/jquery.ui.all.js | 8970 +++++++++++++++++ .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../theme/images/ui-icons_222222_256x240.png | Bin 0 -> 4379 bytes .../theme/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4379 bytes .../theme/images/ui-icons_454545_256x240.png | Bin 0 -> 4379 bytes .../theme/images/ui-icons_888888_256x240.png | Bin 0 -> 4379 bytes .../theme/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4379 bytes .../theme/ui.accordion.css | 9 + .../jquery-ui-themeroller/theme/ui.all.css | 2 + .../jquery-ui-themeroller/theme/ui.base.css | 9 + .../jquery-ui-themeroller/theme/ui.core.css | 37 + .../theme/ui.datepicker.css | 62 + .../jquery-ui-themeroller/theme/ui.dialog.css | 13 + .../theme/ui.progressbar.css | 4 + .../theme/ui.resizable.css | 13 + .../jquery-ui-themeroller/theme/ui.slider.css | 17 + .../jquery-ui-themeroller/theme/ui.tabs.css | 9 + .../jquery-ui-themeroller/theme/ui.theme.css | 243 + .../ext_js/jquery-ui-themeroller/ui_demos.js | 42 + media/ext_js/jquery/jquery-1.2.6.js | 3549 +++++++ media/ext_js/jquery/jquery-1.3.1.js | 4241 ++++++++ .../ext_js/jquery/plugins/jquery.simulate.js | 152 + media/ext_js/jquery/qunit/testrunner.js | 780 ++ media/ext_js/jquery/qunit/testsuite.css | 120 + media/volunteers/css/claim_tasks.css | 18 + media/volunteers/js/chirp.js | 53 + media/volunteers/js/claim_tasks.js | 30 + media/volunteers/js/claim_tasks_stub_urls.js | 23 + media/volunteers/js/meetings.js | 148 + media/volunteers/js/meetings_stub_urls.js | 70 + media/volunteers/js/meetings_test.js | 90 + settings.py | 110 + templates/auth/change_password.html | 16 + templates/auth/forgot_password.html | 19 + templates/auth/forgot_password_email.txt | 8 + templates/auth/hello.html | 29 + templates/auth/list_users.html | 25 + templates/auth/main_page.html | 32 + templates/auth/reset_password.html | 16 + templates/auth/user_form.html | 20 + templates/common/base.html | 40 + templates/landing_page/landing_page.html | 11 + urls.py | 42 + volunteers/__init__.py | 2 + volunteers/_ui_test_/__init__.py | 0 volunteers/_ui_test_/claim_tasks.py | 97 + volunteers/_ui_test_/meetings.py | 36 + volunteers/admin.py | 133 + volunteers/fixtures/initial_data.json | 103 + volunteers/forms.py | 81 + volunteers/models.py | 231 + volunteers/templatetags/__init__.py | 0 volunteers/templatetags/volunteers_extras.py | 124 + volunteers/tests/__init__.py | 5 + volunteers/tests/base.py | 34 + volunteers/tests/fixtures/event_tasks.json | 422 + volunteers/tests/fixtures/meetings.json | 9 + volunteers/tests/fixtures/tasks.json | 23 + volunteers/tests/fixtures/users.json | 92 + volunteers/tests/fixtures/volunteers.json | 28 + volunteers/tests/test_coord_admin.py | 110 + volunteers/tests/test_meeting_attendance.py | 82 + volunteers/tests/test_volunteer_actions.py | 177 + volunteers/tests/test_volunteer_extras.py | 50 + volunteers/urls.py | 33 + volunteers/views.py | 163 + 147 files changed, 31249 insertions(+) create mode 100644 COPYING create mode 100644 README create mode 100644 __init__.py create mode 100644 app.yaml create mode 100644 appengine_django/__init__.py create mode 100644 appengine_django/auth/__init__.py create mode 100644 appengine_django/auth/decorators.py create mode 100644 appengine_django/auth/middleware.py create mode 100644 appengine_django/auth/models.py create mode 100644 appengine_django/auth/templatetags.py create mode 100644 appengine_django/auth/tests.py create mode 100644 appengine_django/conf/app_template/__init__.py create mode 100644 appengine_django/conf/app_template/models.py create mode 100644 appengine_django/conf/app_template/views.py create mode 100755 appengine_django/db/__init__.py create mode 100755 appengine_django/db/base.py create mode 100755 appengine_django/db/creation.py create mode 100644 appengine_django/mail.py create mode 100755 appengine_django/management/__init__.py create mode 100755 appengine_django/management/commands/__init__.py create mode 100755 appengine_django/management/commands/console.py create mode 100755 appengine_django/management/commands/flush.py create mode 100755 appengine_django/management/commands/reset.py create mode 100755 appengine_django/management/commands/rollback.py create mode 100755 appengine_django/management/commands/runserver.py create mode 100644 appengine_django/management/commands/startapp.py create mode 100755 appengine_django/management/commands/testserver.py create mode 100755 appengine_django/management/commands/update.py create mode 100755 appengine_django/management/commands/vacuum_indexes.py create mode 100755 appengine_django/models.py create mode 100644 appengine_django/replacement_imp.py create mode 100755 appengine_django/serializer/__init__.py create mode 100755 appengine_django/serializer/python.py create mode 100755 appengine_django/serializer/xml.py create mode 100644 appengine_django/sessions/__init__.py create mode 100644 appengine_django/sessions/backends/__init__.py create mode 100644 appengine_django/sessions/backends/db.py create mode 100644 appengine_django/sessions/models.py create mode 100644 appengine_django/tests/__init__.py create mode 100755 appengine_django/tests/commands_test.py create mode 100755 appengine_django/tests/core_test.py create mode 100755 appengine_django/tests/db_test.py create mode 100644 appengine_django/tests/memcache_test.py create mode 100755 appengine_django/tests/model_test.py create mode 100755 appengine_django/tests/serialization_test.py create mode 100644 auth/__init__.py create mode 100644 auth/decorators.py create mode 100644 auth/forms.py create mode 100644 auth/middleware.py create mode 100644 auth/models.py create mode 100644 auth/roles.py create mode 100644 auth/tests.py create mode 100644 auth/urls.py create mode 100644 auth/views.py create mode 100644 common/__init__.py create mode 100644 common/context_processors.py create mode 100644 common/decorators.py create mode 100644 django-extras/README create mode 100644 django-extras/__init__.py create mode 100644 django-extras/_monkey_patch.py create mode 100644 django-extras/contrib/__init__.py create mode 100644 django-extras/contrib/auth/__init__.py create mode 100644 django-extras/foo.py create mode 100644 django.zip create mode 100644 landing_page/__init__.py create mode 100644 landing_page/views.py create mode 100755 main.py create mode 100755 manage.py create mode 100644 media/common/css/base.css create mode 100644 media/ext_js/jquery-autocomplete/autocomplete_docs.txt create mode 100644 media/ext_js/jquery-autocomplete/jquery.autocomplete.css create mode 100644 media/ext_js/jquery-autocomplete/jquery.autocomplete.js create mode 100755 media/ext_js/jquery-ui-themeroller/demo.html create mode 100755 media/ext_js/jquery-ui-themeroller/jquery-1.3.1.js create mode 100755 media/ext_js/jquery-ui-themeroller/jquery.ui.all.js create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-bg_flat_75_ffffff_40x100.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-bg_glass_65_ffffff_1x400.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-bg_glass_75_dadada_1x400.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-icons_222222_256x240.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-icons_2e83ff_256x240.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-icons_454545_256x240.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-icons_888888_256x240.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/images/ui-icons_cd0a0a_256x240.png create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.accordion.css create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.all.css create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.base.css create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.core.css create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.datepicker.css create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.dialog.css create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.progressbar.css create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.resizable.css create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.slider.css create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.tabs.css create mode 100755 media/ext_js/jquery-ui-themeroller/theme/ui.theme.css create mode 100755 media/ext_js/jquery-ui-themeroller/ui_demos.js create mode 100644 media/ext_js/jquery/jquery-1.2.6.js create mode 100755 media/ext_js/jquery/jquery-1.3.1.js create mode 100644 media/ext_js/jquery/plugins/jquery.simulate.js create mode 100644 media/ext_js/jquery/qunit/testrunner.js create mode 100644 media/ext_js/jquery/qunit/testsuite.css create mode 100644 media/volunteers/css/claim_tasks.css create mode 100644 media/volunteers/js/chirp.js create mode 100644 media/volunteers/js/claim_tasks.js create mode 100644 media/volunteers/js/claim_tasks_stub_urls.js create mode 100644 media/volunteers/js/meetings.js create mode 100644 media/volunteers/js/meetings_stub_urls.js create mode 100644 media/volunteers/js/meetings_test.js create mode 100644 settings.py create mode 100644 templates/auth/change_password.html create mode 100644 templates/auth/forgot_password.html create mode 100644 templates/auth/forgot_password_email.txt create mode 100644 templates/auth/hello.html create mode 100644 templates/auth/list_users.html create mode 100644 templates/auth/main_page.html create mode 100644 templates/auth/reset_password.html create mode 100644 templates/auth/user_form.html create mode 100644 templates/common/base.html create mode 100644 templates/landing_page/landing_page.html create mode 100644 urls.py create mode 100644 volunteers/__init__.py create mode 100644 volunteers/_ui_test_/__init__.py create mode 100644 volunteers/_ui_test_/claim_tasks.py create mode 100644 volunteers/_ui_test_/meetings.py create mode 100644 volunteers/admin.py create mode 100644 volunteers/fixtures/initial_data.json create mode 100644 volunteers/forms.py create mode 100644 volunteers/models.py create mode 100644 volunteers/templatetags/__init__.py create mode 100644 volunteers/templatetags/volunteers_extras.py create mode 100644 volunteers/tests/__init__.py create mode 100644 volunteers/tests/base.py create mode 100644 volunteers/tests/fixtures/event_tasks.json create mode 100644 volunteers/tests/fixtures/meetings.json create mode 100644 volunteers/tests/fixtures/tasks.json create mode 100644 volunteers/tests/fixtures/users.json create mode 100644 volunteers/tests/fixtures/volunteers.json create mode 100644 volunteers/tests/test_coord_admin.py create mode 100644 volunteers/tests/test_meeting_attendance.py create mode 100644 volunteers/tests/test_volunteer_actions.py create mode 100644 volunteers/tests/test_volunteer_extras.py create mode 100644 volunteers/urls.py create mode 100644 volunteers/views.py diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/COPYING @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README b/README new file mode 100644 index 0000000..bea0a22 --- /dev/null +++ b/README @@ -0,0 +1,104 @@ + +This is the code for CHIRP's internal web applications. The apps are +hosted on Google's App Engine, under the 'chirpradio' project. + +For the chirpradio developer dashboard, go to: +http://appengine.google.com/dashboard?&app_id=chirpradio + +For the end-user landing page, go to: +http://chirpradio.appspot.com/ + +Helpful documentation: + +* App Engine Python API + http://code.google.com/appengine/docs/python/ + +* Django 1.0: + http://www.djangobook.com/en/2.0/ + Be sure you are looking at the right version of the book! We are using + version 1.0. + + +CODING CONVENTIONS +================== + +Please follow the conventions outlined in PEP 8. + + +OVERVIEW OF THE TREE +==================== + +There are part of the common infrastructure. + djzango.zip + Django 1.0.2-final, zipped up. We never want to change this. + appengine_django/ + From google-app-engine-django, AppEngine helper & glue code. + common/ + Code & data shared by all apps. + django-extras/ + A tree that is merged into the django namespace. We put our own + glue code here. This should be kept small and simple. + __init__.py + main.py + manage.py + Launchers for Django. + settings.py + Global configuration for Django. + urls.py + Main URL file. + auth/ + Our own custom authentication & account management system. + media/ext_js/[package name] + External third-party Javascript packages (like JQuery) live under this + directory. + +These are places where all applications store data. + media/[application name]/{js, css, img}/ + templates/[application name]/ + +These are applications that are running in production. + (None so far) + +These are applications that are under development. + landing_page/ + Where you end up when you go to "/". Currently a test page. + volunteers/ + Volunteer tracking. + + +ADDING A NEW APPLICATION +======================== + +Every application has a name that looks like this: "landing_page". +Your code lives in a directory with the same name. +Your templates go under the directory templates/[application name]. +Your media files go under the directory media/[application name]. + +All of your URLs are automatically mapped to be under +http://host/volunteers/my/url + +To make your URLs visible, you need to: +(1) Update the top-level urls.py to include your urls. +(2) Add your application to INSTALLED_APPS in settings.py. + + +THIRD-PARTY CODE +================ + +Some of the files in this directory and all of files under the +appengine_django/ subdirectory are based on rev 81 of the +google-app-engine-django Subversion repository. + +All files in django.zip are taken from Django 1.0.2-final. It was +constructed by running the following commands: + +zip -r django.zip django/__init__.py django/bin django/core \ + django/db django/dispatch django/forms \ + django/http django/middleware django/shortcuts \ + django/template django/templatetags \ + django/test django/utils django/views + +zip -r django.zip django/conf -x 'django/conf/locale/*' + +These commands were taken from +http://code.google.com/appengine/articles/django10_zipimport.html \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app.yaml b/app.yaml new file mode 100644 index 0000000..a68d254 --- /dev/null +++ b/app.yaml @@ -0,0 +1,16 @@ +application: chirpradio +version: 1 +runtime: python +api_version: 1 + +handlers: +- url: /static + static_dir: static + +# Always use HTTPS for pages related to authentication & user management +- url: /auth/.* + secure: always + script: main.py + +- url: /.* + script: main.py diff --git a/appengine_django/__init__.py b/appengine_django/__init__.py new file mode 100644 index 0000000..fce03b9 --- /dev/null +++ b/appengine_django/__init__.py @@ -0,0 +1,537 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Support for integrating a Django project with the appengine infrastructure. + +This requires Django 1.0beta1 or greater. + +This module enables you to use the Django manage.py utility and *some* of it's +subcommands. View the help of manage.py for exact details. + +Additionally this module takes care of initialising the datastore (and a test +datastore) so that the Django test infrastructure can be used for your +appengine project. + +To use this module add the following two lines to your main.py and manage.py +scripts at the end of your imports: + from appengine_django import InstallAppengineHelperForDjango + InstallAppengineHelperForDjango() + +If you would like to use a version of Django other than that provided by the +system all you need to do is include it in a directory just above this helper, +eg: + appengine_django/__init__.py - This file + django/... - your private copy of Django. +""" + +import logging +import os +import re +import sys +import unittest +import zipfile + + +DIR_PATH = os.path.abspath(os.path.dirname(__file__)) +PARENT_DIR = os.path.dirname(DIR_PATH) +if PARENT_DIR.endswith(".zip"): + # Check for appengine_django itself being in a zipfile. + PARENT_DIR = os.path.dirname(PARENT_DIR) + +# Add this project to the start of sys path to enable direct imports. +sys.path = [PARENT_DIR,] + sys.path + +# Try to import the appengine code from the system path. +try: + from google.appengine.api import apiproxy_stub_map +except ImportError, e: + # Not on the system path. Build a list of alternative paths where it may be. + # First look within the project for a local copy, then look for where the Mac + # OS SDK installs it. + paths = [os.path.join(PARENT_DIR, '.google_appengine'), + os.path.join(PARENT_DIR, 'google_appengine'), + '/usr/local/google_appengine'] + # Then if on windows, look for where the Windows SDK installed it. + for path in os.environ.get('PATH', '').split(';'): + path = path.rstrip('\\') + if path.endswith('google_appengine'): + paths.append(path) + try: + from win32com.shell import shell + from win32com.shell import shellcon + id_list = shell.SHGetSpecialFolderLocation( + 0, shellcon.CSIDL_PROGRAM_FILES) + program_files = shell.SHGetPathFromIDList(id_list) + paths.append(os.path.join(program_files, 'Google', + 'google_appengine')) + except ImportError, e: + # Not windows. + pass + # Loop through all possible paths and look for the SDK dir. + SDK_PATH = None + for sdk_path in paths: + if os.path.exists(sdk_path): + SDK_PATH = os.path.realpath(sdk_path) + break + if SDK_PATH is None: + # The SDK could not be found in any known location. + sys.stderr.write("The Google App Engine SDK could not be found!\n") + sys.stderr.write("See README for installation instructions.\n") + sys.exit(1) + if SDK_PATH == os.path.join(PARENT_DIR, 'google_appengine'): + logging.warn('Loading the SDK from the \'google_appengine\' subdirectory ' + 'is now deprecated!') + logging.warn('Please move the SDK to a subdirectory named ' + '\'.google_appengine\' instead.') + logging.warn('See README for further details.') + # Add the SDK and the libraries within it to the system path. + EXTRA_PATHS = [ + SDK_PATH, + os.path.join(SDK_PATH, 'lib', 'antlr3'), + os.path.join(SDK_PATH, 'lib', 'django'), + os.path.join(SDK_PATH, 'lib', 'webob'), + os.path.join(SDK_PATH, 'lib', 'yaml', 'lib'), + ] + # Add SDK paths at the start of sys.path, but after the local directory which + # was added to the start of sys.path on line 50 above. The local directory + # must come first to allow the local imports to override the SDK and + # site-packages directories. + sys.path = sys.path[0:1] + EXTRA_PATHS + sys.path[1:] + from google.appengine.api import apiproxy_stub_map + +# Look for a zipped copy of Django. +have_django_zip = False +django_zip_path = os.path.join(PARENT_DIR, 'django.zip') +if os.path.exists(django_zip_path): + have_django_zip = True + sys.path.insert(1, django_zip_path) + +# Remove the standard version of Django if a local copy has been provided. +if have_django_zip or os.path.exists(os.path.join(PARENT_DIR, 'django')): + for k in [k for k in sys.modules if k.startswith('django')]: + del sys.modules[k] + +# Must set this env var *before* importing any more of Django. +os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' + +from django import VERSION +from django.conf import settings + +from google.appengine.api import yaml_errors + +# Flags made available this module +appid = None +have_appserver = False + +# Hide everything other than the flags above and the install function. +__all__ = ("appid", "have_appserver", "have_django_zip", + "django_zip_path", "InstallAppengineHelperForDjango") + + +INCOMPATIBLE_COMMANDS = ["adminindex", "createcachetable", "dbshell", + "inspectdb", "runfcgi", "syncdb", "validate"] + + +def LoadAppengineEnvironment(): + """Loads the appengine environment. + + Returns: + This function has no return value, but it sets the following parameters on + this package: + - appid: The name of the application. + - have_appserver: Boolean parameter which is True if the code is being run + from within the appserver environment. + """ + global appid, have_appserver + + # Detect if we are running under an appserver. + have_appserver = False + stub = apiproxy_stub_map.apiproxy.GetStub("datastore_v3") + if stub: + have_appserver = True + + # Load the application identifier. + if have_appserver: + appid = os.environ.get("APPLICATION_ID", "unknown") + else: + # Running as manage.py script, read from config file. + try: + from google.appengine.tools import dev_appserver + appconfig, unused_matcher = dev_appserver.LoadAppConfig(PARENT_DIR, {}) + appid = appconfig.application + except (ImportError, yaml_errors.EventListenerYAMLError), e: + logging.warn("Could not read the Application ID from app.yaml. " + "This may break things in unusual ways!") + # Something went wrong. + appid = "unknown" + + logging.debug("Loading application '%s' %s an appserver" % + (appid, have_appserver and "with" or "without")) + + +def InstallAppengineDatabaseBackend(): + """Installs the appengine database backend into Django. + + The appengine database lives in the db/ subdirectory of this package, but is + known as "appengine" to Django. This function installs the module where + Django expects to find its database backends. + """ + from appengine_django import db + sys.modules['django.db.backends.appengine'] = db + logging.debug("Installed appengine database backend") + + +def InstallGoogleMemcache(): + """Installs the Google memcache into Django. + + By default django tries to import standard memcache module. + Because appengine memcache is API compatible with Python memcache module, + we can trick Django to think it is installed and to use it. + + Now you can use CACHE_BACKEND = 'memcached://' in settings.py. IP address + and port number are not required. + """ + from google.appengine.api import memcache + sys.modules['memcache'] = memcache + logging.debug("Installed App Engine memcache backend") + + +def InstallDjangoModuleReplacements(): + """Replaces internal Django modules with App Engine compatible versions.""" + + # Replace the session module with a partial replacement overlay using + # __path__ so that portions not replaced will fall through to the original + # implementation. + try: + from django.contrib import sessions + orig_path = sessions.__path__[0] + sessions.__path__.insert(0, os.path.join(DIR_PATH, 'sessions')) + from django.contrib.sessions import backends + backends.__path__.append(os.path.join(orig_path, 'backends')) + except ImportError: + logging.debug("No Django session support available") + + # Replace incompatible dispatchers. + import django.core.signals + import django.db + import django.dispatch.dispatcher + + # Rollback occurs automatically on Google App Engine. Disable the Django + # rollback handler. + try: + # pre 1.0 + from django.dispatch import errors + CheckedException = errors.DispatcherKeyError + def _disconnectSignal(): + django.dispatch.dispatcher.disconnect( + django.db._rollback_on_exception, + django.core.signals.got_request_exception) + except ImportError: + CheckedException = KeyError + def _disconnectSignal(): + django.core.signals.got_request_exception.disconnect( + django.db._rollback_on_exception) + + try: + _disconnectSignal() + except CheckedException, e: + logging.debug("Django rollback handler appears to be already disabled.") + +def PatchDjangoSerializationModules(): + """Monkey patches the Django serialization modules. + + The standard Django serialization modules to not correctly handle the + datastore models provided by this package. This method installs replacements + for selected modules and methods to give Django the capability to correctly + serialize and deserialize datastore models. + """ + # These can't be imported until InstallAppengineDatabaseBackend has run. + from django.core.serializers import python + from appengine_django.serializer.python import Deserializer + if not hasattr(settings, "SERIALIZATION_MODULES"): + settings.SERIALIZATION_MODULES = {} + base_module = "appengine_django" + settings.SERIALIZATION_MODULES["xml"] = "%s.serializer.xml" % base_module + python.Deserializer = Deserializer + PatchDeserializedObjectClass() + DisableModelValidation() + logging.debug("Installed appengine json and python serialization modules") + + +def PatchDeserializedObjectClass(): + """Patches the DeserializedObject class. + + The default implementation calls save directly on the django Model base + class to avoid pre-save handlers. The model class provided by this package + is not derived from the Django Model class and therefore must be called + directly. + + Additionally we need to clear the internal _parent attribute as it may + contain a FakeParent class that is used to deserialize instances without + needing to load the parent instance itself. See the PythonDeserializer for + more details. + """ + # This can't be imported until InstallAppengineDatabaseBackend has run. + from django.core.serializers import base + class NewDeserializedObject(base.DeserializedObject): + def save(self, save_m2m=True): + self.object.save() + self.object._parent = None + base.DeserializedObject = NewDeserializedObject + logging.debug("Replacement DeserializedObject class installed") + +def DisableModelValidation(): + """Disables Django's model validation routines. + + The model validation is primarily concerned with validating foreign key + references. There is no equivalent checking code for datastore References at + this time. + + Validation needs to be disabled or serialization/deserialization will fail. + """ + from django.core.management import validation + validation.get_validation_errors = lambda x, y=0: 0 + logging.debug("Django SQL model validation disabled") + +def CleanupDjangoSettings(): + """Removes incompatible entries from the django settings module.""" + + # Ensure this module is installed as an application. + apps = getattr(settings, "INSTALLED_APPS", ()) + found = False + for app in apps: + if app.endswith("appengine_django"): + found = True + break + if not found: + logging.warn("appengine_django module is not listed as an application!") + apps += ("appengine_django",) + setattr(settings, "INSTALLED_APPS", apps) + logging.info("Added 'appengine_django' as an application") + + # Ensure the database backend is appropriately configured. + dbe = getattr(settings, "DATABASE_ENGINE", "") + if dbe != "appengine": + settings.DATABASE_ENGINE = "appengine" + logging.warn("DATABASE_ENGINE is not configured as 'appengine'. " + "Value overriden!") + for var in ["NAME", "USER", "PASSWORD", "HOST", "PORT"]: + val = getattr(settings, "DATABASE_%s" % var, "") + if val: + setattr(settings, "DATABASE_%s" % var, "") + logging.warn("DATABASE_%s should be blank. Value overriden!") + + # Remove incompatible middleware modules. + mw_mods = list(getattr(settings, "MIDDLEWARE_CLASSES", ())) + disallowed_middleware_mods = ( + 'django.middleware.doc.XViewMiddleware',) + for modname in mw_mods[:]: + if modname in disallowed_middleware_mods: + # Currently only the CommonMiddleware has been ported. As other base + # modules are converted, remove from the disallowed_middleware_mods + # tuple. + mw_mods.remove(modname) + logging.warn("Middleware module '%s' is not compatible. Removed!" % + modname) + setattr(settings, "MIDDLEWARE_CLASSES", tuple(mw_mods)) + + # Remove incompatible application modules + app_mods = list(getattr(settings, "INSTALLED_APPS", ())) + disallowed_apps = ( + 'django.contrib.contenttypes', + 'django.contrib.sites',) + for app in app_mods[:]: + if app in disallowed_apps: + app_mods.remove(app) + logging.warn("Application module '%s' is not compatible. Removed!" % app) + setattr(settings, "INSTALLED_APPS", tuple(app_mods)) + + # Remove incompatible session backends. + session_backend = getattr(settings, "SESSION_ENGINE", "") + if session_backend.endswith("file"): + logging.warn("File session backend is not compatible. Overriden " + "to use db backend!") + setattr(settings, "SESSION_ENGINE", "django.contrib.sessions.backends.db") + + +def ModifyAvailableCommands(): + """Removes incompatible commands and installs replacements where possible.""" + if have_appserver: + # Commands are not used when running from an appserver. + return + from django.core import management + project_directory = os.path.join(__path__[0], "../") + if have_django_zip: + FindCommandsInZipfile.orig = management.find_commands + management.find_commands = FindCommandsInZipfile + management.get_commands() + # Replace startapp command which is set by previous call to get_commands(). + from appengine_django.management.commands.startapp import ProjectCommand + management._commands['startapp'] = ProjectCommand(project_directory) + RemoveCommands(management._commands) + logging.debug("Removed incompatible Django manage.py commands") + + +def FindCommandsInZipfile(management_dir): + """ + Given a path to a management directory, returns a list of all the command + names that are available. + + This implementation also works when Django is loaded from a zip. + + Returns an empty list if no commands are defined. + """ + zip_marker = ".zip%s" % os.sep + if zip_marker not in management_dir: + return FindCommandsInZipfile.orig(management_dir) + + # Django is sourced from a zipfile, ask zip module for a list of files. + filename, path = management_dir.split(zip_marker) + zipinfo = zipfile.ZipFile("%s.zip" % filename) + + # Add commands directory to management path. + path = os.path.join(path, "commands") + + # The zipfile module returns paths in the format of the operating system + # that created the zipfile! This may not match the path to the zipfile + # itself. Convert operating system specific characters to a standard + # character (#) to compare paths to work around this. + path_normalise = re.compile(r"[/\\]") + path = path_normalise.sub("#", path) + def _IsCmd(t): + """Returns true if t matches the criteria for a command module.""" + filename = os.path.basename(t) + t = path_normalise.sub("#", t) + if not t.startswith(path): + return False + if filename.startswith("_") or not t.endswith(".py"): + return False + return True + + return [os.path.basename(f)[:-3] for f in zipinfo.namelist() if _IsCmd(f)] + + +def RemoveCommands(command_dict): + """Removes incompatible commands from the specified command dictionary.""" + for cmd in command_dict.keys(): + if cmd.startswith("sql"): + del command_dict[cmd] + elif cmd in INCOMPATIBLE_COMMANDS: + del command_dict[cmd] + + +def InstallReplacementImpModule(): + """Install a replacement for the imp module removed by the appserver. + + This is only to find mangement modules provided by applications. + """ + if not have_appserver: + return + modname = 'appengine_django.replacement_imp' + imp_mod = __import__(modname, {}, [], ['']) + sys.modules['imp'] = imp_mod + logging.debug("Installed replacement imp module") + + +def InstallAppengineHelperForDjango(): + """Installs and Patches all of the classes/methods required for integration. + + If the variable DEBUG_APPENGINE_DJANGO is set in the environment verbose + logging of the actions taken will be enabled. + """ + if VERSION < (1, 0, None): + logging.error("Django 1.0 or greater is required!") + sys.exit(1) + + if os.getenv("DEBUG_APPENGINE_DJANGO"): + logging.getLogger().setLevel(logging.DEBUG) + else: + logging.getLogger().setLevel(logging.INFO) + logging.debug("Loading the Google App Engine Helper for Django...") + + # Force Django to reload its settings. + settings._target = None + + LoadAppengineEnvironment() + InstallReplacementImpModule() + InstallAppengineDatabaseBackend() + InstallModelForm() + InstallGoogleMemcache() + InstallDjangoModuleReplacements() + PatchDjangoSerializationModules() + CleanupDjangoSettings() + ModifyAvailableCommands() + InstallGoogleSMTPConnection() + InstallAuthentication() + + logging.debug("Successfully loaded the Google App Engine Helper for Django.") + + +def InstallGoogleSMTPConnection(): + from appengine_django import mail as gmail + from django.core import mail + logging.debug("Installing Google Email Adapter for Django") + mail.SMTPConnection = gmail.GoogleSMTPConnection + mail.mail_admins = gmail.mail_admins + mail.mail_managers = gmail.mail_managers + + +def InstallAuthentication(): + if "django.contrib.auth" not in settings.INSTALLED_APPS: + return + try: + from appengine_django.auth import models as helper_models + from django.contrib.auth import models + models.User = helper_models.User + models.Group = helper_models.Group + models.Permission = helper_models.Permission + models.Message = helper_models.Message + from django.contrib.auth import middleware as django_middleware + from appengine_django.auth.middleware import AuthenticationMiddleware + django_middleware.AuthenticationMiddleware = AuthenticationMiddleware + from django.contrib.auth import decorators as django_decorators + from appengine_django.auth.decorators import login_required + django_decorators.login_required = login_required + from django.contrib import auth as django_auth + from django.contrib.auth import tests as django_tests + django_auth.suite = unittest.TestSuite + django_tests.suite = unittest.TestSuite + logging.debug("Installing authentication framework") + except ImportError: + logging.debug("No Django authentication support available") + + +def InstallModelForm(): + """Replace Django ModelForm with the AppEngine ModelForm.""" + # This MUST happen as early as possible, but after any auth model patching. + from google.appengine.ext.db import djangoforms as aeforms + try: + # pre 1.0 + from django import newforms as forms + except ImportError: + from django import forms + + forms.ModelForm = aeforms.ModelForm + + # Extend ModelForm with support for EmailProperty + # TODO: This should be submitted to the main App Engine SDK. + from google.appengine.ext.db import EmailProperty + def get_form_field(self, **kwargs): + """Return a Django form field appropriate for an email property.""" + defaults = {'form_class': forms.EmailField} + defaults.update(kwargs) + return super(EmailProperty, self).get_form_field(**defaults) + EmailProperty.get_form_field = get_form_field diff --git a/appengine_django/auth/__init__.py b/appengine_django/auth/__init__.py new file mode 100644 index 0000000..d2db207 --- /dev/null +++ b/appengine_django/auth/__init__.py @@ -0,0 +1,25 @@ +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Authentication module that mimics the behavior of Django's authentication +implementation. + +Limitations: + - all user permissions methods are not available (requires contenttypes) +""" + +from django.template import add_to_builtins + +add_to_builtins('appengine_django.auth.templatetags') diff --git a/appengine_django/auth/decorators.py b/appengine_django/auth/decorators.py new file mode 100644 index 0000000..d897c24 --- /dev/null +++ b/appengine_django/auth/decorators.py @@ -0,0 +1,31 @@ +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Decorators for the authentication framework.""" + +from django.http import HttpResponseRedirect + +from google.appengine.api import users + + +def login_required(function): + """Implementation of Django's login_required decorator. + + The login redirect URL is always set to request.path + """ + def login_required_wrapper(request, *args, **kw): + if request.user.is_authenticated(): + return function(request, *args, **kw) + return HttpResponseRedirect(users.create_login_url(request.path)) + return login_required_wrapper diff --git a/appengine_django/auth/middleware.py b/appengine_django/auth/middleware.py new file mode 100644 index 0000000..a727e47 --- /dev/null +++ b/appengine_django/auth/middleware.py @@ -0,0 +1,36 @@ +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from django.contrib.auth.models import AnonymousUser + +from google.appengine.api import users + +from appengine_django.auth.models import User + + +class LazyUser(object): + def __get__(self, request, obj_type=None): + if not hasattr(request, '_cached_user'): + user = users.get_current_user() + if user: + request._cached_user = User.get_djangouser_for_user(user) + else: + request._cached_user = AnonymousUser() + return request._cached_user + + +class AuthenticationMiddleware(object): + def process_request(self, request): + request.__class__.user = LazyUser() + return None diff --git a/appengine_django/auth/models.py b/appengine_django/auth/models.py new file mode 100644 index 0000000..d93e240 --- /dev/null +++ b/appengine_django/auth/models.py @@ -0,0 +1,172 @@ +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +App Engine compatible models for the Django authentication framework. +""" + +from django.core import mail +from django.core.exceptions import ImproperlyConfigured +from django.db import models +from django.utils.encoding import smart_str +import urllib + +from django.db.models.manager import EmptyManager + +from google.appengine.api import users +from google.appengine.ext import db + +from appengine_django.models import BaseModel + + +class User(BaseModel): + """A model with the same attributes and methods as a Django user model. + + The model has two additions. The first addition is a 'user' attribute which + references a App Engine user. The second is the 'get_djangouser_for_user' + classmethod that should be used to retrieve a DjangoUser instance from a App + Engine user object. + """ + user = db.UserProperty(required=True) + username = db.StringProperty(required=True) + first_name = db.StringProperty() + last_name = db.StringProperty() + email = db.EmailProperty() + password = db.StringProperty() + is_staff = db.BooleanProperty(default=False, required=True) + is_active = db.BooleanProperty(default=True, required=True) + is_superuser = db.BooleanProperty(default=False, required=True) + last_login = db.DateTimeProperty(auto_now_add=True, required=True) + date_joined = db.DateTimeProperty(auto_now_add=True, required=True) + groups = EmptyManager() + user_permissions = EmptyManager() + + def __unicode__(self): + return self.username + + def __str__(self): + return unicode(self).encode('utf-8') + + @classmethod + def get_djangouser_for_user(cls, user): + query = cls.all().filter("user =", user) + if query.count() == 0: + django_user = cls(user=user, email=user.email(), username=user.nickname()) + django_user.save() + else: + django_user = query.get() + return django_user + + def set_password(self, raw_password): + raise NotImplementedError + + def check_password(self, raw_password): + raise NotImplementedError + + def set_unusable_password(self): + raise NotImplementedError + + def has_usable_password(self): + raise NotImplementedError + + def get_group_permissions(self): + return self.user_permissions + + def get_all_permissions(self): + return self.user_permissions + + def has_perm(self, perm): + return False + + def has_perms(self, perm_list): + return False + + def has_module_perms(self, module): + return False + + def get_and_delete_messages(self): + """Gets and deletes messages for this user""" + msgs = [] + for msg in self.message_set: + msgs.append(msg) + msg.delete() + return msgs + + def is_anonymous(self): + """Always return False""" + return False + + def is_authenticated(self): + """Always return True""" + return True + + def get_absolute_url(self): + return "/users/%s/" % urllib.quote(smart_str(self.username)) + + def get_full_name(self): + full_name = u'%s %s' % (self.first_name, self.last_name) + return full_name.strip() + + def email_user(self, subject, message, from_email): + """Sends an email to this user. + + According to the App Engine email API the from_email must be the + email address of a registered administrator for the application. + """ + mail.send_mail(subject, + message, + from_email, + [self.email]) + + def get_profile(self): + """ + Returns site-specific profile for this user. Raises + SiteProfileNotAvailable if this site does not allow profiles. + + When using the App Engine authentication framework, users are created + automatically. + """ + from django.contrib.auth.models import SiteProfileNotAvailable + if not hasattr(self, '_profile_cache'): + from django.conf import settings + if not hasattr(settings, "AUTH_PROFILE_MODULE"): + raise SiteProfileNotAvailable + try: + app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.') + model = models.get_model(app_label, model_name) + self._profile_cache = model.all().filter("user =", self).get() + if not self._profile_cache: + raise model.DoesNotExist + except (ImportError, ImproperlyConfigured): + raise SiteProfileNotAvailable + return self._profile_cache + + +class Group(BaseModel): + """Group model not fully implemented yet.""" + # TODO: Implement this model, requires contenttypes + name = db.StringProperty() + permissions = EmptyManager() + + +class Message(BaseModel): + """User message model""" + user = db.ReferenceProperty(User) + message = db.TextProperty() + + +class Permission(BaseModel): + """Permission model not fully implemented yet.""" + # TODO: Implement this model, requires contenttypes + name = db.StringProperty() diff --git a/appengine_django/auth/templatetags.py b/appengine_django/auth/templatetags.py new file mode 100644 index 0000000..8237890 --- /dev/null +++ b/appengine_django/auth/templatetags.py @@ -0,0 +1,62 @@ +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Template tags for the auth module. These are inserted into Django as "built-in" +tags so you do not need to use the load statement in your template to get +access to them. +""" + +from django.template import Library +from django.template import Node + +from google.appengine.api import users + + +class AuthLoginUrlsNode(Node): + """Template node that creates an App Engine login or logout URL. + + If create_login_url is True the App Engine's login URL is rendered into + the template, otherwise the logout URL. + """ + def __init__(self, create_login_url, redirect): + self.redirect = redirect + self.create_login_url = create_login_url + + def render(self, context): + if self.create_login_url: + return users.create_login_url(self.redirect) + else: + return users.create_logout_url(self.redirect) + + +def auth_login_urls(parser, token): + """Template tag registered as 'auth_login_url' and 'auth_logout_url' + when the module is imported. + + Both tags take an optional argument that specifies the redirect URL and + defaults to '/'. + """ + bits = list(token.split_contents()) + if len(bits) == 2: + redirect = bits[1] + else: + redirect = "/" + login = bits[0] == "auth_login_url" + return AuthLoginUrlsNode(login, redirect) + + +register = Library() +register.tag("auth_login_url", auth_login_urls) +register.tag("auth_logout_url", auth_login_urls) diff --git a/appengine_django/auth/tests.py b/appengine_django/auth/tests.py new file mode 100644 index 0000000..20aecfa --- /dev/null +++ b/appengine_django/auth/tests.py @@ -0,0 +1,58 @@ +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +BASIC_TESTS = """ +>>> from google.appengine.api import users +>>> from models import User, AnonymousUser +>>> appengine_user = users.User("test@example.com") +>>> django_user = User.get_djangouser_for_user(appengine_user) +>>> django_user.email == appengine_user.email() +True +>>> django_user.username == appengine_user.nickname() +True +>>> django_user.user == appengine_user +True + +>>> django_user.username = 'test2' +>>> key = django_user.save() +>>> django_user.username == 'test2' +True + +>>> django_user2 = User.get_djangouser_for_user(appengine_user) +>>> django_user2 == django_user +True + +>>> django_user.is_authenticated() +True +>>> django_user.is_staff +False +>>> django_user.is_active +True + +>>> a = AnonymousUser() +>>> a.is_authenticated() +False +>>> a.is_staff +False +>>> a.is_active +False +>>> a.groups.all() +[] +>>> a.user_permissions.all() +[] + + +""" + +__test__ = {'BASIC_TESTS': BASIC_TESTS} diff --git a/appengine_django/conf/app_template/__init__.py b/appengine_django/conf/app_template/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/appengine_django/conf/app_template/models.py b/appengine_django/conf/app_template/models.py new file mode 100644 index 0000000..4d7c5d0 --- /dev/null +++ b/appengine_django/conf/app_template/models.py @@ -0,0 +1,4 @@ +from appengine_django.models import BaseModel +from google.appengine.ext import db + +# Create your models here. diff --git a/appengine_django/conf/app_template/views.py b/appengine_django/conf/app_template/views.py new file mode 100644 index 0000000..60f00ef --- /dev/null +++ b/appengine_django/conf/app_template/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/appengine_django/db/__init__.py b/appengine_django/db/__init__.py new file mode 100755 index 0000000..619bc78 --- /dev/null +++ b/appengine_django/db/__init__.py @@ -0,0 +1,20 @@ +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Explicitly set the name of this package to "appengine". +# +# The rationale for this is so that Django can refer to the database as +# "appengine" even though at a filesystem level it appears as the "db" package +# within the appengine_django package. +__name__ = "appengine" diff --git a/appengine_django/db/base.py b/appengine_django/db/base.py new file mode 100755 index 0000000..8a90182 --- /dev/null +++ b/appengine_django/db/base.py @@ -0,0 +1,150 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This module looks after initialising the appengine api stubs.""" + +import logging +import os + +from appengine_django import appid +from appengine_django import have_appserver +from appengine_django.db.creation import DatabaseCreation + + +from django.db.backends import BaseDatabaseWrapper +from django.db.backends import BaseDatabaseFeatures +from django.db.backends import BaseDatabaseOperations + + +def get_datastore_paths(): + """Returns a tuple with the path to the datastore and history file. + + The datastore is stored in the same location as dev_appserver uses by + default, but the name is altered to be unique to this project so multiple + Django projects can be developed on the same machine in parallel. + + Returns: + (datastore_path, history_path) + """ + from google.appengine.tools import dev_appserver_main + datastore_path = dev_appserver_main.DEFAULT_ARGS['datastore_path'] + history_path = dev_appserver_main.DEFAULT_ARGS['history_path'] + datastore_path = datastore_path.replace("dev_appserver", "django_%s" % appid) + history_path = history_path.replace("dev_appserver", "django_%s" % appid) + return datastore_path, history_path + + +def get_test_datastore_paths(inmemory=True): + """Returns a tuple with the path to the test datastore and history file. + + If inmemory is true, (None, None) is returned to request an in-memory + datastore. If inmemory is false the path returned will be similar to the path + returned by get_datastore_paths but with a different name. + + Returns: + (datastore_path, history_path) + """ + if inmemory: + return None, None + datastore_path, history_path = get_datastore_paths() + datastore_path = datastore_path.replace("datastore", "testdatastore") + history_path = history_path.replace("datastore", "testdatastore") + return datastore_path, history_path + + +def destroy_datastore(datastore_path, history_path): + """Destroys the appengine datastore at the specified paths.""" + for path in [datastore_path, history_path]: + if not path: continue + try: + os.remove(path) + except OSError, e: + if e.errno != 2: + logging.error("Failed to clear datastore: %s" % e) + + +class DatabaseError(Exception): + """Stub class for database errors. Required by Django""" + pass + + +class IntegrityError(Exception): + """Stub class for database integrity errors. Required by Django""" + pass + + +class DatabaseFeatures(BaseDatabaseFeatures): + """Stub class to provide the feaures member expected by Django""" + pass + + +class DatabaseOperations(BaseDatabaseOperations): + """Stub class to provide the options member expected by Django""" + pass + + +class DatabaseWrapper(BaseDatabaseWrapper): + """App Engine database definition for Django. + + This "database" backend does not support any of the standard backend + operations. The only task that it performs is to setup the api stubs required + by the appengine libraries if they have not already been initialised by an + appserver. + """ + + def __init__(self, *args, **kwargs): + super(DatabaseWrapper, self).__init__(*args, **kwargs) + self.features = DatabaseFeatures() + self.ops = DatabaseOperations() + self.creation = DatabaseCreation(self) + self.use_test_datastore = kwargs.get("use_test_datastore", False) + self.test_datastore_inmemory = kwargs.get("test_datastore_inmemory", True) + if have_appserver: + return + self._setup_stubs() + + def _get_paths(self): + if self.use_test_datastore: + return get_test_datastore_paths(self.test_datastore_inmemory) + else: + return get_datastore_paths() + + def _setup_stubs(self): + # If this code is being run without an appserver (eg. via a django + # commandline flag) then setup a default stub environment. + from google.appengine.tools import dev_appserver_main + args = dev_appserver_main.DEFAULT_ARGS.copy() + args['datastore_path'], args['history_path'] = self._get_paths() + from google.appengine.tools import dev_appserver + dev_appserver.SetupStubs(appid, **args) + if self.use_test_datastore: + logging.debug("Configured API stubs for the test datastore") + else: + logging.debug("Configured API stubs for the development datastore") + + def flush(self): + """Helper function to remove the current datastore and re-open the stubs""" + destroy_datastore(*self._get_paths()) + self._setup_stubs() + + def close(self): + pass + + def _commit(self): + pass + + def cursor(self, *args): + pass diff --git a/appengine_django/db/creation.py b/appengine_django/db/creation.py new file mode 100755 index 0000000..74e3048 --- /dev/null +++ b/appengine_django/db/creation.py @@ -0,0 +1,37 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import logging + +from django.db.backends.creation import BaseDatabaseCreation + + +class DatabaseCreation(BaseDatabaseCreation): + + def create_test_db(self, *args, **kw): + """Destroys the test datastore. A new store will be recreated on demand""" + self.destroy_test_db() + self.connection.use_test_datastore = True + self.connection.flush() + + + def destroy_test_db(self, *args, **kw): + """Destroys the test datastore files.""" + from appengine_django.db.base import destroy_datastore + from appengine_django.db.base import get_test_datastore_paths + destroy_datastore(*get_test_datastore_paths()) + logging.debug("Destroyed test datastore") diff --git a/appengine_django/mail.py b/appengine_django/mail.py new file mode 100644 index 0000000..d647dd9 --- /dev/null +++ b/appengine_django/mail.py @@ -0,0 +1,93 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +This module replaces the Django mail implementation with a version that sends +email via the mail API provided by Google App Engine. + +Multipart / HTML email is not yet supported. +""" + +import logging + +from django.core import mail +from django.core.mail import SMTPConnection +from django.conf import settings + +from google.appengine.api import mail as gmail + + +class GoogleSMTPConnection(SMTPConnection): + def __init__(self, host=None, port=None, username=None, password=None, + use_tls=None, fail_silently=False): + self.use_tls = (use_tls is not None) and use_tls or settings.EMAIL_USE_TLS + self.fail_silently = fail_silently + self.connection = None + + def open(self): + self.connection = True + + def close(self): + pass + + def _send(self, email_message): + """A helper method that does the actual sending.""" + if not email_message.to: + return False + try: + if (isinstance(email_message,gmail.EmailMessage)): + e = message + elif (isinstance(email_message,mail.EmailMessage)): + e = gmail.EmailMessage(sender=email_message.from_email, + to=email_message.to, + subject=email_message.subject, + body=email_message.body) + if email_message.bcc: + e.bcc = list(email_message.bcc) + #TODO - add support for html messages and attachments... + e.send() + except: + if not self.fail_silently: + raise + return False + return True + + +def mail_admins(subject, message, fail_silently=False): + """Sends a message to the admins, as defined by the ADMINS setting.""" + _mail_group(settings.ADMINS, subject, message, fail_silently) + + +def mail_managers(subject, message, fail_silently=False): + """Sends a message to the managers, as defined by the MANAGERS setting.""" + _mail_group(settings.MANAGERS, subject, message, fail_silently) + + +def _mail_group(group, subject, message, fail_silently=False): + """Sends a message to an administrative group.""" + if group: + mail.send_mail(settings.EMAIL_SUBJECT_PREFIX + subject, message, + settings.SERVER_EMAIL, [a[1] for a in group], + fail_silently) + return + # If the group had no recipients defined, default to the App Engine admins. + try: + gmail.send_mail_to_admins(settings.SERVER_EMAIL, + settings.EMAIL_SUBJECT_PREFIX + subject, + message) + except: + if not fail_silently: + raise diff --git a/appengine_django/management/__init__.py b/appengine_django/management/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/appengine_django/management/commands/__init__.py b/appengine_django/management/commands/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/appengine_django/management/commands/console.py b/appengine_django/management/commands/console.py new file mode 100755 index 0000000..2c40697 --- /dev/null +++ b/appengine_django/management/commands/console.py @@ -0,0 +1,49 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import code +import getpass +import os +import sys + +from django.conf import settings +from django.core.management.base import BaseCommand + +from google.appengine.ext.remote_api import remote_api_stub + + +def auth_func(): + return raw_input('Username:'), getpass.getpass('Password:') + +class Command(BaseCommand): + """ Start up an interactive console backed by your app using remote_api """ + + help = 'Start up an interactive console backed by your app using remote_api.' + + def run_from_argv(self, argv): + app_id = argv[2] + if len(argv) > 3: + host = argv[3] + else: + host = '%s.appspot.com' % app_id + + remote_api_stub.ConfigureRemoteDatastore(app_id, + '/remote_api', + auth_func, + host) + + code.interact('App Engine interactive console for %s' % (app_id,), + None, + locals()) diff --git a/appengine_django/management/commands/flush.py b/appengine_django/management/commands/flush.py new file mode 100755 index 0000000..c5f3f8c --- /dev/null +++ b/appengine_django/management/commands/flush.py @@ -0,0 +1,36 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import os +import sys + +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + """Overrides the default Django flush command. + """ + help = 'Clears the current datastore and loads the initial fixture data.' + + def run_from_argv(self, argv): + from django.db import connection + connection.flush() + from django.core.management import call_command + call_command('loaddata', 'initial_data') + + def handle(self, *args, **kwargs): + self.run_from_argv(None) diff --git a/appengine_django/management/commands/reset.py b/appengine_django/management/commands/reset.py new file mode 100755 index 0000000..126f386 --- /dev/null +++ b/appengine_django/management/commands/reset.py @@ -0,0 +1,32 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import logging +import os +import sys + +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + """Overrides the default Django reset command. + """ + help = 'Clears the current datastore.' + + def run_from_argv(self, argv): + from django.db import connection + connection.flush() diff --git a/appengine_django/management/commands/rollback.py b/appengine_django/management/commands/rollback.py new file mode 100755 index 0000000..6ce9e4e --- /dev/null +++ b/appengine_django/management/commands/rollback.py @@ -0,0 +1,52 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import sys +import logging + +from django.core.management.base import BaseCommand + + +def run_appcfg(): + # import this so that we run through the checks at the beginning + # and report the appropriate errors + import appcfg + + # We don't really want to use that one though, it just executes this one + from google.appengine.tools import appcfg + + # Reset the logging level to WARN as appcfg will spew tons of logs on INFO + logging.getLogger().setLevel(logging.WARN) + + # Note: if we decide to change the name of this command to something other + # than 'rollback' we will have to munge the args to replace whatever + # we called it with 'rollback' + new_args = sys.argv[:] + new_args.append('.') + appcfg.main(new_args) + + +class Command(BaseCommand): + """Calls the appcfg.py's rollback command for the current project. + + Any additional arguments are passed directly to appcfg.py. + """ + help = 'Calls appcfg.py rollback for the current project.' + args = '[any appcfg.py options]' + + def run_from_argv(self, argv): + run_appcfg() diff --git a/appengine_django/management/commands/runserver.py b/appengine_django/management/commands/runserver.py new file mode 100755 index 0000000..7b91f65 --- /dev/null +++ b/appengine_django/management/commands/runserver.py @@ -0,0 +1,77 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import os +import sys + +from appengine_django.db.base import get_datastore_paths + +from django.core.management.base import BaseCommand + + +def start_dev_appserver(): + """Starts the appengine dev_appserver program for the Django project. + + The appserver is run with default parameters. If you need to pass any special + parameters to the dev_appserver you will have to invoke it manually. + """ + from google.appengine.tools import dev_appserver_main + progname = sys.argv[0] + args = [] + # hack __main__ so --help in dev_appserver_main works OK. + sys.modules['__main__'] = dev_appserver_main + # Set bind ip/port if specified. + if len(sys.argv) > 2: + addrport = sys.argv[2] + try: + addr, port = addrport.split(":") + except ValueError: + addr, port = None, addrport + if not port.isdigit(): + print "Error: '%s' is not a valid port number." % port + sys.exit(1) + else: + addr, port = None, "8000" + if addr: + args.extend(["--address", addr]) + if port: + args.extend(["--port", port]) + # Add email settings + from django.conf import settings + args.extend(['--smtp_host', settings.EMAIL_HOST, + '--smtp_port', str(settings.EMAIL_PORT), + '--smtp_user', settings.EMAIL_HOST_USER, + '--smtp_password', settings.EMAIL_HOST_PASSWORD]) + # Pass the application specific datastore location to the server. + p = get_datastore_paths() + args.extend(["--datastore_path", p[0], "--history_path", p[1]]) + # Append the current working directory to the arguments. + dev_appserver_main.main([progname] + args + [os.getcwdu()]) + + +class Command(BaseCommand): + """Overrides the default Django runserver command. + + Instead of starting the default Django development server this command + fires up a copy of the full fledged appengine dev_appserver that emulates + the live environment your application will be deployed to. + """ + help = 'Runs a copy of the appengine development server.' + args = '[optional port number, or ipaddr:port]' + + def run_from_argv(self, argv): + start_dev_appserver() diff --git a/appengine_django/management/commands/startapp.py b/appengine_django/management/commands/startapp.py new file mode 100644 index 0000000..2648cbd --- /dev/null +++ b/appengine_django/management/commands/startapp.py @@ -0,0 +1,43 @@ +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import os + +import django +from django.core.management.commands import startapp + +import appengine_django + + +class Command(startapp.Command): + def handle_label(self, *args, **kwds): + """Temporary adjust django.__path__ to load app templates from the + helpers directory. + """ + old_path = django.__path__ + django.__path__ = appengine_django.__path__ + startapp.Command.handle_label(self, *args, **kwds) + django.__path__ = old_path + + +class ProjectCommand(Command): + def __init__(self, project_directory): + super(ProjectCommand, self).__init__() + self.project_directory = project_directory + + def handle_label(self, app_name, **options): + super(ProjectCommand, self).handle_label(app_name, self.project_directory, + **options) + diff --git a/appengine_django/management/commands/testserver.py b/appengine_django/management/commands/testserver.py new file mode 100755 index 0000000..bd2c6d1 --- /dev/null +++ b/appengine_django/management/commands/testserver.py @@ -0,0 +1,71 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import os +import sys + +from appengine_django.db.base import destroy_datastore +from appengine_django.db.base import get_test_datastore_paths + +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + """Overrides the default Django testserver command. + + Instead of starting the default Django development server this command fires + up a copy of the full fledged appengine dev_appserver. + + The appserver is always initialised with a blank datastore with the specified + fixtures loaded into it. + """ + help = 'Runs the development server with data from the given fixtures.' + + def run_from_argv(self, argv): + fixtures = argv[2:] + + # Ensure an on-disk test datastore is used. + from django.db import connection + connection.use_test_datastore = True + connection.test_datastore_inmemory = False + + # Flush any existing test datastore. + connection.flush() + + # Load the fixtures. + from django.core.management import call_command + call_command('loaddata', 'initial_data') + if fixtures: + call_command('loaddata', *fixtures) + + # Build new arguments for dev_appserver. + datastore_path, history_path = get_test_datastore_paths(False) + new_args = argv[0:1] + new_args.extend(['--datastore_path', datastore_path]) + new_args.extend(['--history_path', history_path]) + new_args.extend([os.getcwdu()]) + + # Add email settings + from django.conf import settings + new_args.extend(['--smtp_host', settings.EMAIL_HOST, + '--smtp_port', str(settings.EMAIL_PORT), + '--smtp_user', settings.EMAIL_HOST_USER, + '--smtp_password', settings.EMAIL_HOST_PASSWORD]) + + # Start the test dev_appserver. + from google.appengine.tools import dev_appserver_main + dev_appserver_main.main(new_args) diff --git a/appengine_django/management/commands/update.py b/appengine_django/management/commands/update.py new file mode 100755 index 0000000..e489d5d --- /dev/null +++ b/appengine_django/management/commands/update.py @@ -0,0 +1,51 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import sys +import logging + +from django.core.management.base import BaseCommand + + +def run_appcfg(): + # import this so that we run through the checks at the beginning + # and report the appropriate errors + import appcfg + + # We don't really want to use that one though, it just executes this one + from google.appengine.tools import appcfg + + # Reset the logging level to WARN as appcfg will spew tons of logs on INFO + logging.getLogger().setLevel(logging.WARN) + + # Note: if we decide to change the name of this command to something other + # than 'update' we will have to munge the args to replace whatever + # we called it with 'update' + new_args = sys.argv[:] + new_args.append('.') + appcfg.main(new_args) + +class Command(BaseCommand): + """Calls the appcfg.py's update command for the current project. + + Any additional arguments are passed directly to appcfg.py. + """ + help = 'Calls appcfg.py update for the current project.' + args = '[any appcfg.py options]' + + def run_from_argv(self, argv): + run_appcfg() diff --git a/appengine_django/management/commands/vacuum_indexes.py b/appengine_django/management/commands/vacuum_indexes.py new file mode 100755 index 0000000..ab276b4 --- /dev/null +++ b/appengine_django/management/commands/vacuum_indexes.py @@ -0,0 +1,52 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import sys +import logging + +from django.core.management.base import BaseCommand + + +def run_appcfg(): + # import this so that we run through the checks at the beginning + # and report the appropriate errors + import appcfg + + # We don't really want to use that one though, it just executes this one + from google.appengine.tools import appcfg + + # Reset the logging level to WARN as appcfg will spew tons of logs on INFO + logging.getLogger().setLevel(logging.WARN) + + # Note: if we decide to change the name of this command to something other + # than 'vacuum_indexes' we will have to munge the args to replace whatever + # we called it with 'vacuum_indexes' + new_args = sys.argv[:] + new_args.append('.') + appcfg.main(new_args) + + +class Command(BaseCommand): + """Calls the appcfg.py's vacuum_indexes command for the current project. + + Any additional arguments are passed directly to appcfg.py. + """ + help = 'Calls appcfg.py vacuum_indexes for the current project.' + args = '[any appcfg.py options]' + + def run_from_argv(self, argv): + run_appcfg() diff --git a/appengine_django/models.py b/appengine_django/models.py new file mode 100755 index 0000000..82e43cc --- /dev/null +++ b/appengine_django/models.py @@ -0,0 +1,176 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import types + +from google.appengine.ext import db + +from django import VERSION +from django.core.exceptions import ObjectDoesNotExist +from django.db.models.fields import Field +from django.db.models.options import Options +from django.db.models.loading import register_models, get_model + + +class ModelManager(object): + """Replacement for the default Django model manager.""" + + def __init__(self, owner): + self.owner = owner + + def __getattr__(self, name): + """Pass all attribute requests through to the real model""" + return getattr(self.owner, name) + + +class ModelOptions(object): + """Replacement for the default Django options class. + + This class sits at ._meta of each model. The primary information supplied by + this class that needs to be stubbed out is the list of fields on the model. + """ + + def __init__(self, cls): + self.object_name = cls.__name__ + self.module_name = self.object_name.lower() + model_module = sys.modules[cls.__module__] + self.app_label = model_module.__name__.split('.')[-2] + self.abstract = False + + class pk: + """Stub the primary key to always be 'key_name'""" + name = "key_name" + + def __str__(self): + return "%s.%s" % (self.app_label, self.module_name) + + @property + def many_to_many(self): + """The datastore does not support many to many relationships.""" + return [] + + +class Relation(object): + def __init__(self, to): + self.field_name = "key_name" + + +def PropertyWrapper(prop): + """Wrapper for db.Property to make it look like a Django model Property""" + if isinstance(prop, db.Reference): + prop.rel = Relation(prop.reference_class) + else: + prop.rel = None + prop.serialize = True + return prop + + +class PropertiedClassWithDjango(db.PropertiedClass): + """Metaclass for the combined Django + App Engine model class. + + This metaclass inherits from db.PropertiedClass in the appengine library. + This metaclass has two additional purposes: + 1) Register each model class created with Django (the parent class will take + care of registering it with the appengine libraries). + 2) Add the (minimum number) of attributes and methods to make Django believe + the class is a normal Django model. + + The resulting classes are still not generally useful as Django classes and + are intended to be used by Django only in limited situations such as loading + and dumping fixtures. + """ + + def __new__(cls, name, bases, attrs): + """Creates a combined appengine and Django model. + + The resulting model will be known to both the appengine libraries and + Django. + """ + if name == 'BaseModel': + # This metaclass only acts on subclasses of BaseModel. + return super(PropertiedClassWithDjango, cls).__new__(cls, name, + bases, attrs) + + new_class = super(PropertiedClassWithDjango, cls).__new__(cls, name, + bases, attrs) + + new_class._meta = ModelOptions(new_class) + new_class.objects = ModelManager(new_class) + new_class._default_manager = new_class.objects + new_class.DoesNotExist = types.ClassType('DoesNotExist', + (ObjectDoesNotExist,), {}) + + m = get_model(new_class._meta.app_label, name, False) + if m: + return m + + register_models(new_class._meta.app_label, new_class) + return get_model(new_class._meta.app_label, name, False) + + def __init__(cls, name, bases, attrs): + """Initialises the list of Django properties. + + This method takes care of wrapping the properties created by the superclass + so that they look like Django properties and installing them into the + ._meta object of the class so that Django can find them at the appropriate + time. + """ + super(PropertiedClassWithDjango, cls).__init__(name, bases, attrs) + if name == 'BaseModel': + # This metaclass only acts on subclasses of BaseModel. + return + + fields = [PropertyWrapper(p) for p in cls._properties.values()] + cls._meta.local_fields = fields + + +class BaseModel(db.Model): + """Combined appengine and Django model. + + All models used in the application should derive from this class. + """ + __metaclass__ = PropertiedClassWithDjango + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + return self._get_pk_val() == other._get_pk_val() + + def __ne__(self, other): + return not self.__eq__(other) + + def _get_pk_val(self): + """Return the string representation of the model's key""" + return unicode(self.key()) + + def __repr__(self): + # Returns a string representation that can be used to construct an + # equivalent object. First, creates a dictionary of property names and + # values. Note that property values, not property objects, has to be passed + # in to constructor. + d = dict([(k, self.__getattribute__(k)) for k in self.properties()]) + return "%s(**%s)" % (self.__class__.__name__, repr(d)) + + +class RegistrationTestModel(BaseModel): + """Used to check registration with Django is working correctly. + + Django 0.96 only recognises models defined within an applications models + module when get_models() is called so this definition must be here rather + than within the associated test (tests/model_test.py). + """ + pass diff --git a/appengine_django/replacement_imp.py b/appengine_django/replacement_imp.py new file mode 100644 index 0000000..330aaf0 --- /dev/null +++ b/appengine_django/replacement_imp.py @@ -0,0 +1,26 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""This file acts as a very minimal replacement for the 'imp' module. + +It contains only what Django expects to use and does not actually implement the +same functionality as the real 'imp' module. +""" + + +def find_module(name, path=None): + """Django needs imp.find_module, but it works fine if nothing is found.""" + raise ImportError diff --git a/appengine_django/serializer/__init__.py b/appengine_django/serializer/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/appengine_django/serializer/python.py b/appengine_django/serializer/python.py new file mode 100755 index 0000000..bce16e7 --- /dev/null +++ b/appengine_django/serializer/python.py @@ -0,0 +1,130 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +A Python "serializer", based on the default Django python serializer. + +The only customisation is in the deserialization process which needs to take +special care to resolve the name and parent attributes of the key for each +entity and also recreate the keys for any references appropriately. +""" + + +from django.conf import settings +from django.core.serializers import base +from django.core.serializers import python +from django.db import models + +from google.appengine.api import datastore_types +from google.appengine.ext import db + +from django.utils.encoding import smart_unicode + +Serializer = python.Serializer + + +class FakeParent(object): + """Fake parent 'model' like object. + + This class exists to allow a parent object to be provided to a new model + without having to load the parent instance itself. + """ + + def __init__(self, parent_key): + self._entity = parent_key + + +def Deserializer(object_list, **options): + """Deserialize simple Python objects back into Model instances. + + It's expected that you pass the Python objects themselves (instead of a + stream or a string) to the constructor + """ + models.get_apps() + for d in object_list: + # Look up the model and starting build a dict of data for it. + Model = python._get_model(d["model"]) + data = {} + key = resolve_key(Model._meta.module_name, d["pk"]) + if key.name(): + data["key_name"] = key.name() + parent = None + if key.parent(): + parent = FakeParent(key.parent()) + m2m_data = {} + + # Handle each field + for (field_name, field_value) in d["fields"].iteritems(): + if isinstance(field_value, str): + field_value = smart_unicode( + field_value, options.get("encoding", + settings.DEFAULT_CHARSET), + strings_only=True) + field = Model.properties()[field_name] + + if isinstance(field, db.Reference): + # Resolve foreign key references. + data[field.name] = resolve_key(Model._meta.module_name, field_value) + if not data[field.name].name(): + raise base.DeserializationError(u"Cannot load Reference with " + "unnamed key: '%s'" % field_value) + else: + data[field.name] = field.validate(field_value) + # Create the new model instance with all it's data, but no parent. + object = Model(**data) + # Now add the parent into the hidden attribute, bypassing the type checks + # in the Model's __init__ routine. + object._parent = parent + # When the deserialized object is saved our replacement DeserializedObject + # class will set object._parent to force the real parent model to be loaded + # the first time it is referenced. + yield base.DeserializedObject(object, m2m_data) + + +def resolve_key(model, key_data): + """Creates a Key instance from a some data. + + Args: + model: The name of the model this key is being resolved for. Only used in + the fourth case below (a plain key_name string). + key_data: The data to create a key instance from. May be in four formats: + * The str() output of a key instance. Eg. A base64 encoded string. + * The repr() output of a key instance. Eg. A string for eval(). + * A list of arguments to pass to db.Key.from_path. + * A single string value, being the key_name of the instance. When this + format is used the resulting key has no parent, and is for the model + named in the model parameter. + + Returns: + An instance of db.Key. If the data cannot be used to create a Key instance + an error will be raised. + """ + if isinstance(key_data, list): + # The key_data is a from_path sequence. + return db.Key.from_path(*key_data) + elif isinstance(key_data, basestring): + if key_data.find("from_path") != -1: + # key_data is encoded in repr(key) format + return eval(key_data) + else: + try: + # key_data encoded a str(key) format + return db.Key(key_data) + except datastore_types.datastore_errors.BadKeyError, e: + # Final try, assume it's a plain key name for the model. + return db.Key.from_path(model, key_data) + else: + raise base.DeserializationError(u"Invalid key data: '%s'" % key_data) diff --git a/appengine_django/serializer/xml.py b/appengine_django/serializer/xml.py new file mode 100755 index 0000000..f67588a --- /dev/null +++ b/appengine_django/serializer/xml.py @@ -0,0 +1,147 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +""" +Replaces the default Django XML serializer with one that uses the built in +ToXml method for each entity. +""" + +import re + +from django.conf import settings +from django.core.serializers import base +from django.core.serializers import xml_serializer +from django.db import models + +from google.appengine.api import datastore_types +from google.appengine.ext import db + +from python import FakeParent + +getInnerText = xml_serializer.getInnerText + + +class Serializer(xml_serializer.Serializer): + """A Django Serializer class to convert datastore models to XML. + + This class relies on the ToXml method of the entity behind each model to do + the hard work. + """ + + def __init__(self, *args, **kwargs): + super(Serializer, self).__init__(*args, **kwargs) + self._objects = [] + + def handle_field(self, obj, field): + """Fields are not handled individually.""" + pass + + def handle_fk_field(self, obj, field): + """Fields are not handled individually.""" + pass + + def start_object(self, obj): + """Nothing needs to be done to start an object.""" + pass + + def end_object(self, obj): + """Serialize the object to XML and add to the list of objects to output. + + The output of ToXml is manipulated to replace the datastore model name in + the "kind" tag with the Django model name (which includes the Django + application name) to make importing easier. + """ + xml = obj._entity.ToXml() + xml = xml.replace(u"""kind="%s" """ % obj._entity.kind(), + u"""kind="%s" """ % unicode(obj._meta)) + self._objects.append(xml) + + def getvalue(self): + """Wrap the serialized objects with XML headers and return.""" + str = u"""\n""" + str += u"""\n""" + str += u"".join(self._objects) + str += u"""""" + return str + + +class Deserializer(xml_serializer.Deserializer): + """A Django Deserializer class to convert XML to Django objects. + + This is a fairly manualy and simplistic XML parser, it supports just enough + functionality to read the keys and fields for an entity from the XML file and + construct a model object. + """ + + def next(self): + """Replacement next method to look for 'entity'. + + The default next implementation exepects 'object' nodes which is not + what the entity's ToXml output provides. + """ + for event, node in self.event_stream: + if event == "START_ELEMENT" and node.nodeName == "entity": + self.event_stream.expandNode(node) + return self._handle_object(node) + raise StopIteration + + def _handle_object(self, node): + """Convert an node to a DeserializedObject""" + Model = self._get_model_from_node(node, "kind") + data = {} + key = db.Key(node.getAttribute("key")) + if key.name(): + data["key_name"] = key.name() + parent = None + if key.parent(): + parent = FakeParent(key.parent()) + m2m_data = {} + + # Deseralize each field. + for field_node in node.getElementsByTagName("property"): + # If the field is missing the name attribute, bail (are you + # sensing a pattern here?) + field_name = field_node.getAttribute("name") + if not field_name: + raise base.DeserializationError(" node is missing the 'name' " + "attribute") + field = Model.properties()[field_name] + field_value = getInnerText(field_node).strip() + + if isinstance(field, db.Reference): + m = re.match("tag:.*\[(.*)\]", field_value) + if not m: + raise base.DeserializationError(u"Invalid reference value: '%s'" % + field_value) + key = m.group(1) + key_obj = db.Key(key) + if not key_obj.name(): + raise base.DeserializationError(u"Cannot load Reference with " + "unnamed key: '%s'" % field_value) + data[field.name] = key_obj + else: + data[field.name] = field.validate(field_value) + + # Create the new model instance with all it's data, but no parent. + object = Model(**data) + # Now add the parent into the hidden attribute, bypassing the type checks + # in the Model's __init__ routine. + object._parent = parent + # When the deserialized object is saved our replacement DeserializedObject + # class will set object._parent to force the real parent model to be loaded + # the first time it is referenced. + return base.DeserializedObject(object, m2m_data) diff --git a/appengine_django/sessions/__init__.py b/appengine_django/sessions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/appengine_django/sessions/backends/__init__.py b/appengine_django/sessions/backends/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/appengine_django/sessions/backends/db.py b/appengine_django/sessions/backends/db.py new file mode 100644 index 0000000..e2e3aa4 --- /dev/null +++ b/appengine_django/sessions/backends/db.py @@ -0,0 +1,82 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from datetime import datetime + +from django.contrib.sessions.backends import base +from django.core.exceptions import SuspiciousOperation + +from appengine_django.sessions.models import Session + + +class SessionStore(base.SessionBase): + """A key-based session store for Google App Engine.""" + + def load(self): + session = self._get_session(self.session_key) + if session: + try: + return self.decode(session.session_data) + except SuspiciousOperation: + # Create a new session_key for extra security. + pass + self.session_key = self._get_new_session_key() + self._session_cache = {} + self.save() + # Ensure the user is notified via a new cookie. + self.modified = True + return {} + + def save(self, must_create=False): + if must_create and self.exists(self.session_key): + raise base.CreateError + session = Session( + key_name='k:' + self.session_key, + session_data = self.encode(self._session), + expire_date = self.get_expiry_date()) + session.put() + + def exists(self, session_key): + return Session.get_by_key_name('k:' + session_key) is not None + + def delete(self, session_key=None): + if session_key is None: + session_key = self._session_key + session = self._get_session(session_key=session_key) + if session: + session.delete() + + def _get_session(self, session_key): + session = Session.get_by_key_name('k:' + session_key) + if session: + if session.expire_date > datetime.now(): + return session + session.delete() + return None + + def create(self): + while True: + self.session_key = self._get_new_session_key() + try: + # Save immediately to ensure we have a unique entry in the + # database. + self.save(must_create=True) + except base.CreateError: + # Key wasn't unique. Try again. + continue + self.modified = True + self._session_cache = {} + return diff --git a/appengine_django/sessions/models.py b/appengine_django/sessions/models.py new file mode 100644 index 0000000..1681644 --- /dev/null +++ b/appengine_django/sessions/models.py @@ -0,0 +1,22 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.appengine.ext import db + +class Session(db.Model): + """Django compatible App Engine Datastore session model.""" + session_data = db.BlobProperty() + expire_date = db.DateTimeProperty() diff --git a/appengine_django/tests/__init__.py b/appengine_django/tests/__init__.py new file mode 100644 index 0000000..b511f58 --- /dev/null +++ b/appengine_django/tests/__init__.py @@ -0,0 +1,56 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Loads all the _test.py files into the top level of the package. + +This file is a hack around the fact that Django expects the tests "module" to +be a single tests.py file and cannot handle a tests package inside an +application. + +All _test.py files inside this package are imported and any classes derived +from unittest.TestCase are then referenced from this file itself so that they +appear at the top level of the tests "module" that Django will import. +""" + + +import os +import re +import types +import unittest + +TEST_RE = r"^.*_test.py$" + +# Search through every file inside this package. +test_names = [] +test_dir = os.path.dirname( __file__) +for filename in os.listdir(test_dir): + if not re.match(TEST_RE, filename): + continue + # Import the test file and find all TestClass clases inside it. + test_module = __import__('appengine_django.tests.%s' % + filename[:-3], {}, {}, + filename[:-3]) + for name in dir(test_module): + item = getattr(test_module, name) + if not (isinstance(item, (type, types.ClassType)) and + issubclass(item, unittest.TestCase)): + continue + # Found a test, bring into the module namespace. + exec "%s = item" % name + test_names.append(name) + +# Hide everything other than the test cases from other modules. +__all__ = test_names diff --git a/appengine_django/tests/commands_test.py b/appengine_django/tests/commands_test.py new file mode 100755 index 0000000..a02ddbf --- /dev/null +++ b/appengine_django/tests/commands_test.py @@ -0,0 +1,183 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Tests that the manage.py commands execute correctly. + +These tests only verify that the commands execute and exit with a success code. +They are intended to catch import exceptions and similar problems, it is left +up to tests in other modules to verify that the functionality of each command +works correctly. +""" + + +import os +import re +import signal +import subprocess +import tempfile +import time +import unittest + +from django.db.models import get_models + +from google.appengine.ext import db +from appengine_django.models import BaseModel +from appengine_django.models import ModelManager +from appengine_django.models import ModelOptions +from appengine_django.models import RegistrationTestModel + + +class CommandsTest(unittest.TestCase): + """Unit tests for the manage.py commands.""" + + # How many seconds to wait for a command to exit. + COMMAND_TIMEOUT = 10 + + def runCommand(self, command, args=None, int_after=None, input=None): + """Helper to run the specified command in a child process. + + Args: + command: The name of the command to run. + args: List of command arguments to run the command with. + int_after: If set to a positive integer, SIGINT will be sent to the + running child process after this many seconds to cause an exit. This + should be less than the COMMAND_TIMEOUT value (10 seconds). + input: A string to write to stdin when the command starts. stdin is + closed after the string is written. + + Returns: + rc: The integer return code of the process. + output: A string containing the childs output. + """ + if not args: + args = [] + start = time.time() + int_sent = False + fd = subprocess.PIPE + + child = subprocess.Popen(["./manage.py", command] + args, stdin=fd, + stdout=fd, stderr=fd, cwd=os.getcwdu()) + if input: + child.stdin.write(input) + child.stdin.close() + + while 1: + rc = child.poll() + if rc is not None: + # Child has exited. + break + elapsed = time.time() - start + if int_after and int_after > 0 and elapsed > int_after and not int_sent: + # Sent SIGINT as requested, give child time to exit cleanly. + os.kill(child.pid, signal.SIGINT) + start = time.time() + int_sent = True + continue + if elapsed < self.COMMAND_TIMEOUT: + continue + # Command is over time, kill and exit loop. + os.kill(child.pid, signal.SIGKILL) + time.sleep(2) # Give time for the signal to be received. + break + + # Return status and output. + return rc, child.stdout.read(), child.stderr.read() + + def assertCommandSucceeds(self, command, *args, **kwargs): + """Asserts that the specified command successfully completes. + + Args: + command: The name of the command to run. + All other arguments are passed directly through to the runCommand + routine. + + Raises: + This function does not return anything but will raise assertion errors if + the command does not exit successfully. + """ + rc, stdout, stderr = self.runCommand(command, *args, **kwargs) + fd, tempname = tempfile.mkstemp() + os.write(fd, stdout) + os.close(fd) + self.assertEquals(0, rc, + "%s did not return successfully (rc: %d): Output in %s" % + (command, rc, tempname)) + os.unlink(tempname) + + def getCommands(self): + """Returns a list of valid commands for manage.py. + + Args: + None + + Returns: + A list of valid commands for manage.py as read from manage.py's help + output. + """ + rc, stdout, stderr = self.runCommand("help") + parts = re.split("Available subcommands:", stderr) + if len(parts) < 2: + return [] + + return [t.strip() for t in parts[-1].split("\n") if t.strip()] + + def testDiffSettings(self): + """Tests the diffsettings command.""" + self.assertCommandSucceeds("diffsettings") + + def testDumpData(self): + """Tests the dumpdata command.""" + self.assertCommandSucceeds("dumpdata") + + def testFlush(self): + """Tests the flush command.""" + self.assertCommandSucceeds("flush") + + def testLoadData(self): + """Tests the loaddata command.""" + self.assertCommandSucceeds("loaddata") + + def testLoadData(self): + """Tests the loaddata command.""" + self.assertCommandSucceeds("loaddata") + + def testReset(self): + """Tests the reste command.""" + self.assertCommandSucceeds("reset", ["appengine_django"]) + + def testRunserver(self): + """Tests the runserver command.""" + self.assertCommandSucceeds("runserver", int_after=2.0) + + def testShell(self): + """Tests the shell command.""" + self.assertCommandSucceeds("shell", input="exit") + + def testUpdate(self): + """Tests that the update command exists. + + Cannot test that it works without mocking out parts of dev_appserver so for + now we just assume that if it is present it will work. + """ + cmd_list = self.getCommands() + self.assert_("update" in cmd_list) + + def testZipCommandListFiltersCorrectly(self): + """When running under a zipfile test that only valid commands are found.""" + cmd_list = self.getCommands() + self.assert_("__init__" not in cmd_list) + self.assert_("base" not in cmd_list) diff --git a/appengine_django/tests/core_test.py b/appengine_django/tests/core_test.py new file mode 100755 index 0000000..7454177 --- /dev/null +++ b/appengine_django/tests/core_test.py @@ -0,0 +1,37 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests that the core module functionality is present and functioning.""" + + +import unittest + +from appengine_django import appid +from appengine_django import have_appserver + + +class AppengineDjangoTest(unittest.TestCase): + """Tests that the helper module has been correctly installed.""" + + def testAppidProvided(self): + """Tests that application ID and configuration has been loaded.""" + self.assert_(appid is not None) + + def testAppserverDetection(self): + """Tests that the appserver detection flag is present and correct.""" + # It seems highly unlikely that these tests would ever be run from within + # an appserver. + self.assertEqual(have_appserver, False) diff --git a/appengine_django/tests/db_test.py b/appengine_django/tests/db_test.py new file mode 100755 index 0000000..452e8f9 --- /dev/null +++ b/appengine_django/tests/db_test.py @@ -0,0 +1,62 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests that the db module correctly initialises the API stubs.""" + + +import unittest + +from django.db import connection +from django.db.backends.appengine.base import DatabaseWrapper + +from appengine_django import appid +from appengine_django.db import base + + +class DatastoreTest(unittest.TestCase): + """Tests that the datastore stubs have been correctly setup.""" + + def testDjangoDBConnection(self): + """Tests that the Django DB connection is using our replacement.""" + self.assert_(isinstance(connection, DatabaseWrapper)) + + def testDjangoDBConnectionStubs(self): + """Tests that members required by Django are stubbed.""" + self.assert_(hasattr(connection, "features")) + self.assert_(hasattr(connection, "ops")) + + def testDjangoDBErrorClasses(self): + """Tests that the error classes required by Django are stubbed.""" + self.assert_(hasattr(base, "DatabaseError")) + self.assert_(hasattr(base, "IntegrityError")) + + def testDatastorePath(self): + """Tests that the datastore path contains the app name.""" + d_path, h_path = base.get_datastore_paths() + self.assertNotEqual(-1, d_path.find("django_%s" % appid)) + self.assertNotEqual(-1, h_path.find("django_%s" % appid)) + + def testTestInMemoryDatastorePath(self): + """Tests that the test datastore is using the in-memory datastore.""" + td_path, th_path = base.get_test_datastore_paths() + self.assert_(td_path is None) + self.assert_(th_path is None) + + def testTestFilesystemDatastorePath(self): + """Tests that the test datastore is on the filesystem when requested.""" + td_path, th_path = base.get_test_datastore_paths(False) + self.assertNotEqual(-1, td_path.find("testdatastore")) + self.assertNotEqual(-1, th_path.find("testdatastore")) diff --git a/appengine_django/tests/memcache_test.py b/appengine_django/tests/memcache_test.py new file mode 100644 index 0000000..4e5f02e --- /dev/null +++ b/appengine_django/tests/memcache_test.py @@ -0,0 +1,43 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Ensures the App Engine memcache API works as Django's memcache backend.""" + +import unittest + +from django.core.cache import get_cache +from appengine_django import appid +from appengine_django import have_appserver + + +class AppengineMemcacheTest(unittest.TestCase): + """Tests that the memcache backend works.""" + + def setUp(self): + """Get the memcache cache module so it is available to tests.""" + self._cache = get_cache("memcached://") + + def testSimpleSetGet(self): + """Tests that a simple set/get operation through the cache works.""" + self._cache.set("test_key", "test_value") + self.assertEqual(self._cache.get("test_key"), "test_value") + + def testDelete(self): + """Tests that delete removes values from the cache.""" + self._cache.set("test_key", "test_value") + self.assertEqual(self._cache.has_key("test_key"), True) + self._cache.delete("test_key") + self.assertEqual(self._cache.has_key("test_key"), False) diff --git a/appengine_django/tests/model_test.py b/appengine_django/tests/model_test.py new file mode 100755 index 0000000..8611d8b --- /dev/null +++ b/appengine_django/tests/model_test.py @@ -0,0 +1,110 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests that the combined appengine and Django models function correctly.""" + + +import unittest + +from django import VERSION +from django.db.models import get_models +from django import forms + +from google.appengine.ext.db import djangoforms +from google.appengine.ext import db + +from appengine_django.models import BaseModel +from appengine_django.models import ModelManager +from appengine_django.models import ModelOptions +from appengine_django.models import RegistrationTestModel + + +class TestModelWithProperties(BaseModel): + """Test model class for checking property -> Django field setup.""" + property1 = db.StringProperty() + property2 = db.IntegerProperty() + property3 = db.Reference() + + +class ModelTest(unittest.TestCase): + """Unit tests for the combined model class.""" + + def testModelRegisteredWithDjango(self): + """Tests that a combined model class has been registered with Django.""" + self.assert_(RegistrationTestModel in get_models()) + + def testDatastoreModelProperties(self): + """Tests that a combined model class still has datastore properties.""" + self.assertEqual(3, len(TestModelWithProperties.properties())) + + def testDjangoModelClass(self): + """Tests the parts of a model required by Django are correctly stubbed.""" + # Django requires model options to be found at ._meta. + self.assert_(isinstance(RegistrationTestModel._meta, ModelOptions)) + # Django requires a manager at .objects + self.assert_(isinstance(RegistrationTestModel.objects, ModelManager)) + # Django requires ._default_manager. + self.assert_(hasattr(RegistrationTestModel, "_default_manager")) + + def testDjangoModelFields(self): + """Tests that a combined model class has (faked) Django fields.""" + fields = TestModelWithProperties._meta.local_fields + self.assertEqual(3, len(fields)) + # Check each fake field has the minimal properties that Django needs. + for field in fields: + # The Django serialization code looks for rel to determine if the field + # is a relationship/reference to another model. + self.assert_(hasattr(field, "rel")) + # serialize is required to tell Django to serialize the field. + self.assertEqual(True, field.serialize) + if field.name == "property3": + # Extra checks for the Reference field. + # rel.field_name is used during serialization to find the field in the + # other model that this field is related to. This should always be + # 'key_name' for appengine models. + self.assertEqual("key_name", field.rel.field_name) + + def testDjangoModelOptionsStub(self): + """Tests that the options stub has the required properties by Django.""" + # Django requires object_name and app_label for serialization output. + self.assertEqual("RegistrationTestModel", + RegistrationTestModel._meta.object_name) + self.assertEqual("appengine_django", RegistrationTestModel._meta.app_label) + # The pk.name member is required during serialization for dealing with + # related fields. + self.assertEqual("key_name", RegistrationTestModel._meta.pk.name) + # The many_to_many method is called by Django in the serialization code to + # find m2m relationships. m2m is not supported by the datastore. + self.assertEqual([], RegistrationTestModel._meta.many_to_many) + + def testDjangoModelManagerStub(self): + """Tests that the manager stub acts as Django would expect.""" + # The serialization code calls model.objects.all() to retrieve all objects + # to serialize. + self.assertEqual([], list(RegistrationTestModel.objects.all())) + + def testDjangoModelPK(self): + """Tests that each model instance has a 'primary key' generated.""" + obj = RegistrationTestModel(key_name="test") + obj.put() + pk = obj._get_pk_val() + self.assert_(pk) + new_obj = RegistrationTestModel.get(pk) + self.assertEqual(obj.key(), new_obj.key()) + + def testModelFormPatched(self): + """Tests that the Django ModelForm is being successfully patched.""" + self.assertEqual(djangoforms.ModelForm, forms.ModelForm) diff --git a/appengine_django/tests/serialization_test.py b/appengine_django/tests/serialization_test.py new file mode 100755 index 0000000..8642d92 --- /dev/null +++ b/appengine_django/tests/serialization_test.py @@ -0,0 +1,313 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests that the serialization modules are functioning correctly. + +In particular, these tests verify that the modifications made to the standard +Django serialization modules function correctly and that the combined datastore +and Django models can be dumped and loaded to all of the provided formats. +""" + + +import os +import re +import unittest +from StringIO import StringIO + +from django.core import serializers + +from google.appengine.ext import db +from appengine_django.models import BaseModel + + +class ModelA(BaseModel): + description = db.StringProperty() + + +class ModelB(BaseModel): + description = db.StringProperty() + friend = db.Reference(ModelA) + + +class TestAllFormats(type): + + def __new__(cls, name, bases, attrs): + """Extends base test functions to be called for every serialisation format. + + Looks for functions matching 'run.*Test', where the wildcard in the middle + matches the desired test name and ensures that a test case is setup to call + that function once for every defined serialisation format. The test case + that is created will be called 'test'. Eg, for the function + 'runKeyedObjectTest' functions like 'testJsonKeyedObject' will be created. + """ + test_formats = serializers.get_serializer_formats() + test_formats.remove("python") # Python serializer is only used indirectly. + + for func_name in attrs.keys(): + m = re.match("^run(.*)Test$", func_name) + if not m: + continue + for format in test_formats: + test_name = "test%s%s" % (format.title(), m.group(1)) + test_func = eval("lambda self: getattr(self, \"%s\")(\"%s\")" % + (func_name, format)) + attrs[test_name] = test_func + + return super(TestAllFormats, cls).__new__(cls, name, bases, attrs) + + +class SerializationTest(unittest.TestCase): + """Unit tests for the serialization/deserialization functionality. + + Tests that every loaded serialization format can successfully dump and then + reload objects without the objects changing. + """ + __metaclass__ = TestAllFormats + + def compareObjects(self, orig, new, format="unknown"): + """Compares two objects to ensure they are identical. + + Args: + orig: The original object, must be an instance of db.Model. + new: The new object, must be an instance of db.Model. + format: The serialization format being tested, used to make error output + more helpful. + + Raises: + The function has no return value, but will raise assertion errors if the + objects do not match correctly. + """ + if orig.key().name(): + # Only compare object keys when the key is named. Key IDs are not static + # and will change between dump/load. If you want stable Keys they need to + # be named! + self.assertEqual(orig.key(), new.key(), + "keys not equal after %s serialization: %s != %s" % + (format, repr(orig.key()), repr(new.key()))) + + for key in orig.properties().keys(): + oval = getattr(orig, key) + nval = getattr(new, key) + if isinstance(orig.properties()[key], db.Reference): + # Need to compare object keys not the objects themselves. + oval = oval.key() + nval = nval.key() + self.assertEqual(oval, nval, "%s attribute differs after %s " + "serialization: %s != %s" % (key, format, oval, nval)) + + def doSerialisationTest(self, format, obj, rel_attr=None, obj_ref=None): + """Runs a serialization test on an object for the specified format. + + Args: + format: The name of the Django serialization class to use. + obj: The object to {,de}serialize, must be an instance of db.Model. + rel_attr: Name of the attribute of obj references another model. + obj_ref: The expected object reference, must be an instance of db.Model. + + Raises: + The function has no return value but raises assertion errors if the + object cannot be successfully serialized and then deserialized back to an + identical object. If rel_attr and obj_ref are specified the deserialized + object must also retain the references from the original object. + """ + serialised = serializers.serialize(format, [obj]) + # Try and get the object back from the serialized string. + result = list(serializers.deserialize(format, StringIO(serialised))) + self.assertEqual(1, len(result), + "%s serialization should create 1 object" % format) + result[0].save() # Must save back into the database to get a Key. + self.compareObjects(obj, result[0].object, format) + if rel_attr and obj_ref: + rel = getattr(result[0].object, rel_attr) + if callable(rel): + rel = rel() + self.compareObjects(rel, obj_ref, format) + + def doLookupDeserialisationReferenceTest(self, lookup_dict, format): + """Tests the Key reference is loaded OK for a format. + + Args: + lookup_dict: A dictionary indexed by format containing serialized strings + of the objects to load. + format: The format to extract from the dict and deserialize. + + Raises: + This function has no return value but raises assertion errors if the + string cannot be deserialized correctly or the resulting object does not + reference the object correctly. + """ + if format not in lookup_dict: + # Check not valid for this format. + return + obj = ModelA(description="test object", key_name="test") + obj.put() + s = lookup_dict[format] + result = list(serializers.deserialize(format, StringIO(s))) + self.assertEqual(1, len(result), "expected 1 object from %s" % format) + result[0].save() + self.compareObjects(obj, result[0].object.friend, format) + + def doModelKeyDeserialisationReferenceTest(self, lookup_dict, format): + """Tests a model with a key can be loaded OK for a format. + + Args: + lookup_dict: A dictionary indexed by format containing serialized strings + of the objects to load. + format: The format to extract from the dict and deserialize. + + Returns: + This function has no return value but raises assertion errors if the + string cannot be deserialized correctly or the resulting object is not an + instance of ModelA with a key named 'test'. + """ + if format not in lookup_dict: + # Check not valid for this format. + return + s = lookup_dict[format] + result = list(serializers.deserialize(format, StringIO(s))) + self.assertEqual(1, len(result), "expected 1 object from %s" % format) + result[0].save() + self.assert_(isinstance(result[0].object, ModelA)) + self.assertEqual("test", result[0].object.key().name()) + + # Lookup dicts for the above (doLookupDeserialisationReferenceTest) function. + SERIALIZED_WITH_KEY_AS_LIST = { + "json": """[{"pk": "agR0ZXN0chMLEgZNb2RlbEIiB21vZGVsYmkM", """ + """"model": "tests.modelb", "fields": {"description": "test", """ + """"friend": ["ModelA", "test"] }}]""", + "yaml": """- fields: {description: !!python/unicode 'test', friend: """ + """ [ModelA, test]}\n model: tests.modelb\n pk: """ + """ agR0ZXN0chMLEgZNb2RlbEEiB21vZGVsYWkM\n""" + } + SERIALIZED_WITH_KEY_REPR = { + "json": """[{"pk": "agR0ZXN0chMLEgZNb2RlbEIiB21vZGVsYmkM", """ + """"model": "tests.modelb", "fields": {"description": "test", """ + """"friend": "datastore_types.Key.from_path(""" + """'ModelA', 'test')" }}]""", + "yaml": """- fields: {description: !!python/unicode 'test', friend: """ + """\'datastore_types.Key.from_path("ModelA", "test")\'}\n """ + """model: tests.modelb\n pk: """ + """ agR0ZXN0chMLEgZNb2RlbEEiB21vZGVsYWkM\n""" + } + + # Lookup dict for the doModelKeyDeserialisationReferenceTest function. + MK_SERIALIZED_WITH_LIST = { + "json": """[{"pk": ["ModelA", "test"], "model": "tests.modela", """ + """"fields": {}}]""", + "yaml": """-\n fields: {description: null}\n model: tests.modela\n """ + """pk: [ModelA, test]\n""" + } + MK_SERIALIZED_WITH_KEY_REPR = { + "json": """[{"pk": "datastore_types.Key.from_path('ModelA', 'test')", """ + """"model": "tests.modela", "fields": {}}]""", + "yaml": """-\n fields: {description: null}\n model: tests.modela\n """ + """pk: \'datastore_types.Key.from_path("ModelA", "test")\'\n""" + } + MK_SERIALIZED_WITH_KEY_AS_TEXT = { + "json": """[{"pk": "test", "model": "tests.modela", "fields": {}}]""", + "yaml": """-\n fields: {description: null}\n model: tests.modela\n """ + """pk: test\n""" + } + + # Lookup dict for the function. + SERIALIZED_WITH_NON_EXISTANT_PARENT = { + "json": """[{"pk": "ahhnb29nbGUtYXBwLWVuZ2luZS1kamFuZ29yIgsSBk1vZG""" + """VsQiIGcGFyZW50DAsSBk1vZGVsQSIEdGVzdAw", """ + """"model": "tests.modela", "fields": """ + """{"description": null}}]""", + "yaml": """- fields: {description: null}\n """ + """model: tests.modela\n """ + """pk: ahhnb29nbGUtYXBwLWVuZ2luZS1kamFuZ29yIgsSBk1""" + """vZGVsQiIGcGFyZW50DAsSBk1vZGVsQSIEdGVzdAw\n""", + "xml": """\n""" + """\n""" + """\n """ + """tag:google-app-engine-django.gmail.com,""" + """2008-05-13:ModelA[ahhnb29nbGUtYXBwLWVuZ2luZS1kam""" + """FuZ29yIgsSBk1vZGVsQiIGcGFyZW50DAsSBk1vZGVsQSIEdGVzdAw""" + """]\n \n\n""" + } + + # The following functions are all expanded by the metaclass to be run once + # for every registered Django serialization module. + + def runKeyedObjectTest(self, format): + """Test serialization of a basic object with a named key.""" + obj = ModelA(description="test object", key_name="test") + obj.put() + self.doSerialisationTest(format, obj) + + def runObjectWithIdTest(self, format): + """Test serialization of a basic object with a numeric ID key.""" + obj = ModelA(description="test object") + obj.put() + self.doSerialisationTest(format, obj) + + def runObjectWithReferenceTest(self, format): + """Test serialization of an object that references another object.""" + obj = ModelA(description="test object", key_name="test") + obj.put() + obj2 = ModelB(description="friend object", friend=obj) + obj2.put() + self.doSerialisationTest(format, obj2, "friend", obj) + + def runObjectWithParentTest(self, format): + """Test serialization of an object that has a parent object reference.""" + obj = ModelA(description="parent object", key_name="parent") + obj.put() + obj2 = ModelA(description="child object", key_name="child", parent=obj) + obj2.put() + self.doSerialisationTest(format, obj2, "parent", obj) + + def runObjectWithNonExistantParentTest(self, format): + """Test deserialization of an object referencing a non-existant parent.""" + # NOTE(trow): Test disabled, as it fails when the app name has + # been changed. The pre-serialized version has + # google-app-engine-django hard-wired in as the app. + #self.doModelKeyDeserialisationReferenceTest( + # self.SERIALIZED_WITH_NON_EXISTANT_PARENT, format) + + def runCreateKeyReferenceFromListTest(self, format): + """Tests that a reference specified as a list in json/yaml can be loaded OK.""" + self.doLookupDeserialisationReferenceTest(self.SERIALIZED_WITH_KEY_AS_LIST, + format) + + def runCreateKeyReferenceFromReprTest(self, format): + """Tests that a reference specified as repr(Key) in can loaded OK.""" + self.doLookupDeserialisationReferenceTest(self.SERIALIZED_WITH_KEY_REPR, + format) + + def runCreateModelKeyFromListTest(self, format): + """Tests that a model key specified as a list can be loaded OK.""" + self.doModelKeyDeserialisationReferenceTest(self.MK_SERIALIZED_WITH_LIST, + format) + + def runCreateModelKeyFromReprTest(self, format): + """Tests that a model key specified as a repr(Key) can be loaded OK.""" + self.doModelKeyDeserialisationReferenceTest( + self.MK_SERIALIZED_WITH_KEY_REPR, format) + + def runCreateModelKeyFromTextTest(self, format): + """Tests that a reference specified as a plain key_name loads OK.""" + self.doModelKeyDeserialisationReferenceTest( + self.MK_SERIALIZED_WITH_KEY_AS_TEXT, format) + + +if __name__ == '__main__': + unittest.main() diff --git a/auth/__init__.py b/auth/__init__.py new file mode 100644 index 0000000..5100a87 --- /dev/null +++ b/auth/__init__.py @@ -0,0 +1,200 @@ +### +### Copyright 2009 The Chicago Independent Radio Project +### All Rights Reserved. +### +### Licensed under the Apache License, Version 2.0 (the "License"); +### you may not use this file except in compliance with the License. +### You may obtain a copy of the License at +### +### http://www.apache.org/licenses/LICENSE-2.0 +### +### Unless required by applicable law or agreed to in writing, software +### distributed under the License is distributed on an "AS IS" BASIS, +### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### See the License for the specific language governing permissions and +### limitations under the License. +### + +"""CHIRP authentication system.""" + +import base64 +import logging +import os +import time +from Crypto.Cipher import AES +from Crypto.Hash import HMAC +from django import http +from auth.models import User +from auth import roles + +# Our logout URL. +LOGOUT_URL = "/auth/goodbye/" + +# Users are ultimately redirected to the URL after logging out. +_FINAL_LOGOUT_URL = '/auth/hello/' + +# The name of the cookie used to store our security token. +_CHIRP_SECURITY_TOKEN_COOKIE = 'chirp_security_token' + +# Our security tokens expire after two hours. +_TOKEN_TIMEOUT_S = 2 * 60 * 60 + +# Key used to HMAC-sign security tokens. +# To simplify deployment, this should probably be stashed in the datastore. +_SECRET_HMAC_KEY = 'testkey' + +# Key used to AES-encrypt security tokens. +# To simplify deployment, this should probably be stashed in the datastore. +_SECRET_AES_KEY = 'testkey8901234567890123456789012' + + +class UserNotAllowedError(Exception): + """Raised when the user is recognized but forbidden from entering.""" + + +class _Credentials(object): + email = None + security_token_is_stale = False + + +def _create_security_token(user): + """Create a CHIRP security token. + + Args: + user: A User object. + + Returns: + A string containing an encrypted security token that encodes + the user's email address as well as a timestamp. + """ + timestamp = int(time.time()) + plaintext = "%x %s" % (timestamp, user.email) + nearest_mult_of_16 = 16 * ((len(plaintext) + 15) // 16) + # Pad plaintest with whitespace to make the length a multiple of 16, + # as this is a requirement of AES encryption. + plaintext = plaintext.rjust(nearest_mult_of_16, ' ') + body = AES.new(_SECRET_AES_KEY, AES.MODE_CBC).encrypt(plaintext) + sig = HMAC.HMAC(key=_SECRET_HMAC_KEY, msg=body).hexdigest() + return '%s:%s' % (sig, body) + +def _parse_security_token(token): + """Parse a CHIRP security token. + + Returns: + A Credentials object, or None if the token is not valid. + If a Credentials object is returned, its "user" field will not + be set. + """ + if not token: + return None + if ':' not in token: + logging.warn('Malformed token: no signature separator') + return None + sig, body = token.split(':', 1) + computed_sig = HMAC.HMAC(key=_SECRET_HMAC_KEY, msg=body).hexdigest() + if sig != computed_sig: + logging.warn('Malformed token: invalid signature') + return None + try: + plaintext = AES.new(_SECRET_AES_KEY, AES.MODE_CBC).decrypt(body) + except ValueError: + logging.warn('Malformed token: wrong size') + return None + # Remove excess whitespace. + plaintext = plaintext.strip() + # The plaintext should contain at least one space. + if ' ' not in plaintext: + logging.warn('Malformed token: bad contents') + return None + parts = plaintext.split(' ') + if len(parts) != 2: + logging.warn('Malformed token: bad structure') + return None + timestamp, email = parts + try: + timestamp = int(timestamp, 16) + except ValueError: + logging.warn('Malformed token: bad timestamp') + return None + # Reject tokens that are too old or which have time-traveled. We + # allow for 1s of clock skew. + age_s = time.time() - timestamp + if age_s < -1 or age_s > _TOKEN_TIMEOUT_S: + logging.warn('Malformed token: expired (age=%ds)', age_s) + return None + cred = _Credentials() + cred.email = email + cred.security_token_is_stale = (age_s > 0.5 * _TOKEN_TIMEOUT_S) + return cred + + +def attach_credentials(response, user): + """Attach a user's credentials to a response. + + Args: + response: An HttpResponse object. + user: A User object. + """ + response.set_cookie(_CHIRP_SECURITY_TOKEN_COOKIE, + _create_security_token(user)) + + +def get_current_user(request): + """Get the current logged-in user's. + + Returns: + A User object, or None if the user is not logged in. + + Raises: + UserNotAllowedError if the user is prohibited from accessing + the site. + """ + cred = None + token = request.COOKIES.get(_CHIRP_SECURITY_TOKEN_COOKIE) + if token: + cred = _parse_security_token(token) + # No valid token? This is hopeless! + if cred is None: + return None + # Try to find a user for this email address. + user = User.get_by_email(cred.email) + if user is None: + return None + # Reject inactive users. + if not user.is_active: + logging.info('Rejected inactive user %s', user.email) + raise UserNotAllowedError + user._credentials = cred + return user + + +def create_login_url(path): + """Returns the URL of a login page that redirects to 'path' on success.""" + return "/auth/hello?redirect=%s" % path + + +def logout(): + """Create an HTTP response that will log a user out. + + Returns: + An HttpResponse object that will log the user out. + """ + # If the user was signed in and has a cookie, clear it. + response = http.HttpResponseRedirect(_FINAL_LOGOUT_URL) + response.set_cookie(_CHIRP_SECURITY_TOKEN_COOKIE, '') + return response + + +def get_password_reset_token(user): + """A URL-safe token that authenticates a user for a password reset.""" + return base64.urlsafe_b64encode(_create_security_token(user)) + + +def parse_passord_reset_token(token): + """Extracts an email address from a valid password reset token.""" + try: + token = base64.urlsafe_b64decode(str(token)) + except TypeError: + return None + cred = _parse_security_token(token) + return cred and cred.email diff --git a/auth/decorators.py b/auth/decorators.py new file mode 100644 index 0000000..848f4af --- /dev/null +++ b/auth/decorators.py @@ -0,0 +1,65 @@ +### +### Copyright 2009 The Chicago Independent Radio Project +### All Rights Reserved. +### +### Licensed under the Apache License, Version 2.0 (the "License"); +### you may not use this file except in compliance with the License. +### You may obtain a copy of the License at +### +### http://www.apache.org/licenses/LICENSE-2.0 +### +### Unless required by applicable law or agreed to in writing, software +### distributed under the License is distributed on an "AS IS" BASIS, +### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### See the License for the specific language governing permissions and +### limitations under the License. +### + +"""Decorators for CHIRP's authentication system.""" + +from django import http +import auth +from auth import models + + +class require_role(object): + """A decorator that limits access only to users with a particular role. + + If 'role' is None, this check is pass for any signed-in user. + """ + def __init__(self, role): + self._role = role + + def __call__(self, func): + def wrapper(request, *args, **kwargs): + # Not signed in? Redirect to a login page. + if not request.user: + return http.HttpResponseRedirect( + auth.create_login_url(request.path)) + # If the user is signed in and has the required role, + # satisfy the request. + if (request.user and + (self._role is None + or self._role in request.user.roles + or request.user.is_superuser)): + return func(request, *args, **kwargs) + # Othewise return a 403. + return http.HttpResponseForbidden( + 'Page requires role "%s"' % self._role) + return wrapper + + +def require_signed_in_user(func): + """A decorator that limits access to signed-in users. + + Note that limiting acces to signed-in users is the default + behavior for all pages outside of the /auth/ namespace. + """ + def wrapper(request, *args, **kwargs): + if getattr(request, 'user') is None: + # If the user is not signed in, send them off to somewhere + # they can log in. + login_url = auth.create_login_url(request.path) + return http.HttpResponseRedirect(login_url) + return func(request, *args, **kwargs) + return wrapper diff --git a/auth/forms.py b/auth/forms.py new file mode 100644 index 0000000..8057bcc --- /dev/null +++ b/auth/forms.py @@ -0,0 +1,151 @@ +### +### Copyright 2009 The Chicago Independent Radio Project +### All Rights Reserved. +### +### Licensed under the Apache License, Version 2.0 (the "License"); +### you may not use this file except in compliance with the License. +### You may obtain a copy of the License at +### +### http://www.apache.org/licenses/LICENSE-2.0 +### +### Unless required by applicable law or agreed to in writing, software +### distributed under the License is distributed on an "AS IS" BASIS, +### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### See the License for the specific language governing permissions and +### limitations under the License. +### + +from django import forms +from django.forms import HiddenInput, PasswordInput +from auth.models import User +from auth.models import roles + + +class LoginForm(forms.Form): + redirect = forms.CharField(widget=HiddenInput, required=True) + email = forms.EmailField(required=True) + password = forms.CharField(required=True, widget=PasswordInput) + + def clean_password(self): + self.user = User.get_by_email(self.cleaned_data['email']) + if self.user is None: + raise forms.ValidationError('Unknown email address') + if not self.user.is_active: + raise forms.ValidationError('Account not active') + if not self.user.password: + raise forms.ValidationError('Password not set') + if not self.user.check_password(self.cleaned_data['password']): + raise forms.ValidationError('Incorrect password') + return self.cleaned_data['password'] + + +class ChangePasswordForm(forms.Form): + current_password = forms.CharField(required=True, widget=PasswordInput) + new_password = forms.CharField(required=True, widget=PasswordInput) + confirm_new_password = forms.CharField(required=True, widget=PasswordInput) + + def set_user(self, user): + self._user = user + + def clean_current_password(self): + pw = self.cleaned_data['current_password'] + if not self._user.check_password(pw): + raise forms.ValidationError('Incorrect password') + return pw + + def clean_confirm_new_password(self): + pw = self.cleaned_data['confirm_new_password'] + if pw != self.cleaned_data['new_password']: + raise forms.ValidationError('Passwords are not the same') + return pw + + +class ForgotPasswordForm(forms.Form): + email = forms.EmailField(required=True) + user = None + + def clean_email(self): + self.user = User.get_by_email(self.cleaned_data['email']) + if self.user is None: + raise forms.ValidationError('Unknown email address') + return self.cleaned_data['email'] + + +class ResetPasswordForm(forms.Form): + token = forms.CharField(required=True, widget=HiddenInput) + new_password = forms.CharField(required=True, widget=PasswordInput) + confirm_new_password = forms.CharField(required=True, widget=PasswordInput) + + def clean_confirm_new_password(self): + pw = self.cleaned_data['confirm_new_password'] + if pw != self.cleaned_data['new_password']: + raise forms.ValidationError('Passwords are not the same') + return pw + + +class UserForm(forms.Form): + original_email = forms.EmailField(widget=HiddenInput, required=False) + email = forms.EmailField() + first_name = forms.CharField() + last_name = forms.CharField() + password = forms.CharField(required=False) + is_active = forms.BooleanField(initial=True, required=False) + # We also plug in synthetic fields for all of our various roles. + + def clean_email(self): + email = self.cleaned_data['email'] + if (email != self.cleaned_data.get('original_email') + and User.get_by_email(email) is not None): + raise forms.ValidationError('Email address already in use') + return email + + def clean_first_name(self): + # Remove leading and trailing whitespace. + return self.cleaned_data['first_name'].strip() + + def clean_last_name(self): + # Remove leading and trailing whitespace.p + return self.cleaned_data['last_name'].strip() + + @classmethod + def from_user(cls, user): + initial = { + 'original_email': user.email, + 'email': user.email, + 'first_name': user.first_name, + 'last_name': user.last_name, + 'is_active': user.is_active, + } + for r in user.roles: + initial['is_' + r] = True + return cls(initial=initial) + + def to_user(self): + data = self.cleaned_data.copy() + + user_roles = [] + for r in roles.ALL_ROLES: + key = 'is_' + r + if key in data: + if data[key]: + user_roles.append(r) + del data[key] + data['roles'] = user_roles + + if data['original_email']: + user = User.get_by_email(data['original_email']) + for key, val in data.items(): + if key == 'password': + user.set_password(val) + elif key != 'original_email': + setattr(user, key, val) + else: + del data['original_email'] + user = User(**data) + return user + + +# Plug in form fields for all of our roles. +for r in roles.ALL_ROLES: + UserForm.base_fields['is_' + r] = forms.BooleanField(initial=False, + required=False) diff --git a/auth/middleware.py b/auth/middleware.py new file mode 100644 index 0000000..418580b --- /dev/null +++ b/auth/middleware.py @@ -0,0 +1,51 @@ +### +### Copyright 2009 The Chicago Independent Radio Project +### All Rights Reserved. +### +### Licensed under the Apache License, Version 2.0 (the "License"); +### you may not use this file except in compliance with the License. +### You may obtain a copy of the License at +### +### http://www.apache.org/licenses/LICENSE-2.0 +### +### Unless required by applicable law or agreed to in writing, software +### distributed under the License is distributed on an "AS IS" BASIS, +### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### See the License for the specific language governing permissions and +### limitations under the License. +### + +"""Middleware for CHIRP's authentication system.""" + +from django import http +import auth + + +class AuthenticationMiddleware(object): + + def process_request(self, request): + try: + user = auth.get_current_user(request) + except auth.UserNotAllowedError: + return http.HttpResponseForbidden('Access Denied!') + # Un-logged-in users are not redirected away from the /auth/ + # namespace. This ensures that the log-in and related pages + # are reachable. + if user is None and not request.path.startswith('/auth/'): + login_url = auth.create_login_url(request.path) + return http.HttpResponseRedirect(login_url) + # Attach the user to the request. + request.user = user + return None + + def process_response(self, request, response): + # If the "_logout" flag is set on the response, generate a response + # that will log the user out. + if getattr(response, '_logout', False): + return auth.logout() + # If our security token is old, issue a new one. + if hasattr(request, 'user'): + cred = getattr(request.user, '_credentials', None) + if cred and cred.security_token_is_stale: + auth.attach_credentials(response, request.user) + return response diff --git a/auth/models.py b/auth/models.py new file mode 100644 index 0000000..de80e16 --- /dev/null +++ b/auth/models.py @@ -0,0 +1,113 @@ +### +### Copyright 2009 The Chicago Independent Radio Project +### All Rights Reserved. +### +### Licensed under the Apache License, Version 2.0 (the "License"); +### you may not use this file except in compliance with the License. +### You may obtain a copy of the License at +### +### http://www.apache.org/licenses/LICENSE-2.0 +### +### Unless required by applicable law or agreed to in writing, software +### distributed under the License is distributed on an "AS IS" BASIS, +### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### See the License for the specific language governing permissions and +### limitations under the License. +### + +"""Authentication model for CHIRP applications.""" + +import hashlib +import time +from google.appengine.ext import db +from auth import roles + + +class User(db.Model): + """CHIRP radio's canonical user class. + + This object is designed to be contrib.auth-like but not + necessarily compatible. We only keep basic information about the + user here; essentially only things we need for "sysadmin-y" tasks. + More detailed information should go in the volunteer tracker or + other + """ + email = db.EmailProperty(required=True) + first_name = db.StringProperty() + last_name = db.StringProperty() + + # This is the SHA1 hash of the user's password. + password = db.StringProperty() + # We omit Django's is_staff property. + is_active = db.BooleanProperty(default=True, required=True) + # Superusers are given unfettered access to the site, and are + # considered to be in every role. + is_superuser = db.BooleanProperty(default=False, required=True) + last_login = db.DateTimeProperty(auto_now_add=True, required=True) + date_joined = db.DateTimeProperty(auto_now_add=True, required=True) + + # We omit Django's groups property, and replace it with 'roles'. + # A role is just a constant string identifier. For a list of + # the possible roles, see the auth.roles module. + # + # Properties for checking if a user has a particular role are + # automatically patched into the User class. The following two + # expressions are equivalent: + # roles.ROLE_NAME in user.roles + # user.is_role_name + # + # TODO(trow): Add validation that all roles are valid. + roles = db.StringListProperty() + + + def __unicode__(self): + name_parts = [] + if self.first_name: + name_parts.append(self.first_name) + if self.last_name: + name_parts.append(self.last_name) + if not name_parts: + name_parts.append(self.email) + return u' '.join(name_parts) + + def __str__(self): + return unicode(self).encode('utf-8') + + @classmethod + def _hash_password(cls, plaintext): + return hashlib.sha1(plaintext).hexdigest() + + def set_password(self, plaintext): + """Store the SHA1 hash in the password property.""" + salt = '%04x' % int(0xffff * (time.time() % 1)) + self.password = salt + User._hash_password(salt + plaintext) + + def check_password(self, plaintext): + if not self.password or len(self.password) < 4: + return False + salt = self.password[:4] + hashed = self.password[4:] + return hashed == User._hash_password(salt + plaintext) + + @classmethod + def get_by_email(cls, email): + query = db.Query(cls) + query.filter('email =', email) + if query.count() == 0: + return None + elif query.count() == 1: + return query.get() + else: + raise LookupError('User email collision for %s' % email) + + +# Patch the User class to provide properties for checking roles. +# These are useful in templates. +for role in roles.ALL_ROLES: + property_name = 'is_' + role.lower() + assert not hasattr(User, property_name) + setattr(User, property_name, + property(lambda self: self.is_superuser or role in self.roles)) + + + diff --git a/auth/roles.py b/auth/roles.py new file mode 100644 index 0000000..d3bf489 --- /dev/null +++ b/auth/roles.py @@ -0,0 +1,31 @@ +### +### Copyright 2009 The Chicago Independent Radio Project +### All Rights Reserved. +### +### Licensed under the Apache License, Version 2.0 (the "License"); +### you may not use this file except in compliance with the License. +### You may obtain a copy of the License at +### +### http://www.apache.org/licenses/LICENSE-2.0 +### +### Unless required by applicable law or agreed to in writing, software +### distributed under the License is distributed on an "AS IS" BASIS, +### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### See the License for the specific language governing permissions and +### limitations under the License. +### + +"""Constants and definitions related to roles. + +We use these roles to define a very simple set of permissions. +""" + +# A hard-wired list of all possible roles. Each role is specified by +# a more-or-less human-readable string. +VOLUNTEER_COORDINATOR = 'volunteer_coordinator' + + +# A tuple containing all possible roles. +ALL_ROLES = ( + VOLUNTEER_COORDINATOR, +) diff --git a/auth/tests.py b/auth/tests.py new file mode 100644 index 0000000..e2213e4 --- /dev/null +++ b/auth/tests.py @@ -0,0 +1,335 @@ +### +### Copyright 2009 The Chicago Independent Radio Project +### All Rights Reserved. +### +### Licensed under the Apache License, Version 2.0 (the "License"); +### you may not use this file except in compliance with the License. +### You may obtain a copy of the License at +### +### http://www.apache.org/licenses/LICENSE-2.0 +### +### Unless required by applicable law or agreed to in writing, software +### distributed under the License is distributed on an "AS IS" BASIS, +### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### See the License for the specific language governing permissions and +### limitations under the License. +### + +import os +import time +import unittest + +from django import http +from django.test.client import Client +from google.appengine.api import users as google_users + +import auth +from auth import forms as auth_forms +from auth import roles +from auth.models import User + + +# These are needed by the App Engine local user service stub. +# (google_appengine/google/appengine/api/user_service_stub.py) +os.environ['SERVER_NAME'] = 'localhost' +os.environ['SERVER_PORT'] = '1234' +# We need this in order to instantiate a google_users.User object. +os.environ['USER_EMAIL'] = 'test@test.com' + + +class AuthTestCase(unittest.TestCase): + + def setUp(self): + # Remember the original versions of these functions. + self._orig_get_current_user = google_users.get_current_user + self._orig_is_current_user_admin = google_users.is_current_user_admin + self._orig_time = time.time + # Now replace them with mocks. + self.g_user = None + self.is_superuser = False + self.now = 12345 + google_users.get_current_user = lambda: self.g_user + google_users.is_current_user_admin = lambda: self.is_superuser + time.time = lambda: self.now + + def tearDown(self): + # Restore the google_users APIs we mocked out. + google_users.get_current_user = self._orig_get_current_user + google_users.is_current_user_admin = self._orig_is_current_user_admin + time.time = self._orig_time + + def test_user_model_role_properties(self): + user = User(email='test') + self.assertFalse(user.is_volunteer_coordinator) + user.roles.append(roles.VOLUNTEER_COORDINATOR) + self.assertTrue(user.is_volunteer_coordinator) + + def test_user_password_checks(self): + user = User(email='test_pw_checks@test.com') + self.assertFalse(user.check_password('foo')) + user.set_password('foo') + self.assertTrue(user.check_password('foo')) + self.assertFalse(user.check_password('bar')) + + def test_security_token_create_and_parse(self): + # Set up a test user. + email = 'token_test@test.com' + user = User(email=email) + token = auth._create_security_token(user) + # A new token should work fine and not be stale. + cred = auth._parse_security_token(token) + self.assertEqual(email, cred.email) + self.assertFalse(cred.security_token_is_stale) + # Don't accept time-traveling tokens. + self.now -= 60 + self.assertEqual(None, auth._parse_security_token(token)) + # This token is still valid, but is stale. + self.now += 0.75 * auth._TOKEN_TIMEOUT_S + cred = auth._parse_security_token(token) + self.assertEqual(email, cred.email) + self.assertTrue(cred.security_token_is_stale) + # Now the token has expired. + self.now += 0.75 * auth._TOKEN_TIMEOUT_S + self.assertEqual(None, auth._parse_security_token(token)) + # Reject random garbage. + for garbage in (None, '', 'garbage'): + self.assertEqual(None, auth._parse_security_token(garbage)) + + def test_password_reset_token_create_and_parse(self): + email = 'password_reset_token@test.com' + user = User(email=email) + token = auth.get_password_reset_token(user) + observed_email = auth.parse_passord_reset_token(token) + self.assertEqual(email, observed_email) + + def test_attach_credentials(self): + # Set up a test user. + email = 'attach_test@test.com' + user = User(email=email) + # Attach the user's credentials to a test response. + response = http.HttpResponse('test') + auth.attach_credentials(response, user) + # Make sure the response now contains a cookie with the correct + # security token. + self.assertTrue(auth._CHIRP_SECURITY_TOKEN_COOKIE in response.cookies) + token = response.cookies[auth._CHIRP_SECURITY_TOKEN_COOKIE].value + cred = auth._parse_security_token(token) + self.assertEqual(email, cred.email) + + def test_get_current_user(self): + # Set up a test user. + email = 'get_current_user_test@test.com' + user = User(email=email) + user.save() + + # Create some security tokens. + expired_token = auth._create_security_token(user) + self.now += 0.75 * auth._TOKEN_TIMEOUT_S + stale_token = auth._create_security_token(user) + self.now += 0.75 * auth._TOKEN_TIMEOUT_S + good_token = auth._create_security_token(user) + + # Create a test HttpRequest, and test using it against our + # various tokens. + request = http.HttpRequest() + request.COOKIES[auth._CHIRP_SECURITY_TOKEN_COOKIE] = expired_token + self.assertEqual(None, auth.get_current_user(request)) + request.COOKIES[auth._CHIRP_SECURITY_TOKEN_COOKIE] = stale_token + user = auth.get_current_user(request) + self.assertEqual(email, user.email) + self.assertTrue(user._credentials.security_token_is_stale) + request.COOKIES[auth._CHIRP_SECURITY_TOKEN_COOKIE] = good_token + user = auth.get_current_user(request) + self.assertEqual(email, user.email) + self.assertFalse(user._credentials.security_token_is_stale) + + # Check that we will reject an inactive user. + user.is_active = False + user.save() + self.assertRaises(auth.UserNotAllowedError, + auth.get_current_user, request) + user.is_active = True + user.save() + + # This also tests our monkey-patching of Django to make + # client.login() and client.logout(). + def test_auth_middleware(self): + client = Client() + # When returning a user of None, we should get redirected to + # a login page. + response = client.get('/') + self.assertEqual(302, response.status_code) + # Logged out users should be able to get to the login page. + response = client.get('/auth/hello') + self.assertEqual(200, response.status_code) + # Log in as a test user. + client.login(email='test@test.com') + # Logged in, active users should be able to reach '/'. + response = client.get('/') + self.assertEqual(200, response.status_code) + # Hitting the logout URL should actually log us out. + response = client.get('/auth/goodbye') + self.assertEqual(302, response.status_code) # Redirects us off-site + # Since we are now logged out, '/' should try to redirect us to + # log in. + response = client.get('/') + self.assertEqual(302, response.status_code) + # Deactived users should get a 403 + client.login(email='test@test.com', is_active=False) + response = client.get('/') + self.assertEqual(403, response.status_code) + # Logging out should take us back where we started. + client.logout() + response = client.get('/') + self.assertEqual(302, response.status_code) + + def test_client_login_supports_roles(self): + client = Client() + # This should be rejected, since the /auth/ page requires + # special credentials. + client.login(email='test@test.com', is_active=True) + response = client.get('/auth/') + self.assertEqual(403, response.status_code) + # This should work. + client.login(email='test@test.com', + roles=[roles.VOLUNTEER_COORDINATOR]) + response = client.get('/auth/') + self.assertEqual(200, response.status_code) + + def test_bootstrapping_via_google_accounts(self): + client = Client() + # Not signed in at all? We should be redirected to a Google + # login page. + response = client.get('/auth/_bootstrap') + self.assertEqual(302, response.status_code) + # Already signed in? You should see a 403. + client.login(email='bootstrap_test_user@test.com') + response = client.get('/auth/_bootstrap') + self.assertEqual(403, response.status_code) + self.assertEqual('Already logged in', response.content) + client.logout() + # Reject people who are not superusers. + g_email = 'google_user@gmail.com' + self.g_user = google_users.User(email=g_email) + self.is_superuser = False + response = client.get('/auth/_bootstrap') + self.assertEqual(403, response.status_code) + self.assertEqual('Not a chirpradio project admin', response.content) + # Create a new User object for superusers. + self.assertEqual(None, User.get_by_email(g_email)) + self.is_superuser = True + response = client.get('/auth/_bootstrap') + self.assertEqual(302, response.status_code) # Redirect to login page. + user = User.get_by_email(g_email) + self.assertEqual(g_email, user.email) + # If the user already exists for the superuser, 403. + response = client.get('/auth/_bootstrap') + self.assertEqual(403, response.status_code) + self.assertEqual('User %s already exists' % g_email, response.content) + + def test_url_generation(self): + # This is just a smoke test. + auth.create_login_url("not actually a path") + + +class FormsTestCase(unittest.TestCase): + + def test_login_form(self): + # Set up a test user. + email = 'test_login_form@test.com' + user = User(email=email) + user.set_password('password') + user.save() + # Missing required data + form = auth_forms.LoginForm({'redirect': '/'}) + self.assertFalse(form.is_valid()) + form = auth_forms.LoginForm({'redirect': '/', 'email': email}) + self.assertFalse(form.is_valid()) + # Form should fail to validate if password is incorrect. + form = auth_forms.LoginForm({'redirect': '/', + 'email': email, + 'password': 'incorrect password'}) + self.assertFalse(form.is_valid()) + # This should succeed. + form = auth_forms.LoginForm({'redirect': '/', + 'email': email, + 'password': 'password'}) + self.assertTrue(form.is_valid()) + # The form should reject inactive users. + user.is_active = False + user.save() + form = auth_forms.LoginForm({'redirect': '/', + 'email': email, + 'password': 'password'}) + self.assertFalse(form.is_valid()) + # The form should reject unknown users. + form = auth_forms.LoginForm({'redirect': '/', + 'email': 'no_such_user@test.com', + 'password': 'password'}) + self.assertFalse(form.is_valid()) + + def test_change_password_form(self): + # Set up a test user + user = User(email='test_change_password_form@test.com') + user.set_password('password') + + # The form should fail to validate if the current password is wrong. + form = auth_forms.ChangePasswordForm({ + 'current_password': 'incorrect password', + 'new_password': 'foo', + 'confirm_new_password': 'foo', + }) + form.set_user(user) + self.assertFalse(form.is_valid()) + + # The form should fail to validate if the two versions of the + # new password do not agree. + form = auth_forms.ChangePasswordForm({ + 'current_password': 'password', + 'new_password': 'foo', + 'confirm_new_password': 'bar', + }) + form.set_user(user) + self.assertFalse(form.is_valid()) + + # This should work. + form = auth_forms.ChangePasswordForm({ + 'current_password': 'password', + 'new_password': 'foo', + 'confirm_new_password': 'foo', + }) + form.set_user(user) + self.assertTrue(form.is_valid()) + + def test_forgot_password_form(self): + # Set up a test user + user = User(email='test_forgot_password_form@test.com') + user.set_password('password') + user.save() + # The form will validate if given a known email address. + form = auth_forms.ForgotPasswordForm({'email': user.email}) + self.assertTrue(form.is_valid()) + # Check that the user gets attached to the form's user + # property. + self.assertEqual(user.email, form.user.email) + # The form will not validate for an unknown email address. + form = auth_forms.ForgotPasswordForm({'email': 'nosuchuser@test.com'}) + self.assertFalse(form.is_valid()) + self.assertEqual(None, form.user) + + def test_reset_password_form(self): + # The form should validate only if both passwords are identical. + form = auth_forms.ResetPasswordForm({ + 'token': 'token', + 'new_password': 'foo', + 'confirm_new_password': 'bar'}) + self.assertFalse(form.is_valid()) + form = auth_forms.ResetPasswordForm({ + 'token': 'token', + 'new_password': 'foo', + 'confirm_new_password': 'foo'}) + self.assertTrue(form.is_valid()) + + def test_user_edit_form(self): + # TODO: Add some tests here! + pass diff --git a/auth/urls.py b/auth/urls.py new file mode 100644 index 0000000..c4e1038 --- /dev/null +++ b/auth/urls.py @@ -0,0 +1,44 @@ +### +### Copyright 2009 The Chicago Independent Radio Project +### All Rights Reserved. +### +### Licensed under the Apache License, Version 2.0 (the "License"); +### you may not use this file except in compliance with the License. +### You may obtain a copy of the License at +### +### http://www.apache.org/licenses/LICENSE-2.0 +### +### Unless required by applicable law or agreed to in writing, software +### distributed under the License is distributed on an "AS IS" BASIS, +### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### See the License for the specific language governing permissions and +### limitations under the License. +### + +"""URLs for the auth system.""" + +from django.conf import settings +from django.conf.urls.defaults import patterns + +urlpatterns = patterns( + '', + # Log in + (r'^hello/?', 'auth.views.hello'), + # Log out + (r'^goodbye/?', 'auth.views.goodbye'), + # Change your password + (r'^change_password/?', 'auth.views.change_password'), + # Send a password reset email. + (r'^forgot_password/?', 'auth.views.forgot_password'), + # Reset a forgotten password. + (r'^reset_password/?', 'auth.views.reset_password'), + # Main user management page. + (r'^/?$', 'auth.views.main_page'), + # Edit a user. + (r'^edit_user/?', 'auth.views.edit_user'), + # Add a user. + (r'^add_user/?', 'auth.views.add_user'), + + # Bootstrap a test account from a Google account. + (r'^_bootstrap/?', 'auth.views.bootstrap'), +) diff --git a/auth/views.py b/auth/views.py new file mode 100644 index 0000000..57bde19 --- /dev/null +++ b/auth/views.py @@ -0,0 +1,284 @@ +### +### Copyright 2009 The Chicago Independent Radio Project +### All Rights Reserved. +### +### Licensed under the Apache License, Version 2.0 (the "License"); +### you may not use this file except in compliance with the License. +### You may obtain a copy of the License at +### +### http://www.apache.org/licenses/LICENSE-2.0 +### +### Unless required by applicable law or agreed to in writing, software +### distributed under the License is distributed on an "AS IS" BASIS, +### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### See the License for the specific language governing permissions and +### limitations under the License. +### + +"""Views for the auth system.""" + +# Python imports +import base64 +import datetime +import logging +import os +# Django imports +from django import http +from django.template import loader, Context, RequestContext +# App Engine imports +from google.appengine.api import mail +from google.appengine.api import users as google_users +# Application imports +import auth +from auth import roles +from auth.decorators import require_role, require_signed_in_user +from auth import forms as auth_forms +from auth.models import User + +# Require this role in order to access any management tasks. +USER_MANAGEMENT_ROLE = roles.VOLUNTEER_COORDINATOR + + +### +### Log-in and log-out pages +### + +def hello(request): + """Implements our login page.""" + redirect = '/' + tmpl = loader.get_template('auth/hello.html') + if request.method == 'GET': + redirect = request.GET.get('redirect', '/') + # Already signed in? Then redirect immediately. + if request.user: + return http.HttpResponseRedirect(redirect) + form = auth_forms.LoginForm(initial={ + 'redirect': redirect, + }) + else: + form = auth_forms.LoginForm(request.POST) + if form.is_valid(): + response = http.HttpResponseRedirect(form.cleaned_data['redirect']) + auth.attach_credentials(response, form.user) + # Update the last login time in the User record. + form.user.last_login = datetime.datetime.now() + form.user.save() + return response + + ctx = RequestContext(request, {'form': form}) + return http.HttpResponse(tmpl.render(ctx)) + + +def goodbye(request): + """Implements our logout page.""" + # This makes our middleware handle the logout for us. + response = http.HttpResponse('Dummy') + response._logout = True + return response + + +### +### A page to let users change their password +### + +@require_signed_in_user +def change_password(request): + """Change password page.""" + tmpl = loader.get_template('auth/change_password.html') + ctx_vars = { + 'title': 'Change Password', + } + if request.method == 'GET': + ctx_vars['form'] = auth_forms.ChangePasswordForm() + else: + form = auth_forms.ChangePasswordForm(request.POST) + form.set_user(request.user) + if not form.is_valid(): + ctx_vars['form'] = form + else: + request.user.set_password(form.cleaned_data['new_password']) + request.user.save() + ctx = RequestContext(request, ctx_vars) + return http.HttpResponse(tmpl.render(ctx)) + + +### +### Pages to allow a user to reset a forgotten password. +### + +def forgot_password(request): + """Request a a password reset email. + + A user can enter an email address into a form. Submitting causes + an email containing a URL that can be clicked to restore access. + """ + if request.user: + return http.HttpResponseForbidden('Logged-in users prohibited.') + # TODO(trow): Rate-limit password reset emails? + tmpl = loader.get_template('auth/forgot_password.html') + ctx_vars = { + 'title': 'Recover Forgotten Password', + } + if request.method == 'GET': + ctx_vars['form'] = auth_forms.ForgotPasswordForm() + else: + form = auth_forms.ForgotPasswordForm(request.POST) + if not form.is_valid(): + ctx_vars['form'] = form + else: + email = ctx_vars['email'] = form.user.email + # Assemble the URL that can be used to access the password + # reset form. + token = auth.get_password_reset_token(form.user) + url = 'http://%s/auth/reset_password?token=%s' % ( + os.environ['HTTP_HOST'], token) + # Construct and send the email message + msg_tmpl = loader.get_template('auth/forgot_password_email.txt') + msg_ctx = Context({'user': form.user, 'url': url}) + msg_body = msg_tmpl.render(msg_ctx) + # Actually send the email message. + # TODO(trow): This should come from a more general account. + mail.send_mail(sender='trowbridge.jon@gmail.com', + to=form.user.email, + subject='Recovering your forgotten CHIRP password', + body=msg_body) + ctx = RequestContext(request, ctx_vars) + return http.HttpResponse(tmpl.render(ctx)) + + +def reset_password(request): + """Allow a user to reset their password. + + The user authenticates by presenting a security token. Users will + arrive at this page by clicking on the URL in the email they are + sent by the /auth/forgot_password page. + """ + if request.user: + return http.HttpResponseForbidden('Logged-in users prohibited.') + tmpl = loader.get_template('auth/reset_password.html') + ctx_vars = { + 'Title': 'Reset Password', + } + user = None + if request.method == 'GET': + token = request.GET.get('token') + if token is None: + return http.HttpResponseForbidden('Missing token') + email = auth.parse_passord_reset_token(token) + if email is None: + return http.HttpResponseForbidden('Invalid token') + ctx_vars['form'] = auth_forms.ResetPasswordForm( + initial={'token': token}) + else: + form = auth_forms.ResetPasswordForm(request.POST) + if not form.is_valid(): + ctx_vars['form'] = form + else: + token = form.cleaned_data['token'] + email = token and auth.parse_passord_reset_token(token) + if email is None: + return http.HttpResponseForbidden('Invalid token') + user = User.get_by_email(email) + if user is None: + return http.HttpResponseForbidden('No user for token') + user.set_password(form.cleaned_data['new_password']) + # We are also logging the user in automatically, so record + # the time. + user.last_login = datetime.datetime.now() + user.save() + # Attach the user to the request so that our page will + # display the chrome shown to logged-in users. + request.user = user + ctx = RequestContext(request, ctx_vars) + response = http.HttpResponse(tmpl.render(ctx)) + if request.user: + auth.attach_credentials(response, request.user) + return response + + +### +### Simple user management tools. +### + +@require_role(USER_MANAGEMENT_ROLE) +def main_page(request): + """Lists all users.""" + tmpl = loader.get_template('auth/main_page.html') + all_users = list(User.all().order('last_name').order('first_name')) + num_active_users = sum(u.is_active for u in all_users) + active = [u for u in all_users if u.is_active] + inactive = [u for u in all_users if not u.is_active] + ctx = RequestContext(request, { + 'title': 'User Management', + 'all_users': active + inactive, + 'num_active_users': num_active_users, + }) + return http.HttpResponse(tmpl.render(ctx)) + + +@require_role(USER_MANAGEMENT_ROLE) +def edit_user(request): + tmpl = loader.get_template('auth/user_form.html') + if request.method == 'GET': + email = request.GET.get('email') + user_to_edit = User.get_by_email(email) + user_form = auth_forms.UserForm.from_user(user_to_edit) + elif request.method == 'POST': + user_form = auth_forms.UserForm(request.POST) + if user_form.is_valid(): + user_to_edit = user_form.to_user() + user_to_edit.save() + # When finished, redirect user back to the user list. + return http.HttpResponseRedirect('/auth/') + ctx = RequestContext(request, { + 'title': 'Edit User', + 'user_to_edit': user_to_edit, + 'form': user_form, + }) + return http.HttpResponse(tmpl.render(ctx)) + + +@require_role(USER_MANAGEMENT_ROLE) +def add_user(request): + tmpl = loader.get_template('auth/user_form.html') + ctx_vars = { + 'title': 'Add New User', + } + if request.method == 'GET': + ctx_vars['form'] = auth_forms.UserForm() + elif request.method == 'POST': + form = auth_forms.UserForm(request.POST) + if not form.is_valid(): + ctx_vars['form'] = form + if form.is_valid(): + user = form.to_user() + user.save() + ctx_vars['message'] = 'Successfully added user %s' % user.email + ctx_vars['form'] = auth_forms.UserForm() + ctx = RequestContext(request, ctx_vars) + return http.HttpResponse(tmpl.render(ctx)) + + +### +### A backdoor for sysadmins. Useful during testing. Probably should be +### turned off in production. +### + +def bootstrap(request): + """If the visitor is a chirpradio admin, create a user for them.""" + if request.user is None: + g_user = google_users.get_current_user() + if g_user is None: + return http.HttpResponseRedirect( + google_users.create_login_url(request.path)) + if not google_users.is_current_user_admin(): + return http.HttpResponseForbidden('Not a chirpradio project admin') + user = User.get_by_email(g_user.email()) + if user: + return http.HttpResponseForbidden( + 'User %s already exists' % user.email) + user = User(email=g_user.email(), is_superuser=True) + user.set_password("test") + user.save() + return http.HttpResponseRedirect(auth.create_login_url('/')) + return http.HttpResponseForbidden("Already logged in") diff --git a/common/__init__.py b/common/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/common/context_processors.py b/common/context_processors.py new file mode 100644 index 0000000..15aef82 --- /dev/null +++ b/common/context_processors.py @@ -0,0 +1,12 @@ + +"""Custom context processor for CHIRP request templates.""" + +import auth + + +def base(request): + return { + 'user': request.user, + 'login_url': auth.create_login_url('/'), + 'logout_url': auth.LOGOUT_URL, + } diff --git a/common/decorators.py b/common/decorators.py new file mode 100644 index 0000000..142a9a2 --- /dev/null +++ b/common/decorators.py @@ -0,0 +1,25 @@ +import logging +import traceback + +from django.utils import simplejson +from django.http import HttpResponse + + +def respond_with_json(func): + """Convert a handler's return value into a JSON-ified HttpResponse.""" + def wrapper(*args, **kwargs): + try: + response_py = func(*args, **kwargs) + status = 200 + except Exception, err: + logging.exception('Error in JSON response') + response_py = { + 'success': False, + 'error': repr(err), + 'traceback': traceback.format_exc() + } + status = 500 + return HttpResponse(simplejson.dumps(response_py), + mimetype='application/json', + status=status ) + return wrapper diff --git a/django-extras/README b/django-extras/README new file mode 100644 index 0000000..a42bd17 --- /dev/null +++ b/django-extras/README @@ -0,0 +1,5 @@ +Modules in this tree are superimposed into the django module's +namespace. For example, the module django-extras/foo/bar.py could be +imported with: + + from django.foo import bar diff --git a/django-extras/__init__.py b/django-extras/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django-extras/_monkey_patch.py b/django-extras/_monkey_patch.py new file mode 100644 index 0000000..f2ca108 --- /dev/null +++ b/django-extras/_monkey_patch.py @@ -0,0 +1,40 @@ + +"""Monkey-patching for Django. + +These are CHIRP-specific hacks that make Django 1.0 behave the way we want. +""" + +from django.test import client +import auth +from auth.models import User + + +### +### Replaces Client.login and Client.logout with versions that +### support our custom authentication. +### + +def fake_Client_login(self, **credentials): + """If the given credentials are valid, return a User object.""" + user = None + email = credentials.get('email') + if email: + user = User.get_by_email(email) + if user is None: + user = User(email=email) + for key, value in credentials.items(): + setattr(user, key, value) + user.save() + + token = '' + if user: + token = auth._create_security_token(user) + self.cookies[auth._CHIRP_SECURITY_TOKEN_COOKIE] = token + + +def fake_Client_logout(self): + del self.cookies[auth._CHIRP_SECURITY_TOKEN_COOKIE] + + +client.Client.login = fake_Client_login +client.Client.logout = fake_Client_logout diff --git a/django-extras/contrib/__init__.py b/django-extras/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/django-extras/contrib/auth/__init__.py b/django-extras/contrib/auth/__init__.py new file mode 100644 index 0000000..98d232d --- /dev/null +++ b/django-extras/contrib/auth/__init__.py @@ -0,0 +1,15 @@ +"""Stubbed-out versions of django.contrib.auth functions. + +Some parts of core Django (like the testing system) depend on +django.contrib.auth. Here we put in a few stub APIs, just enough to +keep the imports from failing. +""" + +from auth.models import User + +def authenticate(**credentials): + raise NotImplementedError + + +def login(request, user): + raise NotImplementedError diff --git a/django-extras/foo.py b/django-extras/foo.py new file mode 100644 index 0000000..e69de29 diff --git a/django.zip b/django.zip new file mode 100644 index 0000000000000000000000000000000000000000..a9679efdb38e9a2b24805b5e20c3cc7820cdc61c GIT binary patch literal 516844 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ℜh-D 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 hPepOYK>IdgHLOqyUE=s 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 literal 0 HcmV?d00001 diff --git a/landing_page/__init__.py b/landing_page/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/landing_page/views.py b/landing_page/views.py new file mode 100644 index 0000000..7427d6c --- /dev/null +++ b/landing_page/views.py @@ -0,0 +1,13 @@ + +"""Views for the site landing page.""" + +from django import http +from django.template import RequestContext, loader + + +def landing_page(request): + template = loader.get_template('landing_page/landing_page.html') + ctx = RequestContext(request, { + 'title': 'Welcome to chirpradio', + }) + return http.HttpResponse(template.render(ctx)) diff --git a/main.py b/main.py new file mode 100755 index 0000000..6a5546a --- /dev/null +++ b/main.py @@ -0,0 +1,59 @@ +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Bootstrap for running a Django app under Google App Engine. + +The site-specific code is all in other files: settings.py, urls.py, +models.py, views.py. And in fact, only 'settings' is referenced here +directly -- everything else is controlled from there. + +""" + +# Standard Python imports. +import os +import sys +import logging + +from appengine_django import InstallAppengineHelperForDjango +from appengine_django import have_django_zip +from appengine_django import django_zip_path +InstallAppengineHelperForDjango() + +# Google App Engine imports. +from google.appengine.ext.webapp import util + +# Import the part of Django that we use here. +import django.core.handlers.wsgi + +def main(): + # Ensure the Django zipfile is in the path if required. + if have_django_zip and django_zip_path not in sys.path: + sys.path.insert(1, django_zip_path) + + # Map the contents of the django-extras tree into the django + # module's namespace. + import django + django.__path__.append('django-extras') + + # Pull in CHIRP's monkey-patching of Django + from django import _monkey_patch + + # Create a Django application for WSGI. + application = django.core.handlers.wsgi.WSGIHandler() + + # Run the WSGI CGI handler with that application. + util.run_wsgi_app(application) + +if __name__ == '__main__': + main() diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..2dd847d --- /dev/null +++ b/manage.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from appengine_django import InstallAppengineHelperForDjango +InstallAppengineHelperForDjango() + +# Superimpose the contents of the django-extras tree onto the django +# module's namespace. +import django +django.__path__.append('django-extras') + +# Pull in CHIRP's monkey-patching of Django +from django import _monkey_patch + +from django.core.management import execute_manager +try: + import settings # Assumed to be in the same directory. +except ImportError: + import sys + sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) + sys.exit(1) + + +if __name__ == "__main__": + execute_manager(settings) diff --git a/media/common/css/base.css b/media/common/css/base.css new file mode 100644 index 0000000..4054279 --- /dev/null +++ b/media/common/css/base.css @@ -0,0 +1,3 @@ + +/* TODO: Fill this in and make everything pretty. */ + diff --git a/media/ext_js/jquery-autocomplete/autocomplete_docs.txt b/media/ext_js/jquery-autocomplete/autocomplete_docs.txt new file mode 100644 index 0000000..a8b0f51 --- /dev/null +++ b/media/ext_js/jquery-autocomplete/autocomplete_docs.txt @@ -0,0 +1,153 @@ +Autocomplete - a jQuery plugin + +NOTE: This is a modification of the jQuery Autocomplete Plug-in written by Dylan Verheul. The documentation is also based on Dylan's documentation, I made additions/changes as need to support my modifications. + +Usage: +====== +$("selector").autocomplete(url [, options]); +$("selector").autocompleteArray(array [, options]); + +Demo page (search for City names in the state of Ohio (US)): +================================================================== +http://www.pengoworks.com/workshop/jquery/autocomplete.htm + +Advice: +======= +Make sure that selector selects only one element, unless you really, really know what you are doing. + +Example 1: +========== +$("#input_box").autocomplete("autocomplete_ajax.cfm"); + +In the above example, Autocomplete expects an input element with the id "input_box" to exist. When a user starts typing in the input box, the autocompleter will request autocomplete_ajax.cfm with a GET parameter named q that contains the current value of the input box. Let's assume that the user has typed "sp" (without quotes). Autocomplete will then request autocomplete_ajax.cfm?q=sp. + +You can see an example of the output here: +http://www.pengoworks.com/workshop/jquery/autocomplete_ajax.cfm?q=sp + +The backend should output possible values for the autocompleter, each on a single line. Output cannot contain the pipe symbol "|", since that is considered a separator (more on that later). + +An appropiate simple output would be: + +Sparta +Spencer +Spencerville +Spring Valley +Springboro +Springfield + +NOTE: The autocompleter will present the options in the order the backend sends them. + +Example 2: +========== +$("#input_box").autocompleteArray(["Allen","Albert","Alberto","Alladin"]); + +In the above example, and autocomplete box would be populated based on an array containing the items listed above. There are times when you have a very small subset of data you need to allow a user to select from and in those case AJAX operations are often overkill. You can load all the data locally and use an array to build your autocomplete suggestion list. + + +Plug-in Mod/Enhancements +======================== +* Supports local data array (can now use w/out AJAX). +* Limit dropdown to XX number of results (good for limiting the results to users) +* Autofill pre-populates text box as you type +* New findValue() method can be used to programmatically determine if the value in the box is a valid option. (Useful for verifying the text entered is an existing value option.) +* Dropdown options now correctly re-position themselves on each display (which means they adjust for changing to the DOM) +* Dropdown box defaults to the width of the input field its attached to (you can manually specify a larger width as well) +* Better emulates Windows autocomplete boxes (for example: hitting delete and retyping the same box will now bring back the dropdown menu) +* Miscellaneous bug fixes + + +Advanced options: +================= + +You can pass advanced options as a JavaScript object, notation { name:value, ..., name: value } +Example: $("#input_box").autocomplete("my_autocomplete_backend.php", { minChars:3 }); + +These options are available: + +autoFill (default value: false) + Whether or not the first match should be used to autofill in the input element. As you type, the first match will be filled in the input element as a best guess as to what you're looking for. Text you did not manually type will be pre-selected so typing the next character will make the guess go away and the next best match will be populated. + +inputClass (default value: "ac_input") + This class will be added to the input box. + +resultsClass (default value: "ac_results") + The class for the UL that will contain the result items (result items are LI elements). + +loadingClass = (default value: "ac_loading") + The class for the input box while results are being fetched from the server. + +lineSeparator = (default value: "\n") + The character that separates lines in the results from the backend. + +cellSeparator (default value: "|") + The character that separates cells in the results from the backend. + +minChars (default value: 1) + The minimum number of characters a user has to type before the autocompleter activates. + +delay (default value: 400) + The delay in milliseconds the autocompleter waits after a keystroke to activate itself. If you're using the data property to set a local array, you may wish to increase the delay to a shorter time frame (such as 40ms.) + +cacheLength (default value: 1) + The number of backend query results to store in cache. If set to 1 (the current result), no caching will happen. Do not set below 1. + +matchSubset (default value: 1) + Whether or not the autocompleter can use a cache for more specific queries. This means that all matches of "foot" are a subset of all matches for "foo". Usually this is true, and using this options decreases server load and increases performance. Remember to set cacheLength to a bigger number, like 10. + +matchCase (default value: 0) + Whether or not the comparison is case sensitive. Only important only if you use caching. + +matchContains = options.matchContains || 0; + Whether or not the comparison looks inside (i.e. does "ba" match "foo bar") the search results. Only important if you use caching. + +maxItemsToShow (default value: -1) + Limits the number of results that will be showed in the drop down. This is useful if you have a large dataset and don't want to provide the user with a list that could contain hundreds of items. To disable this feature, set the value to -1. + +mustMatch (default value: 0) + If set to 1 (true), the autocompleter will only allow results that are presented by the backend. Note that illegal values result in an empty input box. In the example at the beginning of this documentation, typing "footer" would result in an empty input box. + +extraParams (default value: {}) + Extra parameters for the backend. If you were to specify { bar:4 }, the autocompleter would call my_autocomplete_backend.php?q=foo&bar=4 (assuming the input box contains "foo"). + +width (default value: 0) + Sets the width of the drop down layer. If a non-positive integer is specified, then the width of the box will be determined by the width of the input element. Generally speaking, you'll want to leave this value alone. However, in some circumstances you may have a small input element where the drop down layer needs to display a lot of options. In that case, you can specify a larger size. + +selectFirst (default value: false) + If this is set to true, the first autocomplete value will be automatically selected on tab/return, even if it has not been handpicked by keyboard or mouse action. If there is a handpicked (highlighted) result, that result will take precedence. + +selectOnly (default value: false) + If this is set to true, and there is only one autocomplete when the user hits tab/return, it will be selected even if it has not been handpicked by keyboard or mouse action. This overrides selectFirst. + +formatItem (default value: none) + A JavaScript funcion that can provide advanced markup for an item. For each row of results, this function will be called. The returned value will be displayed inside an LI element in the results list. Autocompleter will provide 3 parameters: the results row, the position of the row in the list of results, and the number of items in the list of results. See the source code of http://www.dyve.net/jquery?autocomplete for an example. + +onSelectItem (default value: none) + A JavaScript function that will be called when an item is selected. The autocompleter will specify a single argument, being the LI element selected. This LI element will have an attribute "extra" that contains an array of all cells that the backend specified. See the source code of http://www.dyve.net/jquery?autocomplete for an example. + +onFindValue (default value: none) + A JavaScript function that will be called when the findValue() method is called. The function will be passed the select LI element--just like the onSelectItem function is. + +More advanced options +===================== + +If you want to do more with your autocompleter, you can change some options on the fly. +The autocompleter is accessed as an attribute of the input box. + +Example: +// set the autocompleter +var ac = $("#input_box").autocomplete("my_autocomplete_backend.php"); +// would look up the value of the autocomplete box based on the text in the input element +ac[0].autocompleter.findValue(); + +There following functions that can be called to influence the behaviour at run-time: + +findValue() + This will examine the value currently in the input element and look it's value up to see if it can find a matching value. This function can potentially perform an AJAX operation, therefore the findValue() function does not return a value. Instead, you need to specific a onFindValue callback function that will run. This method is valuable if you need to set the Autocomplete input element to a value via JavaScript and the "value" of the text field is mapped to extended properties stored in the LI element's "extra" property. + +flushCache() + This flushes the cache. + +setExtraParams(obj) + This sets the extra parameters of the autocompleter to obj (which should be a JavaScript object, see above). + +It's often wise to flush the cache after calling setExtraParameters. diff --git a/media/ext_js/jquery-autocomplete/jquery.autocomplete.css b/media/ext_js/jquery-autocomplete/jquery.autocomplete.css new file mode 100644 index 0000000..e1a26be --- /dev/null +++ b/media/ext_js/jquery-autocomplete/jquery.autocomplete.css @@ -0,0 +1,46 @@ +.ac_results { + padding: 0px; + border: 1px solid WindowFrame; + background-color: Window; + overflow: hidden; +} + +.ac_results ul { + width: 100%; + list-style-position: outside; + list-style: none; + padding: 0; + margin: 0; +} + +.ac_results iframe { + display:none;/*sorry for IE5*/ + display/**/:block;/*sorry for IE5*/ + position:absolute; + top:0; + left:0; + z-index:-1; + filter:mask(); + width:3000px; + height:3000px; +} + +.ac_results li { + margin: 0px; + padding: 2px 5px; + cursor: pointer; + display: block; + width: 100%; + font: menu; + font-size: 12px; + overflow: hidden; +} + +.ac_loading { + background : Window url('./indicator.gif') right center no-repeat; +} + +.ac_over { + background-color: Highlight; + color: HighlightText; +} diff --git a/media/ext_js/jquery-autocomplete/jquery.autocomplete.js b/media/ext_js/jquery-autocomplete/jquery.autocomplete.js new file mode 100644 index 0000000..76af765 --- /dev/null +++ b/media/ext_js/jquery-autocomplete/jquery.autocomplete.js @@ -0,0 +1,502 @@ +jQuery.autocomplete = function(input, options) { + // Create a link to self + var me = this; + + // Create jQuery object for input element + var $input = $(input).attr("autocomplete", "off"); + + // Apply inputClass if necessary + if (options.inputClass) $input.addClass(options.inputClass); + + // Create results + var results = document.createElement("div"); + // Create jQuery object for results + var $results = $(results); + $results.hide().addClass(options.resultsClass).css("position", "absolute"); + if( options.width > 0 ) $results.css("width", options.width); + + // Add to body element + $("body").append(results); + + input.autocompleter = me; + + var timeout = null; + var prev = ""; + var active = -1; + var cache = {}; + var keyb = false; + var hasFocus = false; + var lastKeyPressCode = null; + + // flush cache + function flushCache(){ + cache = {}; + cache.data = {}; + cache.length = 0; + }; + + // flush cache + flushCache(); + + // if there is a data array supplied + if( options.data != null ){ + var sFirstChar = "", stMatchSets = {}, row = []; + + // no url was specified, we need to adjust the cache length to make sure it fits the local data store + if( typeof options.url != "string" ) options.cacheLength = 1; + + // loop through the array and create a lookup structure + for( var i=0; i < options.data.length; i++ ){ + // if row is a string, make an array otherwise just reference the array + row = ((typeof options.data[i] == "string") ? [options.data[i]] : options.data[i]); + + // if the length is zero, don't add to list + if( row[0].length > 0 ){ + // get the first character + sFirstChar = row[0].substring(0, 1).toLowerCase(); + // if no lookup array for this character exists, look it up now + if( !stMatchSets[sFirstChar] ) stMatchSets[sFirstChar] = []; + // if the match is a string + stMatchSets[sFirstChar].push(row); + } + } + + // add the data items to the cache + for( var k in stMatchSets ){ + // increase the cache size + options.cacheLength++; + // add to the cache + addToCache(k, stMatchSets[k]); + } + } + + $input + .keydown(function(e) { + // track last key pressed + lastKeyPressCode = e.keyCode; + switch(e.keyCode) { + case 38: // up + e.preventDefault(); + moveSelect(-1); + break; + case 40: // down + e.preventDefault(); + moveSelect(1); + break; + case 9: // tab + case 13: // return + if( selectCurrent() ){ + // make sure to blur off the current field + $input.get(0).blur(); + e.preventDefault(); + } + break; + default: + active = -1; + if (timeout) clearTimeout(timeout); + timeout = setTimeout(function(){onChange();}, options.delay); + break; + } + }) + .focus(function(){ + // track whether the field has focus, we shouldn't process any results if the field no longer has focus + hasFocus = true; + }) + .blur(function() { + // track whether the field has focus + hasFocus = false; + hideResults(); + }); + + hideResultsNow(); + + function onChange() { + // ignore if the following keys are pressed: [del] [shift] [capslock] + if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ) return $results.hide(); + var v = $input.val(); + if (v == prev) return; + prev = v; + if (v.length >= options.minChars) { + $input.addClass(options.loadingClass); + requestData(v); + } else { + $input.removeClass(options.loadingClass); + $results.hide(); + } + }; + + function moveSelect(step) { + + var lis = $("li", results); + if (!lis) return; + + active += step; + + if (active < 0) { + active = 0; + } else if (active >= lis.size()) { + active = lis.size() - 1; + } + + lis.removeClass("ac_over"); + + $(lis[active]).addClass("ac_over"); + + // Weird behaviour in IE + // if (lis[active] && lis[active].scrollIntoView) { + // lis[active].scrollIntoView(false); + // } + + }; + + function selectCurrent() { + var li = $("li.ac_over", results)[0]; + if (!li) { + var $li = $("li", results); + if (options.selectOnly) { + if ($li.length == 1) li = $li[0]; + } else if (options.selectFirst) { + li = $li[0]; + } + } + if (li) { + selectItem(li); + return true; + } else { + return false; + } + }; + + function selectItem(li) { + if (!li) { + li = document.createElement("li"); + li.extra = []; + li.selectValue = ""; + } + var v = $.trim(li.selectValue ? li.selectValue : li.innerHTML); + input.lastSelected = v; + prev = v; + $results.html(""); + $input.val(v); + hideResultsNow(); + if (options.onItemSelect) setTimeout(function() { options.onItemSelect(li) }, 1); + }; + + // selects a portion of the input string + function createSelection(start, end){ + // get a reference to the input element + var field = $input.get(0); + if( field.createTextRange ){ + var selRange = field.createTextRange(); + selRange.collapse(true); + selRange.moveStart("character", start); + selRange.moveEnd("character", end); + selRange.select(); + } else if( field.setSelectionRange ){ + field.setSelectionRange(start, end); + } else { + if( field.selectionStart ){ + field.selectionStart = start; + field.selectionEnd = end; + } + } + field.focus(); + }; + + // fills in the input box w/the first match (assumed to be the best match) + function autoFill(sValue){ + // if the last user key pressed was backspace, don't autofill + if( lastKeyPressCode != 8 ){ + // fill in the value (keep the case the user has typed) + $input.val($input.val() + sValue.substring(prev.length)); + // select the portion of the value not typed by the user (so the next character will erase) + createSelection(prev.length, sValue.length); + } + }; + + function showResults() { + // get the position of the input field right now (in case the DOM is shifted) + var pos = findPos(input); + // either use the specified width, or autocalculate based on form element + var iWidth = (options.width > 0) ? options.width : $input.width(); + // reposition + $results.css({ + width: parseInt(iWidth) + "px", + top: (pos.y + input.offsetHeight) + "px", + left: pos.x + "px" + }).show(); + }; + + function hideResults() { + if (timeout) clearTimeout(timeout); + timeout = setTimeout(hideResultsNow, 200); + }; + + function hideResultsNow() { + if (timeout) clearTimeout(timeout); + $input.removeClass(options.loadingClass); + if ($results.is(":visible")) { + $results.hide(); + } + if (options.mustMatch) { + var v = $input.val(); + if (v != input.lastSelected) { + selectItem(null); + } + } + }; + + function receiveData(q, data) { + if (data) { + $input.removeClass(options.loadingClass); + results.innerHTML = ""; + + // if the field no longer has focus or if there are no matches, do not display the drop down + if( !hasFocus || data.length == 0 ) return hideResultsNow(); + + if ($.browser.msie) { + // we put a styled iframe behind the calendar so HTML SELECT elements don't show through + $results.append(document.createElement('iframe')); + } + results.appendChild(dataToDom(data)); + // autofill in the complete box w/the first match as long as the user hasn't entered in more data + if( options.autoFill && ($input.val().toLowerCase() == q.toLowerCase()) ) autoFill(data[0][0]); + showResults(); + } else { + hideResultsNow(); + } + }; + + function parseData(data) { + if (!data) return null; + var parsed = []; + var rows = data.split(options.lineSeparator); + for (var i=0; i < rows.length; i++) { + var row = $.trim(rows[i]); + if (row) { + parsed[parsed.length] = row.split(options.cellSeparator); + } + } + return parsed; + }; + + function dataToDom(data) { + var ul = document.createElement("ul"); + var num = data.length; + + // limited results to a max number + if( (options.maxItemsToShow > 0) && (options.maxItemsToShow < num) ) num = options.maxItemsToShow; + + for (var i=0; i < num; i++) { + var row = data[i]; + if (!row) continue; + var li = document.createElement("li"); + if (options.formatItem) { + li.innerHTML = options.formatItem(row, i, num); + li.selectValue = row[0]; + } else { + li.innerHTML = row[0]; + li.selectValue = row[0]; + } + var extra = null; + if (row.length > 1) { + extra = []; + for (var j=1; j < row.length; j++) { + extra[extra.length] = row[j]; + } + } + li.extra = extra; + ul.appendChild(li); + $(li).hover( + function() { $("li", ul).removeClass("ac_over"); $(this).addClass("ac_over"); active = $("li", ul).indexOf($(this).get(0)); }, + function() { $(this).removeClass("ac_over"); } + ).click(function(e) { e.preventDefault(); e.stopPropagation(); selectItem(this) }); + } + return ul; + }; + + function requestData(q) { + if (!options.matchCase) q = q.toLowerCase(); + var data = options.cacheLength ? loadFromCache(q) : null; + // recieve the cached data + if (data) { + receiveData(q, data); + // if an AJAX url has been supplied, try loading the data now + } else if( (typeof options.url == "string") && (options.url.length > 0) ){ + $.get(makeUrl(q), function(data) { + data = parseData(data); + addToCache(q, data); + receiveData(q, data); + }); + // if there's been no data found, remove the loading class + } else { + $input.removeClass(options.loadingClass); + } + }; + + function makeUrl(q) { + var url = options.url + "?q=" + encodeURI(q); + for (var i in options.extraParams) { + url += "&" + i + "=" + encodeURI(options.extraParams[i]); + } + return url; + }; + + function loadFromCache(q) { + if (!q) return null; + if (cache.data[q]) return cache.data[q]; + if (options.matchSubset) { + for (var i = q.length - 1; i >= options.minChars; i--) { + var qs = q.substr(0, i); + var c = cache.data[qs]; + if (c) { + var csub = []; + for (var j = 0; j < c.length; j++) { + var x = c[j]; + var x0 = x[0]; + if (matchSubset(x0, q)) { + csub[csub.length] = x; + } + } + return csub; + } + } + } + return null; + }; + + function matchSubset(s, sub) { + if (!options.matchCase) s = s.toLowerCase(); + var i = s.indexOf(sub); + if (i == -1) return false; + return i == 0 || options.matchContains; + }; + + this.flushCache = function() { + flushCache(); + }; + + this.setExtraParams = function(p) { + options.extraParams = p; + }; + + this.findValue = function(){ + var q = $input.val(); + + if (!options.matchCase) q = q.toLowerCase(); + var data = options.cacheLength ? loadFromCache(q) : null; + if (data) { + findValueCallback(q, data); + } else if( (typeof options.url == "string") && (options.url.length > 0) ){ + $.get(makeUrl(q), function(data) { + data = parseData(data) + addToCache(q, data); + findValueCallback(q, data); + }); + } else { + // no matches + findValueCallback(q, null); + } + } + + function findValueCallback(q, data){ + if (data) $input.removeClass(options.loadingClass); + + var num = (data) ? data.length : 0; + var li = null; + + for (var i=0; i < num; i++) { + var row = data[i]; + + if( row[0].toLowerCase() == q.toLowerCase() ){ + li = document.createElement("li"); + if (options.formatItem) { + li.innerHTML = options.formatItem(row, i, num); + li.selectValue = row[0]; + } else { + li.innerHTML = row[0]; + li.selectValue = row[0]; + } + var extra = null; + if( row.length > 1 ){ + extra = []; + for (var j=1; j < row.length; j++) { + extra[extra.length] = row[j]; + } + } + li.extra = extra; + } + } + + if( options.onFindValue ) setTimeout(function() { options.onFindValue(li) }, 1); + } + + function addToCache(q, data) { + if (!data || !q || !options.cacheLength) return; + if (!cache.length || cache.length > options.cacheLength) { + flushCache(); + cache.length++; + } else if (!cache[q]) { + cache.length++; + } + cache.data[q] = data; + }; + + function findPos(obj) { + var curleft = obj.offsetLeft || 0; + var curtop = obj.offsetTop || 0; + while (obj = obj.offsetParent) { + curleft += obj.offsetLeft + curtop += obj.offsetTop + } + return {x:curleft,y:curtop}; + } +} + +jQuery.fn.autocomplete = function(url, options, data) { + // Make sure options exists + options = options || {}; + // Set url as option + options.url = url; + // set some bulk local data + options.data = ((typeof data == "object") && (data.constructor == Array)) ? data : null; + + // Set default values for required options + options.inputClass = options.inputClass || "ac_input"; + options.resultsClass = options.resultsClass || "ac_results"; + options.lineSeparator = options.lineSeparator || "\n"; + options.cellSeparator = options.cellSeparator || "|"; + options.minChars = options.minChars || 1; + options.delay = options.delay || 400; + options.matchCase = options.matchCase || 0; + options.matchSubset = options.matchSubset || 1; + options.matchContains = options.matchContains || 0; + options.cacheLength = options.cacheLength || 1; + options.mustMatch = options.mustMatch || 0; + options.extraParams = options.extraParams || {}; + options.loadingClass = options.loadingClass || "ac_loading"; + options.selectFirst = options.selectFirst || false; + options.selectOnly = options.selectOnly || false; + options.maxItemsToShow = options.maxItemsToShow || -1; + options.autoFill = options.autoFill || false; + options.width = parseInt(options.width, 10) || 0; + + this.each(function() { + var input = this; + new jQuery.autocomplete(input, options); + }); + + // Don't break the chain + return this; +} + +jQuery.fn.autocompleteArray = function(data, options) { + return this.autocomplete(null, options, data); +} + +jQuery.fn.indexOf = function(e){ + for( var i=0; i + + + + Themeroller Demo + + + + + + + + + + + +

Accordion

+
+

Section 1

+
+

Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.

+
+

Section 2

+
+

Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna.

+
+

Section 3

+
+

Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.

+
    +
  • List item one
  • +
  • List item two
  • +
  • List item three
  • +
+
+
+ + +

Tabs

+
+ +
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+
Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.
+
Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.
+
+ + +

Dialog

+

Open Dialog

+ + +

Overlay and Shadow Classes

+
+

Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci.

Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam.

Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante.

Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi.

+ + +
+
+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+
+
+ +
+ + + +
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

+
+ + + +

Framework Icons (content color preview)

+
    + +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • + +
  • +
  • +
  • +
  • +
  • +
+ + + + + +

Slider

+
+ + +

Datepicker

+
+ + +

Progressbar

+
+ + +

Highlight / Error

+
+
+

+ Hey! Sample ui-state-highlight style.

+
+
+
+
+
+

+ Alert: Sample ui-state-error style.

+
+
+ + + + + + + diff --git a/media/ext_js/jquery-ui-themeroller/jquery-1.3.1.js b/media/ext_js/jquery-ui-themeroller/jquery-1.3.1.js new file mode 100755 index 0000000..3a4badd --- /dev/null +++ b/media/ext_js/jquery-ui-themeroller/jquery-1.3.1.js @@ -0,0 +1,4241 @@ +/*! + * jQuery JavaScript Library v1.3.1 + * http://jquery.com/ + * + * Copyright (c) 2009 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-01-21 20:42:16 -0500 (Wed, 21 Jan 2009) + * Revision: 6158 + */ +(function(){ + +var + // Will speed up references to window, and allows munging its name. + window = this, + // Will speed up references to undefined, and allows munging its name. + undefined, + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + // Map over the $ in case of overwrite + _$ = window.$, + + jQuery = window.jQuery = window.$ = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context ); + }, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, + // Is it a simple selector + isSimple = /^.[^:#\[\.,]*$/; + +jQuery.fn = jQuery.prototype = { + init: function( selector, context ) { + // Make sure that a selection was provided + selector = selector || document; + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this[0] = selector; + this.length = 1; + this.context = selector; + return this; + } + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + var match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) + selector = jQuery.clean( [ match[1] ], context ); + + // HANDLE: $("#id") + else { + var elem = document.getElementById( match[3] ); + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem && elem.id != match[3] ) + return jQuery().find( selector ); + + // Otherwise, we inject the element directly into the jQuery object + var ret = jQuery( elem || [] ); + ret.context = document; + ret.selector = selector; + return ret; + } + + // HANDLE: $(expr, [context]) + // (which is just equivalent to: $(content).find(expr) + } else + return jQuery( context ).find( selector ); + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) + return jQuery( document ).ready( selector ); + + // Make sure that old selector state is passed along + if ( selector.selector && selector.context ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return this.setArray(jQuery.makeArray(selector)); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.3.1", + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num === undefined ? + + // Return a 'clean' array + jQuery.makeArray( this ) : + + // Return just the object + this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = jQuery( elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) + ret.selector = this.selector + (this.selector ? " " : "") + selector; + else if ( name ) + ret.selector = this.selector + "." + name + "(" + selector + ")"; + + // Return the newly-formed element set + return ret; + }, + + // Force the current matched set of elements to become + // the specified array of elements (destroying the stack in the process) + // You should use pushStack() in order to do this, but maintain the stack + setArray: function( elems ) { + // Resetting the length to 0, then using the native Array push + // is a super-fast way to populate an object with array-like properties + this.length = 0; + Array.prototype.push.apply( this, elems ); + + return this; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem && elem.jquery ? elem[0] : elem + , this ); + }, + + attr: function( name, value, type ) { + var options = name; + + // Look for the case where we're accessing a style value + if ( typeof name === "string" ) + if ( value === undefined ) + return this[0] && jQuery[ type || "attr" ]( this[0], name ); + + else { + options = {}; + options[ name ] = value; + } + + // Check to see if we're setting style values + return this.each(function(i){ + // Set all the styles + for ( name in options ) + jQuery.attr( + type ? + this.style : + this, + name, jQuery.prop( this, options[ name ], type, i, name ) + ); + }); + }, + + css: function( key, value ) { + // ignore negative width and height values + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) + value = undefined; + return this.attr( key, value, "curCSS" ); + }, + + text: function( text ) { + if ( typeof text !== "object" && text != null ) + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); + + var ret = ""; + + jQuery.each( text || this, function(){ + jQuery.each( this.childNodes, function(){ + if ( this.nodeType != 8 ) + ret += this.nodeType != 1 ? + this.nodeValue : + jQuery.fn.text( [ this ] ); + }); + }); + + return ret; + }, + + wrapAll: function( html ) { + if ( this[0] ) { + // The elements to wrap the target around + var wrap = jQuery( html, this[0].ownerDocument ).clone(); + + if ( this[0].parentNode ) + wrap.insertBefore( this[0] ); + + wrap.map(function(){ + var elem = this; + + while ( elem.firstChild ) + elem = elem.firstChild; + + return elem; + }).append(this); + } + + return this; + }, + + wrapInner: function( html ) { + return this.each(function(){ + jQuery( this ).contents().wrapAll( html ); + }); + }, + + wrap: function( html ) { + return this.each(function(){ + jQuery( this ).wrapAll( html ); + }); + }, + + append: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.appendChild( elem ); + }); + }, + + prepend: function() { + return this.domManip(arguments, true, function(elem){ + if (this.nodeType == 1) + this.insertBefore( elem, this.firstChild ); + }); + }, + + before: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this ); + }); + }, + + after: function() { + return this.domManip(arguments, false, function(elem){ + this.parentNode.insertBefore( elem, this.nextSibling ); + }); + }, + + end: function() { + return this.prevObject || jQuery( [] ); + }, + + // For internal use only. + // Behaves like an Array's .push method, not like a jQuery method. + push: [].push, + + find: function( selector ) { + if ( this.length === 1 && !/,/.test(selector) ) { + var ret = this.pushStack( [], "find", selector ); + ret.length = 0; + jQuery.find( selector, this[0], ret ); + return ret; + } else { + var elems = jQuery.map(this, function(elem){ + return jQuery.find( selector, elem ); + }); + + return this.pushStack( /[^+>] [^+>]/.test( selector ) ? + jQuery.unique( elems ) : + elems, "find", selector ); + } + }, + + clone: function( events ) { + // Do the clone + var ret = this.map(function(){ + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { + // IE copies events bound via attachEvent when + // using cloneNode. Calling detachEvent on the + // clone will also remove the events from the orignal + // In order to get around this, we use innerHTML. + // Unfortunately, this means some modifications to + // attributes in IE that are actually only stored + // as properties will not be copied (such as the + // the name attribute on an input). + var clone = this.cloneNode(true), + container = document.createElement("div"); + container.appendChild(clone); + return jQuery.clean([container.innerHTML])[0]; + } else + return this.cloneNode(true); + }); + + // Need to set the expando to null on the cloned set if it exists + // removeData doesn't work here, IE removes it from the original as well + // this is primarily for IE but the data expando shouldn't be copied over in any browser + var clone = ret.find("*").andSelf().each(function(){ + if ( this[ expando ] !== undefined ) + this[ expando ] = null; + }); + + // Copy the events from the original to the clone + if ( events === true ) + this.find("*").andSelf().each(function(i){ + if (this.nodeType == 3) + return; + var events = jQuery.data( this, "events" ); + + for ( var type in events ) + for ( var handler in events[ type ] ) + jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data ); + }); + + // Return the cloned set + return ret; + }, + + filter: function( selector ) { + return this.pushStack( + jQuery.isFunction( selector ) && + jQuery.grep(this, function(elem, i){ + return selector.call( elem, i ); + }) || + + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ + return elem.nodeType === 1; + }) ), "filter", selector ); + }, + + closest: function( selector ) { + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null; + + return this.map(function(){ + var cur = this; + while ( cur && cur.ownerDocument ) { + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) + return cur; + cur = cur.parentNode; + } + }); + }, + + not: function( selector ) { + if ( typeof selector === "string" ) + // test special case where just one selector is passed in + if ( isSimple.test( selector ) ) + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); + else + selector = jQuery.multiFilter( selector, this ); + + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; + return this.filter(function() { + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; + }); + }, + + add: function( selector ) { + return this.pushStack( jQuery.unique( jQuery.merge( + this.get(), + typeof selector === "string" ? + jQuery( selector ) : + jQuery.makeArray( selector ) + ))); + }, + + is: function( selector ) { + return !!selector && jQuery.multiFilter( selector, this ).length > 0; + }, + + hasClass: function( selector ) { + return !!selector && this.is( "." + selector ); + }, + + val: function( value ) { + if ( value === undefined ) { + var elem = this[0]; + + if ( elem ) { + if( jQuery.nodeName( elem, 'option' ) ) + return (elem.attributes.value || {}).specified ? elem.value : elem.text; + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type == "select-one"; + + // Nothing was selected + if ( index < 0 ) + return null; + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + if ( option.selected ) { + // Get the specifc value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) + return value; + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(/\r/g, ""); + + } + + return undefined; + } + + if ( typeof value === "number" ) + value += ''; + + return this.each(function(){ + if ( this.nodeType != 1 ) + return; + + if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) + this.checked = (jQuery.inArray(this.value, value) >= 0 || + jQuery.inArray(this.name, value) >= 0); + + else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(value); + + jQuery( "option", this ).each(function(){ + this.selected = (jQuery.inArray( this.value, values ) >= 0 || + jQuery.inArray( this.text, values ) >= 0); + }); + + if ( !values.length ) + this.selectedIndex = -1; + + } else + this.value = value; + }); + }, + + html: function( value ) { + return value === undefined ? + (this[0] ? + this[0].innerHTML : + null) : + this.empty().append( value ); + }, + + replaceWith: function( value ) { + return this.after( value ).remove(); + }, + + eq: function( i ) { + return this.slice( i, +i + 1 ); + }, + + slice: function() { + return this.pushStack( Array.prototype.slice.apply( this, arguments ), + "slice", Array.prototype.slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function(elem, i){ + return callback.call( elem, i, elem ); + })); + }, + + andSelf: function() { + return this.add( this.prevObject ); + }, + + domManip: function( args, table, callback ) { + if ( this[0] ) { + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), + first = fragment.firstChild, + extra = this.length > 1 ? fragment.cloneNode(true) : fragment; + + if ( first ) + for ( var i = 0, l = this.length; i < l; i++ ) + callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment ); + + if ( scripts ) + jQuery.each( scripts, evalScript ); + } + + return this; + + function root( elem, cur ) { + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? + (elem.getElementsByTagName("tbody")[0] || + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : + elem; + } + } +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +function evalScript( i, elem ) { + if ( elem.src ) + jQuery.ajax({ + url: elem.src, + async: false, + dataType: "script" + }); + + else + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); + + if ( elem.parentNode ) + elem.parentNode.removeChild( elem ); +} + +function now(){ + return +new Date; +} + +jQuery.extend = jQuery.fn.extend = function() { + // copy reference to target object + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) + target = {}; + + // extend jQuery itself if only one argument is passed + if ( length == i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) + // Extend the base object + for ( var name in options ) { + var src = target[ name ], copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) + continue; + + // Recurse if we're merging object values + if ( deep && copy && typeof copy === "object" && !copy.nodeType ) + target[ name ] = jQuery.extend( deep, + // Never move original objects, clone them + src || ( copy.length != null ? [ ] : { } ) + , copy ); + + // Don't bring in undefined values + else if ( copy !== undefined ) + target[ name ] = copy; + + } + + // Return the modified object + return target; +}; + +// exclude the following css properties to add px +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, + // cache defaultView + defaultView = document.defaultView || {}, + toString = Object.prototype.toString; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) + window.jQuery = _jQuery; + + return jQuery; + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return toString.call(obj) === "[object Function]"; + }, + + isArray: function( obj ) { + return toString.call(obj) === "[object Array]"; + }, + + // check if an element is in a (or is an) XML document + isXMLDoc: function( elem ) { + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || + !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); + }, + + // Evalulates a script in a global context + globalEval: function( data ) { + data = jQuery.trim( data ); + + if ( data ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.getElementsByTagName("head")[0] || document.documentElement, + script = document.createElement("script"); + + script.type = "text/javascript"; + if ( jQuery.support.scriptEval ) + script.appendChild( document.createTextNode( data ) ); + else + script.text = data; + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, length = object.length; + + if ( args ) { + if ( length === undefined ) { + for ( name in object ) + if ( callback.apply( object[ name ], args ) === false ) + break; + } else + for ( ; i < length; ) + if ( callback.apply( object[ i++ ], args ) === false ) + break; + + // A special, fast, case for the most common use of each + } else { + if ( length === undefined ) { + for ( name in object ) + if ( callback.call( object[ name ], name, object[ name ] ) === false ) + break; + } else + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} + } + + return object; + }, + + prop: function( elem, value, type, i, name ) { + // Handle executable functions + if ( jQuery.isFunction( value ) ) + value = value.call( elem, i ); + + // Handle passing in a number to a CSS property + return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? + value + "px" : + value; + }, + + className: { + // internal only, use addClass("class") + add: function( elem, classNames ) { + jQuery.each((classNames || "").split(/\s+/), function(i, className){ + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) + elem.className += (elem.className ? " " : "") + className; + }); + }, + + // internal only, use removeClass("class") + remove: function( elem, classNames ) { + if (elem.nodeType == 1) + elem.className = classNames !== undefined ? + jQuery.grep(elem.className.split(/\s+/), function(className){ + return !jQuery.className.has( classNames, className ); + }).join(" ") : + ""; + }, + + // internal only, use hasClass("class") + has: function( elem, className ) { + return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; + } + }, + + // A method for quickly swapping in/out CSS properties to get correct calculations + swap: function( elem, options, callback ) { + var old = {}; + // Remember the old values, and insert the new ones + for ( var name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + callback.call( elem ); + + // Revert the old values + for ( var name in options ) + elem.style[ name ] = old[ name ]; + }, + + css: function( elem, name, force ) { + if ( name == "width" || name == "height" ) { + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; + + function getWH() { + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; + var padding = 0, border = 0; + jQuery.each( which, function() { + padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; + border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; + }); + val -= Math.round(padding + border); + } + + if ( jQuery(elem).is(":visible") ) + getWH(); + else + jQuery.swap( elem, props, getWH ); + + return Math.max(0, val); + } + + return jQuery.curCSS( elem, name, force ); + }, + + curCSS: function( elem, name, force ) { + var ret, style = elem.style; + + // We need to handle opacity special in IE + if ( name == "opacity" && !jQuery.support.opacity ) { + ret = jQuery.attr( style, "opacity" ); + + return ret == "" ? + "1" : + ret; + } + + // Make sure we're using the right name for getting the float value + if ( name.match( /float/i ) ) + name = styleFloat; + + if ( !force && style && style[ name ] ) + ret = style[ name ]; + + else if ( defaultView.getComputedStyle ) { + + // Only "float" is needed here + if ( name.match( /float/i ) ) + name = "float"; + + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); + + var computedStyle = defaultView.getComputedStyle( elem, null ); + + if ( computedStyle ) + ret = computedStyle.getPropertyValue( name ); + + // We should always get a number back from opacity + if ( name == "opacity" && ret == "" ) + ret = "1"; + + } else if ( elem.currentStyle ) { + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; + + // From the awesome hack by Dean Edwards + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 + + // If we're not dealing with a regular pixel number + // but a number that has a weird ending, we need to convert it to pixels + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { + // Remember the original values + var left = style.left, rsLeft = elem.runtimeStyle.left; + + // Put in the new values to get a computed value out + elem.runtimeStyle.left = elem.currentStyle.left; + style.left = ret || 0; + ret = style.pixelLeft + "px"; + + // Revert the changed values + style.left = left; + elem.runtimeStyle.left = rsLeft; + } + } + + return ret; + }, + + clean: function( elems, context, fragment ) { + context = context || document; + + // !context.createElement fails in IE with an error but returns typeof 'object' + if ( typeof context.createElement === "undefined" ) + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { + var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); + if ( match ) + return [ context.createElement( match[1] ) ]; + } + + var ret = [], scripts = [], div = context.createElement("div"); + + jQuery.each(elems, function(i, elem){ + if ( typeof elem === "number" ) + elem += ''; + + if ( !elem ) + return; + + // Convert html string into DOM nodes + if ( typeof elem === "string" ) { + // Fix "XHTML"-style tags in all browsers + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? + all : + front + ">"; + }); + + // Trim whitespace, otherwise indexOf won't work as expected + var tags = jQuery.trim( elem ).toLowerCase(); + + var wrap = + // option or optgroup + !tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && + [ 1, "", "
" ] || + + !tags.indexOf("", "" ] || + + // matched above + (!tags.indexOf("", "" ] || + + !tags.indexOf("", "" ] || + + // IE can't serialize and