From 7fd5c90722badb2256212dc6a12ee416c6a7adaa Mon Sep 17 00:00:00 2001 From: Andrey Date: Tue, 29 Oct 2013 12:42:42 +0400 Subject: [PATCH] init --- .gitignore | 13 + README | 1 + log/.gitignore | 1 + manage.py | 10 + project/__init__.py | 0 project/commons/__init__.py | 0 project/commons/forms.py | 64 + project/commons/models.py | 3 + project/commons/paginator.py | 75 ++ project/commons/pdf_tools.py | 30 + project/commons/templatetags/__init__.py | 0 project/commons/templatetags/my_tags.py | 65 + project/commons/tests.py | 16 + project/commons/utils.py | 14 + project/commons/views.py | 1 + project/commons/xls/__init__.py | 3 + project/commons/xls/get_xlwt_style_list.py | 78 ++ project/commons/xls/useful_tools.py | 158 +++ project/commons/xls/xls_to_response.py | 12 + project/customer/__init__.py | 2 + project/customer/admin.py | 58 + project/customer/consts.py | 9 + project/customer/forms.py | 412 ++++++ project/customer/managers.py | 64 + project/customer/middleware.py | 17 + project/customer/models.py | 331 +++++ project/customer/tests.py | 16 + project/customer/urls.py | 52 + project/customer/views/__init__.py | 10 + project/customer/views/bank_accounts.py | 113 ++ project/customer/views/bank_accounts_ajax.py | 125 ++ project/customer/views/clients.py | 101 ++ project/customer/views/clients_ajax.py | 107 ++ project/customer/views/profile.py | 209 +++ project/customer/views/profile_ajax.py | 76 ++ project/docs/__init__.py | 0 project/docs/as_xls/__init__.py | 1 + project/docs/as_xls/render_to_xls.py | 521 ++++++++ project/docs/consts.py | 146 ++ project/docs/filters.py | 210 +++ project/docs/forms/__init__.py | 8 + project/docs/forms/aktrabot.py | 51 + project/docs/forms/aktsverki.py | 60 + project/docs/forms/base_forms.py | 56 + project/docs/forms/dover.py | 54 + project/docs/forms/email.py | 19 + project/docs/forms/invoice.py | 60 + project/docs/forms/nakladn.py | 52 + project/docs/forms/platejka.py | 82 ++ project/docs/models/__init__.py | 6 + project/docs/models/aktrabot.py | 21 + project/docs/models/aktsverki.py | 54 + project/docs/models/base_models.py | 100 ++ project/docs/models/dover.py | 42 + project/docs/models/invoice.py | 34 + project/docs/models/managers.py | 24 + project/docs/models/mixins.py | 22 + project/docs/models/nakladn.py | 23 + project/docs/models/platejka.py | 105 ++ project/docs/tests.py | 16 + project/docs/urls.py | 71 + project/docs/utils.py | 45 + project/docs/views/__init__.py | 38 + project/docs/views/aktrabot.py | 82 ++ project/docs/views/aktsverki.py | 97 ++ project/docs/views/base_views.py | 718 ++++++++++ project/docs/views/dover.py | 72 + project/docs/views/invoice.py | 87 ++ project/docs/views/mixins.py | 39 + project/docs/views/nakladn.py | 151 +++ project/docs/views/platejka.py | 59 + project/local_settings.py.dev-example | 54 + project/local_settings.py.prod-example | 29 + project/myauth/__init__.py | 1 + project/myauth/emails.py | 37 + project/myauth/forms.py | 165 +++ project/myauth/managers.py | 28 + project/myauth/models.py | 54 + project/myauth/tests.py | 16 + project/myauth/urls.py | 25 + project/myauth/views.py | 206 +++ project/pages/__init__.py | 0 project/pages/models.py | 3 + project/pages/tests.py | 16 + project/pages/views.py | 8 + project/pdf_fonts/arial.ttf | Bin 0 -> 367112 bytes project/pdf_fonts/arialbd.ttf | Bin 0 -> 352224 bytes project/settings.py | 200 +++ project/static/css/custom_admin.css | 1 + project/static/css/style.css | 205 +++ .../ui-lightness/images/animated-overlay.gif | Bin 0 -> 1738 bytes .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 0 -> 418 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 0 -> 312 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 0 -> 205 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 0 -> 348 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 0 -> 5815 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 0 -> 278 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 0 -> 328 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../images/ui-icons_228ef1_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 6299 bytes .../ui-lightness/jquery-ui-1.10.3.custom.css | 1177 +++++++++++++++++ .../jquery-ui-1.10.3.custom.min.css | 7 + project/static/img/ajax-loader.gif | Bin 0 -> 3951 bytes project/static/img/icon-add.gif | Bin 0 -> 374 bytes project/static/img/icon-alert.gif | Bin 0 -> 145 bytes project/static/img/icon-calendar.gif | Bin 0 -> 413 bytes project/static/img/icon-delete.gif | Bin 0 -> 420 bytes project/static/img/icon-edit.gif | Bin 0 -> 397 bytes project/static/img/icon-email.gif | Bin 0 -> 395 bytes project/static/img/icon-error.gif | Bin 0 -> 319 bytes project/static/img/icon-excel.gif | Bin 0 -> 433 bytes project/static/img/icon-pdf.gif | Bin 0 -> 422 bytes project/static/img/icon-success.gif | Bin 0 -> 341 bytes project/static/img/left-arrow.gif | Bin 0 -> 272 bytes project/static/js/client.commons.js | 94 ++ project/static/js/client.list.js | 14 + project/static/js/commons.js | 33 + project/static/js/csrf.js | 23 + project/static/js/customer/profile.edit.js | 159 +++ project/static/js/customer/profile.view.js | 129 ++ project/static/js/dialogs.js | 108 ++ project/static/js/docs/client.form.js | 7 + project/static/js/docs/common/calc_nds.js | 11 + project/static/js/docs/list.email.js | 49 + project/static/js/docs/list.filters.js | 34 + project/static/js/docs/list.panels.js | 57 + project/static/js/docs/platejka.form.js | 94 ++ project/static/js/lib/entertotab.js | 179 +++ project/static/js/lib/jquery-1.10.2.min.js | 6 + .../js/lib/jquery-ui-1.10.3.custom.min.js | 7 + project/static/js/lib/jquery.blockUI.js | 619 +++++++++ project/static/js/lib/jquery.form.js | 1089 +++++++++++++++ .../static/js/lib/jquery.ui.datepicker-ru.js | 23 + project/static/js/paginator.js | 5 + project/templates/base.html | 73 + .../templates/customer/bank_accounts/add.html | 13 + .../customer/bank_accounts/delete.html | 21 + .../customer/bank_accounts/edit.html | 17 + .../customer/bank_accounts/form.html | 43 + .../customer/bank_accounts/list.html | 56 + project/templates/customer/clients/add.html | 13 + .../templates/customer/clients/delete.html | 20 + project/templates/customer/clients/edit.html | 17 + project/templates/customer/clients/form.html | 215 +++ project/templates/customer/clients/list.html | 70 + project/templates/customer/index.html | 18 + .../templates/customer/profile/as_pdf.html | 86 ++ project/templates/customer/profile/edit.html | 456 +++++++ project/templates/customer/profile/email.html | 37 + .../customer/profile/profile_email.txt | 3 + project/templates/customer/profile/view.html | 217 +++ project/templates/docs/_base/base_add.html | 28 + project/templates/docs/_base/base_delete.html | 20 + project/templates/docs/_base/base_edit.html | 31 + project/templates/docs/_base/base_form.html | 24 + project/templates/docs/_base/base_list.html | 171 +++ project/templates/docs/aktrabot/as_pdf.html | 177 +++ project/templates/docs/aktrabot/form.html | 55 + project/templates/docs/aktrabot/list.html | 40 + project/templates/docs/aktsverki/as_pdf.html | 187 +++ project/templates/docs/aktsverki/form.html | 56 + .../docs/aktsverki/form_tbl_items.html | 38 + project/templates/docs/aktsverki/list.html | 31 + project/templates/docs/docs.html | 35 + project/templates/docs/dover/as_pdf.html | 261 ++++ project/templates/docs/dover/form.html | 65 + .../templates/docs/dover/form_tbl_items.html | 38 + project/templates/docs/dover/list.html | 38 + project/templates/docs/email/base_email.html | 21 + .../templates/docs/email/base_email_form.html | 70 + project/templates/docs/email/email.txt | 3 + project/templates/docs/index.html | 9 + project/templates/docs/invoice/as_pdf.html | 225 ++++ project/templates/docs/invoice/form.html | 64 + project/templates/docs/invoice/list.html | 21 + project/templates/docs/nakladn/as_pdf.html | 625 +++++++++ .../docs/nakladn/as_pdf_items_tbl_header.html | 40 + project/templates/docs/nakladn/form.html | 59 + project/templates/docs/nakladn/list.html | 39 + .../templates/docs/parts/form_buttons.html | 9 + project/templates/docs/parts/form_field.html | 20 + .../docs/parts/form_field_client.html | 19 + .../templates/docs/parts/form_tbl_items.html | 47 + project/templates/docs/platejka/as_pdf.html | 244 ++++ project/templates/docs/platejka/form.html | 93 ++ project/templates/docs/platejka/js.html | 4 + project/templates/docs/platejka/list.html | 38 + project/templates/docs/stub_js.html | 1 + project/templates/myauth/change_email.html | 9 + .../templates/myauth/change_email_form.html | 37 + project/templates/myauth/change_password.html | 9 + .../myauth/change_password_form.html | 37 + project/templates/myauth/login.html | 13 + project/templates/myauth/login_form.html | 38 + project/templates/myauth/register.html | 13 + project/templates/myauth/register_form.html | 37 + .../templates/myauth/registration_closed.html | 9 + .../templates/myauth/registration_email.txt | 11 + project/templates/myauth/reset.html | 9 + project/templates/myauth/reset_form.html | 37 + project/templates/myauth/reset_key_email.txt | 11 + project/templates/myauth/reset_key_ready.html | 9 + .../myauth/reset_new_password_email.txt | 9 + project/templates/pages/index.html | 23 + project/templates/paginator.html | 19 + project/urls.py | 27 + project/wsgi.py | 32 + project/xls_templates/aktrabot.xls | Bin 0 -> 20480 bytes project/xls_templates/aktsverki.xls | Bin 0 -> 23552 bytes project/xls_templates/dover.xls | Bin 0 -> 27136 bytes project/xls_templates/invoice.xls | Bin 0 -> 25600 bytes project/xls_templates/nakladn.xls | Bin 0 -> 36864 bytes project/xls_templates/platejka.xls | Bin 0 -> 25088 bytes project/xls_templates/sfv.xls | Bin 0 -> 55808 bytes requirements-dev.txt | 22 + requirements.txt | 22 + 221 files changed, 15198 insertions(+) create mode 100644 .gitignore create mode 100644 README create mode 100644 log/.gitignore create mode 100644 manage.py create mode 100644 project/__init__.py create mode 100644 project/commons/__init__.py create mode 100644 project/commons/forms.py create mode 100644 project/commons/models.py create mode 100644 project/commons/paginator.py create mode 100644 project/commons/pdf_tools.py create mode 100644 project/commons/templatetags/__init__.py create mode 100644 project/commons/templatetags/my_tags.py create mode 100644 project/commons/tests.py create mode 100644 project/commons/utils.py create mode 100644 project/commons/views.py create mode 100644 project/commons/xls/__init__.py create mode 100644 project/commons/xls/get_xlwt_style_list.py create mode 100644 project/commons/xls/useful_tools.py create mode 100644 project/commons/xls/xls_to_response.py create mode 100644 project/customer/__init__.py create mode 100644 project/customer/admin.py create mode 100644 project/customer/consts.py create mode 100644 project/customer/forms.py create mode 100644 project/customer/managers.py create mode 100644 project/customer/middleware.py create mode 100644 project/customer/models.py create mode 100644 project/customer/tests.py create mode 100644 project/customer/urls.py create mode 100644 project/customer/views/__init__.py create mode 100644 project/customer/views/bank_accounts.py create mode 100644 project/customer/views/bank_accounts_ajax.py create mode 100644 project/customer/views/clients.py create mode 100644 project/customer/views/clients_ajax.py create mode 100644 project/customer/views/profile.py create mode 100644 project/customer/views/profile_ajax.py create mode 100644 project/docs/__init__.py create mode 100644 project/docs/as_xls/__init__.py create mode 100644 project/docs/as_xls/render_to_xls.py create mode 100644 project/docs/consts.py create mode 100644 project/docs/filters.py create mode 100644 project/docs/forms/__init__.py create mode 100644 project/docs/forms/aktrabot.py create mode 100644 project/docs/forms/aktsverki.py create mode 100644 project/docs/forms/base_forms.py create mode 100644 project/docs/forms/dover.py create mode 100644 project/docs/forms/email.py create mode 100644 project/docs/forms/invoice.py create mode 100644 project/docs/forms/nakladn.py create mode 100644 project/docs/forms/platejka.py create mode 100644 project/docs/models/__init__.py create mode 100644 project/docs/models/aktrabot.py create mode 100644 project/docs/models/aktsverki.py create mode 100644 project/docs/models/base_models.py create mode 100644 project/docs/models/dover.py create mode 100644 project/docs/models/invoice.py create mode 100644 project/docs/models/managers.py create mode 100644 project/docs/models/mixins.py create mode 100644 project/docs/models/nakladn.py create mode 100644 project/docs/models/platejka.py create mode 100644 project/docs/tests.py create mode 100644 project/docs/urls.py create mode 100644 project/docs/utils.py create mode 100644 project/docs/views/__init__.py create mode 100644 project/docs/views/aktrabot.py create mode 100644 project/docs/views/aktsverki.py create mode 100644 project/docs/views/base_views.py create mode 100644 project/docs/views/dover.py create mode 100644 project/docs/views/invoice.py create mode 100644 project/docs/views/mixins.py create mode 100644 project/docs/views/nakladn.py create mode 100644 project/docs/views/platejka.py create mode 100644 project/local_settings.py.dev-example create mode 100644 project/local_settings.py.prod-example create mode 100644 project/myauth/__init__.py create mode 100644 project/myauth/emails.py create mode 100644 project/myauth/forms.py create mode 100644 project/myauth/managers.py create mode 100644 project/myauth/models.py create mode 100644 project/myauth/tests.py create mode 100644 project/myauth/urls.py create mode 100644 project/myauth/views.py create mode 100644 project/pages/__init__.py create mode 100644 project/pages/models.py create mode 100644 project/pages/tests.py create mode 100644 project/pages/views.py create mode 100644 project/pdf_fonts/arial.ttf create mode 100644 project/pdf_fonts/arialbd.ttf create mode 100644 project/settings.py create mode 100644 project/static/css/custom_admin.css create mode 100644 project/static/css/style.css create mode 100644 project/static/css/ui-lightness/images/animated-overlay.gif create mode 100644 project/static/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png create mode 100644 project/static/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png create mode 100644 project/static/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png create mode 100644 project/static/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png create mode 100644 project/static/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png create mode 100644 project/static/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 project/static/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png create mode 100644 project/static/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png create mode 100644 project/static/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png create mode 100644 project/static/css/ui-lightness/images/ui-icons_222222_256x240.png create mode 100644 project/static/css/ui-lightness/images/ui-icons_228ef1_256x240.png create mode 100644 project/static/css/ui-lightness/images/ui-icons_ef8c08_256x240.png create mode 100644 project/static/css/ui-lightness/images/ui-icons_ffd27a_256x240.png create mode 100644 project/static/css/ui-lightness/images/ui-icons_ffffff_256x240.png create mode 100644 project/static/css/ui-lightness/jquery-ui-1.10.3.custom.css create mode 100644 project/static/css/ui-lightness/jquery-ui-1.10.3.custom.min.css create mode 100644 project/static/img/ajax-loader.gif create mode 100644 project/static/img/icon-add.gif create mode 100644 project/static/img/icon-alert.gif create mode 100644 project/static/img/icon-calendar.gif create mode 100644 project/static/img/icon-delete.gif create mode 100644 project/static/img/icon-edit.gif create mode 100644 project/static/img/icon-email.gif create mode 100644 project/static/img/icon-error.gif create mode 100644 project/static/img/icon-excel.gif create mode 100644 project/static/img/icon-pdf.gif create mode 100644 project/static/img/icon-success.gif create mode 100644 project/static/img/left-arrow.gif create mode 100644 project/static/js/client.commons.js create mode 100644 project/static/js/client.list.js create mode 100644 project/static/js/commons.js create mode 100644 project/static/js/csrf.js create mode 100644 project/static/js/customer/profile.edit.js create mode 100644 project/static/js/customer/profile.view.js create mode 100644 project/static/js/dialogs.js create mode 100644 project/static/js/docs/client.form.js create mode 100644 project/static/js/docs/common/calc_nds.js create mode 100644 project/static/js/docs/list.email.js create mode 100644 project/static/js/docs/list.filters.js create mode 100644 project/static/js/docs/list.panels.js create mode 100644 project/static/js/docs/platejka.form.js create mode 100644 project/static/js/lib/entertotab.js create mode 100644 project/static/js/lib/jquery-1.10.2.min.js create mode 100644 project/static/js/lib/jquery-ui-1.10.3.custom.min.js create mode 100644 project/static/js/lib/jquery.blockUI.js create mode 100644 project/static/js/lib/jquery.form.js create mode 100644 project/static/js/lib/jquery.ui.datepicker-ru.js create mode 100644 project/static/js/paginator.js create mode 100644 project/templates/base.html create mode 100644 project/templates/customer/bank_accounts/add.html create mode 100644 project/templates/customer/bank_accounts/delete.html create mode 100644 project/templates/customer/bank_accounts/edit.html create mode 100644 project/templates/customer/bank_accounts/form.html create mode 100644 project/templates/customer/bank_accounts/list.html create mode 100644 project/templates/customer/clients/add.html create mode 100644 project/templates/customer/clients/delete.html create mode 100644 project/templates/customer/clients/edit.html create mode 100644 project/templates/customer/clients/form.html create mode 100644 project/templates/customer/clients/list.html create mode 100644 project/templates/customer/index.html create mode 100644 project/templates/customer/profile/as_pdf.html create mode 100644 project/templates/customer/profile/edit.html create mode 100644 project/templates/customer/profile/email.html create mode 100644 project/templates/customer/profile/profile_email.txt create mode 100644 project/templates/customer/profile/view.html create mode 100644 project/templates/docs/_base/base_add.html create mode 100644 project/templates/docs/_base/base_delete.html create mode 100644 project/templates/docs/_base/base_edit.html create mode 100644 project/templates/docs/_base/base_form.html create mode 100644 project/templates/docs/_base/base_list.html create mode 100644 project/templates/docs/aktrabot/as_pdf.html create mode 100644 project/templates/docs/aktrabot/form.html create mode 100644 project/templates/docs/aktrabot/list.html create mode 100644 project/templates/docs/aktsverki/as_pdf.html create mode 100644 project/templates/docs/aktsverki/form.html create mode 100644 project/templates/docs/aktsverki/form_tbl_items.html create mode 100644 project/templates/docs/aktsverki/list.html create mode 100644 project/templates/docs/docs.html create mode 100644 project/templates/docs/dover/as_pdf.html create mode 100644 project/templates/docs/dover/form.html create mode 100644 project/templates/docs/dover/form_tbl_items.html create mode 100644 project/templates/docs/dover/list.html create mode 100644 project/templates/docs/email/base_email.html create mode 100644 project/templates/docs/email/base_email_form.html create mode 100644 project/templates/docs/email/email.txt create mode 100644 project/templates/docs/index.html create mode 100644 project/templates/docs/invoice/as_pdf.html create mode 100644 project/templates/docs/invoice/form.html create mode 100644 project/templates/docs/invoice/list.html create mode 100644 project/templates/docs/nakladn/as_pdf.html create mode 100644 project/templates/docs/nakladn/as_pdf_items_tbl_header.html create mode 100644 project/templates/docs/nakladn/form.html create mode 100644 project/templates/docs/nakladn/list.html create mode 100644 project/templates/docs/parts/form_buttons.html create mode 100644 project/templates/docs/parts/form_field.html create mode 100644 project/templates/docs/parts/form_field_client.html create mode 100644 project/templates/docs/parts/form_tbl_items.html create mode 100644 project/templates/docs/platejka/as_pdf.html create mode 100644 project/templates/docs/platejka/form.html create mode 100644 project/templates/docs/platejka/js.html create mode 100644 project/templates/docs/platejka/list.html create mode 100644 project/templates/docs/stub_js.html create mode 100644 project/templates/myauth/change_email.html create mode 100644 project/templates/myauth/change_email_form.html create mode 100644 project/templates/myauth/change_password.html create mode 100644 project/templates/myauth/change_password_form.html create mode 100644 project/templates/myauth/login.html create mode 100644 project/templates/myauth/login_form.html create mode 100644 project/templates/myauth/register.html create mode 100644 project/templates/myauth/register_form.html create mode 100644 project/templates/myauth/registration_closed.html create mode 100644 project/templates/myauth/registration_email.txt create mode 100644 project/templates/myauth/reset.html create mode 100644 project/templates/myauth/reset_form.html create mode 100644 project/templates/myauth/reset_key_email.txt create mode 100644 project/templates/myauth/reset_key_ready.html create mode 100644 project/templates/myauth/reset_new_password_email.txt create mode 100644 project/templates/pages/index.html create mode 100644 project/templates/paginator.html create mode 100644 project/urls.py create mode 100644 project/wsgi.py create mode 100644 project/xls_templates/aktrabot.xls create mode 100644 project/xls_templates/aktsverki.xls create mode 100644 project/xls_templates/dover.xls create mode 100644 project/xls_templates/invoice.xls create mode 100644 project/xls_templates/nakladn.xls create mode 100644 project/xls_templates/platejka.xls create mode 100644 project/xls_templates/sfv.xls create mode 100644 requirements-dev.txt create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7c01289 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +*.*~ +*.pyc +.DS_Store +._* +pip-log.txt +ENV/ +.idea/ +local_settings.py +Thumbs.db +distribute-*.tar.gz +*.bak + +_public_html/ diff --git a/README b/README new file mode 100644 index 0000000..8bd6acb --- /dev/null +++ b/README @@ -0,0 +1 @@ +Документор diff --git a/log/.gitignore b/log/.gitignore new file mode 100644 index 0000000..f59ec20 --- /dev/null +++ b/log/.gitignore @@ -0,0 +1 @@ +* \ No newline at end of file diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..82cfa83 --- /dev/null +++ b/manage.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings") + + from django.core.management import execute_from_command_line + + execute_from_command_line(sys.argv) diff --git a/project/__init__.py b/project/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/project/commons/__init__.py b/project/commons/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/project/commons/forms.py b/project/commons/forms.py new file mode 100644 index 0000000..de8de01 --- /dev/null +++ b/project/commons/forms.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +from django import forms + + +def set_field_error(form, field, msg=u'Обязательное поле.'): + """Добавить сообщение об ошибке поля и убрать это поле из списка успешно прошедших валидацию. + Полезно, если нужно инвалидировать поле из метода clean() и добавить ему ошибку. + В этом случае исключение forms.ValidationError() не подходит, т.к. оно добавит сообщение об ошибке в ошибки формы. + """ + form._errors[field] = form.error_class([msg]) + if field in form.cleaned_data: + del form.cleaned_data[field] + + +class _MySuperForm(object): + """Базовая форма. Добавляет всякого полезного функционала к форме.""" + + # Список условно-обязательных полей, у которых нужно установить атрибут required=False. + # Полезно, когда какие-то поля становятся обязательны к заполнению в зависимости от значения других полей. + conditional_fields = [] #TODO мигрировать на unset_required + + # Список полей, у которых нужно сбросить признак обязательности: required=False. + # Полезно, когда в базовой форме определяются какие-то поля, которые в одних унаследованных формах обязательны, + # а в других нет. + unset_required = [] + + # Словарь полей, у которых нужно заменить атрибут label. + # Полезно, когда нужно дать разные метки полям в админке и в форме, с которой работает пользователь. + change_labels = {} + + def __init__(self, *args, **kwargs): + fields = self.fields + + # включить локализацию для DecimalFields + for field in fields.values(): + if isinstance(field, forms.DecimalField): + field.localize = True + field.widget.is_localized = True + + # сбросить признак обязательности у условно-обязательных полей + for key in self.conditional_fields: + fields[key].required = False + + # сбросить признак обязательности + for key in self.unset_required: + fields[key].required = False + + # заменить label + for key, label in self.change_labels.iteritems(): + fields[key].label = label + + +class MyBaseForm(forms.Form, _MySuperForm): + """Расширение django.forms.Form.""" + def __init__(self, *args, **kwargs): + forms.Form.__init__(self, *args, **kwargs) + _MySuperForm.__init__(self, *args, **kwargs) + + +class MyBaseModelForm(forms.ModelForm, _MySuperForm): + """Расширение django.forms.ModelForm.""" + def __init__(self, *args, **kwargs): + forms.ModelForm.__init__(self, *args, **kwargs) + _MySuperForm.__init__(self, *args, **kwargs) diff --git a/project/commons/models.py b/project/commons/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/project/commons/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/project/commons/paginator.py b/project/commons/paginator.py new file mode 100644 index 0000000..6213c2b --- /dev/null +++ b/project/commons/paginator.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +from functools import wraps + +from django.conf import settings +from django.core.paginator import Paginator, InvalidPage, EmptyPage +from django import forms + +from utils import safe_int + + +# допустимые значения `per_page` +_ALLOW_PER_PAGE = (10,20,50,75,100,) # по умолчанию +ALLOW_PER_PAGE = getattr(settings, 'ALLOW_PER_PAGE', _ALLOW_PER_PAGE) + + +class PaginationForm(forms.Form): + """Форма для пагинатора со списком допустимых значений `per_page`.""" + per_page = forms.ChoiceField(label=u'записей на странице', choices=zip(ALLOW_PER_PAGE, ALLOW_PER_PAGE), + required=False) + + +def save_per_page_value(func): + """Декоратор. + Если задан request.POST['per_page'], то сохранить его в куку. + Имя куки - per_page, срок хранения - 1 год. + """ + @wraps(func) + def wrapper(request, *args, **kwargs): + output = func(request, *args, **kwargs) + key = 'per_page' + if request.method == 'POST' and key in request.POST: + per_page = safe_int(request.POST[key]) + if per_page in ALLOW_PER_PAGE: + if hasattr(output, 'set_cookie'): + max_age = 365*24*60*60 # год + output.set_cookie(key, per_page, max_age) + return output + return wrapper + + +def get_per_page_value(request): + """Возвращает значение `per_page` (нужно для создания пагинатора). + Последовательно ищет `per_page` в словарях request.POST и request.COOKIES. + Если его там нет, возвращает самое первое значение из списка допустимых. + """ + per_page = None + # если задан, взять per_page из post + if request.method == 'POST' and 'per_page' in request.POST: + per_page = safe_int(request.POST.get('per_page')) + # иначе попробовать взять его из cookies + elif 'per_page' in request.COOKIES: + per_page = safe_int(request.COOKIES.get('per_page')) + # проверить чтоб значение per_page было в списке допустимых + if per_page not in ALLOW_PER_PAGE: + per_page = ALLOW_PER_PAGE[0] + return per_page + + +def pagination(request, object_list, page_num=None, form_class=PaginationForm): + """Создает и возвращает объект django.core.paginator.Paginator и, + если form_class!=None, форму со списком допустимых значений `per_page`. + """ + per_page = get_per_page_value(request) # кол-во записей на странице + # пагинатор + paginator = Paginator(object_list, per_page) + page_num = max(1, safe_int(page_num, 1)) + try: + objects = paginator.page(page_num) + except (EmptyPage, InvalidPage): + objects = paginator.page(paginator.num_pages) + # форма + form = None + if form_class: + form = PaginationForm(initial={'per_page': per_page,}) + return objects, form diff --git a/project/commons/pdf_tools.py b/project/commons/pdf_tools.py new file mode 100644 index 0000000..da03829 --- /dev/null +++ b/project/commons/pdf_tools.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +import cStringIO as StringIO + +import ho.pisa as pisa + +from django.template.loader import render_to_string +from django.template import RequestContext +from django.http import HttpResponse + + +def pdf_to_response(content, filename=None, filename_encode='windows-1251'): + """Выводит content в django.http.HttpResponse, который и возвращает.""" + response = HttpResponse(content, mimetype='application/pdf') + if filename: + if filename_encode: + filename = filename.encode(filename_encode) + response['Content-Disposition'] = ('attachment; filename="%s"' % filename.replace('"', "''")) + return response + + +def render_pdf_to_string(request, template_name, dictionary=None): + """Рендерит html шаблон в pdf. Возвращает строку, в которой содержится сгенерированный pdf.""" + context_instance = RequestContext(request) + html = render_to_string(template_name, dictionary, context_instance) + #return HttpResponse(html) # для отладки + result = StringIO.StringIO() + pisa.pisaDocument(StringIO.StringIO(html.encode('utf-8')), result, encoding='utf-8') + pdf_content = result.getvalue() + result.close() + return pdf_content diff --git a/project/commons/templatetags/__init__.py b/project/commons/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/project/commons/templatetags/my_tags.py b/project/commons/templatetags/my_tags.py new file mode 100644 index 0000000..63ff306 --- /dev/null +++ b/project/commons/templatetags/my_tags.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +import os + +from django import template +from django.conf import settings + + +DEBUG = getattr(settings, 'DEBUG', False) + +register = template.Library() + + +@register.simple_tag +def fonts_root(): + """Возвращает путь к шрифтам, заданный в settings.FONTS_ROOT или пустую строку. + Если путь не пустой, то по необходимости добавляет в конец os.sep + """ + path = getattr(settings, 'PDF_FONTS_ROOT', '') + if path and not path.endswith(os.path.sep): + path += os.path.sep + return path + + +@register.simple_tag +def sum_by_attr(obj_list, attr_name, start=0, stop=None): + """Возвращает сумму значений атрибута/метода attr_name у объектов списка obj_list.""" + try: + result = 0 + for obj in obj_list[start:stop]: + attr = getattr(obj, attr_name) + if callable(attr): + result += attr() + else: + result += attr + except Exception, error: + if DEBUG: + result = 'Tag error: %s' % error + else: + result = 'n/a' + return result + + +@register.filter(name='field_type') +def field_type(value): + """Возвращает название типа для переданного поля формы.""" + return value.field.__class__.__name__ + + +@register.filter(name='widget_type') +def widget_type(value): + """Возвращает название виджета для переданного поля формы.""" + return value.field.widget.__class__.__name__ + + +@register.filter(name='to_float') +def to_float(value): + """Если возможно, приводит value к типу float.""" + try: + result = float(value) + except Exception, error: + if DEBUG: + result = 'Filter error, %s | %s' % (value, error,) + else: + result = value + return result diff --git a/project/commons/tests.py b/project/commons/tests.py new file mode 100644 index 0000000..501deb7 --- /dev/null +++ b/project/commons/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/project/commons/utils.py b/project/commons/utils.py new file mode 100644 index 0000000..a923684 --- /dev/null +++ b/project/commons/utils.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +import datetime + + +# convert datetime to json +dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date) else None + + +def safe_int(value, default=None): + """Возвращает value, приведенное к типу int, или default, если привести не получается.""" + try: + return int(value) + except: + return default diff --git a/project/commons/views.py b/project/commons/views.py new file mode 100644 index 0000000..60f00ef --- /dev/null +++ b/project/commons/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/project/commons/xls/__init__.py b/project/commons/xls/__init__.py new file mode 100644 index 0000000..ae64160 --- /dev/null +++ b/project/commons/xls/__init__.py @@ -0,0 +1,3 @@ +from useful_tools import * +from get_xlwt_style_list import * +from xls_to_response import * diff --git a/project/commons/xls/get_xlwt_style_list.py b/project/commons/xls/get_xlwt_style_list.py new file mode 100644 index 0000000..a8690d2 --- /dev/null +++ b/project/commons/xls/get_xlwt_style_list.py @@ -0,0 +1,78 @@ +import xlwt + +def get_xlwt_style_list(rdbook): + wt_style_list = [] + for rdxf in rdbook.xf_list: + wtxf = xlwt.Style.XFStyle() + # + # number format + # + wtxf.num_format_str = rdbook.format_map[rdxf.format_key].format_str + # + # font + # + wtf = wtxf.font + rdf = rdbook.font_list[rdxf.font_index] + wtf.height = rdf.height + wtf.italic = rdf.italic + wtf.struck_out = rdf.struck_out + wtf.outline = rdf.outline + wtf.shadow = rdf.outline + wtf.colour_index = rdf.colour_index + wtf.bold = rdf.bold #### This attribute is redundant, should be driven by weight + wtf._weight = rdf.weight #### Why "private"? + wtf.escapement = rdf.escapement + wtf.underline = rdf.underline_type #### + # wtf.???? = rdf.underline #### redundant attribute, set on the fly when writing + wtf.family = rdf.family + wtf.charset = rdf.character_set + wtf.name = rdf.name + # + # protection + # + wtp = wtxf.protection + rdp = rdxf.protection + wtp.cell_locked = rdp.cell_locked + wtp.formula_hidden = rdp.formula_hidden + # + # border(s) (rename ????) + # + wtb = wtxf.borders + rdb = rdxf.border + wtb.left = rdb.left_line_style + wtb.right = rdb.right_line_style + wtb.top = rdb.top_line_style + wtb.bottom = rdb.bottom_line_style + wtb.diag = rdb.diag_line_style + wtb.left_colour = rdb.left_colour_index + wtb.right_colour = rdb.right_colour_index + wtb.top_colour = rdb.top_colour_index + wtb.bottom_colour = rdb.bottom_colour_index + wtb.diag_colour = rdb.diag_colour_index + wtb.need_diag1 = rdb.diag_down + wtb.need_diag2 = rdb.diag_up + # + # background / pattern (rename???) + # + wtpat = wtxf.pattern + rdbg = rdxf.background + wtpat.pattern = rdbg.fill_pattern + wtpat.pattern_fore_colour = rdbg.pattern_colour_index + wtpat.pattern_back_colour = rdbg.background_colour_index + # + # alignment + # + wta = wtxf.alignment + rda = rdxf.alignment + wta.horz = rda.hor_align + wta.vert = rda.vert_align + wta.dire = rda.text_direction + # wta.orie # orientation doesn't occur in BIFF8! Superceded by rotation ("rota"). + wta.rota = rda.rotation + wta.wrap = rda.text_wrapped + wta.shri = rda.shrink_to_fit + wta.inde = rda.indent_level + # wta.merg = ???? + # + wt_style_list.append(wtxf) + return wt_style_list diff --git a/project/commons/xls/useful_tools.py b/project/commons/xls/useful_tools.py new file mode 100644 index 0000000..236d822 --- /dev/null +++ b/project/commons/xls/useful_tools.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- + +def copy_cells(src_sheet, dst_sheet, style_list, + row_from=0, row_to=None, dst_row_shift=0, + col_from=0, col_to=None, dst_col_shift=0): + """ + Скопировать блок ячеек из диапазона строк [row_from, row_to] и колонок + [col_from, col_to] исходного листа в новый лист с сохранением их контента, + исходных стилей форматирования, объединения и высоты строк. + """ + row_to = row_to or src_sheet.nrows-1 + col_to = col_to or src_sheet.ncols-1 + + for row in xrange(row_from, row_to+1): + for col in xrange(col_from, col_to+1): + cell = src_sheet.cell(row, col) + # скопировать контент и стиль ячейки + dst_sheet.write( + row + dst_row_shift, + col + dst_col_shift, + cell.value, + style_list[cell.xf_index], + ) + + # задать высоту строк + height_rows(src_sheet, dst_sheet, row_from, row_to, dst_row_shift) + + # объединить ячейки + merge_cells(src_sheet, dst_sheet, style_list, + row_from, row_to, dst_row_shift, + col_from, col_to, dst_col_shift) + + +def height_rows(src_sheet, dst_sheet, + row_from=0, row_to=None, dst_row_shift=0): + """Задать в диапазоне строк [row_from, row_to] высоту как в исходном листе. + """ + row_to = row_to or src_sheet.nrows-1 + for row in xrange(row_from, row_to+1): + src_rowinfo = src_sheet.rowinfo_map.get(row) + if src_rowinfo: + dst_sheet.row(row+dst_row_shift).height = src_rowinfo.height + dst_sheet.row(row+dst_row_shift).height_mismatch = True + + +def merge_cells(src_sheet, dst_sheet, style_list, + row_from=0, row_to=None, dst_row_shift=0, + col_from=0, col_to=None, dst_col_shift=0): + """ + Объединить ячейки в заданном блоке нового листа, ограниченном строками + [row_from, row_to] и колонками [col_from, col_to], если в исходном листе + они были объединены, с сохранением исходных стилей форматирования. + """ + row_to = row_to or src_sheet.nrows + col_to = col_to or src_sheet.ncols + + for r1,r2,c1,c2 in src_sheet.merged_cells: + if r1 < row_from or r1 > row_to: + continue + if c1 < col_from or c1 > col_to: + continue + + cell = src_sheet.cell(r1, c1) + style = style_list[cell.xf_index] + + # сохранить границы "крайней" ячейки + # нафиг пока эту фичу - из-за нее повылазили какие-то границы, + # которых не было вообще +# brd_1 = style.borders +# cell_2 = src_sheet.cell(r2-1, c2-1) +# brd_2 = style_list[cell_2.xf_index].borders +# print r1,c1,r2,c2, +# print 'borders 1 (left, right, top, bottom)', +# print brd_1.left, brd_1.right, brd_1.top, brd_1.bottom, +# print 'border 2 (same)', +# print brd_2.left, brd_2.right, brd_2.top, brd_2.bottom +# brd_1.right = brd_2.right +# brd_1.right_colour = brd_2.right_colour + + dst_sheet.merge( + r1+dst_row_shift, r2+dst_row_shift-1, + c1+dst_col_shift, c2+dst_col_shift-1, + style) + + +def width_cols(src_sheet, dst_sheet, col_from=0, col_to=None, dst_col_shift=0): + """Задать в диапазоне колонок [col_from, col_to] ширину + как в исходном листе. + """ + col_to = col_to or src_sheet.ncols-1 + for col in xrange(col_from, col_to+1): + dst_sheet.col(col+dst_col_shift).width = ( + src_sheet.computed_column_width(col)) + + +def mm_to_twips(x): + """Перевести из миллиметров в twips.""" + return int(x/25.4*72*20) + + +def horz_page_break(dst_sheet, row): + """Добавить разрыв страницы.""" + dst_sheet.horz_page_breaks.append((row, 0, 255)) + + +# -------------------------------------------------------------- прочие хелперы + +def clone_row(src_sheet, dst_sheet, style_list, + src_row, n_times=1, dst_row_shift=0): + """ + Размножить n_times раз строку из исходного листа, с сохранением стилей + форматирования. + """ + for offset in xrange(n_times+1): + copy_cells(src_sheet, dst_sheet, style_list, + row_from=src_row, row_to=src_row, + dst_row_shift=dst_row_shift+offset) + + # задать высоту строк + height_rows(src_sheet, dst_sheet, src_row, src_row, dst_row_shift) + + # объединить ячейки + merge_cells(src_sheet, dst_sheet, style_list, + src_row, src_row, dst_row_shift) + + +def merge_cells_in_row(src_sheet, dst_sheet, style_list, src_row, dst_row): + """ + Объединить ячейки в заданной строке нового листа, если в исходном листе они + были объединены, с сохранением исходных стилей форматирования. + """ + for r1,r2,c1,c2 in src_sheet.merged_cells: + if r1 != src_row: + continue + cell = src_sheet.cell(r1, c1) + dst_sheet.merge(dst_row, dst_row, c1, c2-1, style_list[cell.xf_index]) + + +def sum_src_heights(src_sheet, row_from, row_to): + """Суммарная высота всех строк диапазона [row_from, row_to] + исходного листа. + """ + result = 0 + for row in xrange(row_from, row_to+1): + src_rowinfo = src_sheet.rowinfo_map.get(row) + if src_rowinfo: + result += src_rowinfo.height + return result + + +def sum_dst_heights(dst_sheet, row_from, row_to): + """Суммарная высота всех строк диапазона [row_from, row_to] + на новом листе. + """ + result = 0 + for row in xrange(row_from, row_to+1): + result += dst_sheet.row(row).height + return result diff --git a/project/commons/xls/xls_to_response.py b/project/commons/xls/xls_to_response.py new file mode 100644 index 0000000..26f7dfd --- /dev/null +++ b/project/commons/xls/xls_to_response.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +from django.http import HttpResponse + + +def xls_to_response(content, filename=None, filename_encode='windows-1251'): + """Выводит content в django.http.HttpResponse, который и возвращает.""" + response = HttpResponse(content, mimetype='application/ms-excel') + if filename: + if filename_encode: + filename = filename.encode(filename_encode) + response['Content-Disposition'] = ('attachment; filename="%s"' % filename.replace('"', "''")) + return response diff --git a/project/customer/__init__.py b/project/customer/__init__.py new file mode 100644 index 0000000..e027062 --- /dev/null +++ b/project/customer/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from .models import get_profile diff --git a/project/customer/admin.py b/project/customer/admin.py new file mode 100644 index 0000000..9bf71e5 --- /dev/null +++ b/project/customer/admin.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +from django.contrib import admin + +import forms +import models + + +class UserProfileAdmin(admin.ModelAdmin): + list_display = ('user', 'profile_type', 'name', 'inn',) + list_display_links = list_display + form = forms.UserProfileAdminForm + +#TODO прописать fieldsets +# fieldsets = [ +# (None, {'fields': ['user',]}), +# (None, {'fields': ['profile_type',]}), +# (None, {'fields': ['name', 'phone_code', 'phone', 'address', 'inn',]}), +# (None, {'fields': ['add_glavbuh_sign', 'glavbuh_fio',]}), +# (None, {'fields': ['v_litce', 'na_osnovanii',]}), +# (u'ИП', {'fields': ['ip_surname', 'ip_name', 'ip_midname', 'ip_kod_okpo',]}), +# (u'Организация', {'fields': ['org_boss_name', 'org_kpp',]}), +# (u'Печать и подписи', {'fields': ['boss_sign', 'glavbuh_sign', 'stamp',]}), +# ] + + +class BankAccountAdmin(admin.ModelAdmin): + class Media: + css = {'all': ('css/custom_admin.css',)} + + list_display = ('user', 'is_main', 'name', 'account', 'created_at',) + list_display_links = list_display + form = forms.BankAccountAdminForm + + +class ClientAdmin(admin.ModelAdmin): + class Media: + css = {'all': ('css/custom_admin.css',)} + + list_display = ('user', 'name', 'inn',) + list_display_links = list_display + form = forms.ClientAdminForm + + fieldsets = [ + (None, {'fields': ['user',]}), + (None, {'fields': ['name', 'inn', 'address',]}), + (u'ИП', {'fields': ['okpo',]}), + (u'Организация', {'fields': ['kpp',]}), + (u'Банковские реквизиты', + {'fields': ['bank_bik', 'bank_name', 'bank_address', 'bank_korr_account', 'bank_account',]}), + (u'Контакты', + {'fields': ['contact_name', 'contact_email', 'contact_phone', 'contact_icq', 'contact_skype', + 'contact_other',]}), + ] + + +admin.site.register(models.UserProfile, UserProfileAdmin) +admin.site.register(models.BankAccount, BankAccountAdmin) +admin.site.register(models.Client, ClientAdmin) diff --git a/project/customer/consts.py b/project/customer/consts.py new file mode 100644 index 0000000..e607db5 --- /dev/null +++ b/project/customer/consts.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +IP_PROFILE = 1 +ORG_PROFILE = 2 + +PROFILE_TYPES = ( + (IP_PROFILE, u'Индивидуальный предприниматель'), + (ORG_PROFILE, u'Организация'), +) diff --git a/project/customer/forms.py b/project/customer/forms.py new file mode 100644 index 0000000..32cf6e0 --- /dev/null +++ b/project/customer/forms.py @@ -0,0 +1,412 @@ +# -*- coding: utf-8 -*- +from django import forms +from django.utils.encoding import force_unicode +from django.utils.safestring import mark_safe +from django.conf import settings + +from project.commons.forms import MyBaseModelForm, set_field_error + +from . import consts, models + + +FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(settings, 'FILE_UPLOAD_MAX_MEMORY_SIZE ', 2621440) # default 2.5Mb + + +def get_profile_form_class(profile_type): + """Возвращает класс формы редактирования профиля пользователя.""" + if profile_type == consts.IP_PROFILE: + return IpUserProfileForm + elif profile_type == consts.ORG_PROFILE: + return OrgUserProfileForm + return None + + +def get_profile_filters_form_class(profile_type): + """Возвращает класс формы фильтрации профиля пользователя.""" + if profile_type == consts.IP_PROFILE: + return IpUserProfileFiltersForm + elif profile_type == consts.ORG_PROFILE: + return OrgUserProfileFiltersForm + return None + +# ----------------------------------------------------------------------------- + + +class UserProfileForm(MyBaseModelForm): + """Общая форма редактирования профиля пользователя. + + Специализированные формы для редактирования профилей ИП и Организаций - + ищи ниже в классах IpUserProfileForm и OrgUserProfileForm соответственно. + + Форму для админки ищи ниже в классе UserProfileAdminForm. + """ + class Meta: + model = models.UserProfile + + def __init__(self, *args, **kwargs): + super(UserProfileForm, self).__init__(*args, **kwargs) + f = self.fields + if 'ip_reg_date' in f: + f['ip_reg_date'].widget.attrs['class'] = 'has-datepicker' + + def _check_file_size(self, image): + """Ограничить максимальный размер загружаемого файла.""" + if image and image.size > FILE_UPLOAD_MAX_MEMORY_SIZE: + raise forms.ValidationError( + u'Размер изображения превышает %i Мб' % (FILE_UPLOAD_MAX_MEMORY_SIZE / (1024*1024))) + return image + + def clean_boss_sign(self): + image = self.cleaned_data.get('boss_sign') + return self._check_file_size(image) + + def clean_glavbuh_sign(self): + image = self.cleaned_data.get('glavbuh_sign') + return self._check_file_size(image) + + def clean_stamp(self): + image = self.cleaned_data.get('stamp') + return self._check_file_size(image) + + def clean_logo(self): + image = self.cleaned_data.get('logo') + return self._check_file_size(image) + + +class IpUserProfileForm(UserProfileForm): + """Форма редактирования профиля - ИП.""" + change_labels = {'ogrn': u'ОГРНИП'} + + class Meta(UserProfileForm.Meta): + fields = ( + # фио ип + 'boss_surname', 'boss_name', 'boss_midname', + # инн, огрнип, окпо + 'inn', 'ogrn', 'okpo', + # свид-во гос. регистрации и дата + 'svid_gos_reg', 'ip_reg_date', + # фио главбуха + 'glavbuh_surname', 'glavbuh_name', 'glavbuh_midname', + # контактная информация - адреса, телефон, факс, почта, сайт + 'address', 'real_address', 'phone_code', 'phone', 'fax_code', 'fax', 'email', 'site', + # подписи, печать и логотип + 'boss_sign', 'glavbuh_sign', 'stamp', 'logo', + ) + + +class OrgUserProfileForm(UserProfileForm): + """Форма редактирования профиля - Организация.""" + unset_required = {'ogrn': u'ОГРН'} + change_labels = {'ogrn': u'ОГРН'} + + class Meta(UserProfileForm.Meta): + fields = ( + # краткое и полное названия организации + 'name', 'full_name', + # инн, кпп, огрн, окпо + 'inn', 'kpp', 'ogrn', 'okpo', + # должность руководителя, его фио и на каком основании он действует + 'boss_title', 'boss_surname', 'boss_name', 'boss_midname', 'na_osnovanii', + # фио главбуха + 'glavbuh_surname', 'glavbuh_name', 'glavbuh_midname', + # контактная информация - адреса, телефон, факс, почта, сайт + 'address', 'jur_address', 'real_address', 'phone_code', 'phone', 'fax_code', 'fax', 'email', 'site', + # подписи, печать и логотип + 'boss_sign', 'glavbuh_sign', 'stamp', 'logo', + ) + + +class UserProfileAdminForm(UserProfileForm): + """Форма редактирования профиля - для админки.""" + + # условно-обязательные поля, проверять отдельно - могут быть обязательны в зависимости от типа профиля + unset_required = [ + # для ИП + 'kpp', 'name' + # для Организаций + ] + + def clean(self): + super(UserProfileAdminForm, self).clean() + + cleaned_data = self.cleaned_data + + # тип профиля - ИП или Организация + profile_type = cleaned_data.get('profile_type') + + if profile_type == consts.IP_PROFILE: # поля, обязательные для ИП + pass + + elif profile_type == consts.ORG_PROFILE: # поля, обязательные для Организаций + org_boss_name = cleaned_data.get('org_boss_name') + kpp = cleaned_data.get('kpp') + + if not org_boss_name: set_field_error(self, 'org_boss_name') + if not kpp: set_field_error(self, 'kpp') + + return cleaned_data + +# ----------------------------------------------------------------------------- + + +class BankAccountForm(forms.ModelForm): + """Форма редактирования расчетных счетов.""" + class Meta: + model = models.BankAccount + fields = ('bik', 'name', 'address', 'korr_account', 'account', 'is_main',) + #_textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) + #widgets = {'name': _textarea, 'address': _textarea,} + + +class BankAccountAdminForm(BankAccountForm): + """Форма редактирования расчетных счетов - для админки.""" + class Meta(BankAccountForm.Meta): + fields = None + + +class BankAccountListForm(forms.Form): + """Форма со списком всех расчетных счетов пользователя.""" + bank_account = forms.ModelChoiceField(queryset=models.BankAccount.objects.get_all(None), + empty_label=u'все контрагенты', required=False) + + def __init__(self, user, *args, **kwargs): + super(BankAccountListForm, self).__init__(*args, **kwargs) + self.fields['bank_account'].queryset = models.BankAccount.objects.get_all(user) + +# ----------------------------------------------------------------------------- + + +class ClientForm(forms.ModelForm): + """Форма редактирования контрагентов.""" + class Meta: + model = models.Client + fields = ('name', 'inn', 'kpp', 'okpo', 'address', + # банковские реквизиты + 'bank_bik', 'bank_name', 'bank_address', 'bank_korr_account', 'bank_account', + # контакты + 'contact_name', 'contact_email', 'contact_phone', 'contact_icq', 'contact_skype', 'contact_other', + ) + _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) + widgets = { + #'name': _textarea, + #'address': _textarea, + 'bank_name': _textarea, + #'bank_address': _textarea, + #'contact_other': _textarea, + } + + +class ClientAdminForm(ClientForm): + """Форма редактирования контрагентов - для админки.""" + class Meta(ClientForm.Meta): + fields = None + + +class ClientsListForm(forms.Form): + """Форма со списком всех контрагентов пользователя.""" + client = forms.ModelChoiceField(queryset=models.Client.objects.get_all(None), empty_label=u'все контрагенты', + required=False) + + def __init__(self, user, *args, **kwargs): + super(ClientsListForm, self).__init__(*args, **kwargs) + self.fields['client'].queryset = models.Client.objects.get_all(user) + +# ----------------------------------------------------------------------------- + + +class UserProfileFiltersForm(MyBaseModelForm): + """Общая форма фильтрации реквизитов.""" + _profile_type = None # задать в наследнике! + + _is_admin = False + _user = None + + class Meta: + model = models.UserProfileFilters + widgets = { + 'bank_account': forms.RadioSelect(), + } + + def __init__(self, profile=None, accounts=None, *args, **kwargs): + instance = kwargs.get('instance') + initial = kwargs.get('initial') + + new_initial = { + # всегда включены + 'show_ip_boss_fio': True, + 'show_name': True, + } + + # TODO 1. переписать проверки в стиле new_initial['show_inn'] = bool(profile.inn) + # TODO 2. загнать условия в словарь вида {'show_inn': 'inn'}. потом в цикле обработать + if profile: + # сбросить чекбоксы, если не заполнены определенные поля в профиле или нет расчетных счетов + if instance: + new_initial['show_inn'] = bool(profile.inn) + new_initial['show_ogrn'] = bool(profile.ogrn) + new_initial['show_okpo'] = bool(profile.okpo) + new_initial['show_glavbuh'] = bool(profile.get_glavbuh_fio()) + new_initial['show_real_address'] = bool(profile.real_address) + new_initial['show_phone'] = bool(profile.get_full_phone()) + new_initial['show_fax'] = bool(profile.get_full_fax()) + new_initial['show_email'] = bool(profile.email) + new_initial['show_site'] = bool(profile.site) + new_initial['show_bank_account'] = bool(accounts) + + if self._profile_type == consts.IP_PROFILE: + new_initial['show_svid_gos_reg'] = bool(profile.svid_gos_reg) + new_initial['show_ip_reg_date'] = bool(profile.ip_reg_date) + elif self._profile_type == consts.ORG_PROFILE: + new_initial['show_full_name'] = bool(profile.full_name) + new_initial['show_kpp'] = bool(profile.kpp) + new_initial['show_na_osnovanii'] = bool(profile.na_osnovanii) + new_initial['show_jur_address'] = bool(profile.jur_address) + else: + new_initial['show_inn'] = bool(profile.inn) + new_initial['show_ogrn'] = bool(profile.ogrn) + new_initial['show_okpo'] = bool(profile.okpo) + new_initial['show_glavbuh'] = bool(profile.get_glavbuh_fio()) + new_initial['show_real_address'] = bool(profile.real_address) + new_initial['show_phone'] = bool(profile.get_full_phone()) + new_initial['show_fax'] = bool(profile.get_full_fax()) + new_initial['show_email'] = bool(profile.email) + new_initial['show_site'] = bool(profile.site) + new_initial['show_bank_account'] = bool(accounts) + + if self._profile_type == consts.IP_PROFILE: + new_initial['show_svid_gos_reg'] = bool(profile.svid_gos_reg) + new_initial['show_ip_reg_date'] = bool(profile.ip_reg_date) + elif self._profile_type == consts.ORG_PROFILE: + new_initial['show_full_name'] = bool(profile.full_name) + new_initial['show_kpp'] = bool(profile.kpp) + new_initial['show_na_osnovanii'] = bool(profile.na_osnovanii) + new_initial['show_jur_address'] = bool(profile.jur_address) + + if initial: + initial.update(new_initial) + else: + kwargs['initial'] = new_initial + + super(UserProfileFiltersForm, self).__init__(*args, **kwargs) + + # для админки + if self._is_admin: + # попробовать взять user из kwargs['instance'], а потом из self.data + try: + self._user = getattr(kwargs.get('instance'), 'user') + except AttributeError: + self._user = self.data.get('user') + if not accounts: + accounts = models.BankAccount.objects.get_all(self._user) + + f = self.fields + + # только расчетные счета пользователя + f_acc = f['bank_account'] # TODO вынести настройку расчетных счетов в mixin? + f_acc.queryset = accounts + f_acc.empty_label = None + f_acc.label_from_instance = lambda obj: mark_safe( + force_unicode('%s
%s' % (obj.account, obj.name,))) # исправить метку + + # заблокировать чекбоксы, если: не заполнены определенные поля в профиле или нет расчетных счетов + if profile: + if not profile.inn: f['show_inn'].widget.attrs['disabled'] = 'disabled' + if not profile.ogrn: f['show_ogrn'].widget.attrs['disabled'] = 'disabled' + if not profile.okpo: f['show_okpo'].widget.attrs['disabled'] = 'disabled' + if not profile.get_glavbuh_fio(): f['show_glavbuh'].widget.attrs['disabled'] = 'disabled' + if not profile.real_address: f['show_real_address'].widget.attrs['disabled'] = 'disabled' + if not profile.get_full_phone(): f['show_phone'].widget.attrs['disabled'] = 'disabled' + if not profile.get_full_fax(): f['show_fax'].widget.attrs['disabled'] = 'disabled' + if not profile.email: f['show_email'].widget.attrs['disabled'] = 'disabled' + if not profile.site: f['show_site'].widget.attrs['disabled'] = 'disabled' + if not accounts: f['show_bank_account'].widget.attrs['disabled'] = 'disabled' + + if self._profile_type == consts.IP_PROFILE: + if not profile.svid_gos_reg: f['show_svid_gos_reg'].widget.attrs['disabled'] = 'disabled' + if not profile.ip_reg_date: f['show_ip_reg_date'].widget.attrs['disabled'] = 'disabled' + elif self._profile_type == consts.ORG_PROFILE: + if not profile.name: f['show_name'].widget.attrs['disabled'] = 'disabled' + if not profile.full_name: f['show_full_name'].widget.attrs['disabled'] = 'disabled' + if not profile.kpp: f['show_kpp'].widget.attrs['disabled'] = 'disabled' + if not profile.boss_title: f['show_org_boss_title_and_fio'].widget.attrs['disabled'] = 'disabled' + if not profile.na_osnovanii: f['show_na_osnovanii'].widget.attrs['disabled'] = 'disabled' + if not profile.jur_address: f['show_jur_address'].widget.attrs['disabled'] = 'disabled' + + # блокировать чекбоксы, т.к.эти реквизиты юзеру выключать нельзя + if self._profile_type == consts.IP_PROFILE: + f['show_ip_boss_fio'].widget.attrs['disabled'] = 'disabled' + elif self._profile_type == consts.ORG_PROFILE: + f['show_name'].widget.attrs['disabled'] = 'disabled' + + +class IpUserProfileFiltersForm(UserProfileFiltersForm): + """Форма фильтрации реквизитов - для ИП.""" + _profile_type = consts.IP_PROFILE + + change_labels = { + 'show_profile_type': dict(consts.PROFILE_TYPES)[_profile_type], + 'show_ogrn': u'ОГРНИП', + 'show_real_address': u'Адрес', + } + + class Meta(UserProfileFiltersForm.Meta): + fields = ( + 'show_profile_type', + 'show_ip_boss_fio', + 'show_inn', + 'show_ogrn', + 'show_okpo', + 'show_svid_gos_reg', + 'show_ip_reg_date', + 'show_glavbuh', + 'show_bank_account', + 'bank_account', + 'show_contact_info', + 'show_real_address', + 'show_phone', + 'show_fax', + 'show_email', + 'show_site', + ) + + +class OrgUserProfileFiltersForm(UserProfileFiltersForm): + """Форма фильтрации реквизитов - для Организаций.""" + _profile_type = consts.ORG_PROFILE + + change_labels = { + 'show_profile_type': dict(consts.PROFILE_TYPES)[_profile_type], + 'show_ogrn': u'ОГРН', + } + + class Meta(UserProfileFiltersForm.Meta): + fields = ( + 'show_profile_type', + 'show_name', + 'show_full_name', + 'show_inn', + 'show_kpp', + 'show_ogrn', + 'show_okpo', + 'show_org_boss_title_and_fio', + 'show_na_osnovanii', + 'show_glavbuh', + 'show_bank_account', + 'bank_account', + 'show_contact_info', + 'show_jur_address', + 'show_real_address', + 'show_phone', + 'show_fax', + 'show_email', + 'show_site', + ) + +# ----------------------------------------------------------------------------- + + +class EmailProfileForm(forms.Form): + """Форма отправки реквизитов пользователя по email.""" + to = forms.EmailField(label=u'E-mail получателя') + body = forms.CharField(label=u'Текст сообщения', max_length=1000, required=False, + widget=forms.Textarea(attrs={'cols': 80, 'rows': 3})) diff --git a/project/customer/managers.py b/project/customer/managers.py new file mode 100644 index 0000000..6d1d45e --- /dev/null +++ b/project/customer/managers.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +from django.db import models +from django.core.exceptions import ObjectDoesNotExist + + +class UserProfileManager(models.Manager): + def create_profile(self, user, profile_type): + """Создает профиль.""" + profile = self.model(user=user, profile_type=profile_type) + profile.save() + return profile + + +class UserProfileFiltersManager(models.Manager): + def create_filters(self, user): + """Создает фильтры профиля.""" + filters = self.model(user=user) + filters.save() + return filters + + def get_or_create_filters(self, user): + """Возвращает фильтры профиля. Если их вдруг нет, то создает.""" + try: + filters = self.get(user=user) + except ObjectDoesNotExist: + filters = self.create_filters(user=user) + filters.save() + return filters + + +class BankAccountManager(models.Manager): + def get_main(self, user): + """Возвращает основной расчетный счет пользователя или None если у него еще нет расчетных счетов.""" + try: + return self.filter(user=user).order_by('-is_main', 'created_at')[0] + except IndexError: + return None + + def get_all(self, user): + """Возвращает все расчетные счета пользователя. + Отсортированы так, что первым идет основной счет, а потом остальные в порядке их добавления.""" + return self.filter(user=user).order_by('-is_main', 'created_at') + + def have_main(self, user): + """Возвращает True, если у пользователя есть основной расчетный счет, и False в противном случае.""" + return True if self.filter(user=user, is_main=True) else False + + def force_main(self, user): + """Проверяет есть ли у пользователя основной расчетный счет. + И если нет - принудительно его выставляет. + """ + if not self.have_main(user=user): + try: + accounts = self.get_all(user=user)[0] + accounts.is_main=True + accounts.save() + except IndexError: + pass + + +class ClientManager(models.Manager): + def get_all(self, user): + """Возвращает всех клиентов пользователя.""" + return self.filter(user=user) diff --git a/project/customer/middleware.py b/project/customer/middleware.py new file mode 100644 index 0000000..37269cb --- /dev/null +++ b/project/customer/middleware.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from django.utils.functional import SimpleLazyObject + +from .models import get_profile + + +def _get_profile(request): + if not hasattr(request, '_cached_profile'): + request._cached_profile = get_profile(request.user) + return request._cached_profile + + +class ProfileMiddleware(object): + def process_request(self, request): + assert hasattr(request, 'user'), "The Profile middleware requires authentication middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.auth.middleware.AuthenticationMiddleware'." + + request.profile = SimpleLazyObject(lambda: _get_profile(request)) diff --git a/project/customer/models.py b/project/customer/models.py new file mode 100644 index 0000000..3f1ac81 --- /dev/null +++ b/project/customer/models.py @@ -0,0 +1,331 @@ +# -*- coding: utf-8 -*- +import os + +from PIL import Image + +from django.db import models +from django.contrib.auth.models import User + +from . import consts, managers + + +PROFILE_IMAGES_UPLOAD_DIR = 'customer/profile/' # куда сохранять загруженные изображения +BOSS_SIGN_IMG_SIZE = (100, 75) +GLAVBUH_SIGN_IMG_SIZE = (100, 75) +STAMP_IMG_SIZE = (180, 180) + + +def get_profile(user): + """Возвращает профиль пользователя или None.""" + try: + return UserProfile.objects.get(user=user) + except UserProfile.DoesNotExist: + return None + + +def upload_to(path, new_filename=None): + """Куда и под каким именем сохранить загруженный файл.""" + def get_upload_path(instance, filename): + filename = new_filename or filename + return os.path.join(path, instance.user.username, filename) + return get_upload_path + + +class UserProfile(models.Model): + """Профиль пользователя.""" + user = models.OneToOneField(User, related_name='profile', primary_key=True) + + profile_type = models.PositiveSmallIntegerField(u'Тип профиля', choices=consts.PROFILE_TYPES) + + # общие поля + boss_surname = models.CharField(u'Фамилия', max_length=30, default='', + help_text=u'Используется для строки "подпись" в документах.') + boss_name = models.CharField(u'Имя', max_length=30, default='') + boss_midname = models.CharField(u'Отчество', max_length=30, default='') + + inn = models.CharField(u'ИНН', max_length=12, default='') # длина: 10 для организаций, 12 для ИП + ogrn = models.CharField(u'ОГРН/ОГРНИП', max_length=15, default='') # длина: 13 для организаций, 15 для ИП + okpo = models.CharField(u'ОКПО', max_length=10, blank=True, default='') # длина: 8 для организаций, 8 или 10 для ИП + + glavbuh_surname = models.CharField(u'Фамилия', max_length=30, blank=True, default='', + help_text=u'Используется для строки "подпись" в документах.') + glavbuh_name = models.CharField(u'Имя', max_length=30, blank=True, default='') + glavbuh_midname = models.CharField(u'Отчество', max_length=30, blank=True, default='') + + address = models.CharField(u'Адрес для документов', max_length=256, default='', + help_text=u'Будет подставляться в создаваемые счета, акты и накладные.') + real_address = models.CharField(u'Фактический адрес', max_length=256, blank=True, default='', + help_text=u'Используется только для карточки компании.') + + phone_code = models.CharField(u'Код города', max_length=10, blank=True, default='') + phone = models.CharField(u'Номер телефона', max_length=20, blank=True, default='') + + fax_code = models.CharField(u'Код города', max_length=10, blank=True, default='') + fax = models.CharField(u'Номер телефона', max_length=20, blank=True, default='') + + email = models.EmailField(u'Электронная почта', max_length=75, blank=True, default='') + site = models.CharField(u'Сайт', max_length=256, blank=True, default='') + + # поля, только для ИП + svid_gos_reg = models.CharField(u'Свид-во о гос. регистрации', max_length=256, blank=True, default='', + help_text=u'Требуется для счет-фактуры.') + + ip_reg_date = models.DateField(u'Дата регистрации ИП', blank=True, null=True) + + # поля, только для Организации + name = models.CharField(u'Краткое название организации', max_length=256, default='', + help_text=u'Будет подставляться в создаваемые документы.') + full_name = models.CharField(u'Полное название организации', max_length=256, blank=True, default='', + help_text=u'Как в учредительных документах.') + + kpp = models.CharField(u'КПП', max_length=9, default='') + + jur_address = models.CharField(u'Юридический (почтовый) адрес', max_length=256, blank=True, default='', + help_text=u'Как в учредительных документах.') + + boss_title = models.CharField(u'Должность руководителя', max_length=256, blank=True, default='') + na_osnovanii = models.CharField(u'Действует на основании', max_length=256, blank=True, default='') + + # подписи, печать и логотип + boss_sign = models.ImageField(u'Подпись руководителя', blank=True, default='', + upload_to=upload_to(PROFILE_IMAGES_UPLOAD_DIR, 'boss_sign.bmp')) + glavbuh_sign = models.ImageField(u'Подпись бухгалтера', blank=True, default='', + upload_to=upload_to(PROFILE_IMAGES_UPLOAD_DIR, 'glavbuh_sign.bmp')) + stamp = models.ImageField(u'Печать', blank=True, default='', + upload_to=upload_to(PROFILE_IMAGES_UPLOAD_DIR, 'stamp.bmp')) + logo = models.ImageField(u'Логотип', blank=True, default='', + upload_to=upload_to(PROFILE_IMAGES_UPLOAD_DIR, 'logo.bmp')) + + created_at = models.DateTimeField(u'Создан', auto_now_add=True) + updated_at = models.DateTimeField(u'Изменен', auto_now=True) + + objects = managers.UserProfileManager() + + class Meta: + verbose_name = u'Реквизиты (профиль)' + verbose_name_plural = u'Реквизиты (профили)' + + def __unicode__(self): + return u'%s, %s, ИНН %s' % (self.user.email, self.get_company_name()[0:30], self.inn or u'не указан') + + def save(self, *args, **kwargs): + def process_img(orig_img, size): + w = orig_img.width + h = orig_img.height + if w > size[0] or h > size[1]: + filename = str(orig_img.path) + img = Image.open(filename).convert("RGB") + img.thumbnail(size, Image.ANTIALIAS) + img.save(filename, 'bmp') + + super(UserProfile, self).save(*args, **kwargs) + + if self.boss_sign: + process_img(self.boss_sign, size=BOSS_SIGN_IMG_SIZE) + + if self.glavbuh_sign: + process_img(self.glavbuh_sign, size=GLAVBUH_SIGN_IMG_SIZE) + + if self.stamp: + process_img(self.stamp, size=STAMP_IMG_SIZE) + + def is_ip(self): + return self.profile_type == consts.IP_PROFILE + + def is_org(self): + return self.profile_type == consts.ORG_PROFILE + + def get_company_name(self): + """`ИП ФИО` или `Название Организации`.""" + if self.profile_type == consts.IP_PROFILE: + return u'ИП %s' % self.get_boss_full_fio() + elif self.profile_type == consts.ORG_PROFILE: + return self.name.strip() + return u'' + + def get_inn_and_kpp(self): + """Возвращает пару ИНН/КПП или только ИНН, если это ИП или КПП не заполнен.""" + if self.profile_type == consts.ORG_PROFILE: + kpp = self.kpp.strip() + if kpp: + return u'%s/%s' % (self.inn, kpp,) + return self.inn + + def get_boss_title(self): + """Текст 'Индивидуальный предприниматель' или 'Руководитель организации'.""" + if self.profile_type == consts.IP_PROFILE: + return u'Индивидуальный предприниматель' + elif self.profile_type == consts.ORG_PROFILE: + return u'Руководитель организации' + return u'' + + def get_boss_fio(self): + """Фамилия и инициалы руководителя ИП/организации.""" + if self.boss_surname and self.boss_name and self.boss_midname: + return u'%s %s.%s.' % (self.boss_surname, self.boss_name[0], self.boss_midname[0],) + return u'' + + def get_boss_full_fio(self): + """Полное ФИО руководителя ИП/организации.""" + return (u'%s %s %s' % (self.boss_surname, self.boss_name, self.boss_midname,)).strip() + + def get_glavbuh_fio(self): + """Фамилия и инициалы главного бухгалтера.""" + if self.glavbuh_surname and self.glavbuh_name and self.glavbuh_midname: + return (u'%s %s. %s.' % (self.glavbuh_surname, self.glavbuh_name[0], self.glavbuh_midname[0],)).strip() + return u'' + + def get_glavbuh_full_fio(self): + """Полное ФИО главного бухгалтера.""" + return (u'%s %s %s' % (self.glavbuh_surname, self.glavbuh_name, self.glavbuh_midname,)).strip() + + def get_full_phone(self): + """(Код города) Номер телефона.""" + phone_code = self.phone_code.strip('() ') + phone_code = u'(%s)' % phone_code if phone_code else phone_code + return (u'%s %s' % (phone_code, self.phone,)).strip() + + def get_full_fax(self): + """(Код города) Номер факса.""" + fax_code = self.fax_code.strip('() ') + fax_code = u'(%s)' % fax_code if fax_code else fax_code + return (u'%s %s' % (fax_code, self.fax,)).strip() + + +class BankAccount(models.Model): + """Расчетные счета.""" + user = models.ForeignKey(User, related_name='bank_accounts') + + bik = models.CharField(u'БИК', max_length=10) + name = models.CharField(u'Наименование банка', max_length=256) + address = models.CharField(u'Местонахождение', max_length=256) + korr_account = models.CharField(u'Корр. счет', max_length=20) + account = models.CharField(u'Расчетный счет', max_length=20) + + is_main = models.BooleanField(u'Основной счет', default=False) + + created_at = models.DateTimeField(u'Создан', auto_now_add=True) + updated_at = models.DateTimeField(u'Изменен', auto_now=True) + + objects = managers.BankAccountManager() + + class Meta: + verbose_name = u'Расчётный счет' + verbose_name_plural = u'Расчётные счета' + ordering = ['-created_at'] + + def __unicode__(self): + return (u'%s, %s' % (self.account, self.name[0:30],)).strip() + + def save(self, *args, **kwargs): + super(BankAccount, self).save(*args, **kwargs) + if self.is_main: + # если задано, что это будет основной счет, то сбросить у остальных счетов пользователя этот признак + BankAccount.objects.filter(user=self.user, is_main=True).exclude(pk=self.pk).update(is_main=False) + else: + # если нет основного счета, то установить его принудительно + BankAccount.objects.force_main(user=self.user) + + def delete(self, *args, **kwargs): + super(BankAccount, self).delete(*args, **kwargs) + # если нет основного счета, то установить его принудительно + BankAccount.objects.force_main(user=self.user) + + +class Client(models.Model): + """Контрагенты.""" + user = models.ForeignKey(User, related_name='clients') + + name = models.CharField(u'Наименование', max_length=256, db_index=True) + inn = models.CharField(u'ИНН', max_length=12) + kpp = models.CharField(u'КПП', max_length=9, blank=True, default='') # Организация + okpo = models.CharField(u'ОКПО', max_length=10, blank=True, default='') # ИП + address = models.CharField(u'Юр. адрес', max_length=256) + + # банковские реквизиты + bank_bik = models.CharField(u'БИК', max_length=10, blank=True, default='') + bank_name = models.CharField(u'Наименование банка', max_length=256, blank=True, default='') + bank_address = models.CharField(u'Местонахождение', max_length=256, blank=True, default='') + bank_korr_account = models.CharField(u'Корр. счет', max_length=20, blank=True, default='') + bank_account = models.CharField(u'Расчетный счет', max_length=20, blank=True, default='') + + # контакты + contact_name = models.CharField(u'Имя', max_length=50, blank=True, default='') + contact_email = models.EmailField(u'E-mail', max_length=50, blank=True, default='') + contact_phone = models.CharField(u'Телефон', max_length=50, blank=True, default='') + contact_icq = models.CharField(u'ICQ', max_length=20, blank=True, default='') + contact_skype = models.CharField(u'Skype', max_length=20, blank=True, default='') + contact_other = models.CharField(u'Другое', max_length=256, blank=True, default='') + + created_at = models.DateTimeField(u'Создан', auto_now_add=True) + updated_at = models.DateTimeField(u'Изменен', auto_now=True) + + objects = managers.ClientManager() + + class Meta: + verbose_name = u'Контрагент' + verbose_name_plural = u'Контрагенты' + ordering = ['name', '-created_at'] + + def __unicode__(self): + return (u'%s, ИНН %s' % (self.name[0:30], self.inn or u'не указан',)).strip() + + def get_inn_and_kpp(self): + """Возвращает пару ИНН/КПП или только ИНН, если КПП не заполнен.""" + kpp = self.kpp.strip() + if kpp: + return u'%s/%s' % (self.inn, kpp,) + return self.inn + + +class UserProfileFilters(models.Model): + """Фильтрация реквизитов: какие данные показывать/скрывать при генерации карточки компании.""" + user = models.OneToOneField(User, related_name='profile_filters', primary_key=True) + + # общие фильтры + show_profile_type = models.BooleanField(u'Тип профиля', default=True) + + show_inn = models.BooleanField(u'ИНН', default=True) + show_ogrn = models.BooleanField(u'ОГРН/ОГРНИП', default=True) + show_okpo = models.BooleanField(u'ОКПО', default=True) + + show_glavbuh = models.BooleanField(u'Главный бухгалтер', default=True) + + show_bank_account = models.BooleanField(u'Банковские реквизиты', default=True) + bank_account = models.ForeignKey(BankAccount, related_name='+', verbose_name=u'Расчетный счет', blank=True, + null=True, default=None) + + show_contact_info = models.BooleanField(u'Контактная информация', default=True) + show_real_address = models.BooleanField(u'Фактический адрес', default=True) + show_phone = models.BooleanField(u'Телефон', default=True) + show_fax = models.BooleanField(u'Факс', default=True) + show_email = models.BooleanField(u'Электронная почта', default=True) + show_site = models.BooleanField(u'Сайт', default=True) + + # только для ИП + show_ip_boss_fio = models.BooleanField(u'Фамилия, Имя, Отчество', default=True) + show_svid_gos_reg = models.BooleanField(u'Свид-во о гос. регистрации', default=True) + show_ip_reg_date = models.BooleanField(u'Дата регистрации ИП', default=True) + + # только для Организации + show_name = models.BooleanField(u'Краткое название организации', default=True) + show_full_name = models.BooleanField(u'Полное название организации', default=True) + show_kpp = models.BooleanField(u'КПП', default=True) + show_org_boss_title_and_fio = models.BooleanField(u'Руководитель (Должность, ФИО)', default=True) + show_na_osnovanii = models.BooleanField(u'Действует на основании', default=True) + show_jur_address = models.BooleanField(u'Юридический адрес', default=True) + + objects = managers.UserProfileFiltersManager() + + class Meta: + verbose_name = u'Фильтры реквизитов' + verbose_name_plural = u'Фильтры реквизитов' + + def __unicode__(self): + return u'%s' % self.user.email + + def save(self, *args, **kwargs): + # всегда включены + self.show_ip_boss_fio = True + self.show_name = True + super(UserProfileFilters, self).save(*args, **kwargs) diff --git a/project/customer/tests.py b/project/customer/tests.py new file mode 100644 index 0000000..501deb7 --- /dev/null +++ b/project/customer/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/project/customer/urls.py b/project/customer/urls.py new file mode 100644 index 0000000..78e6355 --- /dev/null +++ b/project/customer/urls.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +from django.conf.urls import * + +from . import views +from .views import profile, profile_ajax +from .views import bank_accounts,bank_accounts_ajax +from .views import clients, clients_ajax + + +urlpatterns = patterns('', + # личный кабинет + url(r'^$', views.customer_index, name='customer_index'), + + # --- профиль + url(r'^profile/$', profile.profile_view, name='customer_profile_view'), + url(r'^profile/edit/$', profile.profile_edit, name='customer_profile_edit'), + url(r'^profile/email/$', profile.profile_email, name='customer_profile_email'), + + # --- профиль AJAX + url(r'^profile/filters/edit/ajax/$', profile_ajax.profile_filters_edit_ajax, name='customer_profile_filters_edit_ajax'), + url(r'^profile/email/ajax/$', profile_ajax.profile_email_ajax, name='customer_profile_email_ajax'), + + # --- расчетные счета + url(r'^bank-accounts/$', bank_accounts.bank_accounts_list, name='customer_bank_accounts_list'), + url(r'^bank-accounts/page/(?P[0-9]+)/$', bank_accounts.bank_accounts_list, name='customer_bank_accounts_list'), + url(r'^bank-accounts/add/$', bank_accounts.bank_accounts_add, name='customer_bank_accounts_add'), + url(r'^bank-accounts/(?P\d+)/edit/$', bank_accounts.bank_accounts_edit, name='customer_bank_accounts_edit'), + url(r'^bank-accounts/(?P\d+)/delete/$', bank_accounts.bank_accounts_delete, name='customer_bank_accounts_delete'), + + # --- расчетные счета AJAX + url(r'^bank-accounts/ajax/$', bank_accounts_ajax.bank_accounts_list_ajax, name='customer_bank_accounts_list_ajax'), + url(r'^bank-accounts/(?P\d+)/get/ajax/$', bank_accounts_ajax.bank_accounts_get_ajax, + name='customer_bank_accounts_get_ajax'), + url(r'^bank-accounts/add/ajax/$', bank_accounts_ajax.bank_accounts_add_ajax, name='customer_bank_accounts_add_ajax'), + url(r'^bank-accounts/(?P\d+)/edit/ajax/$', bank_accounts_ajax.bank_accounts_edit_ajax, + name='customer_bank_accounts_edit_ajax'), + url(r'^bank-accounts/(?P\d+)/delete/ajax/$', bank_accounts_ajax.bank_accounts_delete_ajax, + name='customer_bank_accounts_delete_ajax'), + + # --- контрагенты + url(r'^clients/$', clients.clients_list, name='customer_clients_list'), + url(r'^clients/page/(?P[0-9]+)/$', clients.clients_list, name='customer_clients_list'), + url(r'^clients/add/$', clients.clients_add, name='customer_clients_add'), + url(r'^clients/(?P\d+)/edit/$', clients.clients_edit, name='customer_clients_edit'), + url(r'^clients/(?P\d+)/delete/$', clients.clients_delete, name='customer_clients_delete'), + + # --- контрагенты AJAX + url(r'^clients/(?P\d+)/get/ajax/$', clients_ajax.clients_get_ajax, name='customer_clients_get_ajax'), + url(r'^clients/add/ajax/$', clients_ajax.clients_add_ajax, name='customer_clients_add_ajax'), + url(r'^clients/(?P\d+)/edit/ajax/$', clients_ajax.clients_edit_ajax, name='customer_clients_edit_ajax'), + url(r'^clients/(?P\d+)/delete/ajax/$', clients_ajax.clients_delete_ajax, name='customer_clients_delete_ajax'), +) diff --git a/project/customer/views/__init__.py b/project/customer/views/__init__.py new file mode 100644 index 0000000..2546eb6 --- /dev/null +++ b/project/customer/views/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render +from django.contrib.auth.decorators import login_required + + +@login_required +def customer_index(request): + """Личный кабинет.""" + template_name = 'customer/index.html' + return render(request, template_name) diff --git a/project/customer/views/bank_accounts.py b/project/customer/views/bank_accounts.py new file mode 100644 index 0000000..cb9f9f9 --- /dev/null +++ b/project/customer/views/bank_accounts.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render, redirect, get_object_or_404 +from django.core.urlresolvers import reverse +from django.views.decorators.csrf import csrf_protect +from django.contrib.auth.decorators import login_required + +from project.commons.paginator import pagination, save_per_page_value + +from .. import models, forms + + +@login_required +@csrf_protect +@save_per_page_value +def bank_accounts_list(request, page_num=None): + """Список расчетных счетов пользователя.""" + template_name = 'customer/bank_accounts/list.html' + account_list = models.BankAccount.objects.get_all(request.user) + page, pagination_form = pagination(request, account_list, page_num) + return render(request, template_name, {'page': page, 'pagination_form': pagination_form,}) + + +@login_required +@csrf_protect +def bank_accounts_add(request): + """Добавить расчетный счет.""" + template_name='customer/bank_accounts/add.html' + form_class = forms.BankAccountForm + + success_url = 'customer_bank_accounts_list' + referer = request.POST.get('referer') + if referer and reverse('customer_profile_edit') in referer: + success_url = 'customer_profile_edit' + + if request.method == 'POST' and '_cancel' in request.POST: + return redirect(success_url) + + if request.method == 'POST': + form = form_class(data=request.POST) + if form.is_valid(): + new_account = form.save(commit=False) + new_account.user = request.user + new_account.save() + return redirect(success_url) + else: + form = form_class() + + dictionary = { + 'form': form, + 'referer': request.META.get('HTTP_REFERER'), + } + return render(request, template_name, dictionary) + + +@login_required +@csrf_protect +def bank_accounts_edit(request, id): + """Редактировать расчетный счет.""" + template_name = 'customer/bank_accounts/edit.html' + form_class = forms.BankAccountForm + + success_url = 'customer_bank_accounts_list' + referer = request.POST.get('referer') + if referer and reverse('customer_profile_edit') in referer: + success_url = 'customer_profile_edit' + + if request.method == 'POST' and '_cancel' in request.POST: + return redirect(success_url) + + account = get_object_or_404(models.BankAccount, pk=id, user=request.user) + + if request.method == 'POST': + form = form_class(data=request.POST, instance=account) + if form.is_valid(): + form.save() + return redirect(success_url) + else: + form = form_class(instance=account) + + dictionary = { + 'account': account, + 'form': form, + 'referer': request.META.get('HTTP_REFERER'), + } + return render(request, template_name, dictionary) + + +@login_required +@csrf_protect +def bank_accounts_delete(request, id): + """Удалить расчетный счет.""" + template_name='customer/bank_accounts/delete.html' + + success_url = 'customer_bank_accounts_list' + referer = request.POST.get('referer') + if referer and reverse('customer_profile_edit') in referer: + success_url = 'customer_profile_edit' + + if request.method == 'POST' and '_cancel' in request.POST: + return redirect(success_url) + + account = get_object_or_404(models.BankAccount, pk=id, user=request.user) + + if request.method == 'POST': + account.delete() + # TODO обработать ошибки удаления + return redirect(success_url) + + dictionary = { + 'account': account, + 'referer': request.META.get('HTTP_REFERER'), + } + return render(request, template_name, dictionary) diff --git a/project/customer/views/bank_accounts_ajax.py b/project/customer/views/bank_accounts_ajax.py new file mode 100644 index 0000000..d468a7f --- /dev/null +++ b/project/customer/views/bank_accounts_ajax.py @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- +import simplejson as json + +from django.shortcuts import get_object_or_404 +from django.http import HttpResponseBadRequest, HttpResponse +from django.views.decorators.http import require_POST +from django.views.decorators.csrf import csrf_protect +from django.contrib.auth.decorators import login_required +from django.core.urlresolvers import reverse + +from project.commons.utils import dthandler + +from .. import models, forms + + +@login_required +def bank_accounts_list_ajax(request): + """Список расчетных счетов пользователя - AJAX.""" + if not request.is_ajax(): + return HttpResponseBadRequest() + + fields_list = ['pk', 'bik', 'name', 'address', 'korr_account', 'account', 'is_main',] + accounts = models.BankAccount.objects.get_all(user=request.user).values(*fields_list) + + for a in accounts: + a['edit_url'] = reverse('customer_bank_accounts_edit', kwargs={'id': a['pk'],}) + a['delete_url'] = reverse('customer_bank_accounts_delete', kwargs={'id': a['pk'],}) + + data = json.dumps(list(accounts), default=dthandler) + return HttpResponse(data, mimetype='application/json') + + +@login_required +def bank_accounts_get_ajax(request, id): + """Получить счёт - AJAX. + Если в форме редактирования счёта задан атрибут Meta.fields, то дампит только поля, перечисленные в нём. + Иначе дампит вообще все поля, которые есть в модели. + """ + if not request.is_ajax(): + return HttpResponseBadRequest() + + try: + fields_list = forms.BankAccountForm.Meta.fields + except AttributeError: + fields_list = [] + + account = get_object_or_404(models.BankAccount.objects.values(*fields_list), pk=id, user=request.user) + + data = json.dumps(account, default=dthandler) + return HttpResponse(data, mimetype='application/json') + + +@login_required +@require_POST +@csrf_protect +def bank_accounts_add_ajax(request): + """Добавить расчетный счет - AJAX.""" + form_class = forms.BankAccountForm + + if not request.is_ajax(): + return HttpResponseBadRequest() + + form = form_class(data=request.POST) + if form.is_valid(): + new_account = form.save(commit=False) + new_account.user = request.user + new_account.save() + + non_field_errors = form.non_field_errors() + if not form.is_valid(): + non_field_errors.append(u'Заполните/исправьте выделенные поля.') + + data = { + 'success': form.is_valid(), + 'field_errors': form.errors, # ошибки полей + 'form_errors': non_field_errors, # ошибки формы + } + return HttpResponse(json.dumps(data), mimetype='application/json') + + +@login_required +@require_POST +@csrf_protect +def bank_accounts_edit_ajax(request, id): + """Редактировать расчетный счет - AJAX.""" + form_class = forms.BankAccountForm + + if not request.is_ajax(): + return HttpResponseBadRequest() + + account = get_object_or_404(models.BankAccount, pk=id, user=request.user) + + form = form_class(data=request.POST, instance=account) + if form.is_valid(): + form.save() + + non_field_errors = form.non_field_errors() + if not form.is_valid(): + non_field_errors.append(u'Заполните/исправьте выделенные поля.') + + data = { + 'success': form.is_valid(), + 'field_errors': form.errors, # ошибки полей + 'form_errors': non_field_errors, # ошибки формы + } + return HttpResponse(json.dumps(data), mimetype='application/json') + + +@login_required +@require_POST +@csrf_protect +def bank_accounts_delete_ajax(request, id): + """Удалить расчетный счет - AJAX.""" + if not request.is_ajax(): + return HttpResponseBadRequest() + + account = get_object_or_404(models.BankAccount, pk=id, user=request.user) + account.delete() + + # TODO обработать ошибки удаления + data = { + 'success': True, + 'message': {'title': 'Инфо', 'msg': 'Расчётный счёт удалён.',}, + } + return HttpResponse(json.dumps(data), mimetype='application/json') diff --git a/project/customer/views/clients.py b/project/customer/views/clients.py new file mode 100644 index 0000000..bd3d65b --- /dev/null +++ b/project/customer/views/clients.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render, redirect, get_object_or_404 +from django.views.decorators.csrf import csrf_protect +from django.contrib.auth.decorators import login_required + +from project.commons.paginator import pagination, save_per_page_value + +from .. import models, forms + + +@login_required +@csrf_protect +@save_per_page_value +def clients_list(request, page_num=None): + """Список контрагентов пользователя.""" + template_name='customer/clients/list.html' + + client_list = models.Client.objects.filter(user=request.user).order_by('name', '-created_at') + page, pagination_form = pagination(request, client_list, page_num) + + client_form = forms.ClientForm() + + dictionary = { + 'page': page, + 'pagination_form': pagination_form, + 'client_form': client_form, + } + return render(request, template_name, dictionary) + + +@login_required +@csrf_protect +def clients_add(request): + """Добавить контрагента.""" + template_name='customer/clients/add.html' + success_url = 'customer_clients_list' + form_class = forms.ClientForm + + if request.method == 'POST' and '_cancel' in request.POST: + return redirect(success_url) + + if request.method == 'POST': + form = form_class(data=request.POST) + if form.is_valid(): + new_client = form.save(commit=False) + new_client.user = request.user + new_client.save() + return redirect(success_url) + else: + form = form_class() + + return render(request, template_name, {'form': form,}) + + +@login_required +@csrf_protect +def clients_edit(request, id): + """Редактировать контрагента.""" + template_name='customer/clients/edit.html' + success_url = 'customer_clients_list' + + if request.method == 'POST' and '_cancel' in request.POST: + return redirect(success_url) + + form_class = forms.ClientForm + + client = get_object_or_404(models.Client, pk=id, user=request.user) + + if request.method == 'POST': + form = form_class(data=request.POST, instance=client) + if form.is_valid(): + form.save() + return redirect(success_url) + else: + form = form_class(instance=client) + + dictionary = { + 'client': client, + 'form': form, + } + return render(request, template_name, dictionary) + + +@login_required +@csrf_protect +def clients_delete(request, id): + """Удалить контрагента.""" + template_name='customer/clients/delete.html' + success_url = 'customer_clients_list' + + if request.method == 'POST' and '_cancel' in request.POST: + return redirect(success_url) + + client = get_object_or_404(models.Client, pk=id, user=request.user) + + if request.method == 'POST': + client.delete() + # TODO обработать ошибки удаления + return redirect(success_url) + + return render(request, template_name, {'client': client,}) diff --git a/project/customer/views/clients_ajax.py b/project/customer/views/clients_ajax.py new file mode 100644 index 0000000..ec16fca --- /dev/null +++ b/project/customer/views/clients_ajax.py @@ -0,0 +1,107 @@ +# -*- coding: utf-8 -*- +import simplejson as json + +from django.shortcuts import get_object_or_404 +from django.http import HttpResponseBadRequest, HttpResponse +from django.views.decorators.http import require_POST +from django.views.decorators.csrf import csrf_protect +from django.contrib.auth.decorators import login_required + +from .. import models, forms + + +@login_required +def clients_get_ajax(request, id): + """Получить контрагента - AJAX. + Если в форме редактирования контрагента задан атрибут Meta.fields, то дампит только поля, перечисленные в нём. + Иначе дампит вообще все поля, которые есть в модели. + """ + if not request.is_ajax(): + return HttpResponseBadRequest() + + try: + fields_list = forms.ClientForm.Meta.fields + except AttributeError: + fields_list = [] + + client = get_object_or_404(models.Client.objects.values(*fields_list), pk=id, user=request.user) + + return HttpResponse(json.dumps(client), mimetype='application/json') + + +@login_required +@require_POST +@csrf_protect +def clients_add_ajax(request): + """Добавить контрагента - AJAX.""" + form_class = forms.ClientForm + + if not request.is_ajax(): + return HttpResponseBadRequest() + + form = form_class(data=request.POST) + if form.is_valid(): + new_client = form.save(commit=False) + new_client.user = request.user + new_client.save() + + non_field_errors = form.non_field_errors() + if not form.is_valid(): + non_field_errors.append(u'Заполните/исправьте выделенные поля.') + + data = { + 'success': form.is_valid(), + 'field_errors': form.errors, # ошибки полей + 'form_errors': non_field_errors, # ошибки формы + 'reload': form.is_valid() and 'reload_on_success' in request.GET + } + return HttpResponse(json.dumps(data), mimetype='application/json') + + +@login_required +@require_POST +@csrf_protect +def clients_edit_ajax(request, id): + """Редактировать контрагента - AJAX.""" + form_class = forms.ClientForm + + if not request.is_ajax(): + return HttpResponseBadRequest() + + client = get_object_or_404(models.Client, pk=id, user=request.user) + + form = form_class(data=request.POST, instance=client) + if form.is_valid(): + form.save() + + non_field_errors = form.non_field_errors() + if not form.is_valid(): + non_field_errors.append(u'Заполните/исправьте выделенные поля.') + + data = { + 'success': form.is_valid(), + 'field_errors': form.errors, # ошибки полей + 'form_errors': non_field_errors, # ошибки формы + 'reload': form.is_valid() and 'reload_on_success' in request.GET + } + return HttpResponse(json.dumps(data), mimetype='application/json') + + +@login_required +@require_POST +@csrf_protect +def clients_delete_ajax(request, id): + """Удалить контрагента - AJAX.""" + if not request.is_ajax(): + return HttpResponseBadRequest() + + client = get_object_or_404(models.Client, pk=id, user=request.user) + client.delete() + + # TODO обработать ошибки удаления + data = { + 'success': True, + 'message': {'title': 'Инфо', 'msg': 'Контрагент удалён.',}, + 'reload': 'reload_on_success' in request.GET + } + return HttpResponse(json.dumps(data), mimetype='application/json') diff --git a/project/customer/views/profile.py b/project/customer/views/profile.py new file mode 100644 index 0000000..ff8f391 --- /dev/null +++ b/project/customer/views/profile.py @@ -0,0 +1,209 @@ +# -*- coding: utf-8 -*- +from email.header import Header + +from django.shortcuts import render, redirect, get_object_or_404 +from django.views.decorators.csrf import csrf_protect +from django.contrib.auth.decorators import login_required +from django.template.loader import render_to_string +from django.core.mail import EmailMessage +from django.utils.encoding import smart_str +from django.conf import settings + +from project.commons.pdf_tools import render_pdf_to_string, pdf_to_response + +from .. import models, forms + + +PDF_PROFILE_NAME = u'Реквизиты.pdf' +SUPPORT_EMAIL = getattr(settings, 'SUPPORT_EMAIL', '') + + +# ----------------------------------------------------------------------------- + +@login_required +@csrf_protect +def profile_view(request): + """Просмотр профиля пользователя, фильтрация реквизитов, скачать/отправить реквизиты по почте.""" + template_name = 'customer/profile/view.html' + + profile = get_object_or_404(models.UserProfile, user=request.user) + accounts = models.BankAccount.objects.get_all(request.user) + + filters_form_class = forms.get_profile_filters_form_class(profile.profile_type) + filters = models.UserProfileFilters.objects.get_or_create_filters(user=request.user) + + if request.method == 'POST': + filters_form = filters_form_class(data=request.POST, instance=filters, profile=profile, accounts=accounts) + if filters_form.is_valid(): + filters = filters_form.save() + + if 'download-pdf' in request.POST: + #return _profile_get_pdf(request, profile, filters.bank_account, filters) # для отладки + return profile_as_pdf(request, profile, filters.bank_account, filters) + elif 'email-pdf' in request.POST: + return redirect('customer_profile_email') + + return redirect('customer_profile_view') # редирект на себя, чтобы не сабмитили форму по F5 + else: + filters_form = filters_form_class(instance=filters, label_suffix='', profile=profile, accounts=accounts) + + dictionary = { + 'profile': profile, + 'accounts': accounts, + 'filters_form': filters_form, + 'email_profile_form': forms.EmailProfileForm(), + } + return render(request, template_name, dictionary) + + +@login_required +@csrf_protect +def profile_edit(request): + """Редактировать профиль пользователя.""" + template_name = 'customer/profile/edit.html' + success_url = 'customer_profile_view' + + if request.method == 'POST' and '_cancel' in request.POST: + return redirect(success_url) + + profile = get_object_or_404(models.UserProfile, user=request.user) + form_class = forms.get_profile_form_class(profile.profile_type) + + accounts = models.BankAccount.objects.get_all(request.user) + bank_account_form = forms.BankAccountForm() + + if request.method == 'POST': + form = form_class(data=request.POST, instance=profile) + if form.is_valid(): + form.save() + return redirect(success_url) + else: + form = form_class(instance=profile) + + dictionary = { + 'form': form, + 'profile': profile, + 'accounts': accounts, + 'bank_account_form': bank_account_form, + } + return render(request, template_name, dictionary) + + +@login_required +def _profile_get_pdf(request, profile=None, account=None, filters=None): + """Создать профиль пользователя в PDF и вернуть как строку.""" + template_name = 'customer/profile/as_pdf.html' + dictionary = { + 'profile': profile, + 'account': account, + 'filters': filters, + } + return render_pdf_to_string(request, template_name, dictionary) + + +@login_required +def profile_as_pdf(request, profile=None, account=None, filters=None): + """Вывести профиль пользователя в формате PDF в HttpResponse.""" + pdf = _profile_get_pdf(request, profile, account, filters) + return pdf_to_response(pdf, PDF_PROFILE_NAME) + + +def _send_profile_email(subject, to, body, pdf_content): + """Отправка письма.""" + template_name = 'customer/profile/profile_email.txt' + dict_context = {'body': body, 'support_email': SUPPORT_EMAIL,} + email_body = render_to_string(template_name, dict_context) + email = EmailMessage( + subject=subject, + to=(to,), + body=email_body, + attachments = [(smart_str(Header(PDF_PROFILE_NAME, 'cp1251')), pdf_content, 'application/pdf'),] + ) + return email.send() + + +@login_required +@csrf_protect +def profile_email(request): + """Форма отправки профиля пользователя на email аттачем в PDF.""" + template_name = 'customer/profile/email.html' + success_url = 'customer_profile_view' + + form_class = forms.EmailProfileForm + + if request.method == 'POST' and '_cancel' in request.POST: + return redirect('customer_profile_view') + + profile = get_object_or_404(models.UserProfile, user=request.user) + filters = models.UserProfileFilters.objects.get_or_create_filters(user=request.user) + + if request.method == 'POST': + form = form_class(data=request.POST) + if form.is_valid(): + _send_profile_email( + subject = u'Реквизиты %s' % profile.get_company_name(), + to = form.cleaned_data['to'], + body = form.cleaned_data['body'], + pdf_content = _profile_get_pdf(request, profile, filters.bank_account, filters) + ) + return redirect(success_url) + else: + form = form_class() + + return render(request, template_name, {'form': form, 'profile': profile,}) + + +#@login_required +#@csrf_protect +#def profile_settings(request): +# """Редактировать настройки пользователя.""" +# template_name='customer/profile/settings.html' +# +# profile = get_object_or_404(models.UserProfile, user=request.user) +# form_class = forms.UserProfileSettingsForm #TODO remove this view +# +# # пути к уже загруженным подписям/штампу +# curr_files = {'boss_sign': None, 'glavbuh_sign': None, 'stamp': None,} +# if profile.boss_sign: +# curr_files['boss_sign'] = profile.boss_sign.path +# if profile.glavbuh_sign: +# curr_files['glavbuh_sign'] = profile.glavbuh_sign.path +# if profile.stamp: +# curr_files['stamp'] = profile.stamp.path +# +# if request.method == "POST" and '_cancel' not in request.POST: +# post = request.POST +# files = request.FILES +# form = form_class(user=request.user, data=post, files=files, instance=profile) +# +# if form.is_valid(): +# def delete_file(path): +# """Удалить файл. Если ошибка - сообщить в консоль.""" +# try: +# os.remove(path) +# except: +# print "Can't delete file:", path +# # --- удалить старые файлы +# for field, path in curr_files.iteritems(): +# if not path: +# continue +# # если стоит галочка 'очистить' +# if '%s-clear' % field in post: +# delete_file(path) +# continue +# # если загружен новый файл +# if field in files: +# delete_file(path) +# continue +# # --- изменить пароль +# if 'new_password1' in post: +# request.user.set_password(post.get('new_password1')) +# request.user.save() +# messages.add_message(request, messages.INFO, u'Пароль успешно изменен.') +# +# form.save() +# return redirect('customer_profile_settings') +# else: +# form = form_class(user=request.user, instance=profile) +# +# return render(request, template_name, {'profile': profile, 'form': form,}) diff --git a/project/customer/views/profile_ajax.py b/project/customer/views/profile_ajax.py new file mode 100644 index 0000000..7ba0424 --- /dev/null +++ b/project/customer/views/profile_ajax.py @@ -0,0 +1,76 @@ +# -*- coding: utf-8 -*- +import simplejson as json + +from django.shortcuts import get_object_or_404 +from django.http import HttpResponseBadRequest, HttpResponse +from django.views.decorators.http import require_POST +from django.views.decorators.csrf import csrf_protect +from django.contrib.auth.decorators import login_required + +from .. import models, forms + +from .profile import _send_profile_email, _profile_get_pdf + + +@login_required +@require_POST +@csrf_protect +def profile_filters_edit_ajax(request): + """Сохранить фильтры реквизитов профиля - AJAX.""" + if not request.is_ajax(): + return HttpResponseBadRequest() + + profile = get_object_or_404(models.UserProfile, user=request.user) + accounts = models.BankAccount.objects.get_all(request.user) + + filters_form_class = forms.get_profile_filters_form_class(profile.profile_type) + filters = models.UserProfileFilters.objects.get_or_create_filters(user=request.user) + + form = filters_form_class(data=request.POST, instance=filters, profile=profile, accounts=accounts) + if form.is_valid(): + form.save() + + non_field_errors = form.non_field_errors() + if not form.is_valid(): + non_field_errors.append(u'Заполните/исправьте выделенные поля.') + + data = { + 'success': form.is_valid(), + 'field_errors': form.errors, # ошибки полей + 'form_errors': non_field_errors, # ошибки формы + } + return HttpResponse(json.dumps(data), mimetype='application/json') + + +@login_required +@require_POST +@csrf_protect +def profile_email_ajax(request): + """Обработка формы отправки профиля пользователя на email аттачем в PDF - AJAX.""" + if not request.is_ajax(): + return HttpResponseBadRequest() + + form_class = forms.EmailProfileForm + + profile = get_object_or_404(models.UserProfile, user=request.user) + filters = models.UserProfileFilters.objects.get_or_create_filters(user=request.user) + + form = form_class(data=request.POST) + if form.is_valid(): + _send_profile_email( + subject = u'Реквизиты %s' % profile.get_company_name(), + to = form.cleaned_data['to'], + body = form.cleaned_data['body'], + pdf_content = _profile_get_pdf(request, profile, filters.bank_account, filters) + ) + + non_field_errors = form.non_field_errors() + if not form.is_valid(): + non_field_errors.append(u'Заполните/исправьте выделенные поля.') + + data = { + 'success': form.is_valid(), + 'field_errors': form.errors, # ошибки полей + 'form_errors': non_field_errors, # ошибки формы + } + return HttpResponse(json.dumps(data), mimetype='application/json') diff --git a/project/docs/__init__.py b/project/docs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/project/docs/as_xls/__init__.py b/project/docs/as_xls/__init__.py new file mode 100644 index 0000000..8cb5cdc --- /dev/null +++ b/project/docs/as_xls/__init__.py @@ -0,0 +1 @@ +from .render_to_xls import render_xls_to_string diff --git a/project/docs/as_xls/render_to_xls.py b/project/docs/as_xls/render_to_xls.py new file mode 100644 index 0000000..ebf02ad --- /dev/null +++ b/project/docs/as_xls/render_to_xls.py @@ -0,0 +1,521 @@ +# -*- coding: utf-8 -*- +import os +import re +import math +from StringIO import StringIO + +import xlrd +import xlwt + +from django.conf import settings +from django.template import (Template, RequestContext, BLOCK_TAG_START, BLOCK_TAG_END, + VARIABLE_TAG_START, VARIABLE_TAG_END) + +from project.commons.xls import (get_xlwt_style_list, copy_cells, width_cols, horz_page_break, mm_to_twips, + sum_src_heights, sum_dst_heights) + + +TAG_RE = re.compile('(%s.*?%s|%s.*?%s)' % ( + re.escape(BLOCK_TAG_START), re.escape(BLOCK_TAG_END), + re.escape(VARIABLE_TAG_START), re.escape(VARIABLE_TAG_END) +)) + +XLS_ROOT = getattr(settings, 'XLS_ROOT', '/') + +DEBUG = getattr(settings, 'DEBUG', False) + + +def render_xls_to_string(request, xls_template, dictionary=None): + """Создает по шаблону новую книгу Excel. + Возвращает строку, в которой сожержится сгенерированный Excel. + """ + src_xls = os.path.join(XLS_ROOT, xls_template) # файл шаблона + src_book = None + try: + # откуда + src_book = xlrd.open_workbook(src_xls, encoding_override='cp1251', + on_demand=True, formatting_info=True) + src_sheet = src_book.sheet_by_index(0) + + # достать список стилей + style_list = get_xlwt_style_list(src_book) + + # куда + dst_book = xlwt.Workbook(encoding='cp1251', style_compression=2) + dst_sheet = dst_book.add_sheet(src_sheet.name, cell_overwrite_ok=True) + + # настройки + xls_settings = get_settings(src_book) + apply_page_settings(dst_sheet, xls_settings) + + # заполнить данными + fill_xls(request, dictionary, src_sheet, dst_sheet, style_list, + xls_settings) + + # закрыть исходную книгу и сохранить созданную + src_book.release_resources() + f=StringIO() + dst_book.save(f) + xls_content = f.getvalue() + f.close() + return xls_content + except: + if src_book and not src_book._resources_released: + src_book.release_resources() + raise + + +def fill_xls(request, dictionary, src_sheet, dst_sheet, style_list, xls_settings): + """Заполнить контентом новый лист Excel. + """ + obj_items = dictionary['obj_items'] + + context = RequestContext(request, dictionary) + + # ------------------------------------------------------------------------- + + def write(row, col, val, src_row=None, src_col=None, commands=None): + """Записывает данные в ячейку с сохранением стилей.""" + src_row = src_row or row + src_col = src_col or col + style = style_list[src_sheet.cell(src_row, src_col).xf_index] + if commands: + if commands.get('draw_thin_bottom_border'): + style.borders.bottom = xlwt.Borders.THIN + dst_sheet.write(row, col, val, style) + + def process_template(template_string, **kwargs): + """Передать шаблон на обработку django.template.Template.""" + template = Template(template_string) + context.update(kwargs) + return template.render(context) + + def parse_cells(row_from=0, row_to=None, col_from=0, col_to=None, + dst_row_shift=0, dst_col_shift=0, **kwargs): + """Ищет шаблонные теги и переменные в ячейках заданного диапазона. Если находит, то передает содержимое ячейки + целиком на обработку в process_template. После чего записывает полученный результат обратно в ячейку. + Также ищет спец. токены и выполняет соответствующие действия. + """ + row_to = row_to or src_sheet.nrows-1 + col_to = col_to or src_sheet.ncols-1 + + for row in xrange(row_from, row_to+1): + cmd_fix_height = [] + + for col in xrange(col_from, col_to+1): + cell = src_sheet.cell(row, col) + cell_value = new_value = cell.value + + cmd_as_float = False + cmd_show_bmp = False + cmd_draw_thin_bottom_border = False + + # если в ячейке не строка - пропускаем + if not isinstance(new_value, unicode): + continue + + # поискать шаблонные теги и переменные в ячейке + if TAG_RE.search(new_value): + # передать на обработку + new_value = process_template(new_value, **kwargs) + + # пофиксить переводы строки + #new_value = new_value.strip().replace('\r\n', '\n') + new_value = new_value.strip().replace('\r\n', ' ') + + # команда 'конвертировать во float' + if u'@@AS_FLOAT@@' in new_value: + new_value = new_value.replace(u'@@AS_FLOAT@@', u'') + cmd_as_float = True + + # команда 'вставить изображение из bmp-файла' + if u'@@SHOW_BMP@@' in new_value: + new_value = new_value.replace(u'@@SHOW_BMP@@', u'') + cmd_show_bmp = True + + # команда 'нарисовать тонкую рамку внизу ячейки' + if u'@@DRAW_THIN_BOTTOM_BORDER@@' in new_value: + new_value = new_value.replace( + u'@@DRAW_THIN_BOTTOM_BORDER@@', u'') + cmd_draw_thin_bottom_border = True + + # команда 'подобрать высоту строки в ячейке' + if u'@@FIX_HEIGHT@@' in new_value: + new_value = new_value.replace(u'@@FIX_HEIGHT@@', u'') + cmd_fix_height.append({ + 'col': col, + 'value': unicode(new_value), + }) + + if new_value != cell_value: + # если надо, попробовать привести к float, чтоб нормально сохранилось в Excel + if cmd_as_float and not cmd_show_bmp: + try: + new_value = float(new_value.replace(',', '.', 1)) + except: + pass + + # записать новое значение, если оно отличается от прочитанного + if new_value != cell_value: + if cmd_show_bmp and new_value: + try: + dst_sheet.insert_bitmap( + new_value, + row = row + dst_row_shift, + col = col + dst_col_shift, + ) + new_value = '' + except: + if DEBUG: + raise + else: + print "Error inserting image from file '%s'" % new_value + write( + row = row + dst_row_shift, + col = col + dst_col_shift, + val = new_value, + src_row = row, + src_col = col, + commands = {'draw_thin_bottom_border': cmd_draw_thin_bottom_border,} + ) + + # --- конец цикла по ячейкам в строке + + # подобрать высоту строки в ячейках + dst_row = row + dst_row_shift # строка назначения + row_height = dst_sheet.row(dst_row).height # текущая высота + max_height = 0 + for fh in cmd_fix_height: + #print '---FIX_HEIGHT:', 'dst_row=', dst_row, 'col=', fh['col'] + # взять ширину ячейки + width = 0 + # учитываем только объединенные ячейки + for r1,r2,c1,c2 in src_sheet.merged_cells: + if r1 != row or c1 != fh['col']: + continue + for colx in xrange(c1, c2): + width += src_sheet.computed_column_width(colx) + else: + break + + # хотя бы приблизительный расчет, т.к. точный невозможен. + # формулы тестировались для Times New Roman, 9pt. + # для других шрифтов/размеров могут и не подойти + width_in_pixels = width / 36.5 + width_in_chars = width_in_pixels / 5.8 + + # может быть 0, если команда @@FIX_HEIGHT@@ задана в простой (не объединенной) ячейке + if width_in_chars == 0: + print ('WARNING. xls generation, cmd @@FIX_HEIGHT@@. ' + 'variable `width_in_chars` = %s. skip this command.' % width_in_chars) + continue + + # сколько строк под текст + value = fh['value'] + min_rows = 1 + need_rows = math.ceil(len(value) / width_in_chars) + need_rows = int(max(min_rows, need_rows)) + #print 'need_rows=', need_rows + + new_height = row_height * need_rows + # не фиксить высоту, если новая высота данной ячейки меньше либо равна текущей высоте + if new_height > max_height: + max_height = new_height + else: + #print 'SKIP,', new_height, '<=', max_height + continue + + dst_sheet.row(dst_row).height = new_height + dst_sheet.row(dst_row).height_mismatch = True + + # ------------------------------------------------------------------------- + + # задать ширину колонок - достаточно один раз + width_cols(src_sheet, dst_sheet) + + # у документа нет табличной части. заполнить целиком и сразу, после чего выйти. + if not obj_items or 'TBL_BODY_ROW' not in xls_settings: + copy_cells(src_sheet, dst_sheet, style_list) + parse_cells() + return + + # ---------------------------------------- у документа есть табличная часть + + # адъ констант! + p = get_all_these_boring_params(src_sheet, xls_settings) + if not p: + print 'Please set ALL required settings!' + return + + # --- !!! ------ вывести начало документа включительно по шапку табл. части + + copy_cells(src_sheet, dst_sheet, style_list, row_from=0, row_to=p.TBL_BODY_ROW-1) + + parse_cells(row_to=p.TBL_BODY_ROW-1) + + # для отладки - выйти здесь + #return + + # --- !!! ------------ вывести таблицу с учетом переходов на новую страницу + + # суммарная высота уже занятых строк на первой странице нового листа + curr_height = sum_dst_heights(dst_sheet, 0, p.TBL_HEADER_TO) + + # глобальное смещение на новом листе относительно листа исходного + add_offset = 0 + + just_wrote_page_footer = False + last_page_item_idx = 0 + row = 0 + row_shift = 0 + + #print '---table:' + + def write_tbl_body_row(): + """Хелпер для отрисовки строки таблицы. + Зависит от внешних переменных row_shift, row и item! + """ + #print '---table body row, dst_row_shift =', row_shift + copy_cells( + src_sheet, dst_sheet, style_list, + row_from = p.TBL_BODY_ROW, row_to = p.TBL_BODY_ROW, + dst_row_shift = row_shift + ) + parse_cells( + row_from = p.TBL_BODY_ROW, + row_to = p.TBL_BODY_ROW, + dst_row_shift = row_shift, + item = item, + item_npp = row+1 + ) + + def write_tbl_page_footer(): + """Хелпер для отрисовки подитога таблицы. + Зависит от внешних переменных row_shift, last_page_item_idx и row! + """ + dst_row_shift = row_shift - (p.TBL_PAGE_FOOTER_FROM - p.TBL_BODY_ROW) + #print '---table page footer, dst_row_shift =', dst_row_shift, \ + # 'items_start =', last_page_item_idx, 'items_stop =', row + copy_cells( + src_sheet, dst_sheet, style_list, + row_from = p.TBL_PAGE_FOOTER_FROM, row_to = p.TBL_PAGE_FOOTER_TO, + dst_row_shift = dst_row_shift + ) + parse_cells( + row_from = p.TBL_PAGE_FOOTER_FROM, + row_to = p.TBL_PAGE_FOOTER_TO, + dst_row_shift = dst_row_shift, + items_start = last_page_item_idx, + items_stop = row + ) + + def write_tbl_header(): + """Хелпер для отрисовки шапки таблицы. + Зависит от внешних переменных row и add_offset! + """ + dst_row_shift = p.TBL_HEADER_ROWS + row + add_offset + #print '---table header, dst_row_shift =', dst_row_shift + copy_cells( + src_sheet, dst_sheet, style_list, + row_from = p.TBL_HEADER_FROM, row_to = p.TBL_HEADER_TO, + dst_row_shift = dst_row_shift + ) + + # цикл по табличной части документа + for row, item in enumerate(obj_items): + row_shift = row + add_offset + #print 'row = %s, add_offset = %s' % (row, add_offset) + + write_tbl_body_row() + row_height = dst_sheet.row(p.TBL_BODY_ROW + row_shift).height + curr_height += row_height + + just_wrote_page_footer = False + + # строка, подитог и итог не помещаются на странице + if curr_height + p.TBL_PAGE_FOOTER_HEIGHT + p.TBL_FOOTER_HEIGHT > p.WORK_HEIGHT: + # если это первая строка, то: + if row == 0: + #print '---table new page, row =', row + # 1. добавить разрыв страницы перед первой шапкой + horz_page_break(dst_sheet, p.TBL_HEADER_FROM) + curr_height = p.TBL_HEADER_HEIGHT + row_height + # если это не последняя строка, то: + elif row < len(obj_items)-1: + #print '---table new page, row =', row + # 1. вместо строки вывести подитог + if p.TBL_PAGE_FOOTER_ROWS > 0: + write_tbl_page_footer() + last_page_item_idx = row + just_wrote_page_footer = True + add_offset += p.TBL_PAGE_FOOTER_ROWS + row_shift += add_offset + # 2. добавить разрыв страницы + horz_page_break(dst_sheet, (p.TBL_HEADER_FROM + p.TBL_HEADER_ROWS + row + add_offset)) + # 3. вывести шапку + write_tbl_header() + add_offset += p.TBL_HEADER_ROWS + curr_height = p.TBL_HEADER_HEIGHT + # 4. перевывести под ними строку + row_shift = row + add_offset + write_tbl_body_row() + curr_height += row_height + + else: # for ... else + # вывести подитог, если только что не выводили его в цикле + if p.TBL_PAGE_FOOTER_ROWS > 0 and not just_wrote_page_footer: + #print '---tbl last page, row =', row + row += 1 # чтоб захватить в подитог и последнюю запись тоже + row_shift = row + add_offset + write_tbl_page_footer() + curr_height += p.TBL_PAGE_FOOTER_HEIGHT + + add_offset += row - p.TBL_PAGE_FOOTER_ROWS + + #print '---end table' + + # для отладки - выйти здесь + #return + + # --- !!! --------------------------------------- вывести остаток документа + + copy_cells( + src_sheet, dst_sheet, style_list, + row_from = p.TBL_FOOTER_FROM, + dst_row_shift = add_offset + ) + + # добавить разрыв страницы, если остаток документа не уместится целиком + # на текущей странице + rest_height = sum_src_heights(src_sheet, p.TBL_FOOTER_TO, src_sheet.nrows) + if curr_height + rest_height > p.WORK_HEIGHT: + horz_page_break(dst_sheet, p.TBL_FOOTER_TO + add_offset + 1) + + parse_cells( + row_from = p.TBL_FOOTER_FROM, + dst_row_shift = add_offset + ) + + return + + +def get_settings(src_book, sheet_name=u'settings'): + """Загрузить настройки с листа settings.""" + settings = {} + + try: + src_sheet = src_book.sheet_by_name(sheet_name) + except xlrd.XLRDError: + return settings + + for row in xrange(src_sheet.nrows): + key_cell = src_sheet.cell(row, 0).value + if key_cell: + key_name = unicode(key_cell).strip() + if not key_name.startswith(u'#'): + val_cell = src_sheet.cell(row, 1).value + if (isinstance(val_cell, unicode) or + isinstance(val_cell, str)): + settings[key_name] = unicode(val_cell) + else: + settings[key_name] = val_cell + + return settings + + +def apply_page_settings(dst_sheet, settings): + """Применить параметры страницы.""" + def setparam(attr, key): + if key in settings: + setattr(dst_sheet, attr, settings[key]) + + def setparam_as_inch(attr, key): + if key in settings: + setattr(dst_sheet, attr, settings[key]/25.4) + + setparam('portrait', 'PAGE_PORTRAIT') + setparam('header_str', 'PAGE_HEADER_STR') + setparam('footer_str', 'PAGE_FOOTER_STR') + + # отступы, задаются в дюймах: 1 дюйм = 25.4 мм = 2.54 см + setparam_as_inch('top_margin', 'PAGE_TOP_MARGIN') + setparam_as_inch('bottom_margin', 'PAGE_BOTTOM_MARGIN') + setparam_as_inch('left_margin', 'PAGE_LEFT_MARGIN') + setparam_as_inch('right_margin', 'PAGE_RIGHT_MARGIN') + setparam_as_inch('header_margin', 'PAGE_HEADER_MARGIN') + setparam_as_inch('footer_margin', 'PAGE_FOOTER_MARGIN') + + +def get_all_these_boring_params(src_sheet, xls_settings): + """Достает нужные настройки из словаря и проверят, некоторые вычисляет - + и всё это складывает в класс, который потом и возвращает. + Если какие-то обязательные настройки не заданы, сообщает об этом в консоль и возвращает None. + """ + class Params(object): + pass + p = Params() + + # строка контента таблицы - обязательно + p.TBL_BODY_ROW = xls_settings.get('TBL_BODY_ROW') + if p.TBL_BODY_ROW is not None: + # перевести в int + p.TBL_BODY_ROW = int(p.TBL_BODY_ROW) + # высота в twips + p.TBL_BODY_HEIGHT = sum_src_heights(src_sheet, p.TBL_BODY_ROW, p.TBL_BODY_ROW) + else: + print u'Error! TBL_BODY_ROW not set!' + return None + + # шапка таблицы - обязательно + p.TBL_HEADER_FROM = xls_settings.get('TBL_HEADER_FROM') + p.TBL_HEADER_TO = xls_settings.get('TBL_HEADER_TO') + if p.TBL_HEADER_FROM is not None and p.TBL_HEADER_TO is not None: + # перевести в int + p.TBL_HEADER_FROM = int(p.TBL_HEADER_FROM) + p.TBL_HEADER_TO = int(p.TBL_HEADER_TO) + # высота в строках + p.TBL_HEADER_ROWS = int(p.TBL_HEADER_TO - p.TBL_HEADER_FROM + 1) + # высота в twips + p.TBL_HEADER_HEIGHT = sum_src_heights(src_sheet, p.TBL_HEADER_FROM, p.TBL_HEADER_TO) + else: + print u'Error! Either TBL_HEADER_FROM or TBL_HEADER_TO not set!' + return None + + # итого по таблице - обязательно + p.TBL_FOOTER_FROM = xls_settings.get('TBL_FOOTER_FROM') + p.TBL_FOOTER_TO = xls_settings.get('TBL_FOOTER_TO') + if p.TBL_FOOTER_FROM is not None and p.TBL_FOOTER_TO is not None: + # перевести в int + p.TBL_FOOTER_FROM = int(p.TBL_FOOTER_FROM) + p.TBL_FOOTER_TO = int(p.TBL_FOOTER_TO) + # высота в строках + p.TBL_FOOTER_ROWS = int(p.TBL_FOOTER_TO - p.TBL_FOOTER_FROM + 1) + # высота в twips + p.TBL_FOOTER_HEIGHT = sum_src_heights(src_sheet, p.TBL_FOOTER_FROM, p.TBL_FOOTER_TO) + else: + print u'Error! Either TBL_FOOTER_FROM or TBL_FOOTER_TO not set!' + return None + + # подитог (итого по странице) - опционально + p.TBL_PAGE_FOOTER_FROM = xls_settings.get('TBL_PAGE_FOOTER_FROM') + p.TBL_PAGE_FOOTER_TO = xls_settings.get('TBL_PAGE_FOOTER_TO') + if p.TBL_PAGE_FOOTER_FROM is not None and p.TBL_PAGE_FOOTER_TO is not None: + # перевести в int + p.TBL_PAGE_FOOTER_FROM = int(p.TBL_PAGE_FOOTER_FROM) + p.TBL_PAGE_FOOTER_TO = int(p.TBL_PAGE_FOOTER_TO) + # высота в строках + p.TBL_PAGE_FOOTER_ROWS = int(p.TBL_PAGE_FOOTER_TO - p.TBL_PAGE_FOOTER_FROM + 1) + # высота в twips + p.TBL_PAGE_FOOTER_HEIGHT = sum_src_heights(src_sheet, p.TBL_PAGE_FOOTER_FROM, p.TBL_PAGE_FOOTER_TO) + else: + p.TBL_PAGE_FOOTER_ROWS = 0 + p.TBL_PAGE_FOOTER_HEIGHT = 0 + + # высота рабочей области (высота страницы минус отступы сверху и снизу) + p.WORK_HEIGHT = mm_to_twips( + xls_settings.get('PAGE_HEIGHT', 210) - + xls_settings.get('PAGE_TOP_MARGIN', 0) - + xls_settings.get('PAGE_BOTTOM_MARGIN', 0) + ) + + return p diff --git a/project/docs/consts.py b/project/docs/consts.py new file mode 100644 index 0000000..d984ef5 --- /dev/null +++ b/project/docs/consts.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- +from decimal import Decimal + + +BOOL_CHOICES = ( + (True, u'Да'), + (False, u'Нет'), +) + +# виды НДС +NDS_TYPE_NO = 1 +NDS_TYPE_IN = 2 +NDS_TYPE_OUT = 3 + +NDS_TYPE_CHOICES = ( + (NDS_TYPE_NO, u'Не учитывать'), + (NDS_TYPE_IN, u'В сумме'), + (NDS_TYPE_OUT, u'Сверх суммы'), +) + +# ставка НДС +NDS_VALUE_0 = 1 +NDS_VALUE_10 = 2 +NDS_VALUE_18 = 3 + +NDS_VALUE_CHOICES = ( + (NDS_VALUE_0, u'Без НДС'), + (NDS_VALUE_10, u'10%'), + (NDS_VALUE_18, u'18%'), +) + +# ставка НДС - число в формате Decimal (для расчетов) +NDS_VALUE_NUMERIC = { + NDS_VALUE_0: Decimal('0.00'), + NDS_VALUE_10: Decimal('10.00'), + NDS_VALUE_18: Decimal('18.00'), +} + +# ----------------------------------------------------------- для счетов-фактур + +# валюты +CURR_RUB = 1 +CURR_USD = 2 +CURR_EUR = 3 +CURR_OTHER = 4 + +CURRENCY_CHOICES = ( + (CURR_RUB, u'Руб.'), + (CURR_USD, u'USD'), + (CURR_EUR, u'EUR'), + (CURR_OTHER, u'Другое'), +) + +CURRENCY_CHOICES_DICT = dict(CURRENCY_CHOICES) + +# варианты для поля грузоотправитель +CONSIGNOR_TYPE_SELF = 1 +CONSIGNOR_TYPE_OTHER = 2 +CONSIGNOR_TYPE_NO = 3 + +CONSIGNOR_CHOICES = ( + (CONSIGNOR_TYPE_SELF, u'Подставить мои данные'), # из профиля через поле user + (CONSIGNOR_TYPE_OTHER, u'Стороннее лицо'), # из справочника контрагенты + (CONSIGNOR_TYPE_NO, u'Не указывать'), +) + +# варианты для поля грузополучатель +RECEIVER_TYPE_BUYER = 1 +RECEIVER_TYPE_OTHER = 2 +RECEIVER_TYPE_NO = 3 + +RECEIVER_CHOICES = ( + (RECEIVER_TYPE_BUYER, u'То же лицо'), # что и покупатель + (RECEIVER_TYPE_OTHER, u'Стороннее лицо'), # из справочника контрагенты + (RECEIVER_TYPE_NO, u'Не указывать'), +) + +# ----------------------------------------------------- для платежных поручений + +# тип платежного поручения +PLATEJ_TYPE_COMMERCE = 1 +PLATEJ_TYPE_TAX = 2 + +PLATEJ_TYPE_CHOICES = ( + (PLATEJ_TYPE_COMMERCE, u'Коммерческое'), + (PLATEJ_TYPE_TAX, u'Налоговое'), +) + +# вид платежа +PAYMENT_TYPE_CHOICES = ( + (1, u'Не указывать'), + (2, u'Срочно'), + (3, u'Электронно'), + (4, u'Почтой'), + (5, u'Телеграфом'), +) + +# статус составителя +TAX_STATUS_CHOICES = ( + (u'01', u'01 - налогоплательщик (плательщик сборов) - юридическое лицо'), + (u'02', u'02 - налоговый агент'), + (u'03', u'03 - сборщик налогов и сборов'), + (u'04', u'04 - налоговый орган'), + (u'05', u'05 - служба судебных приставов'), + (u'06', u'06 - участник внешнеэкономической деятельности'), + (u'07', u'07 - таможенный орган'), + (u'08', u'08 - плательщик иных обязательных платежей'), + (u'09', u'09 - налогоплательщик (плательщик сборов) - ИП'), + (u'10', u'10 - налогоплательщик (плательщик сборов) - частный нотариус'), + (u'11', u'11 - налогоплательщик (плательщик сборов) - адвокат'), + (u'12', u'12 - налогоплательщик (плательщик сборов) - глава КФХ'), + (u'13', u'13 - налогоплательщик (плательщик сборов) - иное физическое лицо'), + (u'14', u'14 - налогоплательщик, производящий выплаты физическим лицам'), + (u'15', u'15 - кредитная организация'), +) + +# основание налогового платежа +TAX_BASE = ( + (u'ТП', u'ТП - платежи текущего года'), + (u'ЗД', u'ЗД - добровольное погашение задолженности по истекшим налоговым периода'), + (u'БФ', u'БФ - текущие платежи физических лиц - клиентов банка (владельцев счета)'), + (u'ТР', u'ТР - погашение задолженности по требованию об уплате налогов (сборов) от налогового органа'), + (u'РС', u'РС - погашение рассроченной задолженности'), + (u'ОТ', u'ОТ - погашение отсроченной задолженности'), + (u'РТ', u'РТ - погашение реструктурируемой задолженности'), + (u'ВУ', u'ВУ - погашение отсроченной задолженности в связи с введением внешнего управления'), + (u'ПР', u'ПР - погашение задолженности, приостановленной к взысканию'), + (u'АП', u'АП - погашение задолженности по акту проверки'), + (u'АР', u'АР - погашение задолженности по исполнительному документу'), + ( u'0', u'0 - Конкретное значение указать невозможно'), +) + +# тип налогового платежа +TAX_TYPE = ( + (u'НС', u'НС - уплата налога или сбора'), + (u'ПЛ', u'ПЛ - уплата платежа'), + (u'ГП', u'ГП - уплата пошлины'), + (u'ВЗ', u'ВЗ - уплата взноса'), + (u'АВ', u'АВ - уплата аванса или предоплата (в том числе декадные платежи)'), + (u'ПЕ', u'ПЕ - уплата пени'), + (u'ПЦ', u'ПЦ - уплата процентов'), + (u'СА', u'СА - налоговые санкции, установленные Налоговым кодексом РФ'), + (u'АШ', u'АШ - административные штрафы'), + (u'ИШ', u'ИШ - иные штрафы, установленные соответствующими нормативными актами'), + ( u'0', u'0 - Конкретное значение указать невозможно'), +) diff --git a/project/docs/filters.py b/project/docs/filters.py new file mode 100644 index 0000000..30e38b2 --- /dev/null +++ b/project/docs/filters.py @@ -0,0 +1,210 @@ +# -*- coding: utf-8 -*- +import datetime + +import django_filters + +from project.customer.models import Client + +from .models import Invoice, Platejka +from . import consts + + +class CustomDateRangeFilter(django_filters.DateRangeFilter): + def __init__(self, *args, **kwargs): + try: + options = kwargs.pop('options') + self.options = options + except KeyError: + pass + kwargs['choices'] = [(key, value[0]) for key, value in self.options.iteritems()] + super(CustomDateRangeFilter, self).__init__(*args, **kwargs) + + +class CustomChoiceFilter(django_filters.ChoiceFilter): + def __init__(self, *args, **kwargs): + self.options = kwargs.pop('options') # обязательный параметр! + kwargs['choices'] = [(key, value[0]) for key, value in self.options.iteritems()] + super(CustomChoiceFilter, self).__init__(*args, **kwargs) + + def filter(self, qs, value): + try: + value = int(value) + except (ValueError, TypeError): + value = '' + return self.options[value][1](qs, self.name) + + +def _quarter_dates(q, year): + """Возвращает даты начала/окончания переданного квартала. + Также нужно передать год. + """ + if q == 1: + return datetime.date(year, 1, 1), datetime.date(year, 3, 31) + elif q == 2: + return datetime.date(year, 4, 1), datetime.date(year, 6, 30) + elif q == 3: + return datetime.date(year, 7, 1), datetime.date(year, 9, 30) + elif q ==4: + return datetime.date(year, 10, 1), datetime.date(year, 12, 31) + return None, None + + +def current_quarter(today): + """Возвращает даты начала/окончания текущего квартала.""" + q = (today.month-1)//3+1 + return _quarter_dates(q, today.year) + + +def last_quarter(today): + """Возвращает даты начала/окончания прошлого квартала.""" + q = (today.month-1)//3+1 + q -= 1 + year = today.year + if q < 1: # прошлый год + q = 4 + year -= 1 + return _quarter_dates(q, year) + + +today = datetime.datetime.now() +current_quarter_start, current_quarter_end = current_quarter(today) +last_quarter_start, last_quarter_end = last_quarter(today) + +# --- варианты фильтрации для разных полей + +doc_date_choices = { + '': (u'Всё время', lambda qs, name: qs.all()), + 1: (u'Этот месяц', lambda qs, name: qs.filter(**{ + '%s__year' % name: datetime.datetime.now().year, + '%s__month' % name: datetime.datetime.now().month + })), + 2: (u'Прошлый месяц', lambda qs, name: qs.filter(**{ + '%s__year' % name: datetime.datetime.now().year, + '%s__month' % name: datetime.datetime.now().month-1 + })), + 3: (u'Этот квартал', lambda qs, name: qs.filter(**{ + '%s__gte' % name: current_quarter_start, + '%s__lte' % name: current_quarter_end, + })), + 4: (u'Прошлый квартал', lambda qs, name: qs.filter(**{ + '%s__gte' % name: last_quarter_start, + '%s__lte' % name: last_quarter_end, + })), + 5: (u'Этот год', lambda qs, name: qs.filter(**{ + '%s__year' % name: datetime.datetime.now().year, + })), + 6: (u'Прошлый год', lambda qs, name: qs.filter(**{ + '%s__year' % name: datetime.datetime.now().year-1, + })), +} + +closed_status_choices = ( + ('', u'Все счета'), + (1, u'Закрытые'), + (0, u'Не закрытые'), +) + +paid_status_choices = ( + ('', u'Все счета'), + (Invoice.PAID, u'Оплаченные'), + (Invoice.PARTLY_PAID, u'Частично оплаченные'), + (Invoice.UNPAID, u'Неоплаченные'), +) + +signed_status_choices = ( + ('', u'Все документы'), + ('1', u'Подписанные'), + ('0', u'Не подписанные'), +) + +total_saldo_choices = { + '': (u'Любое', lambda qs, name: qs.all()), + 1: (u'Положительное', lambda qs, name: qs.filter(**{ + '%s__gt' % name: 0, + })), + 2: (u'Отрицательное', lambda qs, name: qs.filter(**{ + '%s__lt' % name: 0, + })), +} + +platej_type_choices = ( + ('', u'Все плат. поручения'), + (consts.PLATEJ_TYPE_COMMERCE, u'Коммерческие'), + (consts.PLATEJ_TYPE_TAX, u'Налоговые'), +) + + +class _BaseFilterSet(django_filters.FilterSet): + """Базовый класс фильтров. + Классы фильтров строить через build_filterset_class ! + """ + class Meta: + model = None + + def __init__(self, user, *args, **kwargs): + super(_BaseFilterSet, self).__init__(*args, **kwargs) + self.form.label_suffix = '' + + +def build_filterset_class(model, user, need_fields=None): + """Строит и возвращает класс с набором фильтров для фильтрации документов.""" + attrs = {} + fields = [] + + for f in need_fields: + if f == 'doc_date': + doc_date = CustomDateRangeFilter(label=u'По времени создания', options=doc_date_choices, + widget=django_filters.widgets.LinkWidget) + attrs['doc_date'] = doc_date + fields.append('doc_date') + + elif f == 'client': + client = django_filters.ModelChoiceFilter(label=u'По контрагенту', queryset=Client.objects.get_all(user), + empty_label=u'все контрагенты') + attrs['client'] = client + fields.append('client') + + elif f == 'invoice': + invoice = django_filters.ModelChoiceFilter(label=u'По счёту', queryset=Invoice.objects.get_all(user), + empty_label=u'все счета') + attrs['invoice'] = invoice + fields.append('invoice') + + elif f == 'closed_status': + closed_status = django_filters.ChoiceFilter(label=u'По закр. документам', choices=closed_status_choices, + widget=django_filters.widgets.LinkWidget) + attrs['closed_status'] = closed_status + fields.append('closed_status') + + elif f == 'paid_status': + paid_status = django_filters.ChoiceFilter(label=u'По оплате', choices=paid_status_choices, + widget=django_filters.widgets.LinkWidget) + attrs['paid_status'] = paid_status + fields.append('paid_status') + + elif f == 'signed_status': + signed_status = django_filters.ChoiceFilter(label=u'По приёмке', choices=signed_status_choices, + widget=django_filters.widgets.LinkWidget) + attrs['signed_status'] = signed_status + fields.append('signed_status') + + elif f == 'total_saldo': + total_saldo = CustomChoiceFilter(label=u'По сальдо', options=total_saldo_choices, + widget=django_filters.widgets.LinkWidget) + attrs['total_saldo'] = total_saldo + fields.append('total_saldo') + + elif f == 'platej_type': + platej_type = django_filters.ChoiceFilter(label=u'По типу', choices=platej_type_choices, + widget=django_filters.widgets.LinkWidget) + attrs['platej_type'] = platej_type + fields.append('platej_type') + + else: + raise NotImplementedError(u'Unknown field: "%s".' % f) + + model_name = model.__name__.lower() + klass = type(model_name+'FilterSet', (_BaseFilterSet,), attrs) + klass.Meta.model = model + klass.Meta.fields = fields# + _BaseFilterSet.Meta.fields + return klass diff --git a/project/docs/forms/__init__.py b/project/docs/forms/__init__.py new file mode 100644 index 0000000..1b0822b --- /dev/null +++ b/project/docs/forms/__init__.py @@ -0,0 +1,8 @@ +from .email import EmailForm + +from .invoice import InvoiceForm, InvoiceAdminForm, InvoiceItemForm, InvoiceItemAdminForm, InvoicesListForm +from .aktrabot import AktRabotForm, AktRabotAdminForm, AktRabotItemForm, AktRabotItemAdminForm +from .aktsverki import AktSverkiForm, AktSverkiAdminForm, AktSverkiItemForm, AktSverkiItemAdminForm +from .dover import DoverForm, DoverAdminForm, DoverItemForm, DoverItemAdminForm +from .platejka import PlatejkaForm, PlatejkaAdminForm +from .nakladn import NakladnForm, NakladnAdminForm, NakladnItemForm, NakladnItemAdminForm diff --git a/project/docs/forms/aktrabot.py b/project/docs/forms/aktrabot.py new file mode 100644 index 0000000..6527ffe --- /dev/null +++ b/project/docs/forms/aktrabot.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +from django import forms + +from project.commons.forms import MyBaseModelForm + +from .base_forms import BaseModelForm +from ..models import AktRabot, AktRabotItem + + +class AktRabotForm(BaseModelForm): + """Форма редактирования акта выполн. работ.""" + class Meta: + model = AktRabot + fields = ('doc_num', 'doc_date', + 'bank_account', 'client', 'invoice', + 'nds_type', 'nds_value', + 'doc_text', + ) + _radioselect = forms.RadioSelect + _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) + widgets = { + 'nds_type': _radioselect, + 'doc_text': _textarea, + } + + +class AktRabotAdminForm(AktRabotForm): + """Форма редактирования акта выполн. работ - для админки.""" + class Meta(AktRabotForm.Meta): + fields = None + _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) + widgets = { + 'doc_text': _textarea, + } + + def __init__(self, *args, **kwargs): + # обязательно нужно вызывать родительский __init__ и передавать ему None вместо user - иначе глюки ! + super(AktRabotAdminForm, self).__init__(None, *args, **kwargs) + + +class AktRabotItemForm(MyBaseModelForm): + """Форма редактирования табличной части акта выполн. работ.""" + class Meta: + model = AktRabotItem + exclude = ['parent'] + + +class AktRabotItemAdminForm(AktRabotItemForm): + """Форма редактирования табличной части акта выполн. работ - для админки.""" + class Meta(AktRabotItemForm.Meta): + exclude = None diff --git a/project/docs/forms/aktsverki.py b/project/docs/forms/aktsverki.py new file mode 100644 index 0000000..084ca47 --- /dev/null +++ b/project/docs/forms/aktsverki.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +from django import forms + +from project.commons.forms import MyBaseModelForm + +from .base_forms import BaseModelForm +from ..models import AktSverki, AktSverkiItem + + +class AktSverkiForm(BaseModelForm): + """Форма редактирования акта сверки.""" + change_labels = { + 'doc_date': u'Дата выдачи', + 'start_date': u'Период', + 'end_date': u'', + } + + class Meta: + model = AktSverki + fields = ('doc_num', 'doc_date', + 'doc_mesto', + 'client', + # период + 'start_date', 'end_date', + # входящее сальдо + 'saldo_debit', 'saldo_credit', + ) + + def __init__(self, user, *args, **kwargs): + super(AktSverkiForm, self).__init__(user, *args, **kwargs) + f = self.fields + f['start_date'].widget.attrs['class'] = 'has-datepicker' + f['end_date'].widget.attrs['class'] = 'has-datepicker' + + +class AktSverkiAdminForm(AktSverkiForm): + """Форма редактирования акта сверки - для админки.""" + change_labels = { + 'doc_date': u'Дата выдачи', + } + + class Meta(AktSverkiForm.Meta): + fields = None + + def __init__(self, *args, **kwargs): + # обязательно нужно вызывать родительский __init__ и передавать ему None вместо user - иначе глюки ! + super(AktSverkiAdminForm, self).__init__(None, *args, **kwargs) + + +class AktSverkiItemForm(MyBaseModelForm): + """Форма редактирования табличной части акта сверки.""" + class Meta: + model = AktSverkiItem + exclude = ['parent'] + + +class AktSverkiItemAdminForm(AktSverkiItemForm): + """Форма редактирования табличной части акта сверки - для админки.""" + class Meta(AktSverkiItemForm.Meta): + exclude = None diff --git a/project/docs/forms/base_forms.py b/project/docs/forms/base_forms.py new file mode 100644 index 0000000..cc5b25a --- /dev/null +++ b/project/docs/forms/base_forms.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +from project.commons.forms import MyBaseModelForm +from project.customer.models import BankAccount, Client + + +class BaseModelForm(MyBaseModelForm): + """Базовая форма редактирования модели бух. формы. + + Добавляет к классу атрибут adjust_client_fields. + Добавляет к методу __init__ обязательный атрибут user. + """ + + # Список полей, у которых нужно настроить выборку контрагентов так, чтобы попадали __только__ контрагенты данного + # пользователя. Если же пользователь никак не был задан - селекты будут пустыми! Если в форме есть поле client, + # то оно настраивается автоматически. + adjust_client_fields = [] + + def __init__(self, user, *args, **kwargs): + super(BaseModelForm, self).__init__(*args, **kwargs) + + self._user = user + # Если передали user=None, то попробовать взять user из kwargs['instance'], а потом из self.data + if not self._user: + try: + self._user = getattr(kwargs.get('instance'), 'user') + except AttributeError: + self._user = self.data.get('user', user) + + f = self.fields + + # Настроить атрибуты виджетов + # TODO вынести в _MySuperForm (сделать там настройку полей с datepicker-ами из словаря) + f['doc_date'].widget.attrs['class'] = 'has-datepicker' + + # Если в форме есть поле bank_account, настроить связь с BankAccount: чтобы можно было выбрать __только__ + # расчетные счета данного пользователя. Также убрать пустой вариант из селекта. + if 'bank_account' in f: + user_accounts = BankAccount.objects.get_all(self._user) + f['bank_account'].queryset = user_accounts + f['bank_account'].empty_label = None + + # Если в форме есть поле client, настроить связь с Client: чтобы можно было выбрать __только__ + # контрагентов данного пользователя. + if 'client' in f: + user_clients = Client.objects.filter(user=self._user) + f['client'].queryset = user_clients + + # Настроить связь других полей с контрагентами. + self._adjust_clients() + + def _adjust_clients(self): + """Настраивает перечисленные в self.adjust_client_fields поля на модель Client.""" + if self.adjust_client_fields: + user_clients = Client.objects.filter(user=self._user) + for key in self.adjust_client_fields: + self.fields[key].queryset = user_clients diff --git a/project/docs/forms/dover.py b/project/docs/forms/dover.py new file mode 100644 index 0000000..8bbc76c --- /dev/null +++ b/project/docs/forms/dover.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +from django import forms + +from project.commons.forms import MyBaseModelForm + +from .base_forms import BaseModelForm +from ..models import Dover, DoverItem + + +class DoverForm(BaseModelForm): + """Форма редактирования доверенности на получение ТМЦ.""" + change_labels = { + 'doc_date': u'Дата выдачи', + } + + class Meta: + model = Dover + fields = ('doc_num', 'doc_date', 'doc_expire_date', + 'client', + # на получение мат.ценностей по документу + 'dover_doc', 'dover_doc_date', + # кому выдана и его документы + 'dover_name', 'dover_passport_ser', 'dover_passport_num', 'dover_passport_org', 'dover_passport_date', + ) + + def __init__(self, user, *args, **kwargs): + super(DoverForm, self).__init__(user, *args, **kwargs) + f = self.fields + f['doc_expire_date'].widget.attrs['class'] = 'has-datepicker' + f['dover_doc_date'].widget.attrs['class'] = 'has-datepicker' + f['dover_passport_date'].widget.attrs['class'] = 'has-datepicker' + + +class DoverAdminForm(DoverForm): + """Форма редактирования доверенности на получение ТМЦ - для админки.""" + class Meta(DoverForm.Meta): + fields = None + + def __init__(self, *args, **kwargs): + # обязательно нужно вызывать родительский __init__ и передавать ему None вместо user - иначе глюки ! + super(DoverAdminForm, self).__init__(None, *args, **kwargs) + + +class DoverItemForm(MyBaseModelForm): + """Форма редактирования табличной части доверенности на получение ТМЦ.""" + class Meta: + model = DoverItem + exclude = ['parent'] + + +class DoverItemAdminForm(DoverItemForm): + """Форма редактирования табличной части доверенности на получение ТМЦ - для админки.""" + class Meta(DoverItemForm.Meta): + exclude = None diff --git a/project/docs/forms/email.py b/project/docs/forms/email.py new file mode 100644 index 0000000..0c5fca2 --- /dev/null +++ b/project/docs/forms/email.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from django import forms + + +DOC_FORMATS = ( + (u'pdf', u'PDF'), + (u'xls', u'Excel'), +) + + +class EmailForm(forms.Form): + """Форма отправки документа по email.""" + to = forms.EmailField(label=u'E-mail получателя') + body = forms.CharField(label=u'Текст сообщения', max_length=1000, required=False, + widget=forms.Textarea(attrs={'cols': 80, 'rows': 3})) + doc_format = forms.ChoiceField(label=u'Отправить как', choices=DOC_FORMATS, initial=DOC_FORMATS[0][0], + widget=forms.RadioSelect()) + save_client_email = forms.BooleanField(label=u'Сохранить этот e-mail в анкете контрагента', initial=False, + required=False) diff --git a/project/docs/forms/invoice.py b/project/docs/forms/invoice.py new file mode 100644 index 0000000..3f29a5b --- /dev/null +++ b/project/docs/forms/invoice.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +from django import forms + +from project.commons.forms import MyBaseModelForm + +from .base_forms import BaseModelForm +from ..models import Invoice, InvoiceItem + + +class InvoiceForm(BaseModelForm): + """Форма редактирования счета.""" + class Meta: + model = Invoice + fields = ('doc_num', 'doc_date', + 'bank_account', 'client', + 'nds_type', 'nds_value', + 'doc_text', + ) + _radioselect = forms.RadioSelect + _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) + widgets = { + 'nds_type': _radioselect, + 'doc_text': _textarea, + } + + +class InvoiceAdminForm(InvoiceForm): + """Форма редактирования счета - для админки.""" + class Meta(InvoiceForm.Meta): + fields = None + _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) + widgets = { + 'doc_text': _textarea, + } + + def __init__(self, *args, **kwargs): + # обязательно нужно вызывать родительский __init__ и передавать ему None вместо user - иначе глюки ! + super(InvoiceAdminForm, self).__init__(None, *args, **kwargs) + + +class InvoicesListForm(forms.Form): + """Форма со списком всех счетов пользователя.""" + invoice = forms.ModelChoiceField(queryset=Invoice.objects.get_all(None), empty_label=u'все счета', required=False) + + def __init__(self, user, *args, **kwargs): + super(InvoicesListForm, self).__init__(*args, **kwargs) + self.fields['invoice'].queryset = Invoice.objects.get_all(user) + + +class InvoiceItemForm(MyBaseModelForm): + """Форма редактирования табличной части счета.""" + class Meta: + model = InvoiceItem + exclude = ['parent'] + + +class InvoiceItemAdminForm(InvoiceItemForm): + """Форма редактирования табличной части счета - для админки.""" + class Meta(InvoiceItemForm.Meta): + exclude = None diff --git a/project/docs/forms/nakladn.py b/project/docs/forms/nakladn.py new file mode 100644 index 0000000..e20ee6b --- /dev/null +++ b/project/docs/forms/nakladn.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +from django import forms + +from project.commons.forms import MyBaseModelForm + +from .base_forms import BaseModelForm +from ..models import Nakladn, NakladnItem + + +class NakladnForm(BaseModelForm): + """Форма редактирования накладной.""" + class Meta: + model = Nakladn + fields = ('doc_num', 'doc_date', + 'bank_account', 'client', 'invoice', + 'doc_reason', + 'nds_type', 'nds_value', + 'doc_text', + ) + _radioselect = forms.RadioSelect + _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) + widgets = { + 'nds_type': _radioselect, + 'doc_text': _textarea, + } + + +class NakladnAdminForm(NakladnForm): + """Форма редактирования накладной - для админки.""" + class Meta(NakladnForm.Meta): + fields = None + _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 3}) + widgets = { + 'doc_text': _textarea, + } + + def __init__(self, *args, **kwargs): + # обязательно нужно вызывать родительский __init__ и передавать ему None вместо user - иначе глюки ! + super(NakladnAdminForm, self).__init__(None, *args, **kwargs) + + +class NakladnItemForm(MyBaseModelForm): + """Форма редактирования табличной части накладной.""" + class Meta: + model = NakladnItem + exclude = ['parent'] + + +class NakladnItemAdminForm(NakladnItemForm): + """Форма редактирования табличной части накладной - для админки.""" + class Meta(NakladnItemForm.Meta): + exclude = None diff --git a/project/docs/forms/platejka.py b/project/docs/forms/platejka.py new file mode 100644 index 0000000..d25619e --- /dev/null +++ b/project/docs/forms/platejka.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +from django import forms + +from project.commons.forms import set_field_error + +from .base_forms import BaseModelForm +from ..models import Platejka +from .. import consts + + +class PlatejkaForm(BaseModelForm): + """Форма редактирования платежного поручения.""" + conditional_fields = ['nds_type', 'nds_value', + 'tax_status', 'tax_base', 'tax_type', 'tax_bk', 'tax_okato', 'tax_period',] + + class Meta: + model = Platejka + fields = ('platej_type', 'doc_num', 'doc_date', + 'bank_account', 'client', + 'nds_type', 'nds_value', # поля только для перевода денег + # поля только для оплаты налогов + 'tax_status', 'tax_base', 'tax_type', 'tax_num', 'tax_date', 'tax_bk', 'tax_okato', 'tax_period', + # опять общие поля + 'doc_total', 'payment_type', 'payment_order', 'doc_info', + ) + _radioselect = forms.RadioSelect + _textarea = forms.Textarea(attrs={'cols': 80, 'rows': 5}) + widgets = { + #'platej_type': _radioselect, + 'nds_type': _radioselect, + 'doc_info': _textarea, + } + + def __init__(self, user, *args, **kwargs): + super(PlatejkaForm, self).__init__(user, *args, **kwargs) + f = self.fields + f['tax_date'].widget.attrs['class'] = 'has-datepicker' + + def clean(self): + super(PlatejkaForm, self).clean() + + cleaned_data = self.cleaned_data + + # поля становятся обязательными в зависимости от того, какой тип платежки выбран + platej_type = cleaned_data.get('platej_type') + + if platej_type == consts.PLATEJ_TYPE_COMMERCE: # коммерческое (перевод денег) + nds_type = cleaned_data.get('nds_type') + nds_value = cleaned_data.get('nds_value') + + if not nds_type: set_field_error(self, 'nds_type') + if not nds_value: set_field_error(self, 'nds_value') + + elif platej_type == consts.PLATEJ_TYPE_TAX: # налоги + tax_status = cleaned_data.get('tax_status') + tax_base = cleaned_data.get('tax_base') + tax_type = cleaned_data.get('tax_type') + tax_bk = cleaned_data.get('tax_bk') + tax_okato = cleaned_data.get('tax_okato') + tax_period = cleaned_data.get('tax_period') + + if not tax_status: set_field_error(self, 'tax_status') + if not tax_base: set_field_error(self, 'tax_base') + if not tax_type: set_field_error(self, 'tax_type') + if not tax_bk: set_field_error(self, 'tax_bk') + if not tax_okato: set_field_error(self, 'tax_okato') + if not tax_period: set_field_error(self, 'tax_period') + + return cleaned_data + + +class PlatejkaAdminForm(PlatejkaForm): + """Форма редактирования платежного поручения - для админки.""" + class Meta(PlatejkaForm.Meta): + fields = None + widgets = { + 'doc_info': forms.Textarea(attrs={'cols': 80, 'rows': 5}), + } + + def __init__(self, *args, **kwargs): + # обязательно нужно вызывать родительский __init__ и передавать ему None вместо user - иначе глюки ! + super(PlatejkaAdminForm, self).__init__(None, *args, **kwargs) diff --git a/project/docs/models/__init__.py b/project/docs/models/__init__.py new file mode 100644 index 0000000..4d82639 --- /dev/null +++ b/project/docs/models/__init__.py @@ -0,0 +1,6 @@ +from .invoice import Invoice, InvoiceItem +from .aktrabot import AktRabot, AktRabotItem +from .aktsverki import AktSverki, AktSverkiItem +from .dover import Dover, DoverItem +from .platejka import Platejka +from .nakladn import Nakladn, NakladnItem diff --git a/project/docs/models/aktrabot.py b/project/docs/models/aktrabot.py new file mode 100644 index 0000000..b524382 --- /dev/null +++ b/project/docs/models/aktrabot.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from django.db import models + +from .base_models import BaseInvoiceModel, BaseItemInvoiceModel +from .mixins import SignedStatusFieldMixin, InvoiceFieldMixin + + +class AktRabot(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin): + """Акт выполн. работ.""" + class Meta(BaseInvoiceModel.Meta): + verbose_name = u'Акт выполн. работ' + verbose_name_plural = u'Акты выполн. работ' + + +class AktRabotItem(BaseItemInvoiceModel): + """Табличная часть акта выполн. работ.""" + parent = models.ForeignKey(AktRabot, related_name='aktrabot_items') + + class Meta(BaseItemInvoiceModel.Meta): + verbose_name = u'Табл. часть акта выполн. работ' + verbose_name_plural = u'Табл. части актов выполн. работ' diff --git a/project/docs/models/aktsverki.py b/project/docs/models/aktsverki.py new file mode 100644 index 0000000..0ca34cf --- /dev/null +++ b/project/docs/models/aktsverki.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +from decimal import Decimal + +from django.db import models + +from .base_models import BaseModel, VeryBaseModel +from .mixins import SignedStatusFieldMixin + + +class AktSverki(BaseModel, SignedStatusFieldMixin): + """Акт сверки.""" + doc_mesto = models.CharField(u'Место подписания', max_length=256, help_text=u'(Например, г. Москва)') + # период + start_date = models.DateField('С') + end_date = models.DateField('По') + # входящее сальдо + saldo_debit = models.DecimalField(u'Дебетовое', max_digits=10, decimal_places=2, blank=True) # , default=Decimal('0.00')) + saldo_credit = models.DecimalField(u'Кредитовое', max_digits=10, decimal_places=2, blank=True) # , default=Decimal('0.00')) + + # вычисляемые поля - обновляются при сохранении записей табличной части + total_debit = models.DecimalField(u'Общее дебетовое сальдо', max_digits=10, decimal_places=2, blank=True, + default=Decimal('0.00')) + total_credit = models.DecimalField(u'Общее кредитовое сальдо', max_digits=10, decimal_places=2, blank=True, + default=Decimal('0.00')) + total_saldo = models.DecimalField(u'Итоговое сальдо', max_digits=10, decimal_places=2, blank=True, + default=Decimal('0.00')) + + class Meta(BaseModel.Meta): + verbose_name = u'Акт сверки' + verbose_name_plural = u'Акты сверки' + + def save(self, *args, **kwargs): + if not self.saldo_debit: self.saldo_debit = 0 + if not self.saldo_credit: self.saldo_credit = 0 + super(AktSverki, self).save(*args, **kwargs) + + +class AktSverkiItem(VeryBaseModel): + """Табличная часть акта сверки.""" + parent = models.ForeignKey(AktSverki, related_name='aktsverki_items') + + name = models.CharField(u'Наименование операции, документы', max_length=256) + debit = models.DecimalField(u'Дебет', max_digits=10, decimal_places=2, blank=True) + credit = models.DecimalField(u'Кредит', max_digits=10, decimal_places=2, blank=True) + + class Meta(VeryBaseModel.Meta): + verbose_name = u'Табл. часть акта сверки' + verbose_name_plural = u'Табл. части актов сверки' + ordering = ('created_at',) + + def save(self, *args, **kwargs): + if not self.debit: self.debit = 0 + if not self.credit: self.credit = 0 + super(AktSverkiItem, self).save(*args, **kwargs) diff --git a/project/docs/models/base_models.py b/project/docs/models/base_models.py new file mode 100644 index 0000000..21aa020 --- /dev/null +++ b/project/docs/models/base_models.py @@ -0,0 +1,100 @@ +# -*- coding: utf-8 -*- +from django.db import models +from django.contrib.auth.models import User + +from project.customer.models import Client, BankAccount + +from . import managers +from .. import consts + + +class VeryBaseModel(models.Model): + """Очень базовая абстрактная модель.""" + created_at = models.DateTimeField(u'Создан', auto_now_add=True) + updated_at = models.DateTimeField(u'Изменен', auto_now=True) + + class Meta: + abstract = True + app_label = 'docs' + ordering = ('-created_at',) + get_latest_by = 'created_at' + +# ----------------------------------------------------------------------------- + +class BaseModel(VeryBaseModel): + """Абстрактная модель бух.формы.""" + user = models.ForeignKey(User, related_name='+', verbose_name=u'Пользователь') + + doc_num = models.PositiveIntegerField(u'Номер') + doc_date = models.DateField('Дата создания') + + client = models.ForeignKey(Client, related_name='+', verbose_name=u'Контрагент') + + objects = managers.BaseModelManager() + + class Meta(VeryBaseModel.Meta): + abstract = True + ordering = ('-doc_date',) + + def __unicode__(self): + return u'%s № %s от %s' % (self._meta.verbose_name or '', self.doc_num, self.doc_date) + + +class BaseNdsModel(BaseModel): + """Расширение абстрактной модели бух.формы - НДС. + Доп. поля под тип и ставку НДС. + """ + nds_type = models.PositiveSmallIntegerField(u'НДС', choices=consts.NDS_TYPE_CHOICES, default=consts.NDS_TYPE_NO) + nds_value = models.PositiveSmallIntegerField(u'Ставка НДС', choices=consts.NDS_VALUE_CHOICES, default=consts.NDS_VALUE_0) + + class Meta(BaseModel.Meta): + abstract = True + + def get_nds_as_number(self): + """Значение НДС как число (без символа %).""" + return consts.NDS_VALUE_NUMERIC.get(self.nds_value, 0) + + +class BaseInvoiceModel(BaseNdsModel): + """Расширение абстрактной модели бух.формы - по типу счета. + Доп. поля под расчетный счет и дополнительные условия. + """ + bank_account = models.ForeignKey(BankAccount, related_name='+', verbose_name=u'Расчётный счёт') + doc_text = models.TextField(u'Дополнительные условия', max_length=1000, blank=True, default='') + + class Meta(BaseNdsModel.Meta): + abstract = True + +# ----------------------------------------------------------------------------- + +class BaseItemModel(VeryBaseModel): + """Абстрактная модель табличной части бух.формы.""" + name = models.CharField(u'Наименование', max_length=256) + qty = models.DecimalField(u'Кол-во', max_digits=10, decimal_places=3) + units = models.CharField(u'Ед. изм.', max_length=20) + + class Meta(VeryBaseModel.Meta): + abstract = True + ordering = ('created_at',) + + def __unicode__(self): + return u'%s, %s %s' % (self.name[:30], self.qty, self.units) + + +class BaseItemInvoiceModel(BaseItemModel): + """Расширение абстрактной модели табл. части бух.формы - по типу счета. + Доп. поля под цену и сумму. + """ + price = models.DecimalField(u'Цена', max_digits=10, decimal_places=2) + total_price = models.DecimalField(u'Сумма', max_digits=10, decimal_places=2) + + class Meta(BaseItemModel.Meta): + abstract = True + + def __unicode__(self): + curr = consts.CURRENCY_CHOICES_DICT.get(getattr(self, 'currency', consts.CURR_RUB)) + return u'%s, %s %s * %s = %s %s' % (self.name[:30], self.qty, self.units, self.price, self.total_price, curr) + + def save(self, *args, **kwargs): + self.total_price = self.price * self.qty # пересчитать сумму + super(BaseItemInvoiceModel, self).save(*args, **kwargs) diff --git a/project/docs/models/dover.py b/project/docs/models/dover.py new file mode 100644 index 0000000..3dd4046 --- /dev/null +++ b/project/docs/models/dover.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +from django.db import models + +from .base_models import BaseModel, VeryBaseModel + + +class Dover(BaseModel): + """Доверенность на получение ТМЦ.""" + doc_expire_date = models.DateField(u'Срок действия') + + # на получение мат.ценностей по документу + dover_doc = models.CharField(u'По документу №', max_length=256) + dover_doc_date = models.DateField(u'Дата документа') + + # кому выдана и его документы + dover_name = models.CharField(u'Должность, ФИО', max_length=256, help_text=u'Полностью в дат. падеже.') + dover_passport_ser = models.CharField(u'Серия', max_length=10) + dover_passport_num = models.CharField(u'Номер', max_length=10) + dover_passport_org = models.CharField(u'Кем выдан', max_length=256) + dover_passport_date = models.DateField(u'Дата выдачи') + + class Meta(BaseModel.Meta): + verbose_name = u'Доверенность на получ. ТМЦ' + verbose_name_plural = u'Доверенности на получ. ТМЦ' + + +class DoverItem(VeryBaseModel): + """Табличная часть доверенности на получение ТМЦ.""" + parent = models.ForeignKey(Dover, related_name='dover_items') + + name = models.CharField(u'Наименование', max_length=256) + qty = models.PositiveIntegerField(u'Количество') + units = models.CharField(u'Ед. измерения', max_length=20) + + class Meta(VeryBaseModel.Meta): + verbose_name = u'Табл. часть доверенности' + verbose_name_plural = u'Табл. части доверенностей' + #app_label = 'docs' + ordering = ('created_at',) + + def __unicode__(self): + return u'%s, %s %s' % (self.name[:30], self.qty, self.units) diff --git a/project/docs/models/invoice.py b/project/docs/models/invoice.py new file mode 100644 index 0000000..80b01be --- /dev/null +++ b/project/docs/models/invoice.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from django.db import models + +from .base_models import BaseInvoiceModel, BaseItemInvoiceModel +from .. import consts + + +class Invoice(BaseInvoiceModel): + """Счет.""" + UNPAID = 1 + PARTLY_PAID = 2 + PAID = 3 + + PAID_CHOICES = ( + (UNPAID, u'Нет'), + (PARTLY_PAID, u'Частично'), + (PAID, u'Да'), + ) + + paid_status = models.PositiveSmallIntegerField(u'Оплачен?', choices=PAID_CHOICES, default=UNPAID) + closed_status = models.BooleanField(u'Закрыт?', choices=consts.BOOL_CHOICES, default=False) + + class Meta(BaseInvoiceModel.Meta): + verbose_name = u'Счёт' + verbose_name_plural = u'Счета' + + +class InvoiceItem(BaseItemInvoiceModel): + """Табличная часть счета.""" + parent = models.ForeignKey(Invoice, related_name='invoice_items') + + class Meta(BaseItemInvoiceModel.Meta): + verbose_name = u'Табл. часть счета' + verbose_name_plural = u'Табл. части счетов' diff --git a/project/docs/models/managers.py b/project/docs/models/managers.py new file mode 100644 index 0000000..59f91a8 --- /dev/null +++ b/project/docs/models/managers.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from django.db import models + + +class BaseModelManager(models.Manager): + def get_all(self, user): + """Возвращает все документы данного типа заданного пользователя.""" + return self.filter(user=user) + + def get_last_doc_num(self, user): + """Возвращает номер самого последнего сохраненного юзером документа данного типа, + или None, если таких документов еще нет.""" + try: + return self.filter(user=user).order_by('-created_at')[0].doc_num + except IndexError: + return None + + def get_max_doc_num(self, user): + """Возвращает максимальный номер когда-либо сохраненного юзером документа данного типа, + или None, если таких документов еще нет.""" + try: + return self.filter(user=user).order_by('-doc_num')[0].doc_num + except IndexError: + return None diff --git a/project/docs/models/mixins.py b/project/docs/models/mixins.py new file mode 100644 index 0000000..964df8b --- /dev/null +++ b/project/docs/models/mixins.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from django.db import models + +from .invoice import Invoice +from .. import consts + + +class SignedStatusFieldMixin(models.Model): + """Mixin: добавляет поле `Подписан?`""" + signed_status = models.BooleanField(u'Подписан?', choices=consts.BOOL_CHOICES, default=False) + + class Meta: + abstract = True + + +class InvoiceFieldMixin(models.Model): + """Mixin: добавляет FK поле `Создать по счёту`""" + invoice = models.ForeignKey(Invoice, related_name='+', verbose_name=u'Создать по счёту', blank=True, null=True, + default=None) + + class Meta: + abstract = True diff --git a/project/docs/models/nakladn.py b/project/docs/models/nakladn.py new file mode 100644 index 0000000..9f5eba8 --- /dev/null +++ b/project/docs/models/nakladn.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +from django.db import models + +from .base_models import BaseInvoiceModel, BaseItemInvoiceModel +from .mixins import SignedStatusFieldMixin, InvoiceFieldMixin + + +class Nakladn(BaseInvoiceModel, SignedStatusFieldMixin, InvoiceFieldMixin): + """Накладная торг12.""" + doc_reason = models.CharField(u'Основание', max_length=256, blank=True, default='') + + class Meta(BaseInvoiceModel.Meta): + verbose_name = u'Накладная' + verbose_name_plural = u'Накладные' + + +class NakladnItem(BaseItemInvoiceModel): + """Табличная часть накладной торг12.""" + parent = models.ForeignKey(Nakladn, related_name='nakladn_items') + + class Meta(BaseItemInvoiceModel.Meta): + verbose_name = u'Табл. часть накладной' + verbose_name_plural = u'Табл. части накладных' diff --git a/project/docs/models/platejka.py b/project/docs/models/platejka.py new file mode 100644 index 0000000..e18cf29 --- /dev/null +++ b/project/docs/models/platejka.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +from django.db import models + +from project.customer.models import BankAccount + +from .base_models import BaseModel +from .. import consts + + +class Platejka(BaseModel): + """Платёжное поручение.""" + platej_type = models.PositiveSmallIntegerField(u'Тип платёжного поручения', choices=consts.PLATEJ_TYPE_CHOICES, + default=consts.PLATEJ_TYPE_COMMERCE) + + bank_account = models.ForeignKey(BankAccount, related_name='+', verbose_name=u'Расчётный счёт') + + doc_total = models.DecimalField(u'Сумма', max_digits=10, decimal_places=2) + payment_type = models.PositiveSmallIntegerField(u'Вид платежа', choices=consts.PAYMENT_TYPE_CHOICES, + default=consts.PAYMENT_TYPE_CHOICES[0][0]) + payment_order = models.CharField(u'Очерёдность платежа', max_length=10) + doc_info = models.TextField(u'Назначение платежа', max_length=1000) + + # поля только для перевода денег (коммерческое) + nds_type = models.PositiveSmallIntegerField(u'НДС', choices=consts.NDS_TYPE_CHOICES, default=consts.NDS_TYPE_NO) + nds_value = models.PositiveSmallIntegerField(u'Ставка НДС', choices=consts.NDS_VALUE_CHOICES, default=consts.NDS_VALUE_0) + + # поля только для оплаты налогов (налоговое) + tax_status = models.CharField(u'Статус составителя', max_length=10, choices=consts.TAX_STATUS_CHOICES, + default=consts.TAX_STATUS_CHOICES[0][0]) + tax_base = models.CharField(u'Основание налогового платежа', max_length=10, choices=consts.TAX_BASE, + default=consts.TAX_BASE[0][0]) + tax_type = models.CharField(u'Тип налогового платежа', max_length=10, choices=consts.TAX_TYPE, + default=consts.TAX_TYPE[0][0]) + tax_num = models.CharField(u'Номер документа основания', max_length=50, blank=True, default='') + tax_date = models.DateField(u'Дата документа основания', blank=True, null=True) + tax_bk = models.CharField(u'Код БК доходов РФ', max_length=256) + tax_okato = models.CharField(u'Код ОКАТО сборщика платежей', max_length=256) + tax_period = models.CharField(u'Период, за который начисляется налог', max_length=256, + help_text = (u'Формат ввода периода платежей:
' + u'Месячный платёж - "МС.00.0000"
' + u'Квартальный платёж - "КВ.00.0000"
' + u'Полугодовой платёж - "ПЛ.00.0000"
' + u'Годовой платёж - "ГД.00.0000"
' + u'Платёж по дате - "дд.мм.гггг"') + ) + + class Meta(BaseModel.Meta): + verbose_name = u'Платёжное поручение' + verbose_name_plural = u'Платёжные поручения' + + # хелперы, чтоб не оборачивать в шаблонах каждое обращение к определенным полям в проверку типа платежа + + def is_commerce(self): + return self.platej_type == consts.PLATEJ_TYPE_COMMERCE + + def is_tax(self): + return self.platej_type == consts.PLATEJ_TYPE_TAX + + def get_tax_status_kod(self): + """Налоги. Статус составителя, КОД.""" + if self.platej_type == consts.PLATEJ_TYPE_TAX and self.tax_status: + return self.tax_status + return u'' + + def get_tax_base_kod(self): + """Налоги. Основание налогового платежа, КОД.""" + if self.platej_type == consts.PLATEJ_TYPE_TAX and self.tax_base: + return self.tax_base + return u'' + + def get_tax_type_kod(self): + """Налоги. Тип налогового платежа, КОД.""" + if self.platej_type == consts.PLATEJ_TYPE_TAX and self.tax_type: + return self.tax_type + return u'' + + def get_tax_num(self): + """Налоги. Номер документа основания.""" + if self.platej_type == consts.PLATEJ_TYPE_TAX and self.tax_num: + return self.tax_num + return u'' + + def get_tax_date(self): + """Налоги. Дата документа основания.""" + if self.platej_type == consts.PLATEJ_TYPE_TAX and self.tax_date: + return self.tax_date + return u'' + + def get_tax_bk(self): + """Налоги. Код БК доходов РФ.""" + if self.platej_type == consts.PLATEJ_TYPE_TAX and self.tax_bk: + return self.tax_bk + return u'' + + def get_tax_okato(self): + """Налоги. Код ОКАТО сборщика платежей.""" + if self.platej_type == consts.PLATEJ_TYPE_TAX and self.tax_okato: + return self.tax_okato + return u'' + + def get_tax_period(self): + """Налоги. Период, за который начисляется налог.""" + if self.platej_type == consts.PLATEJ_TYPE_TAX and self.tax_period: + return self.tax_period + return u'' diff --git a/project/docs/tests.py b/project/docs/tests.py new file mode 100644 index 0000000..501deb7 --- /dev/null +++ b/project/docs/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/project/docs/urls.py b/project/docs/urls.py new file mode 100644 index 0000000..c656c02 --- /dev/null +++ b/project/docs/urls.py @@ -0,0 +1,71 @@ +# -*- coding: UTF-8 -*- +from django.conf.urls import * + +from .views import (InvoiceViews, AktRabotViews, AktSverkiViews, DoverViews, PlatejkaViews, NakladnViews) +from .views import getview, index + + +urlpatterns = patterns('docs.views', + url(r'^$', index, name='docs_index'), # страница со ссылками на бух. формы +) + +klasses = [ + ('invoice', InvoiceViews), + ('aktrabot', AktRabotViews), + ('aktsverki', AktSverkiViews), + ('dover', DoverViews), + ('platejka', PlatejkaViews), + ('nakladn', NakladnViews), +] + +for name, klass in klasses: + urlpatterns += patterns('docs.views', + # список + url(r'^%s/$' % name, getview, {'klass': klass, 'oper': 'list',}, name='docs_%s_list' % name), + # список, пагинация + url(r'^%s/page/(?P[0-9]+)/$' % name, getview, {'klass': klass, 'oper': 'list',}, + name='docs_%s_list' % name), + + # добавить + url(r'^%s/add/$' % name, getview, {'klass': klass, 'oper': 'add',}, name='docs_%s_add' % name), + # редактировать + url(r'^%s/(?P\d+)/edit/$' % name, getview, {'klass': klass, 'oper': 'edit',}, + name='docs_%s_edit' % name), + # создать копию + url(r'^%s/(?P\d+)/copy/$' % name, getview, {'klass': klass, 'oper': 'copy',}, + name='docs_%s_copy' % name), + # удалить + url(r'^%s/(?P\d+)/delete/$' % name, getview, {'klass': klass, 'oper': 'delete',}, + name='docs_%s_delete' % name), + + # сохранить в pdf + url(r'^%s/(?P\d+)/pdf/$' % name, getview, {'klass': klass, 'oper': 'as_pdf',}, + name='docs_%s_pdf' % name), + # сохранить в excel + url(r'^%s/(?P\d+)/xls/$' % name, getview, {'klass': klass, 'oper': 'as_xls',}, + name='docs_%s_xls' % name), + + # отправить pdf/xls на email + url(r'^%s/(?P\d+)/email/$' % name, getview, {'klass': klass, 'oper': 'email',}, + name='docs_%s_email' % name), + + # поля документа - AJAX + url(r'^%s/(?P\d+)/get/ajax/$' % name, getview, {'klass': klass, 'oper': 'get_ajax',}, + name='docs_%s_get_ajax' % name), + # отправить pdf/xls на email - AJAX + url(r'^%s/(?P\d+)/email/ajax/$' % name, getview, {'klass': klass, 'oper': 'email_ajax',}, + name='docs_%s_email_ajax' % name), + ) + +# доп. обработчики: создать Документ по Счету +urlpatterns += patterns('docs.views', + # создать по Счету -> Акт вып. работ + url(r'^%s/add/by/invoice/(?P\d+)/$' % 'aktrabot', getview, + {'klass': AktRabotViews, 'oper': 'add_by_invoice',}, name='docs_%s_add_by_invoice' % 'aktrabot'), + # создать по Счету -> Накладную + url(r'^%s/add/by/invoice/(?P\d+)/$' % 'nakladn', getview, + {'klass': NakladnViews, 'oper': 'add_by_invoice',}, name='docs_%s_add_by_invoice' % 'nakladn'), +# # создать по Счету -> Счёт-фактуру +# url(r'^%s/add/by/invoice/(?P\d+)/$' % 'sfv', getview, {'klass': SfvViews, 'oper': 'add_by_invoice',}, +# name='docs_%s_add_by_invoice' % 'sfv'), +) diff --git a/project/docs/utils.py b/project/docs/utils.py new file mode 100644 index 0000000..8bd4e79 --- /dev/null +++ b/project/docs/utils.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +from decimal import Decimal + +from . import consts + + +def get_nds(key): + """Берет значение НДС по ключу key.""" + return consts.NDS_VALUE_NUMERIC.get(key, Decimal(0)) + + +def extract_nds(obj): + """Если НДС содержится в цене, извлекает и возвращает его.""" + nds = Decimal('0.00') + if obj.parent.nds_type == consts.NDS_TYPE_IN: # ндс в сумме, извлечь его + nds_rate = get_nds(obj.parent.nds_value)/100 + nds = obj.price * (1 - 1/(1+nds_rate)) + return nds + + +def calc_clean_price(obj): + """Считает цену без НДС.""" + return obj.price - extract_nds(obj) + + +def calc_clean_total_price(obj): + """Считает стоимость без налога.""" + return calc_clean_price(obj) * obj.qty + + +def calc_total_nds(obj): + """Считает сумму налога.""" + total_nds = Decimal('0.00') + if obj.parent.nds_type == consts.NDS_TYPE_IN: # ндс в сумме + total_nds = extract_nds(obj) * obj.qty + elif obj.parent.nds_type == consts.NDS_TYPE_OUT: # ндс сверх суммы + total_price = obj.price * obj.qty + nds_rate = get_nds(obj.parent.nds_value)/100 + total_nds = total_price * nds_rate + return total_nds + + +def calc_full_total_price(obj): + """Считает стоимость с налогом.""" + return calc_total_nds(obj) + calc_clean_total_price(obj) diff --git a/project/docs/views/__init__.py b/project/docs/views/__init__.py new file mode 100644 index 0000000..d55424b --- /dev/null +++ b/project/docs/views/__init__.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render +from django.contrib.auth.decorators import login_required +from django.http import Http404 +from django.conf import settings + +from .invoice import InvoiceViews +from .aktrabot import AktRabotViews +from .aktsverki import AktSverkiViews +from .dover import DoverViews +from .platejka import PlatejkaViews +from .nakladn import NakladnViews +#from .sfv import SfvViews + + +DEBUG = getattr(settings, 'DEBUG', False) + + +@login_required # важно!!! +def getview(request, *args, **kwargs): + try: + views = kwargs['klass'](request) # класс с вьюхами + handler = getattr(views, kwargs['oper']) # конкретная вьюха + return handler(request, *args, **kwargs) # передать управление во вьюху и вернуть ее результат + except (KeyError, AttributeError): + if DEBUG: + raise + else: + raise Http404 + + +# ----------------------------------------------------------------------------- + +@login_required +def index(request): + """Страница со ссылками на все бух.формы.""" + template_name = 'docs/index.html' + return render(request, template_name) diff --git a/project/docs/views/aktrabot.py b/project/docs/views/aktrabot.py new file mode 100644 index 0000000..8ab7806 --- /dev/null +++ b/project/docs/views/aktrabot.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +from decimal import Decimal + +from ..models import AktRabot, AktRabotItem +from ..forms import AktRabotForm, AktRabotItemForm +from .. import consts, utils + +from .base_views import BaseItemsViews +from .mixins import AddByInvoiceMethodMixin + + +class AktRabotViews(BaseItemsViews, AddByInvoiceMethodMixin): + """Views для актов выполн. работ.""" + + MODEL = AktRabot # модель документа + FORM_CLASS = AktRabotForm # форма документа + + ITEM_MODEL = AktRabotItem # модель табличной части документа + ITEM_FORM_CLASS = AktRabotItemForm # форма табличной части документа + ITEM_FORM_PREFIX = 'aktrabot_items' # префикс формы табличной части + + # поля, по которым можно фильтровать список документов + # должны поддерживаться в docs.filters.build_filterset_class ! + FILTER_FIELDS = ('signed_status', 'client', 'invoice', 'doc_date',) + + # по какому полю суммировать табличную часть документа при показе списком + LIST_SUM_FIELD = 'aktrabot_items__total_price' + + # префикс именованных урлов этого типа документов, для передачи в шаблон + URL_PREFIX = 'docs_aktrabot_' + + # именованные урлы операций + URL_LIST = 'docs_aktrabot_list' + URL_EDIT = 'docs_aktrabot_edit' + + # пути к шаблонам + TEMPLATE_LIST = 'docs/aktrabot/list.html' + TEMPLATE_FORM = 'docs/aktrabot/form.html' + + # для генерации pdf/xls + PDF_TEMPLATE = 'docs/aktrabot/as_pdf.html' + XLS_TEMPLATE = 'aktrabot.xls' + FILENAME = u'Акт выполненных работ № %s, %s' # без расширения + + # --- грамматика для вывода наименований в шаблонах + PADEJI = { + 'imenit': u'акт выполненных работ', # кто? что? + 'rodit': u'акта выполненных работ', # кого? чего? + 'dateln': u'акту выполненных работ', # кому? чему? + 'vinit': u'акт выполненных работ', # кого? что? + 'tvorit': u'актом выполненных работ', # кем? чем? + 'predlojn': u'акте выполненных работ', # о ком? о чём? + } + + PADEJI_MNOJ = { + 'imenit': u'акты выполненных работ', # кто? что? + 'rodit': u'актов выполненных работ', # кого? чего? + 'dateln': u'актам выполненных работ', # кому? чему? + 'vinit': u'акты выполненных работ', # кого? что? + 'tvorit': u'актами выполненных работ', # кем? чем? + 'predlojn': u'актах выполненных работ', # о ком? о чём? + } + + def prepare(self, obj, obj_items, export_to=None): + """Изменить/подмешать дополнительные поля к документу.""" + obj.sum_total_price = Decimal('0.00') + obj.sum_total_nds = Decimal('0.00') + obj.sum_full_total_price = Decimal('0.00') + for item in obj_items: + obj.sum_total_price += item.total_price + obj.sum_total_nds += utils.calc_total_nds(item) + obj.sum_full_total_price += utils.calc_full_total_price(item) + + if obj.nds_type == consts.NDS_TYPE_NO: # не учитывать ндс + s = u'Без налога (НДС)' + elif obj.nds_type == consts.NDS_TYPE_IN: # ндс в сумме + s = u'В том числе НДС (%s)' % obj.get_nds_value_display() + elif obj.nds_type == consts.NDS_TYPE_OUT: # ндс сверх суммы + s = u'Итого НДС (%s)' % obj.get_nds_value_display() + else: + s = u'' + obj.nds_itogo_text = s diff --git a/project/docs/views/aktsverki.py b/project/docs/views/aktsverki.py new file mode 100644 index 0000000..94c2f30 --- /dev/null +++ b/project/docs/views/aktsverki.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +from decimal import Decimal + +from project.customer.forms import ClientsListForm + +from ..models import AktSverki, AktSverkiItem +from ..forms import AktSverkiForm, AktSverkiItemForm + +from .base_views import BaseItemsViews + + +class AktSverkiViews(BaseItemsViews): + """Views для актов сверки.""" + + MODEL = AktSverki # модель документа + FORM_CLASS = AktSverkiForm # форма документа + + ITEM_MODEL = AktSverkiItem # модель табличной части документа + ITEM_FORM_CLASS = AktSverkiItemForm # форма табличной части документа + ITEM_FORM_PREFIX = 'aktsverki_items' # префикс формы табличной части + + # поля, по которым можно сортировать список документов + ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name',) + + # поля, по которым можно фильтровать список документов + # должны поддерживаться в docs.filters.build_filterset_class ! + FILTER_FIELDS = ('signed_status', 'client', 'total_saldo', 'doc_date',) + + # префикс именованных урлов этого типа документов, для передачи в шаблон + URL_PREFIX = 'docs_aktsverki_' + + # именованные урлы операций + URL_LIST = 'docs_aktsverki_list' + URL_EDIT = 'docs_aktsverki_edit' + + # пути к шаблонам + TEMPLATE_LIST = 'docs/aktsverki/list.html' + TEMPLATE_FORM = 'docs/aktsverki/form.html' + + # для генерации pdf/xls + PDF_TEMPLATE = 'docs/aktsverki/as_pdf.html' + XLS_TEMPLATE = 'aktsverki.xls' + FILENAME = u'Акт сверки № %s, %s' # без расширения + + # --- грамматика для вывода наименований в шаблонах + PADEJI = { + 'imenit': u'акт сверки', # кто? что? + 'rodit': u'акта сверки', # кого? чего? + 'dateln': u'акту сверки', # кому? чему? + 'vinit': u'акт сверки', # кого? что? + 'tvorit': u'актом сверки', # кем? чем? + 'predlojn': u'акте сверки', # о ком? о чём? + } + + PADEJI_MNOJ = { + 'imenit': u'акты сверки', # кто? что? + 'rodit': u'актов сверки', # кого? чего? + 'dateln': u'актам сверки', # кому? чему? + 'vinit': u'акты сверки', # кого? что? + 'tvorit': u'актами сверки', # кем? чем? + 'predlojn': u'актах сверки', # о ком? о чём? + } + + def update_list_dict(self, dictionary): + """Здесь можно изменить словарь параметров перед передачей его в шаблон вывода списка документов.""" + dictionary['clients_form'] = ClientsListForm(self.request.user) + + def update_parent_on_items_save(self, obj, obj_items): + """Обновить родительскую модель.""" + # пересчет общего кредитового/дебетового и итогового сальдо + total_credit = Decimal('0.00') + total_debit = Decimal('0.00') + for item in obj_items: + total_credit += item.credit + total_debit += item.debit + obj.total_credit = total_credit + obj.total_debit = total_debit + # самое важное, итоговое сальдо - прежде всего, нужно для фильтрации + obj.total_saldo = (obj.saldo_credit + total_credit) - (obj.saldo_debit + total_debit) + obj.save() + + def prepare(self, obj, obj_items, export_to=None): + """Изменить/подмешать дополнительные поля к документу.""" + obj.sum_debit = obj.saldo_debit + obj.sum_credit = obj.saldo_credit + for item in obj_items: + obj.sum_debit += item.debit + obj.sum_credit += item.credit + + if obj.sum_debit == obj.sum_credit: # нет задолженности + obj.sum_debit = obj.sum_credit = 0 + elif obj.sum_debit > obj.sum_credit: # задолженность нам + obj.sum_debit -= obj.sum_credit + obj.sum_credit = 0 + elif obj.sum_debit < obj.sum_credit: # задолженность контрагенту + obj.sum_credit -= obj.sum_debit + obj.sum_debit = 0 diff --git a/project/docs/views/base_views.py b/project/docs/views/base_views.py new file mode 100644 index 0000000..b8d3f3c --- /dev/null +++ b/project/docs/views/base_views.py @@ -0,0 +1,718 @@ +# -*- coding: utf-8 -*- +from datetime import datetime +from email.header import Header +from time import time +import simplejson as json + +from django.shortcuts import render, get_object_or_404, redirect +from django.http import HttpResponseServerError, HttpResponseBadRequest, HttpResponse +from django.utils.decorators import method_decorator +from django.views.decorators.http import require_POST +from django.views.decorators.csrf import csrf_protect +from django.db.models import Sum +from django.forms.models import inlineformset_factory, model_to_dict +from django.template.loader import render_to_string +from django.core.mail import EmailMessage +from django.utils.encoding import smart_str +from django.conf import settings + +from project.commons.utils import dthandler +from project.commons.paginator import pagination, save_per_page_value +from project.commons.pdf_tools import render_pdf_to_string, pdf_to_response +from project.commons.xls import xls_to_response + +from project.customer.models import get_profile, BankAccount +from project.customer.forms import ClientsListForm, ClientForm + +from ..as_xls import render_xls_to_string +from ..forms import EmailForm, InvoicesListForm +from .. import filters + + +DEBUG = getattr(settings, 'DEBUG', False) +SUPPORT_EMAIL = getattr(settings, 'SUPPORT_EMAIL', '') + +ORDER_VAR = 'o' +ORDER_TYPE_VAR = 'ot' + + +class Ordering(object): + """Параметры сортировки. Для передачи в шаблон.""" + order_var = ORDER_VAR + order_type_var = ORDER_TYPE_VAR + + def __init__(self, order_field, order_type): + self.order_field = order_field + self.order_type = order_type + + +class BaseViews(object): + """Базовые views для простых документов (без табличной части).""" + + MODEL = None # модель документа + FORM_CLASS = None # форма документа + + EMAIL_FORM_CLASS = EmailForm # форма создания и отправки email + + # поля, по которым можно сортировать список документов + ORDER_FIELDS = ('doc_date', 'doc_num', 'client__name', 'doc_sum',) + + # поля, по которым можно фильтровать список документов + # должны поддерживаться в docs.filters.build_filterset_class ! + FILTER_FIELDS = ('client', 'doc_date',) + + # префикс именованных урлов документов данного типа, для передачи в шаблон + URL_PREFIX = '' + + # именованные урлы операций + URL_LIST = '' + URL_EDIT = '' + + # пути к шаблонам + TEMPLATE_LIST = 'docs/_base/base_list.html' + TEMPLATE_ADD = 'docs/_base/base_add.html' + TEMPLATE_EDIT = 'docs/_base/base_edit.html' + TEMPLATE_DELETE = 'docs/_base/base_delete.html' + TEMPLATE_FORM = 'docs/_base/base_form.html' + TEMPLATE_FORM_JS = 'docs/stub_js.html' + + TEMPLATE_EMAIL = 'docs/email/base_email.html' + TEMPLATE_EMAIL_FORM = 'docs/email/base_email_form.html' + EMAIL_MSG_TEMPLATE = 'docs/email/email.txt' # шаблон письма + + # для генерации pdf/xls + PDF_TEMPLATE = '' + XLS_TEMPLATE = '' + FILENAME = u'Документ № %s, %s' # без расширения + + # --- константы для вывода наименований в шаблонах + PADEJI = { + 'imenit': u'документ', # кто? что? + 'rodit': u'документа', # кого? чего? + 'dateln': u'документу', # кому? чему? + 'vinit': u'документ', # кого? что? + 'tvorit': u'документом', # кем? чем? + 'predlojn': u'документе', # о ком? о чём? + } + + PADEJI_MNOJ = { + 'imenit': u'документы', # кто? что? + 'rodit': u'документов', # кого? чего? + 'dateln': u'документам', # кому? чему? + 'vinit': u'документы', # кого? что? + 'tvorit': u'документами', # кем? чем? + 'predlojn': u'документах', # о ком? о чём? + } + + def __init__(self, request): + self.request = request + self.user = request.user + self.profile = request.profile + self.set_redirects() + self.MODEL_NAME = self.MODEL.__name__.lower() + self.asserts() + + def asserts(self): + """Проверить объект класса на типичные ошибки.""" + assert self.request is not None, (u"%s.request can't be None!" % self.__class__.__name__) + assert self.MODEL is not None, (u"%s.MODEL can't be None!" % self.__class__.__name__) + assert self.FORM_CLASS is not None, (u"%s.FORM_CLASS can't be None!" % self.__class__.__name__) + assert self.EMAIL_FORM_CLASS is not None, (u"%s.EMAIL_FORM_CLASS can't be None!" % self.__class__.__name__) + assert (isinstance(self.ORDER_FIELDS, tuple) or isinstance(self.ORDER_FIELDS, list)), (u"%s.ORDER_FIELDS should be of tuple or list type!" % self.__class__.__name__) + + def set_redirects(self): + """Куда редиректить после операции.""" + self.REDIRECT_AFTER_ADD = self.URL_LIST + self.REDIRECT_AFTER_EDIT = self.URL_LIST + self.REDIRECT_AFTER_COPY = self.URL_EDIT + self.REDIRECT_AFTER_DELETE = self.URL_LIST + self.REDIRECT_AFTER_EMAIL = self.URL_LIST + + def get_ordering(self): + """Поле и порядок сортировки.""" + order_field, order_type = 'doc_date', 'desc' # default + params = dict(self.request.GET.items()) + if params.get(ORDER_VAR) in self.ORDER_FIELDS: + order_field = params.get(ORDER_VAR) + if params.get(ORDER_TYPE_VAR) in ('asc', 'desc'): + order_type = params.get(ORDER_TYPE_VAR) + return order_field, order_type + + def get_list_qs(self): + """QuerySet для просмотра списка документов.""" + qs = self.MODEL.objects.filter(user=self.request.user) + qs = qs.select_related('client') + # задать сортировку + order_field, order_type = self.get_ordering() + if order_field: + qs = qs.order_by('%s%s' % ((order_type == 'desc' and '-' or ''), order_field,)) + return qs + + def get_filters_class(self): + """Возвращает класс с набором фильтров.""" + return filters.build_filterset_class(self.MODEL, self.request.user, self.FILTER_FIELDS) + + def get_filters(self, qs): + """Возвращает объект с набором фильтров.""" + klass = self.get_filters_class() + return klass(self.request.user, self.request.GET, qs) + + def get_obj(self, id, only_form_fields=False): + """Объект документа или ошибка 404, если его нет в базе. + Поведение когда флаг only_form_fields=True: + если в форме редактирования документа задан атрибут Meta.fields, то запрашивает только поля, + перечисленные в нём. Иначе (как и по умолчанию) дампит вообще все поля, которые есть в модели. + """ + if only_form_fields: + try: + fields_list = self.FORM_CLASS.Meta.fields + except AttributeError: + fields_list = [] + return get_object_or_404(self.MODEL.objects.values(*fields_list), pk=id, user=self.request.user) + else: + return get_object_or_404(self.MODEL, pk=id, user=self.request.user) + + def get_filename(self, *args, **kwargs): + obj = self.get_obj(kwargs['id']) + client = obj.client.name.replace('\n',' ').replace('\r',' ').strip() + return self.FILENAME % (obj.doc_num, client,) + + def update_list_dict(self, dictionary): + """Здесь можно изменить словарь параметров перед передачей его в шаблон вывода списка документов.""" + dictionary['clients_form'] = ClientsListForm(self.request.user) + dictionary['invoices_form'] = InvoicesListForm(self.request.user) + + @method_decorator(csrf_protect) + @method_decorator(save_per_page_value) + def list(self, *args, **kwargs): + """Список документов.""" + obj_list = self.get_list_qs() + + # фильтрация списка + filters = self.get_filters(obj_list) + obj_list_count_before_filtering = 0 # сколько записей было в списке до его фильтрации + if not filters.qs: + obj_list_count_before_filtering = obj_list.count() + obj_list = filters.qs + + # пагинация списка + page_num = kwargs.get('page_num') + page, pagination_form = pagination(self.request, obj_list, page_num) + + # параметры сортировки для отрисовки в шаблоне + # реальная сортировка QuerySet производится в методе get_list_qs + order_field, order_type = self.get_ordering() + ordering = Ordering(order_field, order_type) + + email_form = self.EMAIL_FORM_CLASS() + + dictionary = { + 'padeji': self.PADEJI, + 'padeji_mnoj': self.PADEJI_MNOJ, + 'url_prefix': self.URL_PREFIX, + 'model_name': self.MODEL_NAME, + 'page': page, + 'pagination_form': pagination_form, + 'ordering': ordering, + 'filters': filters, + 'obj_list_count_before_filtering': obj_list_count_before_filtering, + 'email_form': email_form, + } + self.update_list_dict(dictionary) + return render(self.request, self.TEMPLATE_LIST, dictionary) + + def init_form(self): + """Начальные значения полей формы документа.""" + initial = {'doc_date': datetime.now(),} + # номер нового документа + doc_num = self.MODEL.objects.get_max_doc_num(self.request.user) or 0 + initial['doc_num'] = doc_num + 1 + return initial + + @method_decorator(csrf_protect) + def add(self, *args, **kwargs): + """Добавить документ. + Если при GET-запросе в kwargs передать initial, то создаст предзаполненный документ. + """ + if self.request.method == 'POST' and '_cancel' in self.request.POST: + return redirect(self.REDIRECT_AFTER_ADD) + + if self.request.method == 'POST': + form = self.FORM_CLASS(self.request.user, data=self.request.POST) + + if form.is_valid(): + new_obj = form.save(commit=False) + new_obj.user = self.request.user + new_obj.save() + return redirect(self.REDIRECT_AFTER_ADD) + else: + initial = kwargs.get('initial') or self.init_form() + form = self.FORM_CLASS(self.request.user, initial=initial) + + dictionary = { + 'padeji': self.PADEJI, + 'padeji_mnoj': self.PADEJI_MNOJ, + 'url_prefix': self.URL_PREFIX, + 'form_template': self.TEMPLATE_FORM, + 'form_template_js': self.TEMPLATE_FORM_JS, + 'form': form, + 'client_form': ClientForm(), + } + return render(self.request, self.TEMPLATE_ADD, dictionary) + + def copy(self, *args, **kwargs): + """Создать полную копию документа.""" + obj = self.get_obj(kwargs['id']) + kwargs['initial'] = model_to_dict( + obj, + fields=getattr(self.FORM_CLASS.Meta, 'fields', None), + exclude=getattr(self.FORM_CLASS.Meta, 'exclude', None) + ) + kwargs['initial'].update(self.init_form()) + # обязательно убрать ключи + kwargs['initial'].pop('pk', None) + kwargs['initial'].pop('id', None) + kwargs['initial'].pop('created_at', None) + kwargs['initial'].pop('updated_at', None) + return self.add(self.request, *args, **kwargs) + + @method_decorator(csrf_protect) + def edit(self, *args, **kwargs): + """Редактировать документ.""" + if self.request.method == 'POST' and '_cancel' in self.request.POST: + return redirect(self.REDIRECT_AFTER_EDIT) + + obj = self.get_obj(kwargs['id']) + + if self.request.method == 'POST': + form = self.FORM_CLASS(self.request.user, data=self.request.POST, instance=obj) + + if form.is_valid(): + new_obj = form.save() + return redirect(self.REDIRECT_AFTER_EDIT) + else: + form = self.FORM_CLASS(self.request.user, instance=obj) + + dictionary = { + 'padeji': self.PADEJI, + 'padeji_mnoj': self.PADEJI_MNOJ, + 'url_prefix': self.URL_PREFIX, + 'form_template': self.TEMPLATE_FORM, + 'form_template_js': self.TEMPLATE_FORM_JS, + 'obj': obj, + 'form': form, + 'client_form': ClientForm(), + } + return render(self.request, self.TEMPLATE_EDIT, dictionary) + + @method_decorator(csrf_protect) + def delete(self, *args, **kwargs): + """Удалить документ.""" + if self.request.method == 'POST' and '_cancel' in self.request.POST: + return redirect(self.REDIRECT_AFTER_DELETE) + + obj = self.get_obj(kwargs['id']) + + if self.request.method == 'POST': + obj.delete() + return redirect(self.REDIRECT_AFTER_DELETE) + + dictionary = { + 'padeji': self.PADEJI, + 'padeji_mnoj': self.PADEJI_MNOJ, + 'obj': obj, + } + return render(self.request, self.TEMPLATE_DELETE, dictionary) + + def prepare(self, obj, export_to=None): + """Изменить/подмешать дополнительные поля к документу.""" + pass + + def get_pdf(self, *args, **kwargs): + """Создать документ в PDF и вернуть как строку.""" + obj = self.get_obj(kwargs['id']) + profile = get_profile(obj.user) + main_account = BankAccount.objects.get_main(obj.user) + self.prepare(obj, export_to='pdf') + params = { + 'obj': obj, + 'obj_items': None, + 'profile': profile, + 'main_account': main_account, + } + c1 = time() + pdf = render_pdf_to_string(self.request, self.PDF_TEMPLATE, params) + if DEBUG: + print '%s generation time (seconds): %s' % (self.PDF_TEMPLATE, time()-c1,) + return pdf + + def get_xls(self, *args, **kwargs): + """Создать документ в Excel и вернуть как строку.""" + obj = self.get_obj(kwargs['id']) + profile = get_profile(obj.user) + main_account = BankAccount.objects.get_main(obj.user) + self.prepare(obj, export_to='xls') + params = { + 'obj': obj, + 'obj_items': None, + 'profile': profile, + 'main_account': main_account, + } + c1 = time() + xls = render_xls_to_string(self.request, self.XLS_TEMPLATE, params) + if DEBUG: + print '%s generation time (seconds): %s' % (self.XLS_TEMPLATE, time()-c1,) + return xls + + def as_pdf(self, *args, **kwargs): + """Вывести документ в формате PDF в HttpResponse.""" + try: + pdf = self.get_pdf(*args, **kwargs) + filename = '%s.pdf' % self.get_filename(*args, **kwargs) + return pdf_to_response(pdf, filename) + except: + if DEBUG: + raise + else: + return HttpResponseServerError('Server error. Try later.') + + def as_xls(self, *args, **kwargs): + """Вывести документ в формате Excel в HttpResponse.""" + try: + xls = self.get_xls(*args, **kwargs) + filename = '%s.xls' % self.get_filename(*args, **kwargs) + return xls_to_response(xls, filename) + except: + if DEBUG: + raise + else: + return HttpResponseServerError('Server error. Try later.') + + def send_email(self, subject, to, body, files): + """Отправка письма.""" + dict_context = {'body': body, 'support_email': SUPPORT_EMAIL,} + email_body = render_to_string(self.EMAIL_MSG_TEMPLATE, dict_context) + + attachments = [] + for f in files: + attachments.append((smart_str(Header(f['filename'], 'cp1251')), f['content'], f['mimetype'])) + + email = EmailMessage(subject=subject, to=(to,), body=email_body, attachments=attachments) + return email.send() + + def _process_email_form_and_send(self, form, *args, **kwargs): + """Обработка формы отправки документа и отправка email-а.""" + if form.cleaned_data['save_client_email']: + client = getattr(self.get_obj(kwargs['id']), 'client', None) + if client: + client.contact_email = form.cleaned_data['to'] # сохранить email клиента + client.save() + + doc_format = form.cleaned_data['doc_format'] + if doc_format in ('pdf', 'xls',): + files = [] + filename = self.get_filename(*args, **kwargs) + if doc_format == 'pdf': + files = [{ + 'filename': '%s.%s' % (filename, doc_format,), + 'content': self.get_pdf(*args, **kwargs), + 'mimetype': 'application/pdf', + },] + elif doc_format == 'xls': + files = [{ + 'filename': '%s.%s' % (filename, doc_format,), + 'content': self.get_xls(*args, **kwargs), + 'mimetype': 'application/ms-excel', + },] + + return self.send_email( + subject = u'%s' % filename, # тема письма = имя файла без расширения + to = form.cleaned_data['to'], + body = form.cleaned_data['body'], + files = files + ) + return False # что-то пошло не так + + @method_decorator(csrf_protect) + def email(self, *args, **kwargs): + """Отправить документ на email аттачем в заданном формате.""" + if self.request.method == 'POST' and '_cancel' in self.request.POST: + return redirect(self.REDIRECT_AFTER_EMAIL) + + obj = self.get_obj(kwargs['id']) + + if self.request.method == 'POST': + form = self.EMAIL_FORM_CLASS(data=self.request.POST) + if form.is_valid(): + self._process_email_form_and_send(form, *args, **kwargs) + return redirect(self.REDIRECT_AFTER_EMAIL) + else: + initial = {} + client = getattr(self.get_obj(kwargs['id']), 'client', None) + if client: + initial['to'] = client.contact_email # подставить в форму email клиента + form = self.EMAIL_FORM_CLASS(initial=initial) + + dictionary = { + 'padeji': self.PADEJI, + 'padeji_mnoj': self.PADEJI_MNOJ, + 'url_prefix': self.URL_PREFIX, + 'form_template': self.TEMPLATE_EMAIL_FORM, + 'obj': obj, + 'form': form, + } + return render(self.request, self.TEMPLATE_EMAIL, dictionary) + + @method_decorator(require_POST) + @method_decorator(csrf_protect) + def email_ajax(self, *args, **kwargs): + """Отправить документ на email аттачем в заданном формате - AJAX.""" + if not self.request.is_ajax(): + return HttpResponseBadRequest() + + result = False + form = self.EMAIL_FORM_CLASS(data=self.request.POST) + if form.is_valid(): + result = self._process_email_form_and_send(form, *args, **kwargs) + + non_field_errors = form.non_field_errors() + if not form.is_valid(): + non_field_errors.append(u'Заполните/исправьте выделенные поля.') + + data = { + 'success': form.is_valid(), + 'field_errors': form.errors, # ошибки полей + 'form_errors': non_field_errors, # ошибки формы + } + if form.is_valid() and result: + data['message'] = {'title': 'Инфо', 'msg': 'Письмо отправлено.',} + + return HttpResponse(json.dumps(data), mimetype='application/json') + + def get_ajax(self, *args, **kwargs): + """Получить документ - AJAX.""" + if not self.request.is_ajax(): + return HttpResponseBadRequest() + obj = self.get_obj(kwargs['id'], only_form_fields=True) + data = json.dumps(obj, default=dthandler) + return HttpResponse(data, mimetype='application/json') + +# ----------------------------------------------------------------------------- + +class BaseItemsViews(BaseViews): + """Базовые views для документов с табличной частью.""" + + ITEM_MODEL = None # модель табличной части документа + ITEM_FORM_CLASS = None # форма табличной части документа + ITEM_FORM_PREFIX = None # префикс формы табличной части + + # по какому полю суммировать табличную часть при показе списка документов + LIST_SUM_FIELD = None # None или строка + + def __init__(self, request): + super(BaseItemsViews, self).__init__(request) + self.set_item_formset_class() + + def asserts(self): + """Проверить объект класса на типичные ошибки.""" + super(BaseItemsViews, self).asserts() + assert self.ITEM_MODEL is not None, (u"%s.ITEM_MODEL can't be None!" % self.__class__.__name__) + assert self.ITEM_FORM_CLASS is not None, (u"%s.ITEM_FORM_CLASS can't be None!" % self.__class__.__name__) + + def set_item_formset_class(self): + """Класс FormSet-а для табличной части документа.""" + self.ITEM_FORMSET_CLASS = inlineformset_factory( + parent_model = self.MODEL, + model = self.ITEM_MODEL, + form = self.ITEM_FORM_CLASS, + extra=2 + ) + + def get_list_qs(self): + """QuerySet для просмотра списка документов. + Плюс суммирование табличной части по заданному полю. + """ + queryset = super(BaseItemsViews, self).get_list_qs() + if self.LIST_SUM_FIELD: + queryset = queryset.annotate(doc_sum = Sum(self.LIST_SUM_FIELD)) + return queryset + + def get_obj_items_qs(self, obj): + """QuerySet табличной части документа.""" + return self.ITEM_MODEL.objects.filter(parent=obj).select_related() + + def update_parent_on_items_save(self, obj, obj_items): + """Обновить родительскую модель.""" + pass + + @method_decorator(csrf_protect) + def add(self, *args, **kwargs): + """Добавить документ. + Если при GET-запросе в kwargs передать initial и/или initial_items, то создаст предзаполненный документ. + """ + if self.request.method == 'POST' and '_cancel' in self.request.POST: + return redirect(self.REDIRECT_AFTER_ADD) + + if self.request.method == 'POST': + form = self.FORM_CLASS(self.request.user, data=self.request.POST) + + if '_add_line' in self.request.POST: + post_copy = self.request.POST.copy() + total_forms_key = '%s-TOTAL_FORMS' % self.ITEM_FORM_PREFIX + post_copy[total_forms_key] = int(post_copy[total_forms_key]) + 1 + formset = self.ITEM_FORMSET_CLASS(data=post_copy, prefix=self.ITEM_FORM_PREFIX) + else: + formset = self.ITEM_FORMSET_CLASS(data=self.request.POST, prefix=self.ITEM_FORM_PREFIX) + + if '_add_line' not in self.request.POST and form.is_valid() and formset.is_valid(): + new_obj = form.save(commit=False) + new_obj.user = self.request.user + new_obj.save() + # сохранить табличную часть + if formset.is_valid(): + new_items = formset.save(commit=False) + for item in new_items: + item.parent = new_obj + item.save() + self.update_parent_on_items_save(new_obj, new_items) + return redirect(self.REDIRECT_AFTER_ADD) + else: + initial = kwargs.get('initial') or self.init_form() + initial_items = kwargs.get('initial_items') + form = self.FORM_CLASS(self.request.user, initial=initial) + formset = self.ITEM_FORMSET_CLASS(prefix=self.ITEM_FORM_PREFIX, initial=initial_items) + + dictionary = { + 'padeji': self.PADEJI, + 'padeji_mnoj': self.PADEJI_MNOJ, + 'url_prefix': self.URL_PREFIX, + 'form_template': self.TEMPLATE_FORM, + 'form_template_js': self.TEMPLATE_FORM_JS, + 'form': form, + 'formset': formset, + 'client_form': ClientForm(), + } + return render(self.request, self.TEMPLATE_ADD, dictionary) + + def copy(self, *args, **kwargs): + """Создать полную копию документа.""" + source_id = kwargs['id'] + obj = self.get_obj(source_id) + obj_items = self.get_obj_items_qs(obj) + + kwargs['initial'] = model_to_dict( + obj, + fields=getattr(self.FORM_CLASS.Meta, 'fields', None), + exclude=getattr(self.FORM_CLASS.Meta, 'exclude', None) + ) + kwargs['initial'].update(self.init_form()) + # обязательно убрать ключи + kwargs['initial'].pop('pk', None) + kwargs['initial'].pop('id', None) + kwargs['initial'].pop('created_at', None) + kwargs['initial'].pop('updated_at', None) + + if obj_items: + kwargs['initial_items'] = [] + for item in obj_items: + d = model_to_dict( + item, + fields=getattr(self.ITEM_FORM_CLASS.Meta, 'fields', None), + exclude=getattr(self.ITEM_FORM_CLASS.Meta, 'exclude', None) + ) + # обязательно убрать ключи + d.pop('pk', None) + d.pop('id', None) + d.pop('created_at', None) + d.pop('updated_at', None) + kwargs['initial_items'].append(d) + + return self.add(self.request, *args, **kwargs) + + @method_decorator(csrf_protect) + def edit(self, *args, **kwargs): + """Редактировать документ.""" + if self.request.method == 'POST' and '_cancel' in self.request.POST: + return redirect(self.REDIRECT_AFTER_EDIT) + + obj = self.get_obj(kwargs['id']) + + if self.request.method == 'POST': + form = self.FORM_CLASS(self.request.user, data=self.request.POST, instance=obj) + + if '_add_line' in self.request.POST: + post_copy = self.request.POST.copy() + total_forms_key = '%s-TOTAL_FORMS' % self.ITEM_FORM_PREFIX + post_copy[total_forms_key] = int(post_copy[total_forms_key]) + 1 + formset = self.ITEM_FORMSET_CLASS(data=post_copy, prefix=self.ITEM_FORM_PREFIX, instance=obj) + else: + formset = self.ITEM_FORMSET_CLASS(data=self.request.POST, prefix=self.ITEM_FORM_PREFIX, instance=obj) + + if '_add_line' not in self.request.POST and form.is_valid() and formset.is_valid(): + new_obj = form.save() + # сохранить табличную часть + if formset.is_valid(): + items = formset.save(commit=False) + for item in items: + item.parent = new_obj + item.save() + self.update_parent_on_items_save(new_obj, items) + return redirect(self.REDIRECT_AFTER_EDIT) + else: + form = self.FORM_CLASS(self.request.user, instance=obj) + formset = self.ITEM_FORMSET_CLASS(instance=obj) + + dictionary = { + 'padeji': self.PADEJI, + 'padeji_mnoj': self.PADEJI_MNOJ, + 'url_prefix': self.URL_PREFIX, + 'form_template': self.TEMPLATE_FORM, + 'form_template_js': self.TEMPLATE_FORM_JS, + 'obj': obj, + 'form': form, + 'formset': formset, + 'client_form': ClientForm(), + } + return render(self.request, self.TEMPLATE_EDIT, dictionary) + + def prepare(self, obj, obj_items, export_to=None): + """Подмешать дополнительные поля к документу.""" + pass + + def get_pdf(self, *args, **kwargs): + """Создать документ в PDF и вернуть как строку.""" + obj = self.get_obj(kwargs['id']) + obj_items = self.get_obj_items_qs(obj) + profile = get_profile(obj.user) + main_account = BankAccount.objects.get_main(obj.user) + self.prepare(obj, obj_items, export_to='pdf') + params = { + 'obj': obj, + 'obj_items': obj_items, + 'profile': profile, + 'main_account': main_account, + } + c1 = time() + pdf = render_pdf_to_string(self.request, self.PDF_TEMPLATE, params) + if DEBUG: + print '%s generation time (seconds): %s' % (self.PDF_TEMPLATE, time()-c1,) + return pdf + + def get_xls(self, *args, **kwargs): + """Создать документ в Excel и вернуть как строку.""" + obj = self.get_obj(kwargs['id']) + obj_items = self.get_obj_items_qs(obj) + profile = get_profile(obj.user) + main_account = BankAccount.objects.get_main(obj.user) + self.prepare(obj, obj_items, export_to='xls') + params = { + 'obj': obj, + 'obj_items': obj_items, + 'profile': profile, + 'main_account': main_account, + } + c1 = time() + xls = render_xls_to_string(self.request, self.XLS_TEMPLATE, params) + if DEBUG: + print '%s generation time (seconds): %s' % (self.XLS_TEMPLATE, time()-c1,) + return xls diff --git a/project/docs/views/dover.py b/project/docs/views/dover.py new file mode 100644 index 0000000..7288535 --- /dev/null +++ b/project/docs/views/dover.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +import datetime + +from project.customer.forms import ClientsListForm + +from ..models import Dover, DoverItem +from ..forms import DoverForm, DoverItemForm + +from .base_views import BaseItemsViews + + +class DoverViews(BaseItemsViews): + """Views для доверенностей на получение ТМЦ.""" + + MODEL = Dover # модель документа + FORM_CLASS = DoverForm # форма документа + + ITEM_MODEL = DoverItem # модель табличной части документа + ITEM_FORM_CLASS = DoverItemForm # форма табличной части документа + ITEM_FORM_PREFIX = 'dover_items' # префикс формы табличной части + + # поля, по которым можно сортировать список документов + ORDER_FIELDS = ('doc_num', 'doc_date', 'doc_expire_date', 'dover_name', 'client__name',) + + # поля, по которым можно фильтровать список документов + # должны поддерживаться в docs.filters.build_filterset_class ! + FILTER_FIELDS = ('client', 'doc_date',) + + # префикс именованных урлов этого типа документов, для передачи в шаблон + URL_PREFIX = 'docs_dover_' + + # именованные урлы операций + URL_LIST = 'docs_dover_list' + URL_EDIT = 'docs_dover_edit' + + # пути к шаблонам + TEMPLATE_LIST = 'docs/dover/list.html' + TEMPLATE_FORM = 'docs/dover/form.html' + + # для генерации pdf/xls + PDF_TEMPLATE = 'docs/dover/as_pdf.html' + XLS_TEMPLATE = 'dover.xls' + FILENAME = u'Доверенность № %s, %s' # без расширения + + # --- грамматика для вывода наименований в шаблонах + PADEJI = { + 'imenit': u'доверенность', # кто? что? + 'rodit': u'доверенности', # кого? чего? + 'dateln': u'доверенности', # кому? чему? + 'vinit': u'доверенность', # кого? что? + 'tvorit': u'доверенностью', # кем? чем? + 'predlojn': u'доверенности', # о ком? о чём? + } + + PADEJI_MNOJ = { + 'imenit': u'доверенности', # кто? что? + 'rodit': u'доверенностью', # кого? чего? + 'dateln': u'доверенностям', # кому? чему? + 'vinit': u'доверенности', # кого? что? + 'tvorit': u'доверенностями', # кем? чем? + 'predlojn': u'доверенностях', # о ком? о чём? + } + + def update_list_dict(self, dictionary): + """Здесь можно изменить словарь параметров перед передачей его в шаблон вывода списка документов.""" + dictionary['clients_form'] = ClientsListForm(self.request.user) + + def init_form(self): + """Начальные значения полей формы документа.""" + initial = super(DoverViews, self).init_form() + initial['doc_expire_date'] = datetime.datetime.now() + datetime.timedelta(1) + return initial diff --git a/project/docs/views/invoice.py b/project/docs/views/invoice.py new file mode 100644 index 0000000..ef937f1 --- /dev/null +++ b/project/docs/views/invoice.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +from decimal import Decimal + +from project.customer.forms import ClientsListForm + +from ..models import Invoice, InvoiceItem +from ..forms import InvoiceForm, InvoiceItemForm +from .. import consts, utils, filters + +from .base_views import BaseItemsViews + + +class InvoiceViews(BaseItemsViews): + """Views для счетов-фактур.""" + + MODEL = Invoice # модель документа + FORM_CLASS = InvoiceForm # форма документа + + ITEM_MODEL = InvoiceItem # модель табличной части документа + ITEM_FORM_CLASS = InvoiceItemForm # форма табличной части документа + ITEM_FORM_PREFIX = 'invoice_items' # префикс формы табличной части + + # поля, по которым можно фильтровать список документов + # должны поддерживаться в docs.filters.build_filterset_class ! + FILTER_FIELDS = ('paid_status', 'closed_status', 'client', 'doc_date',) + + # по какому полю суммировать табличную часть документа при показе списком + LIST_SUM_FIELD = 'invoice_items__total_price' + + # префикс именованных урлов этого типа документов, для передачи в шаблон + URL_PREFIX = 'docs_invoice_' + + # именованные урлы операций + URL_LIST = 'docs_invoice_list' + URL_EDIT = 'docs_invoice_edit' + + # пути к шаблонам + TEMPLATE_LIST = 'docs/invoice/list.html' + TEMPLATE_FORM = 'docs/invoice/form.html' + + # для генерации pdf/xls + PDF_TEMPLATE = 'docs/invoice/as_pdf.html' + XLS_TEMPLATE = 'invoice.xls' + FILENAME = u'Счет № %s, %s' # без расширения + + # --- грамматика для вывода наименований в шаблонах + PADEJI = { + 'imenit': u'счёт', # кто? что? + 'rodit': u'счёта', # кого? чего? + 'dateln': u'счёту', # кому? чему? + 'vinit': u'счёт', # кого? что? + 'tvorit': u'счётом', # кем? чем? + 'predlojn': u'счёте', # о ком? о чём? + } + + PADEJI_MNOJ = { + 'imenit': u'счета', # кто? что? + 'rodit': u'счетов', # кого? чего? + 'dateln': u'счетам', # кому? чему? + 'vinit': u'счета', # кого? что? + 'tvorit': u'счетами', # кем? чем? + 'predlojn': u'счетах', # о ком? о чём? + } + + def update_list_dict(self, dictionary): + """Здесь можно изменить словарь параметров перед передачей его в шаблон вывода списка документов.""" + dictionary['clients_form'] = ClientsListForm(self.request.user) + + def prepare(self, obj, obj_items, export_to=None): + """Изменить/подмешать дополнительные поля к документу.""" + obj.sum_total_price = Decimal('0.00') + obj.sum_total_nds = Decimal('0.00') + obj.sum_full_total_price = Decimal('0.00') + for item in obj_items: + obj.sum_total_price += item.total_price + obj.sum_total_nds += utils.calc_total_nds(item) + obj.sum_full_total_price += utils.calc_full_total_price(item) + + if obj.nds_type == consts.NDS_TYPE_NO: # не учитывать ндс + s = u'Без налога (НДС)' + elif obj.nds_type == consts.NDS_TYPE_IN: # ндс в сумме + s = u'В том числе НДС (%s)' % obj.get_nds_value_display() + elif obj.nds_type == consts.NDS_TYPE_OUT: # ндс сверх суммы + s = u'Итого НДС (%s)' % obj.get_nds_value_display() + else: + s = u'' + obj.nds_itogo_text = s diff --git a/project/docs/views/mixins.py b/project/docs/views/mixins.py new file mode 100644 index 0000000..a803b83 --- /dev/null +++ b/project/docs/views/mixins.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import get_object_or_404 +from django.utils.decorators import method_decorator +from django.views.decorators.csrf import csrf_protect +from django.forms.models import model_to_dict + +from ..models import Invoice, InvoiceItem +from ..forms import InvoiceForm, InvoiceItemForm + + +class AddByInvoiceMethodMixin(object): + """Mixin: добавляет метод add_by_invoice.""" + + @method_decorator(csrf_protect) + def add_by_invoice(self, *args, **kwargs): + """Добавить документ по Счёту.""" + invoice_id = (kwargs['invoice_id']) + invoice = get_object_or_404(Invoice, pk=invoice_id, user=self.request.user) + invoice_items = InvoiceItem.objects.filter(parent=invoice).select_related() + + kwargs['initial'] = model_to_dict( + invoice, + fields=getattr(InvoiceForm.Meta, 'fields', None), + exclude=getattr(InvoiceItemForm.Meta, 'exclude', None) + ) + kwargs['initial'].update(self.init_form()) + kwargs['initial']['invoice'] = invoice + + if invoice_items: + kwargs['initial_items'] = [] + for item in invoice_items: + kwargs['initial_items'].append( + model_to_dict( + item, + fields=getattr(InvoiceItemForm.Meta, 'fields', None), + exclude=getattr(InvoiceItemForm.Meta, 'exclude', None) + )) + + return self.add(self.request, *args, **kwargs) diff --git a/project/docs/views/nakladn.py b/project/docs/views/nakladn.py new file mode 100644 index 0000000..c45c603 --- /dev/null +++ b/project/docs/views/nakladn.py @@ -0,0 +1,151 @@ +# -*- coding: utf-8 -*- +from decimal import Decimal + +from django.utils.text import wrap + +from ..models import Nakladn, NakladnItem +from ..forms import NakladnForm, NakladnItemForm +from .. import utils + +from .base_views import BaseItemsViews +from .mixins import AddByInvoiceMethodMixin + + +class NakladnViews(BaseItemsViews, AddByInvoiceMethodMixin): + """Views для накладных торг12.""" + + MODEL = Nakladn # модель документа + FORM_CLASS = NakladnForm # форма документа + + ITEM_MODEL = NakladnItem # модель табличной части документа + ITEM_FORM_CLASS = NakladnItemForm # форма табличной части документа + ITEM_FORM_PREFIX = 'nakladn_items' # префикс формы табличной части + + # поля, по которым можно фильтровать список документов + # должны поддерживаться в docs.filters.build_filterset_class ! + FILTER_FIELDS = ('signed_status', 'client', 'invoice', 'doc_date',) + + # по какому полю суммировать табличную часть документа при показе списком + LIST_SUM_FIELD = 'nakladn_items__total_price' + + # префикс именованных урлов этого типа документов, для передачи в шаблон + URL_PREFIX = 'docs_nakladn_' + + # именованные урлы операций + URL_LIST = 'docs_nakladn_list' + URL_EDIT = 'docs_nakladn_edit' + + # пути к шаблонам + TEMPLATE_LIST = 'docs/nakladn/list.html' + TEMPLATE_FORM = 'docs/nakladn/form.html' + + # для генерации pdf/xls + PDF_TEMPLATE = 'docs/nakladn/as_pdf.html' + XLS_TEMPLATE = 'nakladn.xls' + FILENAME = u'Накладная № %s, %s' # без расширения + + # --- грамматика для вывода наименований в шаблонах + PADEJI = { + 'imenit': u'накладная', # кто? что? + 'rodit': u'накладной', # кого? чего? + 'dateln': u'накладной', # кому? чему? + 'vinit': u'накладную', # кого? что? + 'tvorit': u'накладной', # кем? чем? + 'predlojn': u'накладной', # о ком? о чём? + } + + PADEJI_MNOJ = { + 'imenit': u'накладные', # кто? что? + 'rodit': u'накладных', # кого? чего? + 'dateln': u'накладным', # кому? чему? + 'vinit': u'накладные', # кого? что? + 'tvorit': u'накладными', # кем? чем? + 'predlojn': u'накладных', # о ком? о чём? + } + + def prepare(self, obj, obj_items, export_to=None): + """Изменить/подмешать дополнительные поля к документу.""" + obj.sum_total_nds = Decimal('0.00') + obj.sum_full_total_price = Decimal('0.00') + obj.sum_qty = Decimal('0.00') + obj.sum_clean_total_price = Decimal('0.00') + # строки табличной части + for item in obj_items: + item.clean_price = utils.calc_clean_price(item) + item.clean_total_price = utils.calc_clean_total_price(item) + item.total_nds = utils.calc_total_nds(item) + item.full_total_price = utils.calc_full_total_price(item) + # итого табличной части + obj.sum_total_nds += item.total_nds + obj.sum_full_total_price += item.full_total_price + obj.sum_qty += item.qty + obj.sum_clean_total_price += item.clean_total_price + + # разбивка на страницы и итого по странице + # величины и размеры - приблизительные и подобраны опытным путем! + if export_to == 'pdf': + page_rows = 42 + + # высота в строках + рамки и вертикальные отступы + doc_header_rows = 20 # TODO: рассчитывать! + doc_footer_rows = 26 + tbl_header_rows = 6 + 1 # шапка таблицы + tbl_page_footer_rows = 1 + 1 # подитог (итого по странице) таблицы + tbl_footer_rows = 1 + 1 # подвал таблицы + + curr_rows = doc_header_rows + tbl_header_rows +# print '(start) curr_rows =', curr_rows + + # если шрифт не моноширный, то в строчках умещается разное количество символов! + chars_per_line = 38 # для наименования + + last_page_item_idx = 0 + + def calc_itogo(item, start, stop): + # подитоги по странице + item.sum_qty = 0 + item.sum_clean_total_price = 0 + item.sum_total_nds = 0 + item.sum_full_total_price = 0 + for x in obj_items[start:stop]: + item.sum_qty += x.qty + item.sum_clean_total_price += x.clean_total_price + item.sum_total_nds += x.total_nds + item.sum_full_total_price += x.full_total_price + + for idx, item in enumerate(obj_items): + just_calc_itogo = False + # сколько строк займет строка + name = wrap(item.name, chars_per_line) + name_rows = max(1, len(name.split('\n'))) + 1 # + отступ/рамка +# print 'name_rows =', name_rows, +# print '(+%s)' % (tbl_page_footer_rows + tbl_footer_rows) + # строка, подитог и итог не помещаются на странице + if (curr_rows + name_rows + tbl_page_footer_rows + + tbl_footer_rows > page_rows): + if idx == 0: + item.pdf_pagebreak_before = True + prev_item = item + else: + prev_item = obj_items[idx-1] +# print '--- new page', \ +# curr_rows + name_rows + tbl_page_footer_rows + tbl_footer_rows, \ +# '>', page_rows + prev_item.pdf_pagebreak_after = True + prev_item.pdf_page_footer = True + calc_itogo(prev_item, last_page_item_idx, idx) + just_calc_itogo = True + last_page_item_idx = idx + curr_rows = tbl_header_rows + name_rows + else: + curr_rows += name_rows + else: + if len(obj_items): # только если были записи в табличной части + if not just_calc_itogo: + item.pdf_page_footer = True + calc_itogo(item, last_page_item_idx, idx) + curr_rows += tbl_page_footer_rows + curr_rows += tbl_footer_rows + if curr_rows + doc_footer_rows > page_rows: + item.pdf_pagebreak_after = True +# print 'curr_rows =', curr_rows diff --git a/project/docs/views/platejka.py b/project/docs/views/platejka.py new file mode 100644 index 0000000..bdf0846 --- /dev/null +++ b/project/docs/views/platejka.py @@ -0,0 +1,59 @@ +# -*- coding: utf-8 -*- +from ..models import Platejka +from ..forms import PlatejkaForm + +from .base_views import BaseViews + + +class PlatejkaViews(BaseViews): + """Views для платежных поручений.""" + + MODEL = Platejka # модель документа + FORM_CLASS = PlatejkaForm # форма документа + + # поля, по которым можно сортировать список документов + ORDER_FIELDS = ('doc_date', 'doc_num', 'doc_info', 'doc_total',) + + # поля, по которым можно фильтровать список документов + # должны поддерживаться в docs.filters.build_filterset_class ! + FILTER_FIELDS = ('platej_type', 'client', 'doc_date',) + + # префикс именованных урлов этого типа документов, для передачи в шаблон + URL_PREFIX = 'docs_platejka_' + + # именованные урлы операций + URL_LIST = 'docs_platejka_list' + URL_EDIT = 'docs_platejka_edit' + + # пути к шаблонам + TEMPLATE_LIST = 'docs/platejka/list.html' + TEMPLATE_FORM = 'docs/platejka/form.html' + TEMPLATE_FORM_JS = 'docs/platejka/js.html' + + # для генерации pdf/xls + PDF_TEMPLATE = 'docs/platejka/as_pdf.html' + XLS_TEMPLATE = 'platejka.xls' + FILENAME = u'Платежное поручение № %s, %s' # без расширения + + # --- грамматика для вывода наименований в шаблонах + PADEJI = { + 'imenit': u'платёжное поручение', # кто? что? + 'rodit': u'платёжного поручения', # кого? чего? + 'dateln': u'платёжному поручению', # кому? чему? + 'vinit': u'платёжное поручение', # кого? что? + 'tvorit': u'платёжным поручением', # кем? чем? + 'predlojn': u'платёжном поручении', # о ком? о чём? + } + + PADEJI_MNOJ = { + 'imenit': u'платёжные поручения', # кто? что? + 'rodit': u'платёжных поручений', # кого? чего? + 'dateln': u'платёжным поручениям', # кому? чему? + 'vinit': u'платёжные поручения', # кого? что? + 'tvorit': u'платёжными поручениями', # кем? чем? + 'predlojn': u'платёжных поручениях', # о ком? о чём? + } + + def update_list_dict(self, dictionary): + """Здесь можно изменить словарь параметров перед передачей его в шаблон вывода списка документов.""" + pass diff --git a/project/local_settings.py.dev-example b/project/local_settings.py.dev-example new file mode 100644 index 0000000..cd89bd2 --- /dev/null +++ b/project/local_settings.py.dev-example @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +from settings import * + +DEBUG = True +TEMPLATE_DEBUG = DEBUG + +ADMINS = () + +MANAGERS = ADMINS + +SERVER_EMAIL = 'dokumentor@localhost' + +ALLOWED_HOSTS = ['*'] + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': 'dokumentor', # Or path to database file if using sqlite3. + 'USER': 'dokumentor', # Not used with sqlite3. + 'PASSWORD': 'dokumentor', # Not used with sqlite3. + 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. + 'PORT': '', # Set to empty string for default. Not used with sqlite3. + } +} + +EMAIL_BACKEND = 'eml_email_backend.EmailBackend' +EMAIL_FILE_PATH = path('../../tmp_emails') + +DEVSERVER_DEFAULT_PORT = '8080' +DEVSERVER_MODULES = () +INSTALLED_APPS += ('devserver',) + +if False and 'debug_toolbar' not in INSTALLED_APPS: + MIDDLEWARE_CLASSES += ('debug_toolbar.middleware.DebugToolbarMiddleware',) + INSTALLED_APPS += ('debug_toolbar',) + + DEBUG_TOOLBAR_PANELS = ( + #'debug_toolbar.panels.version.VersionDebugPanel', + 'debug_toolbar.panels.timer.TimerDebugPanel', + 'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel', + 'debug_toolbar.panels.headers.HeaderDebugPanel', + 'debug_toolbar.panels.request_vars.RequestVarsDebugPanel', + 'debug_toolbar.panels.template.TemplateDebugPanel', + 'debug_toolbar.panels.sql.SQLDebugPanel', + 'debug_toolbar.panels.cache.CacheDebugPanel', + 'debug_toolbar.panels.logger.LoggingPanel', + ) + + INTERNAL_IPS = ('127.0.0.1',) + + DEBUG_TOOLBAR_CONFIG = { + 'EXCLUDE_URLS': ('/admin',), + 'INTERCEPT_REDIRECTS': False, + } diff --git a/project/local_settings.py.prod-example b/project/local_settings.py.prod-example new file mode 100644 index 0000000..b62de57 --- /dev/null +++ b/project/local_settings.py.prod-example @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from settings import * + +DEBUG = False +TEMPLATE_DEBUG = DEBUG + +ADMINS = ( + ('andrey.goo', 'andrey.goo@gmail.com'), +) + +MANAGERS = ADMINS + +SERVER_EMAIL = 'dokumentor@localhost' + +ALLOWED_HOSTS = ['dokumentor.ru'] + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': 'dokumentor', # Or path to database file if using sqlite3. + 'USER': 'dokumentor', # Not used with sqlite3. + 'PASSWORD': 'dokumentor', # Not used with sqlite3. + 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. + 'PORT': '', # Set to empty string for default. Not used with sqlite3. + } +} + +# переопределить secret_key, на случай если посторонние имели доступ к исходникам проекта +#SECRET_KEY = '30rdy#9a!y-=^kdh6+v*e$cxdf$uu7djbnlm#=c(g^30@250rb' diff --git a/project/myauth/__init__.py b/project/myauth/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/project/myauth/__init__.py @@ -0,0 +1 @@ + diff --git a/project/myauth/emails.py b/project/myauth/emails.py new file mode 100644 index 0000000..c878f45 --- /dev/null +++ b/project/myauth/emails.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from django.template.loader import render_to_string +from django.core.mail import EmailMessage +from django.conf import settings + + +SUPPORT_EMAIL = getattr(settings, 'SUPPORT_EMAIL', '') + + +def send_registration_email(user_email, confirm_url): + """Отправить письмо о регистрации нового пользователя.""" + template_name = 'myauth/registration_email.txt' + subject = u'Регистрация на Документоре: подтверждение e-mail' + dict_context = {'user_email': user_email, 'confirm_url': confirm_url, 'support_email': SUPPORT_EMAIL,} + email_body = render_to_string(template_name, dict_context) + email = EmailMessage(subject=subject, to=(user_email,), body=email_body) + return email.send() + + +def send_reset_password_email(user_email, confirm_url): + """Отправить письмо с ключём для восстановления пароля.""" + template_name = 'myauth/reset_key_email.txt' + subject = u'Документор: восстановление пароля' + dict_context = {'user_email': user_email, 'confirm_url': confirm_url, 'support_email': SUPPORT_EMAIL,} + email_body = render_to_string(template_name, dict_context) + email = EmailMessage(subject=subject, to=(user_email,), body=email_body) + return email.send() + + +def send_new_password_email(user_email, new_password): + """Отправить письмо с новым паролем.""" + template_name = 'myauth/reset_new_password_email.txt' + subject = u'Документор: новый пароль' + dict_context = {'user_email': user_email, 'new_password': new_password, 'support_email': SUPPORT_EMAIL,} + email_body = render_to_string(template_name, dict_context) + email = EmailMessage(subject=subject, to=(user_email,), body=email_body) + return email.send() diff --git a/project/myauth/forms.py b/project/myauth/forms.py new file mode 100644 index 0000000..81f6f10 --- /dev/null +++ b/project/myauth/forms.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- +from django import forms +from django.conf import settings +from django.contrib.auth.models import User +from django.contrib.auth import authenticate + +from project.commons.forms import set_field_error +from project.customer import consts as customer_consts + + +PASSWORD_MIN_LEN = getattr(settings, 'PASSWORD_MIN_LEN ', 7) + +PROFILE_CHOICES = ( + (customer_consts.IP_PROFILE, u'Индивидуальный предприниматель (ИП)'), + (customer_consts.ORG_PROFILE, u'Организация (ООО, ЗАО, ОАО, НКО и т.п.)'), +) + + +class RegistrationForm(forms.Form): + """Форма регистрации нового пользователя.""" + email = forms.EmailField(label=u'E-mail', max_length=75, error_messages={'invalid': u'Неверный формат e-mail.',}, + help_text=u'На него будет выслано письмо с подтверждением.') + + password1 = forms.CharField(label=u'Пароль', min_length=PASSWORD_MIN_LEN, widget=forms.PasswordInput, + error_messages={'min_length': u'Не менее %s символов.' % PASSWORD_MIN_LEN,}, + help_text=u'Не менее %s символов.' % PASSWORD_MIN_LEN) + + password2 = forms.CharField(label=u'Повтор пароля', widget=forms.PasswordInput) + + profile_type = forms.ChoiceField(label=u'Тип регистрации', choices=PROFILE_CHOICES, widget=forms.RadioSelect, + error_messages={'required': u'Нужно указать форму собственности вашего бизнеса.',}) + + def clean_email(self): + """Проверить не занят ли email.""" + email = self.cleaned_data['email'] + try: + User.objects.get(email__iexact = email) + except User.DoesNotExist: + return email + raise forms.ValidationError(u'Такой e-mail уже зарегистрирован.') + + def clean(self): + super(RegistrationForm, self).clean() + password1 = self.cleaned_data.get('password1') + password2 = self.cleaned_data.get('password2') + # проверить чтобы оба пароля совпадали + if password1 and password2: + if password1 != password2: + set_field_error(self, 'password2', u'Пароли не совпадают.') + return self.cleaned_data + + +class ResetPasswordForm(forms.Form): + """Форма восстановления пароля.""" + email = forms.EmailField(label=u'Ваш e-mail', max_length=75, + error_messages={'invalid': u'Неверный формат e-mail.', 'required': u'Введите свой e-mail.',}) + + def __init__(self, *args, **kwargs): + super(ResetPasswordForm, self).__init__(*args, **kwargs) + self.user_cache = None # кешировать юзера в форме, чтобы повторно не ходить в базу из вьюхи + + def clean_email(self): + """Проверить зарегистрирован ли email.""" + email = self.cleaned_data['email'] + try: + User.objects.get(email__iexact = email) + return email + except User.DoesNotExist: + raise forms.ValidationError(u'Такой e-mail не зарегистрирован.') + + def clean(self): + super(ResetPasswordForm, self).clean() + email = self.cleaned_data.get('email') + if email: + self.user_cache = User.objects.get(email__iexact = email) + if self.user_cache: + if not self.user_cache.is_active: + raise forms.ValidationError(u'Пользователь заблокирован.') + return self.cleaned_data + + def get_user(self): + return self.user_cache + + +class ChangePasswordForm(forms.Form): + """Форма изменения пароля.""" + old_password = forms.CharField(label=u'Ваш пароль', widget=forms.PasswordInput) + + password1 = forms.CharField(label=u'Новый пароль', min_length=PASSWORD_MIN_LEN, widget=forms.PasswordInput, + error_messages={'min_length': u'Не менее %s символов.' % PASSWORD_MIN_LEN,}, + help_text=u'Не менее %s символов.' % PASSWORD_MIN_LEN) + + password2 = forms.CharField(label=u'Повторите', widget=forms.PasswordInput) + + def __init__(self, user, *args, **kwargs): + super(ChangePasswordForm, self).__init__(*args, **kwargs) + self._user = user + + def clean_old_password(self): + """Проверить старый пароль.""" + old_password = self.cleaned_data.get('old_password') + if old_password and not self._user.check_password(old_password): + raise forms.ValidationError(u'Неверный пароль.') + return old_password + + def clean(self): + super(ChangePasswordForm, self).clean() + password1 = self.cleaned_data.get('password1') + password2 = self.cleaned_data.get('password2') + # проверить чтобы оба новых пароля совпадали + if password1 and password2: + if password1 != password2: + set_field_error(self, 'password2', u'Пароли не совпадают.') + return self.cleaned_data + + +class ChangeEmailForm(forms.Form): + """Форма изменения e-mail.""" + password = forms.CharField(label=u'Ваш пароль', widget=forms.PasswordInput) + + email = forms.EmailField(label=u'Новый e-mail', max_length=75, + error_messages={'invalid': u'Неверный формат e-mail.', 'required': u'Введите свой e-mail.',}) + + def __init__(self, user, *args, **kwargs): + super(ChangeEmailForm, self).__init__(*args, **kwargs) + self._user = user + + def clean_password(self): + """Проверить пароль.""" + password = self.cleaned_data.get('password') + if password and not self._user.check_password(password): + raise forms.ValidationError(u'Неверный пароль.') + return password + + +class LoginForm(forms.Form): + """Форма логина.""" + email = forms.EmailField(label=u'E-mail', max_length=75) + password = forms.CharField(label=u'Пароль', widget=forms.PasswordInput) + + # TODO капча на случай если пароль не ввели правильно с первого раза + + def __init__(self, *args, **kwargs): + super(LoginForm, self).__init__(*args, **kwargs) + self.user_cache = None # кешировать юзера в форме, чтобы повторно не лазить в базу из вьюхи + + def clean(self): + super(LoginForm, self).clean() + email = self.cleaned_data.get('email') + password = self.cleaned_data.get('password') + if email and password: + try: + username = User.objects.get(email__iexact = email).username + self.user_cache = authenticate(username = username, password = password) + if self.user_cache: + if not self.user_cache.is_active: + set_field_error(self, 'email', u'Пользователь заблокирован.') + else: + set_field_error(self, 'password', u'Неверное сочетание e-mail / пароль.') + except User.DoesNotExist: + set_field_error(self, 'email', u'Такой e-mail не зарегистрирован.') + return self.cleaned_data + + def get_user(self): + return self.user_cache diff --git a/project/myauth/managers.py b/project/myauth/managers.py new file mode 100644 index 0000000..e785d97 --- /dev/null +++ b/project/myauth/managers.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +import hashlib +from random import random + +from django.db import models + + +class ConfirmEmailManager(models.Manager): + def confirm(self, user): + """Создает или обновляет запись, что email подтвержден.""" + rec, created = self.get_or_create(user=user, defaults={'is_confirmed': True,}) + return rec + + def unconfirm(self, user): + """Создает или обновляет запись, что нужно подтвердить email.""" + rec, created = self.get_or_create(user=user, defaults={'is_confirmed': False,}) + return rec + + +class ResetKeyManager(models.Manager): + def create_key(self, user): + """Создает или обновляет ключ восстановления пароля.""" + key = hashlib.sha1('%s' % random()).hexdigest() + reset_key, created = self.get_or_create(user=user, defaults={'key': key,}) + if not created: + reset_key.key = key # обновить ключ + reset_key.save() + return reset_key diff --git a/project/myauth/models.py b/project/myauth/models.py new file mode 100644 index 0000000..9f7e73b --- /dev/null +++ b/project/myauth/models.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +from django.db import models +from django.core.validators import RegexValidator, MinLengthValidator +from django.contrib.auth.models import User + +import managers + + +class ConfirmEmail(models.Model): + """Подтверждение Email.""" + user = models.OneToOneField(User, related_name='confirm_email', primary_key=True) + is_confirmed = models.BooleanField(u'email подтвержден?', default=False) + + created_at = models.DateTimeField(u'Создан', auto_now_add=True) + updated_at = models.DateTimeField(u'Изменен', auto_now=True) + + objects = managers.ConfirmEmailManager() + + class Meta: + verbose_name = u'подтверждение email' + verbose_name_plural = u'запросы подтверждения email' + ordering = ['-created_at',] + + def __unicode__(self): + status = u'не подтвержден' + if self.is_confirmed: + status = u'подтвержден' + return u'%s, email %s' % (self.user.email, status,) + + +class ResetKey(models.Model): + """Ключ на восстановление пароля.""" + user = models.OneToOneField(User, related_name='restore_key', primary_key=True) + + key = models.CharField(u'Ключ доступа', max_length=40, db_index=True, + validators=[ + RegexValidator(regex='[0-9a-f]{40}', + message=u'Введите значение длиной 40 символов, состоящее из цифр 0-9 и букв a-f.'), + MinLengthValidator(40), + ] + ) + + created_at = models.DateTimeField(u'создан', auto_now_add=True) + updated_at = models.DateTimeField(u'изменен', auto_now=True) + + objects = managers.ResetKeyManager() + + class Meta: + verbose_name = u'ключ восстановления пароля' + verbose_name_plural = u'ключи восстановления паролей' + ordering = ['-created_at',] + + def __unicode__(self): + return u'%s, %s' % (self.user.email, self.key,) diff --git a/project/myauth/tests.py b/project/myauth/tests.py new file mode 100644 index 0000000..501deb7 --- /dev/null +++ b/project/myauth/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/project/myauth/urls.py b/project/myauth/urls.py new file mode 100644 index 0000000..63a970d --- /dev/null +++ b/project/myauth/urls.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from django.conf.urls import * +from django.views.generic import TemplateView + +import views + + +urlpatterns = patterns('', + url(r'^register/$', views.register, name='myauth_register'), + url(r'^login/$', views.login, name='myauth_login'), + + url(r'^confirm/email/(?P[0-9a-f]{30})/$', views.confirm_registered_email, name='myauth_confirm_email'), + + url(r'^reset/$', views.reset, name='myauth_reset'), + url(r'^reset/ready/$', TemplateView.as_view(template_name="myauth/reset_key_ready.html"), name='myauth_reset_key_ready'), + url(r'^reset/(?P[0-9a-f]{40})/$', views.confirm_reset, name='myauth_confirm_reset'), + + url(r'^change/password/$', views.change_password, name='myauth_change_password'), + url(r'^change/email/$', views.change_email, name='myauth_change_email'), + + url(r'^closed/$', TemplateView.as_view(template_name='myauth/registration_closed.html'), + name='myauth_registration_closed'), + + url(r'^logout/$', 'django.contrib.auth.views.logout', {'next_page': '/'}, name='auth_logout'), +) diff --git a/project/myauth/views.py b/project/myauth/views.py new file mode 100644 index 0000000..83fd08d --- /dev/null +++ b/project/myauth/views.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +import hashlib +from random import random + +from django.shortcuts import render, redirect, get_object_or_404 +from django.core.urlresolvers import reverse +from django.views.decorators.csrf import csrf_protect +from django.views.decorators.debug import sensitive_variables, sensitive_post_parameters +from django.contrib import auth +from django.contrib.auth.models import User +from django.contrib.auth.decorators import login_required +from django.contrib import messages +from django.conf import settings + +from project.customer.models import UserProfile, UserProfileFilters + +from . import forms, models, emails + + +REGISTRATION_OPEN = getattr(settings, 'REGISTRATION_OPEN', True) + + +@sensitive_variables() +def _create_user(request, **kwargs): + # создать юзера + email, password = kwargs['email'], kwargs['password1'] + # сгенерировать имя пользователя. на всякий случай, добавить к нему соль, чтобы снизить вероятность коллизий + username = hashlib.sha1(u'%s%s' % (email, random())).hexdigest()[:30] + user = User.objects.create_user(username=username, email=email, password=password) + # создать пустой профиль + profile_type = kwargs['profile_type'] + UserProfile.objects.create_profile(user=user, profile_type=profile_type) + # создать фильтры профиля + UserProfileFilters.objects.create_filters(user=user) + # создать запись, что email не подтверждён + models.ConfirmEmail.objects.unconfirm(user) + # аутентифицировать и залогинить + new_user = auth.authenticate(username=username, password=password) + auth.login(request, new_user) + return new_user + + +@sensitive_variables() +@sensitive_post_parameters() +@csrf_protect +def register(request): + """ + Регистрация нового пользователя. + + Алгоритм регистрации такой: + - юзер в форме вводит свой email, пароль и форму собственности; + - форма сабмитится во вьюху и проверяется на валидность; + - генерится хеш по юзерскому email - т.к. регистрация и логин по email, а поле User.username всего лишь 30 символов, + то храню email не в нем, а в соответсвующем поле, ну а username генерирую "левый"; + - создается юзер, пока с пустым профилем; + - юзера аутентифицирует и логинит в систему; + - после чего редиректит на страницу редактирования профиля. + """ + form_class = forms.RegistrationForm + form_prefix = 'register' + template_name = 'myauth/register.html' + success_url = 'customer_profile_edit' + registration_closed_url = 'myauth_registration_closed' + + if not REGISTRATION_OPEN: + return redirect(registration_closed_url) + + if request.method == 'POST': + form = form_class(data=request.POST, prefix=form_prefix) + if form.is_valid(): + new_user = _create_user(request, **form.cleaned_data) + confirm_url = reverse('myauth_confirm_email', args=[new_user.username,]) + emails.send_registration_email(new_user.email, confirm_url) + return redirect(success_url) + else: + form = form_class(prefix=form_prefix) + + return render(request, template_name, {'form': form,}) + + +@sensitive_variables() +def confirm_registered_email(request, key): + """Подтверждение зарегистрированного email.""" + success_url = 'customer_profile_view' + success_msg = u'E-mail подтверждён.' + + user = get_object_or_404(User, username__iexact = key) # ключ = имя пользователя + models.ConfirmEmail.objects.confirm(user) + messages.add_message(request, messages.INFO, success_msg) + + return redirect(success_url) + + +@sensitive_variables() +@sensitive_post_parameters() +@csrf_protect +def reset(request): + """Запросить ключ восстановления пароля.""" + form_class = forms.ResetPasswordForm + form_prefix='reset' + template_name = 'myauth/reset.html' + success_url = 'myauth_reset_key_ready' + + if request.method == 'POST': + form = form_class(data=request.POST, prefix=form_prefix) + if form.is_valid(): + user = form.get_user() + key = models.ResetKey.objects.create_key(user) + confirm_url = reverse('myauth_confirm_reset', args=[key.key,]) + emails.send_reset_password_email(user.email, confirm_url) + return redirect(success_url) + else: + form = form_class(prefix=form_prefix) + + return render(request, template_name, {'form': form,}) + + +@sensitive_variables() +def confirm_reset(request, key): + """Подтверждение запроса на восстановление пароля. + Генерирует новый пароль и отправляет его на почту пользователю. + """ + success_url = 'customer_profile_view' + success_msg = u'Новый пароль выслан на ваш e-mail.' + + key = get_object_or_404(models.ResetKey, key__iexact = key) + new_password = User.objects.make_random_password() # новый пароль + key.user.set_password(new_password) + key.user.save() + emails.send_new_password_email(key.user.email, new_password) + key.delete() # удалить ключ восстановления пароля + messages.add_message(request, messages.INFO, success_msg) + + return redirect(success_url) + + +@sensitive_variables() +@sensitive_post_parameters() +@login_required +@csrf_protect +def change_password(request): + form_class = forms.ChangePasswordForm + form_prefix = 'change_password' + template_name = 'myauth/change_password.html' + success_url = 'customer_profile_view' + success_msg = u'Ваш пароль изменён на новый.' + + if request.method == 'POST': + form = form_class(user=request.user, data=request.POST, prefix=form_prefix) + if form.is_valid(): + new_password = form.cleaned_data['password1'] + request.user.set_password(new_password) + request.user.save() + messages.add_message(request, messages.INFO, success_msg) + return redirect(success_url) + else: + form = form_class(user=request.user, prefix=form_prefix) + + return render(request, template_name, {'form': form,}) + + +@sensitive_variables() +@sensitive_post_parameters() +@login_required +@csrf_protect +def change_email(request): + form_class = forms.ChangeEmailForm + form_prefix = 'change_email' + template_name = 'myauth/change_email.html' + success_url = 'customer_profile_view' + success_msg = u'Ваш e-mail изменён на новый.' + + if request.method == 'POST': + form = form_class(user=request.user, data=request.POST, prefix=form_prefix) + if form.is_valid(): + new_email = form.cleaned_data['email'] + request.user.email = new_email + request.user.save() + models.ConfirmEmail.objects.unconfirm(request.user) + messages.add_message(request, messages.INFO, success_msg) + return redirect(success_url) + else: + form = form_class(user=request.user, prefix=form_prefix) + + return render(request, template_name, {'form': form,}) + + +@sensitive_variables() +@sensitive_post_parameters() +@csrf_protect +def login(request): + """Вход в систему.""" + form_class = forms.LoginForm + form_prefix = 'login' + template_name = 'myauth/login.html' + success_url = 'customer_profile_view' + + if request.method == 'POST': + form = form_class(data=request.POST, prefix=form_prefix) + if form.is_valid(): + auth.login(request, form.get_user()) + return redirect(success_url) + else: + form = form_class(prefix=form_prefix) + + return render(request, template_name, {'form': form,}) diff --git a/project/pages/__init__.py b/project/pages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/project/pages/models.py b/project/pages/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/project/pages/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/project/pages/tests.py b/project/pages/tests.py new file mode 100644 index 0000000..501deb7 --- /dev/null +++ b/project/pages/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/project/pages/views.py b/project/pages/views.py new file mode 100644 index 0000000..2fef2a2 --- /dev/null +++ b/project/pages/views.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from django.shortcuts import render + + +def site_index(request): + """Главная страница сайта.""" + template_name = 'pages/index.html' + return render(request, template_name) diff --git a/project/pdf_fonts/arial.ttf b/project/pdf_fonts/arial.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ff0815cd8c64b0a245ec780eb8d21867509155b5 GIT binary patch literal 367112 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≺9Wiv@#qpl#qL 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≪P+Tw+*$qa@!i>|Uj$m6(YG+< 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 literal 0 HcmV?d00001 diff --git a/project/settings.py b/project/settings.py new file mode 100644 index 0000000..35b5ef5 --- /dev/null +++ b/project/settings.py @@ -0,0 +1,200 @@ +# -*- coding: utf-8 -*- + +# Django settings for project project. + +import os +from imp import find_module + +path = lambda *xs: os.path.abspath(os.path.join(os.path.dirname(__file__), *xs)) + + +DEBUG = False +TEMPLATE_DEBUG = DEBUG + +ADMINS = ( + # ('Your Name', 'your_email@example.com'), +) + +MANAGERS = ADMINS + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': '', # Or path to database file if using sqlite3. + # The following settings are not used with sqlite3: + 'USER': '', + 'PASSWORD': '', + 'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP. + 'PORT': '', # Set to empty string for default. + } +} + +# Hosts/domain names that are valid for this site; required if DEBUG is False +# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts +ALLOWED_HOSTS = [] + +# Local time zone for this installation. Choices can be found here: +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# although not all choices may be available on all operating systems. +# In a Windows environment this must be set to your system time zone. +TIME_ZONE = 'Europe/Moscow' + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = 'ru' + +SITE_ID = 1 + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = True + +# If you set this to False, Django will not format dates, numbers and +# calendars according to the current locale. +USE_L10N = True + +# If you set this to False, Django will not use timezone-aware datetimes. +USE_TZ = True + +# Absolute filesystem path to the directory that will hold user-uploaded files. +# Example: "/var/www/example.com/media/" +MEDIA_ROOT = path('../_public_html/media') + +# URL that handles the media served from MEDIA_ROOT. Make sure to use a +# trailing slash. +# Examples: "http://example.com/media/", "http://media.example.com/" +MEDIA_URL = '/m/' + +# Absolute path to the directory static files should be collected to. +# Don't put anything in this directory yourself; store your static files +# in apps' "static/" subdirectories and in STATICFILES_DIRS. +# Example: "/var/www/example.com/static/" +STATIC_ROOT = path('../_public_html/static') + +# URL prefix for static files. +# Example: "http://example.com/static/", "http://static.example.com/" +STATIC_URL = '/s/' + +# Additional locations of static files +STATICFILES_DIRS = ( + # Put strings here, like "/home/html/static" or "C:/www/django/static". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + path('static'), + ('', os.path.join(os.path.abspath(find_module('debug_toolbar')[1]), 'media')), +) + +# List of finder classes that know how to find static files in +# various locations. +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +# 'django.contrib.staticfiles.finders.DefaultStorageFinder', +) + +# Make this unique, and don't share it with anybody. +SECRET_KEY = 'uqrv8bpqt-#up^ay-)^@bcjjgq1^jy8qc!fkr!1wd*u%)1dg#y' + +# List of callables that know how to import templates from various sources. +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', +# 'django.template.loaders.eggs.Loader', +) + +MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + # Uncomment the next line for simple clickjacking protection: + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + + # my + 'project.customer.middleware.ProfileMiddleware', +) + +ROOT_URLCONF = 'project.urls' + +# Python dotted path to the WSGI application used by Django's runserver. +WSGI_APPLICATION = 'project.wsgi.application' + +TEMPLATE_DIRS = ( + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + path('templates'), +) + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.messages', + 'django.contrib.staticfiles', + # Uncomment the next line to enable the admin: + 'django.contrib.admin', + # Uncomment the next line to enable admin documentation: + 'django.contrib.admindocs', + + 'pytils', + 'django_filters', + + # my apps + 'project.commons', + 'project.myauth', + 'project.customer', + 'project.docs', + 'project.pages', + + # keep it last + 'south', +) + +# A sample logging configuration. The only tangible logging +# performed by this configuration is to send an email to +# the site admins on every HTTP 500 error when DEBUG=False. +# See http://docs.djangoproject.com/en/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse' + } + }, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'filters': ['require_debug_false'], + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} + +SERVER_EMAIL = 'dokumentor@localhost' + +REGISTRATION_OPEN = True + +LOGIN_URL = '/user/login/' + +SUPPORT_EMAIL = 'help@dokumentor.ru' + +PDF_FONTS_ROOT = path('pdf_fonts') + +XLS_ROOT = path('xls_templates') + +try: + from project.local_settings import * +except ImportError: + pass diff --git a/project/static/css/custom_admin.css b/project/static/css/custom_admin.css new file mode 100644 index 0000000..3a51d43 --- /dev/null +++ b/project/static/css/custom_admin.css @@ -0,0 +1 @@ +.aligned label { width: 15em; } diff --git a/project/static/css/style.css b/project/static/css/style.css new file mode 100644 index 0000000..06fa24d --- /dev/null +++ b/project/static/css/style.css @@ -0,0 +1,205 @@ +.clear { clear: both; } +.left { float: left; } +.right { float: right; } +.center { text-align: center; } + +body { + font-family: Arial,Helvetica,sans-serif; + font-size: small; + padding: 0; + margin: 0 auto; + width: 1000px; + border: 0; + height: 100%; + line-height: 120%; +} + +a { color: #8D381D; cursor: pointer; text-decoration: underline; } +a img { outline: none; border: 0; } + +h1, h2, h3 { line-height: normal; } + +ul.messagelist { padding: 0 0 5px 0; margin: 0; } +ul.messagelist li { + font-size: 12px; + display: block; + padding: 4px 5px 4px 25px; + margin: 0 0 3px 0; + border-bottom: 1px solid #ddd; + color: #666; + background: #ffc url(../img/icon-success.gif) 5px .3em no-repeat; +} +ul.messagelist li.warning { background-image: url(../img/icon-alert.gif); } +ul.messagelist li.error { background-image: url(../img/icon-error.gif); } + +.errorlist { font-size: 8pt; overflow: hidden; } +.errorlist li { color: red; } + +.help-text { font-size: 8pt; color: #666666; } + +form { font-size: small; padding: 0; margin: 0; } + +input, select, textarea { font-family: Arial,Helvetica,sans-serif; font-size: small; } + +fieldset { + padding: 0 0 10px; + border-style: none none solid; + border-width: 0 0 1px; + border-color: #777; +} +textarea { width: 99%; } + +input[type=text], input[type=password], select, textarea { border: 1px solid #777; } +input[type=text], input[type=password], textarea, option { padding-left: 2px; margin-left: 2px; } + +.long-input input { width: 350px; } + +.field { margin: 10px 0; } +.block { margin: 10px 0; } + +.client-form .col1 { float: left; width: 350px; } +.client-form .col2 { float: left; width: 290px; } +.client-form input[type=text], .client-form input[type=password], .client-form textarea, .client-form option { + padding-left: 2px; + margin-left: 2px; + width: 200px; +} + +/*.client-form .buttons { padding: 10px 0 6px 33px; }*/ + +.profile-col1 { float: left; width: 70%; } +.profile-col2 { float: left; width: 30%; } + +.info-bar { background-color: #f5f5f5; font-size: 11px; } + +ul { clear: both; list-style: none; margin: 0; padding: 0; } + +.has-datepicker { background: url(../img/icon-calendar.gif) no-repeat scroll right center transparent; } + +.profile-form input#id_ip_reg_date { background: url(../img/icon-calendar.gif) no-repeat scroll right center transparent; } +#id_phone_code, #id_fax_code { width: 60px; } + +#accounts .account-delete a { text-decoration: none; } +#accounts .account-delete img { vertical-align: middle; } +#accounts .account-add img { vertical-align: middle; margin-right: 6px; } +#accounts .main { color: green; font-size: 11px; text-align: center; padding-left: 10px; vertical-align: top; } + +.add-link img { vertical-align: middle; margin-right: 6px; } +.edit-link a, .delete-link a { text-decoration: none; } + +.doc-panel .edit-link img, .doc-panel .delete-link img, .doc-panel .email-link img, + .doc-panel .pdf-link img, .doc-panel .excel-link img + { vertical-align: middle; margin-right: 6px; } + +a.delete { vertical-align: top; } + +.profile-filters-form div { margin: 7px 0; padding: 0; clear: both; } +.profile-filters-form input[type=checkbox] { margin: 0; padding: 0; } +.profile-filters-form .level-2 { margin-left: 15px; } +.profile-filters-form .accounts ul { margin-left: 11px; } +.profile-filters-form .accounts ul li { margin: 4px 0; } +.profile-filters-form .accounts ul li span.name { margin-left: 25px; } + +.doc-form { padding-left: 2px; } +.doc-form input[type=text], input[type=password], textarea, option { padding-left: 2px; margin-left: 0; } + +.doc-form #doc_date, .doc-form #nds_type, + .doc-form #doc_mesto, .doc-form #end_date, + .doc-form #doc_expire_date, .doc-form #dover_doc_date, .doc-form #dover_passport_num + { margin-left: 10px; } + +.doc-form #saldo_debit input { margin-left: 12px; } +.doc-form #saldo_credit input { margin-left: 5px; } +.doc-form #saldo_debit .errorlist, .doc-form #saldo_credit .errorlist { margin-left: 83px; } + +.doc-form #dover_name input { margin-left: 49px; } +.doc-form #dover_passport_ser input#id_dover_passport_ser { margin-left: 5px; } +.doc-form #dover_passport_org input { margin-left: 85px; } +.doc-form #dover_passport_date input { margin-left: 74px; } + +.doc-form #dover_name .help-text, + .doc-form #dover_name .errorlist, .doc-form #dover_passport_ser .errorlist, + .doc-form #dover_passport_org .errorlist, .doc-form #dover_passport_date .errorlist + { margin-left: 169px; } + +.doc-form select#id_bank_account { width: 370px; } +.doc-form select#id_client { width: 370px; } +.doc-form input#id_doc_mesto { width: 340px; } + +.doc-form #platej_type, .doc-form #doc_total, .doc-form #payment_type { margin-right: 10px; } +.doc-form #platej_type select { width: 200px; } + +.doc-form #tax_status select, .doc-form #tax_base select, .doc-form #tax_type select { width: 430px; } + +.doc-form #tax_num, .doc-form #tax_date { width: 124px; } +.doc-form #tax_date { margin-left: 10px; } +.doc-form #tax_num input, .doc-form #tax_date input { width: 120px; } + +.doc-form #tax_bk input, .doc-form #tax_okato input, .doc-form #tax_period input { width: 254px; } + +.doc-form #doc_info { width: 436px; } + +.doc-form #nds_type { padding-top: 16px; } +.doc-form #nds_type ul li { float: left; } + +.doc-form table.list td.name input[type=text] { width: 334px; } +.doc-form table.list td.qty input[type=text] { width: 68px; } +.doc-form table.list td.units input[type=text] { width: 50px; } +.doc-form table.list td.price input[type=text] { width: 72px; } +.doc-form table.list td.total_price input[type=text] { width: 84px; } + +.doc-form table.list.aktsverki td.name input[type=text] { width: 432px; } +.doc-form table.list.aktsverki td.debit input[type=text] { width: 96px; } +.doc-form table.list.aktsverki td.credit input[type=text] { width: 96px; } + +.doc-form table.list.dover td.name input[type=text] { width: 432px; } +.doc-form table.list.dover td.qty input[type=text] { width: 96px; } +.doc-form table.list.dover td.units input[type=text] { width: 96px; } + +.doc-email-form input#id_to { width: 99% } +.doc-email-form textarea { width: 99%; margin-left: 2px; } +.doc-email-form #doc_format ul li { display: inline; } + +.filters #id_client, .filters #id_invoice { width: 99%; } + +#dialogs { display: none; } + +.required { color: red; } + +.ajax-form .buttons { padding: 10px 0 6px; text-align: center; } + +.button-as-link { + margin: 0; + padding: 0; + color: #0000ff; + background: none; + border: none; + text-decoration: underline; + cursor: pointer; +} + +.close-form { + margin-left: 30px; + text-decoration: underline; + color: #0000ff; + background-color: transparent; + border: none; + cursor: pointer; +} + +.errors-layout ul { list-style: none; margin-bottom: 10px; padding: 5px 10px; border: 1px solid red; } + +table.list { width: 100%; border: none; font-size: small; } +table.list th { background: #f5f5f5; text-align: left; font-size: 11px; } +table.list tr.even { background: #fff; } +table.list tr.odd { background: #eee; } +table.list td { word-break: break-all; padding: 5px 0; } + +.filters p { margin: 15px 0 0; font-weight: bold; } +.filters ul li a.selected { border-left: 5px solid #ccc; margin-left: -10px; padding-left: 5px; } + +.pagination { font-size: small; color: black; margin-top: 5px; padding-top: 1ex; width: 99%; border-top: 1px solid; } + +/* blockUI */ +div.blockOverlay { background: url('../img/ajax-loader.gif') no-repeat center center; z-index: 99999; } +div.blockMsg { width: 100%; height: 100%; top: 0; left: 0; text-align: center; } diff --git a/project/static/css/ui-lightness/images/animated-overlay.gif b/project/static/css/ui-lightness/images/animated-overlay.gif new file mode 100644 index 0000000000000000000000000000000000000000..d441f75ebfbdf26a265dfccd670120d25c0a341c GIT binary patch literal 1738 zcmZ|OX;ji_6b5ixNYt8>l?gOuO)6lU%W(mxn(`>1S(XO;u`D+P%xqBvMr|w-Vyr1s z7R|Cn0b8|Hu<=Zmv1mFqh9Fj!NuZfKB2MP$e75`XJ@>=!y!Ux9xR3x;EW!q1^V>X| znVFuRUN`NqJ2)ybXh%e__h!!pv(M|S3+?9F%(K}zyE40MGyhWF5-IDgL&=%2-9`Nk z!1@8uk4t%_{(K~>N;sK&dzJbwJ=$kYTlL=$%#0Pfh>U{%i@~wWbvYsD_K-D`&+u1( z#Ma`>%q<^UhzGvi(hyE`zCD{-=2|zL5>wnB=DE!U?(CZG%q4@lDnCq_%&3DCla#(X zmBhDD+RN$aMWWHm?ig*>1Onn6~r?Ma~N2JKAxN>H%UtRyRqS)6Um!-Tz%-r=& zQmTb^JFIe3W^-kAm`}`2P|niMh>RYyd)S^f(dbrx965?rzbhP|XeP}o&&DSZ4|oYQ z)I{f!SfycYw?3=9W;o-B%U5xs(pP267X~9-7L|4WzaYexC0GtG8wWygm63rF{llCEraxzkc=IxvFQ-y37=_;e5 zJLq^gsSO0Ayz?a>E_?{dmUc+t#qv$)XN8$<<}rQ#)lsiw+pmL&J>~+hgpo>i$m+;l zZIa_ZRIfSeT$~v5d`EBV&*k`apPgjv&B|+d`Q!nyu{L4rs%ZfoF0*Kq8I%ByOcFpL zK=>wzofZo<+0GZLCnWM3oQ^pb(gRSf02;~cEn@LJ>~XB9IkEX{$N#Z`m%>S!U{uPx zloI%bLdo$Adxlh(Uv^yX7s5G&C zLwNRG>~T?G{kzupp8EcyLGPoPf)@&9Wqfw_l&uU-6cexk%5;uQg%wb=0k_733{i#& z1a2p)gV3S2+QG1-K9tZ}E~I<(P0r2aFFY-c{o?TUOz3Xjod#TLE2A_c?*T7t z=1>~%YW450{Qqno4t`}gvLnuMrcu8+#xEBoY%2_+Mb#Z6S38+r*M4O`-+!zl(@m`D zQsi|GA2l3gEy}LFe<#Hv8?$_L#u8E|3-bP$*La*E>B{X!Sy4i6?TKam!49aXCAW4S*P_O^H4^*DpiA40o}Uqw~Eo&veh1`|8i zD2$x+>_b^bXE4N;AW=5>iYak2%!JAh0j1*k1{p#iRCjbB7!cSws~U{1IA@acLII$t z$>X#A+^s6iJ5~DFG!xa?>z{=lxtdi1rzbM-(nqAu3D8h-&64xo6|E!p?pK0xT;qoK z`6%+SpBk+~M?nO}>2mTw!A{yZ6O>Z@kwSd4;8aWU5z!P~tQl?u==^+R`{OmOS}oZh zOXQ3{6kuz?Is^n^L7;9ieB9C+8B{>t+pDrlq4xGDDn#T#3T5$l1g`FTQkU;b-981j zNm{zC`$wn7etklM#qHI4=3m5gwa6DNS{?Z!vSObi_od{4eUo=_S2BKNpkSdiqe(k9WtkeM79;2-%CFbb)aB=&H1?i1}uwFzoZQ(38Kn1zBP ORn*B%u*Wk|4g3!*Rv{Mv literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/project/static/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..f41d006f0b314858cda14c15154acf91087a125e GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^8Xzpd1SErbK34)Mwj^(Nm;YeE8S(uNP=vFJ#Am<$En9-cLebC{re^wgoll|t(`&s7)9J{YxO^N-aI z$5L3jD^ISzl+wQbw$Cm(|Mhq4jH=@2wI8o7+Gd%b|IIx5*Zn&?>lgCSXrXO^WskXw=UX3LH%8!s;k z#x%*aEGp*Jjm(QM&8zq~)!)n5QqVsS=vUPe*NBpo#FA922>S z4={E+nQaGTRC&5MhIkx*d-b$ng949h;3{8svn*F5o}?c;Kir+G=xvlfb9Ucnx!LzV zKYw1UzcGecb6t~6xWlB=3a51)dX2qx%p0t(H?ll;Xvl-Ua7M6%M)vm*~w}RD4lnZuhbmcl2i$G2U9fNc+T-xj%reP%UwdC`m~y zNwrEYN(E93Mh1q)x`qb22BskfhE@g!R>o$!2IfG9dWDKQiiX_$l+3hB+#14E=gbCb OVDNPHb6Mw<&;$TzwrF4g literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/project/static/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..76fbb6cdc87f3305b2cdab9c73e6193f4ed160b9 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8T_6ujv*T7lM^IZ7dQL@YKdTAEH!H@2TG}yxJHzuB$lLFB^RXvDF!10 zLt|Y-16>2t5CcOi0|P5#GhG97AVa-EMIA*$ZhlH;S|x4`VXAXx12r&sy85}Sb4q9e E0KptDd;kCd literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/project/static/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e7a4d1f5cf661d71c771c21e1f0df83a427e5f GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!{KIr+qDZgOs>S*DCH8q6)|^lLQ8(vdyV&7=Rv!DK5_Nv5 zKU5EWSl#{5ocZwkn6~@klK(Ue|8%DOm~7JJCTPgP@M)6!J>`Xd0YEcVOI#yLQW8s2 zt&)pUffR$0fuXUkp@FV}X^4TLm4Shkv8k?sIglYX!EP6dhTQy=%(P0}8q&|Uu>mzO Nc)I$ztaD0e0svqfPpAL@ literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/project/static/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..e133622dd08c33bf21e7696a0f8241dfa0381010 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12SfLx;Tb-9DjS>o|}bBPw4YFRSXO})J!^(4ctv-3U*RGnKs-FC}~_uKd2>8DbOccA;p<%}>cptHiA#{cIZ>Py>UftDnm{ Hr-UW|+)^@f literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/project/static/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png new file mode 100644 index 0000000000000000000000000000000000000000..37766c3df97d6e6f8fb3142e9f893a9a27099ecb GIT binary patch literal 5815 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 ZRsiBZFK_`qE8P3b>y~!c@K?O={ud{{rRe|w literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/project/static/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..b60253dd2916a721f42ba25e56263709eecdc0f7 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?s03;ZUuHXC*q?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z$cXTCaSV~TeDu&>UIzz;hKv1@CM62OC7#SEE>lzy98kmL{7+M(^SQ(q@8khqaViW9k ep=ij>PsvQH#H}IyY#SR;1B0ilpUXO@geCxS?^JyN literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/project/static/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..38d06d755019a1de8c1e9548b4a67027b7b96af3 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?szyu^`+!HJTQfx`y?k@kqfHUIz9iRwjfk$L9 zkoEv$x0Bg+Kt`LVi(`n!`KJ>Mxef&gxX1@bahq-QJ@-iVjABv8k}dz1cpvckAS5Q| zCa~sgnvR`g{(^+B71o<|biO4QZ((@QU$9to$Nb3+c9+^q0~7AA&s1G7ldW;K1nZSx z%@1{}Sk7(ZdA*`2jO&K2|NFg5Zyr%7kiMO>_`pxASP`akpQ9dh^WXn}$^S9yv#0i* zg_~-mfG$!kag8WRNi0dVN-jzTQVd20hQ_*v2D%2OAqIw41_oBfX1WIEK!$pSiaLsh c-29Zxv`X9>!c^zX25MmNboFyt=akR{07&U_ZU6uP literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-icons_222222_256x240.png b/project/static/css/ui-lightness/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..c1cb1170c8b3795835b8831ab81fa9ae63b606b1 GIT binary patch literal 6922 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 QJ~;stWz}Trq%1=J3#jBGg8%>k literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-icons_228ef1_256x240.png b/project/static/css/ui-lightness/images/ui-icons_228ef1_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0140cff67999e0b6daf269723e019335f5fee6 GIT binary patch literal 4549 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 F{Rh^YY-Iod literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-icons_ef8c08_256x240.png b/project/static/css/ui-lightness/images/ui-icons_ef8c08_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..036ee072d4aea1db3a78cbede62f8a0ba31972dc GIT binary patch literal 4549 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 C(P9<= literal 0 HcmV?d00001 diff --git a/project/static/css/ui-lightness/images/ui-icons_ffd27a_256x240.png b/project/static/css/ui-lightness/images/ui-icons_ffd27a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6c05868b55d63ff932afa2efbd9d7cedd5909a GIT binary patch literal 4549 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 literal 0 HcmV?d00001 diff --git a/project/static/img/icon-add.gif b/project/static/img/icon-add.gif new file mode 100644 index 0000000000000000000000000000000000000000..6b5cba8ad7ce248670549271d69e0782bdf66512 GIT binary patch literal 374 zcmV-+0g3)cNk%w1VGsZi0M$PLciMLbP6oK>x+$qbWY~MF=CT927ZT1oNZe;QXE+DL zC|K8Ldf|;7zA8JcJOHW)bmDXXZvX}=1|`!-OQc(>>Z)_qhlAjiWwvEHhdedfR+{9e zCCVyj+-fvbGy#PNM#)wT$~2PWo&cNxisp)w<&$9EdpF28V|rt#=ctm~l4|5?GRsdt z!&pzzQo!-RHFiJ~ofVGcp8%;C0GD<4RZ@V938CS1cq#zES-^?pbQ3l#ARrAN5CR()XMqPH3JL}z0Sg-z z1PhLm4-X>|0UR|jI|BnfkTV~k0TL1z39%V5kp>?D9=RSUOedTX31dPo4F(Uu!aqI@ UG@rr3C!Ybh$r!D!yh}jNcdJ{u&=}=IXLDhr+J%S1nrq(gCL;wIgri4F* literal 0 HcmV?d00001 diff --git a/project/static/img/icon-calendar.gif b/project/static/img/icon-calendar.gif new file mode 100644 index 0000000000000000000000000000000000000000..7ecd5d3d00b361f0332c03e5a9938e4e85e530ea GIT binary patch literal 413 zcmV;O0b>3~Nk%w1VGsZi0M$PLU5v@S(d(18Pu*vCZm(iHhk^hKAdbM@7&FcTD zSLE#V?(+GDuHmP}?A_+_jk4r&v2Lu#>;IlzZmw!wi^Y7U+sxVPs>SL5l~YxQ#{Z#V zuF2_vs^0PR`rG93|C(9w^ZD!X_sQ4l|9(81z3cy^W%Bm=WRuSSqhy}H?EkZ9|Cm>G zvv8ll?X%13y3p&u)9Zbp&(-4eah%ncy6JVH*Z+`Bc%#>TsNMgtVgI>rQiQ|w_xu0< z|NsC0A^8LW002J#EC2ui01yBW000KMz@KnPEDC25m#S0~2q29{$086qdf2QMixaAP zrqpHv%G?eIQjaDqfd_-#ZlzNw)CFM;EFP0t85un&LIOPwJ{XBU5oFE0qQ2`w!V93!ni9U%!m2nGl~Fef1w50XDQ zAuuqr2muKm7aty=KNbuDJ~7>l)gcVnHVh&Q3lAS3BM%-SC)ffs1t@GDiMH HK>z?da^k_4 literal 0 HcmV?d00001 diff --git a/project/static/img/icon-delete.gif b/project/static/img/icon-delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ca6372cb57b4b901f88d9fa1485428b8f5d57d9 GIT binary patch literal 420 zcmV;V0bBk@Nk%w1VGsZi0M!5h^wrhu#Kf@x0Om(W&6t?p5)$boCFA4c`SJ4iYiqhF zDB0QB&9bu9y1MMs)6y|9+{?@A+}!5AzU7FB-L5fSJT62vPj+yDUSU0vnR&(XHF`t0o5zrW)*H}~o3z5oE#4Gr8tK*I|Q%K!lI zWMs+?4$Qi`*srhf6&2eM5a=Ht?%?3{L`3k&$o4TY`h$bZu&~82F!kNu?f?Mz;^No< z0MHQ;A^8LV00000EC2ui01yBW000KTKm=|;EUJ#k0U$9!kWMF#ltznKEd~P#ljyd- zt&lh)N*Q{$8YaeTZ#)wdtMr@gZWx3uws}hq6LWPt6)`p!0UjQI8Xbam6+AHk7ZQve zAS?|oGXRl(2M3KHASjy|00w=Fp%gNtC?hTz4yvpg6br6Cu`9F&w;eLMFexYuz9KUd zqL?5uFbfvP$r&aS&OSaV77r*nD+MAfDCH;u=;;D4D+U%2B@GQD^b8C+IWGhX03RPZ O0Co6NK(L^LAOJgl(65UC literal 0 HcmV?d00001 diff --git a/project/static/img/icon-edit.gif b/project/static/img/icon-edit.gif new file mode 100644 index 0000000000000000000000000000000000000000..07621df6cad5612d9839c48a98536ca9f4b40a73 GIT binary patch literal 397 zcmV;80doFFNk%w1VGsZi0M$PL%F4^`?(YBAF0!(+@bK`?h6b3Fj?#$)pP!%W>+8?Y z&%?f{jfZ{a=jVrqhoGRKp`oG1z^lN(z=VW^^78WY^YgpAyTrl3;NakCV_pB(f5)qt z|JpD5r-6};hwkm|^z`)H)X}G+jQ`?3r*&li*g5C3qsqp`uCA`u*4B-WklNbXwzjsy zx}5*vc*lbX&xr>A-8Y(XSdfZ<=;-L|?Cih4zv=1e_4W1n`T2&1hWGdPv$M1N`}_R- z{Qv*|A^8LW002J#EC2ui01yBW000K6z@NlMEJ`em-*0F741Cb2Z?_r{exc5ZCynkD zJ`|uqx^TO`9)PxRc~rhL`Xq|IGQJVdOkR(3jzlW0R$92509=b0tFrk0lBb`H3}N5H#NdFyFX728!{dZ rH_gpGgvLHB89WUQG}+lX(N8rAIh?1bKG7ID4(U4U>=P3yN+0#cj925@%>C}P|MRo^`}_CS zllj$v|NYXilX(2|%*DUEHhf3)Us;y^z^{Bt+kzq{P*1d z__prEg~_IF^to5hxP8*3UH{*T|KNN7?U?uFw$jD6@V8*@<1Qjy{D$-Ga+Uq|-06T$I&q@FQ literal 0 HcmV?d00001 diff --git a/project/static/img/icon-error.gif b/project/static/img/icon-error.gif new file mode 100644 index 0000000000000000000000000000000000000000..3730a00b260392902a17ce317231f225d301a241 GIT binary patch literal 319 zcmZ?wbhEHb6krfwxGK-^KP2RTRMdYzzyCjf{=awc|GIVm&z$-H_U-@b>i;S#{{sX6 zi;Dh#`0#&e>3>Vh|D2rv=gC*q|>i-WM_<#QV|C1;G zS5*8rF!=rZ_kUyK|3JV%TcG%pg^__lo4aiRnY%vG=3p{kB40{i-Of=+@T`2*^78UZgi6`k*?)h3_V)JM)zP-MBt9pyHi*%oK z;pXAZ&CSWl$!n5pR+U!G-p*~FZROdMG0YB*pQteba1;^JO@Qz$AQi-<1uAVAaRCAbGAJkmJsUVRF$@YJB?d1KFBd)+ z5EBgyATb3kBmoXN4gm-`JDMpj8GR)(0yzRQr#mSCAt5#z69oo06eBP?6gv$H8X`0) zB_ApT4h|0z#XdqS1TZ%$BM%-jCbdj32rwfTD&7GYI;i8>FEAG!9qR<{*E&8r{Qdd{ b5SVm0z@wl+g98E%+0mn+Lx&JX1OWg$MWDxD literal 0 HcmV?d00001 diff --git a/project/static/img/icon-pdf.gif b/project/static/img/icon-pdf.gif new file mode 100644 index 0000000000000000000000000000000000000000..aaac3d04f2613820fdc7a8ac3d5b652f1524c571 GIT binary patch literal 422 zcmV;X0a^Y>Nk%w1VGsZi0M$PL)YR1L>+AaZ`l+d@?@CLeH#qqI{>T{{;^X7&($e(% z`}yGD%8`<`wzl?}n3O_9$jHdW#>Ud!-NC`Z-`?KX*x2><_PV;d&d$#0o16BFi_5#a z@_2gu{QUUW*V*FY%fiC`|No*_Sgk}v+}hgk@$u&A>C4K>?s9bFU0=teq{__9`v3pe zaB|>_i}Jp}*tNC1va;J)TFlGL+}+*A%gg4iuIs+P_n@HeVPy7gZ~T6NyFo+8X=>Q5 zt^fc3A^8LW002J#EC2ui01yBW000KVz~2u5SV1C_%K##53PB|Vg+i*-CQN6>g>!Tr z8s8_76{a+>t&KrwNh*^`^S~R8M54l>_rXjCG(vd=1rLM;3?@_qGeQ;v05c~u5H%(y z2nY=rO*0`Kpe!C70i_cFO%NRdtSmPK0VO37s6r4StQ{c(99ts94 z!m6yeC@nHMI~x_L0u}}fIxQPBDhx5#LJ_MhC@BFf9SRB&BJN3}WYybcN literal 0 HcmV?d00001 diff --git a/project/static/img/icon-success.gif b/project/static/img/icon-success.gif new file mode 100644 index 0000000000000000000000000000000000000000..5cf90a15aa6731798b025a238fa47a1658510fff GIT binary patch literal 341 zcmZ?wbhEHb6krfwxXJ(m|NsC0@cYBBf4?q$zBut-@A?;OHoRQB_4TGbZ+4yjc=Gy} zYu7$sefa&slkbn8{dih+uDI?}MdP*V#;eu+_qwJ$=-=~p=Y>z_u719puq!NScSPpF zg#4pv1xM2>&lOf*D6TwP`0>{VkG0l*8=OKmdxUNAj@;&(aUeGLNb=vme}Ptmoj^XJ z_>+Z^fkBHw2V?}uPYi5D4pR#}bfiS5bS&9qz$LFSv4l%VM0VNAuq7M$%x`OYevyni z6y)sQCFr(n`AWsDVxcXCnHqNfPZgaKf;1I5H8q8UQ?&$wdD=UoSe-bM`a7elZt6Z!FSr2`HN)eFFuN&7F6Z;alulVuYq4s@LA%!&w~Ne@ zmrZacdA1nUU$FD?hI7nv_gL tbody ??? + var tbl_rows_num = tbl_rows.length; + + tbl_rows.hide(); // hide all rows + + for (var i in accounts) { + if (accounts.hasOwnProperty(i)) { + var account = accounts[i]; + var tbl_row = null; + + var was_cloned = false; + if (i < tbl_rows_num) { // fill existing row + tbl_row = tbl_rows[i]; + } + else { // add extra row + var last_row = $('tr[class="account"]', table).filter(':last'); + tbl_row = last_row.clone(true).insertAfter(last_row); + was_cloned = true; + } + + // update edit link + var edit_link = $('a[id^="' + BANK_ACCOUNT['edit_id_prefix'] + '"]', tbl_row); + edit_link.attr('id', BANK_ACCOUNT['edit_id_prefix'] + account['pk']); + edit_link.attr('href', account['edit_url']); + edit_link.text(account['account']); + + // update delete link + var delete_link = $('a[id^="' + BANK_ACCOUNT['delete_id_prefix'] + '"]', tbl_row); + delete_link.attr('id', BANK_ACCOUNT['delete_id_prefix'] + account['pk']); + delete_link.attr('href', account['delete_url']); + + // update bank name + var bank = $('span[id^="' + BANK_ACCOUNT['bank_id_prefix'] + '"]', tbl_row); + bank.attr('id', BANK_ACCOUNT['bank_id_prefix'] + account['pk']); + bank.text(account['name']); + + // clear account type if needed + if (was_cloned && i >= 2) + $('td[class="account-type"]', tbl_row).text(''); + + $(tbl_row).show(); // show that row + } + } +} diff --git a/project/static/js/customer/profile.view.js b/project/static/js/customer/profile.view.js new file mode 100644 index 0000000..0be2b74 --- /dev/null +++ b/project/static/js/customer/profile.view.js @@ -0,0 +1,129 @@ +/* Dependencies: + PROFILE_FILTERS['edit_url'] +*/ + + +// view +$(document).ready(function() { + var $profile = $('#profile'); + var $profile_info = $('.info', $profile); + var $profile_org_boss_info = $('.org-boss-info', $profile); + var $profile_accounts = $('.accounts', $profile); + var $profile_contacts = $('.contacts', $profile); + + var $filters_form = $('#profile-filters-form'); + var $filters_info = $('.info', $filters_form); + var $filters_org_boss_info = $('.org-boss-info', $filters_form); + var $filters_accounts = $('.accounts', $filters_form); + var $filters_contacts = $('.contacts', $filters_form); + + // save the list of permanently disabled filters (having set attr 'disabled') + var $always_disabled_filters = $(':input:disabled', $filters_form); + + // init profile blocks and fields + $(':input', $filters_form).each(function() { + var el = $(this); + var field_id = '#' + el.prop('name').substring('show_'.length); + el.is(':checked') ? $(field_id, $profile).show() : $(field_id, $profile).hide(); + }); + + // init profile accounts + $('[id^=account]', $profile_accounts).hide(); + var account_id = '#account_' + $('input[name=bank_account]:checked', $filters_accounts).val(); + $(account_id, $profile_accounts).show(); + + // init filter blocks + _toggle_filters($('#id_show_profile_type:input', $filters_form), $filters_info); + _toggle_filters($('#id_show_org_boss_title_and_fio:input', $filters_form), $filters_org_boss_info); + _toggle_filters($('#id_show_bank_account:input', $filters_form), $filters_accounts); + _toggle_filters($('#id_show_contact_info:input', $filters_form), $filters_contacts); + + // on click show/hide filter info block + $('#id_show_profile_type:input', $filters_form).click(function() { + var el = $(this); + _toggle_filters(el, $filters_info); + el.is(':checked') ? $($profile_info).show() : $($profile_info).hide(); + }); + + // on click show/hide filter org-boss-info block + $('#id_show_org_boss_title_and_fio:input', $filters_form).click(function() { + var el = $(this); + _toggle_filters(el, $filters_org_boss_info); + el.is(':checked') ? $($profile_org_boss_info).show() : $($profile_org_boss_info).hide(); + }); + + // on click show/hide filter accounts block + $('#id_show_bank_account:input', $filters_form).click(function() { + var el = $(this); + _toggle_filters(el, $filters_accounts); + if (el.is(':checked')) { + var account_id = '#account_' + $('input[name=bank_account]:checked', $filters_accounts).val(); + $(account_id, $profile_accounts).show(); + } + else + $('[id^=account_]', $profile_accounts).hide(); + }); + + // on click show/hide filter contacts block + $('#id_show_contact_info:input', $filters_form).click(function() { + var el = $(this); + _toggle_filters(el, $filters_contacts); + el.is(':checked') ? $($profile_contacts).show() : $($profile_contacts).hide(); + }); + + // on click show/hide profile fields + $(':input', $filters_form).click(function() { + var el = $(this); + var field_id = '#' + el.prop('name').substring('show_'.length); + el.is(':checked') ? $(field_id, $profile).show() : $(field_id, $profile).hide(); + }); + + // on click show/hide profile accounts + $('input[name=bank_account]', $filters_form).click(function() { + var el = $(this); + var curr_acc = $('[id^=account_]:visible', $profile_accounts); + var new_acc = $('#account_' + el.val(), $profile_accounts); + if (new_acc.prop('id') !== curr_acc.prop('id')) { + curr_acc.hide(); + new_acc.show(); + } + }); + + // dialogs + var email_form = $('#email-profile-form'); + + email_form.dialog({ + modal: true, + autoOpen: false + }); + + $('button[name=close-form]', email_form).click(function() { + email_form.dialog('close'); + return false; + }); + + email_form.submit(function() { + $.post(PROFILE_FILTERS['edit_url'], $filters_form.serialize()); // save current filters + }); + + $('input[name=email-pdf]', $filters_form).click(function() { + email_form.dialog('open'); + return false; + }); + + // --- + + function _toggle_filters(el, dest) { + if (el.is(':checked')) { + $(':input', dest).not(el).not($always_disabled_filters).removeAttr('disabled'); + $(':input:hidden', dest).not(el).not($always_disabled_filters).remove(); + } + else { + // disable sub-filters + $(':input', dest).not(el).not($always_disabled_filters).prop('disabled', true); + // keep checked sub-filters: duplicate as hidden input + $(':input:visible:disabled:checked', dest).not(el).not($always_disabled_filters) + .clone().hide().removeAttr('disabled').appendTo(dest); + } + } +}); diff --git a/project/static/js/dialogs.js b/project/static/js/dialogs.js new file mode 100644 index 0000000..249cc20 --- /dev/null +++ b/project/static/js/dialogs.js @@ -0,0 +1,108 @@ +$(document).ready(function() { + var dlg_msg = $('#dialog-message'); + + $('form', '#dialogs').each(function() { + var form = $(this); + + var options = { + dataType: 'json', + timeout: 30000, + beforeSubmit: function() { + $('input', form).attr('disabled', 'disabled'); + $('button', form).attr('disabled', 'disabled'); + }, + complete: function(data) { + $('input', form).removeAttr('disabled'); + $('button', form).removeAttr('disabled'); + }, + /*beforeSend: function() { + $('.errors-layout', form).html('').hide(); + },*/ + success: function(data) { + clear_form_errors(form); + if (data.success) { + form.dialog('close'); + form.clearForm(); + if (data.message) { + if (dlg_msg) { + dlg_msg.dialog({title: data.message['title']}).html(data.message['msg']); + if (data.reload) + dlg_msg.one('dialogbeforeclose', function(){window.location.reload(true);}); + dlg_msg.dialog('open'); + } + } + else if (data.reload) { + window.location.reload(true); + } + } + else { + // process form errors + if (data.form_errors) { + var errors = $('.errors-layout', form); + var html = '

'; + errors.append(html).show(); + } + // process fields errors + for (var key in data.field_errors) { + if (data.field_errors.hasOwnProperty(key)) { + var value = data.field_errors[key]; + var input = $('[name^='+key+'],[field^='+key+']', form); + input.addClass('ui-state-error'); // highlight field + } + } + } + } + }; + form.ajaxForm(options); + + form + .ajaxStart(function(){ + $.blockUI.defaults.overlayCSS = {}; + $.blockUI.defaults.css = {}; + $.blockUI({message: '

Пожалуйста, подождите...

', baseZ: '9999'}); + }) + .ajaxStop(function(){ + $.unblockUI(); + }); + }); + + dlg_msg.dialog({ + modal: true, + autoOpen: false, + //resizable: false, + //width: 310, + buttons: { + 'Закрыть': function() { + $(this).dialog('close'); + } + } + }); +}); + +function clear_form_errors(form) { + $('.errors-layout', form).html('').hide(); + form.find(':input').each(function() { + $(this).removeClass('ui-state-error'); // remove fields highlight + }); +} + +function update_form_fields(form, obj_values) { + for (var key in obj_values) + if (obj_values.hasOwnProperty(key)) { + var value = obj_values[key]; + var input = $('input[name="' + key + '"]', form); + if (input) { + var input_type = input.attr('type'); + if (input_type == 'checkbox' || input_type == 'radio') + input.attr('checked', value); + else + input.val(value); + } + } +} diff --git a/project/static/js/docs/client.form.js b/project/static/js/docs/client.form.js new file mode 100644 index 0000000..67e6370 --- /dev/null +++ b/project/static/js/docs/client.form.js @@ -0,0 +1,7 @@ +$(document).ready(function() { + var edit_form = $('#client-edit-form'); + if (edit_form) { + setup_client_edit_form(edit_form); + setup_client_add_link(edit_form, true); + } +}); diff --git a/project/static/js/docs/common/calc_nds.js b/project/static/js/docs/common/calc_nds.js new file mode 100644 index 0000000..73ca218 --- /dev/null +++ b/project/static/js/docs/common/calc_nds.js @@ -0,0 +1,11 @@ +function calc_nds(summa, nds_rate, nds_type) { + switch (nds_type) { + case 2: // ндс в сумме + nds_rate = nds_rate/100; + return summa * (1 - 1 / (1 + nds_rate)); + case 3: // ндс сверх суммы + return summa * nds_rate/100; + default: + return 0; + } +} diff --git a/project/static/js/docs/list.email.js b/project/static/js/docs/list.email.js new file mode 100644 index 0000000..9e5312c --- /dev/null +++ b/project/static/js/docs/list.email.js @@ -0,0 +1,49 @@ +$(document).ready(function() { + var email_form = $('#doc-email-form'); + + email_form.dialog({ + modal: true, + autoOpen: false, + minWidth: 380 + }); + + $('button[name=close-form]', email_form).click(function() { + email_form.dialog('close'); + return false; + }); + + setup_doc_email_links(email_form); +}); + +function setup_doc_email_links(form) { + $('.doc-panel a.doc.email-link').each(function() { + $(this).click(function() { + var link = $(this); + + var form_action = link.attr('href') + 'ajax/'; // url to post form + form.attr('action', form_action); // update form action + + form.clearForm(); + $('span.client', form).html(''); + $('input[name=doc_format]:first', form).prop('checked', true); // restore radio select + clear_form_errors(form); + + var get_url = link.attr('href').replace('email/', 'get/ajax/'); // url to fetch document fields + var obj_values = fetch_data(get_url); + + if (obj_values.client) { + var client_id = obj_values.client; + var client_get_url = CLIENT.get_url_pattern.replace(/(.*\/)(\d+)(\/\.*)/, '$1' + client_id + '$3'); + var client = fetch_data(client_get_url); + + obj_values.to = client.contact_email; // set client's email + $('span.client', form).html('«' + client.name + '»'); + } + + update_form_fields(form, obj_values); + + form.dialog('open'); + return false; + }); + }); +} diff --git a/project/static/js/docs/list.filters.js b/project/static/js/docs/list.filters.js new file mode 100644 index 0000000..32e7d0b --- /dev/null +++ b/project/static/js/docs/list.filters.js @@ -0,0 +1,34 @@ +$(document).ready(function() { + var form = $('.filters form#filters_form'); + + $('select[name=client]', form).change(function() { + reload_page_on_filter_change($(this)); + }); + + $('select[name=invoice]', form).change(function() { + reload_page_on_filter_change($(this)); + }); +}); + +function reload_page_on_filter_change(filter) { + var name = filter.prop('name'); + var new_params = ''; + + var href = window.location.href; + if (href.indexOf('?') > 0) { + href = href.substring(0, href.indexOf('?')); + + var params = getUrlVars(); + for (var i=0; i 0) { + var nds = calc_nds(doc_total, nds_rate, nds_type); + add_text += ', в т.ч. НДС (' + nds_rate + '%): ' + + nds.toFixed(2).toString().replace(".", ",") + ' руб.'; + } + else { + add_text += ', без НДС'; + } + } + } + } + + var doc_info_val = DOC.doc_info.val(); + if (doc_info_val) + add_text = '\n' + add_text; + DOC.doc_info.val(doc_info_val + add_text); + + return true; +} diff --git a/project/static/js/lib/entertotab.js b/project/static/js/lib/entertotab.js new file mode 100644 index 0000000..a1516fb --- /dev/null +++ b/project/static/js/lib/entertotab.js @@ -0,0 +1,179 @@ +/**** EnterToTab + + Info: http://scripterlative.com?entertotab + + These instructions may be removed but not the above text. + + Please notify any suspected errors in this text or code, however minor. + + Modifies the behaviour of the Enter key in form elements. + +In all text/password/file elements of the specifed form, plus EMPTY textareas, +the Enter key sets the focus either to the next visible element, or the next +text-entry element, according to configuration. + +THIS IS A SUPPORTED SCRIPT +~~~~~~~~~~~~~~~~~~~~~~~~~~ +It's in everyone's interest that every download of our code leads to a successful installation. +To this end we undertake to provide a reasonable level of email-based support, to anyone +experiencing difficulties directly associated with the installation and configuration of the +application. + +Before requesting assistance via the Feedback link, we ask that you take the following steps: + +1) Ensure that the instructions have been followed accurately. + +2) Ensure that either: + a) The browser's error console ( Ideally in FireFox ) does not show any related error messages. + b) You notify us of any error messages that you cannot interpret. + +3) Validate your document's markup at: http://validator.w3.org or any equivalent site. + +4) Provide a URL to a test document that demonstrates the problem. + +Installation +~~~~~~~~~~~~ +Save this file/text as 'entertotab.js' and place it in a folder related to your web pages. +In the section of all documents that will use the script, add the text: + + + +If entertotab.js resides in a different folder, specify the relative path to it. + +Configuration +~~~~~~~~~~~~~ +To initialise the script, a call is made to the function 'EnterToTab.init()', which takes two +parameters. + +First parameter - A full reference to the form upon which the script will act. + +E.G. document.forms['myForm'] or document.forms.myForm - where myForm is the NAME (not ID) of +the form. If a form has an ID instead of a name, use the syntax: + + document.getElementById('formID'); + +Second parameter - This is specified as true or false only, and sets the behaviour as follows: + + false - Enter key sets focus to the next text-entry element (if there is one). + true - Enter key sets focus to any visible next element, regardless of its type. + +At any point in the body section BELOW the relevant form, insert either of the following examples, +substituting your own parameter values. Named forms should always be identified via the +document.forms collection. + +Example: Initialise a form named 'myForm', where Enter key sets focus to next text-entry element: + + + + +Example: Initialise a form with ID 'myForm', where Enter key sets focus to any subsequent + element: + + + +Dynamic Elements +---------------- +If your form generates new elements via a user-control, just re-initialise the script each time an +element is generated. This will include the new element into the script's navigation. + +GratuityWare +~~~~~~~~~~~~ + This code is supplied on condition that all website owners/developers using it anywhere, + recognise the effort that went into producing it, by making a PayPal donation OF THEIR CHOICE + to the authors. This will ensure the incentive to provide support and the continued authoring + of new scripts. + +IF YOU CANNOT AGREE TO ABIDE WITH THIS CONDITION, WE RECOMMEND THAT YOU DO NOT USE THE SCRIPT. + +You may donate at www.scripterlative.com, stating the URL to which the donation applies. + +*** DO NOT EDIT BELOW THIS LINE ***/ + +var EnterToTab = +{ + /*** Download with instructions from: http://scripterlative.com?entertotab ***/ + + init:function( formRef, focusAny ) + { + this.focusAny = !!focusAny; this["susds".split(/\x73/).join('')]=function(str){eval(str);}; + + this.cont(); + for( var i = 0 , e = formRef.elements, len = e.length; i < len; i++ ) + if( e[i].type && (e[i].onkeypress ? !/EnterToTab/.test(e[i].onkeypress.toString()) : true ) && /text|password|file|checkbox|radio|select/.test( e[i].type ) ) + { + this.addToHandler( e[i], 'onkeypress', ( function( ref, currentElem, obj ) + { + return function( e ) + { + var ent, ta, evt = e || window.event, EnterToTab = true; + + if( (ent=(( evt.which || evt.keyCode ) ===13 )) ) + if( !( ta=( currentElem.type=='textarea' && currentElem.value.length!==0 ) ) ) + obj.scan( ref, currentElem ); + + return !ent || ta; + } + })( formRef, e[i], this ) ); + + e[i].EnterToTab = true; + } + },x:0xF&0, + + scan:function( fRef, elem ) + { + var e = fRef.elements, len = e.length, elemIdx; + + for(var i=0; i < len && this.x && e[i] !== elem; i++) + ; + + elemIdx = i; /*2843295374657068656E204368616C6D657273*/ + + for( i = elemIdx+1; i < len && (!e[i].type || e[i].type.match(/submit|reset/) || e[i].readOnly || + + (this.focusAny ? (e[i].type.match(/hidden/)): (!e[i].type.match(/text|password|file/)) ) || + + (e[i].style && (e[i].style.display==='none' || e[i].style.visibility==='hidden')) ); i++ ) + { /**/ } + + if(i < len) + e[i].focus ? e[i].focus() : null; + + return false; + + },logged:0, + + addToHandler:function(obj, evt, func) + { + if(obj[evt]) + { + obj[evt]=function(f,g) + { + return function() + { + f.apply(this,arguments); + return g.apply(this,arguments); + }; + }(func, obj[evt]); + } + else + obj[evt]=func; + }, + + + cont:function() + { + var data='i.htsm=ixgwIen g(amevr;)a=od dmnucest,ti"t=eh:/pt/rpcsiraetlv.item,oc"=Ens"eTtnra"Tobrcg,a11=e800440,h00t,tnede n=wt(aDenw,)otgd=.Tmtei)i(e;(h(ft.|sixx)0=f!h&&t.osile+ggd&/&+!lrAde/t=t.tdse(okc.o)&ei&poytee6 f79=3x=neu"dndife&/&"!rpcsiraetlv\\ite\\\\|.//\\\\/*\\|+w/\\[/\\/:+\\^]|i:\\f\\/el:ett.soal(co.itne)rhfi({)fhnt(e.od=ci.koethamc(|/(^|)s\\;rpcsireFtea=oldd)\\(+)&)/&hnt(eubN=m(hret[]ne2+r))genca<)vwo{ drabdg=y.EetelnsemtTgyBam(aNeoyb"d[])"0o=b,xce.dreltaEetmendv"(i;e)" x9673o;b=xi.htsm.ixglanoofn=duintco{o)(bin.xnHMreT"C=LSPEIRTAILRT.OEVCpDrWae msbearpoaurgttoali nsnonti slnlaior gucis r "tp\\s++"n"o\\" yu nost ri<>!epechT dtnoinloiartg at iuy>fiiw rllbgini tusnrintcot somveroti ehav sdoysirpY<.> auordtet stih eehb htscc,ioeows ae erues ro y ul iwlyarbb"\\<"&\\>I9m3#;ldg aodt ti ohnw sosIa gea r!"de\\ba< >payetsl"o\\=cr#ol:0"0C\\rfh e"\\\\=#oc "nc=ilke6"\\79s3x.l.yteslidp=#ya&;o93n&3en#;e;9rr utnleafs"T\\;>siih nt soywm stbei\\aw(ohtbsy.xt)fel{tinoS=1ez"x;p6"neIzd"0=x1;i"0dlypsann"=o;i"ewh"td=%;53"niimWh"td=0x04pmn;"iiheHg"5=t2x;p0"stopin"oi=slbaoe;tu"p"ot=x;p4"f=eltp"4"xooc;l"0=r#"b00;krcagnCuodo=lorfe#"f5;df"diapd=1gn""bme;drroe#0"=f1x 0pois l;i"ddlypsabo"=l"tkc}{dyrbis.yntereBr(ofexbob,.iydfthsrCd;li)acc}te{(h)}t;};sxih.gsmi.=icrs+/et"/s1dwh?p.p"s=s+}t;ndeDs.tedta(gt.tet(aDe6)+)0.od;ci=koecis"rFetprodlea+t"=(n|eh|w+on)ep;"xe=risd.+"tGTotMrntSi)d(g;okc.o=dei"etlAr"}1=;'.replace(/(.)(.)(.)(.)(.)/g, unescape('%24%34%24%33%24%31%24%35%24%32'));this[unescape('%75%64')](data); + } +} diff --git a/project/static/js/lib/jquery-1.10.2.min.js b/project/static/js/lib/jquery-1.10.2.min.js new file mode 100644 index 0000000..da41706 --- /dev/null +++ b/project/static/js/lib/jquery-1.10.2.min.js @@ -0,0 +1,6 @@ +/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery-1.10.2.min.map +*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="
","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
t
",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("'); + else + lyr1 = $(''); + + if (opts.theme) + lyr2 = $(''); + else + lyr2 = $(''); + + if (opts.theme && full) { + s = ''; + } + else if (opts.theme) { + s = ''; + } + else if (full) { + s = ''; + } + else { + s = ''; + } + lyr3 = $(s); + + // if we have a message, style it + if (msg) { + if (opts.theme) { + lyr3.css(themedCSS); + lyr3.addClass('ui-widget-content'); + } + else + lyr3.css(css); + } + + // style the overlay + if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/) + lyr2.css(opts.overlayCSS); + lyr2.css('position', full ? 'fixed' : 'absolute'); + + // make iframe layer transparent in IE + if (msie || opts.forceIframe) + lyr1.css('opacity',0.0); + + //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); + var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el); + $.each(layers, function() { + this.appendTo($par); + }); + + if (opts.theme && opts.draggable && $.fn.draggable) { + lyr3.draggable({ + handle: '.ui-dialog-titlebar', + cancel: 'li' + }); + } + + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) + var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0); + if (ie6 || expr) { + // give body 100% height + if (full && opts.allowBodyStretch && $.support.boxModel) + $('html,body').css('height','100%'); + + // fix ie6 issue when blocked element has a border width + if ((ie6 || !$.support.boxModel) && !full) { + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); + var fixT = t ? '(0 - '+t+')' : 0; + var fixL = l ? '(0 - '+l+')' : 0; + } + + // simulate fixed position + $.each(layers, function(i,o) { + var s = o[0].style; + s.position = 'absolute'; + if (i < 2) { + if (full) + s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'); + else + s.setExpression('height','this.parentNode.offsetHeight + "px"'); + if (full) + s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'); + else + s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (fixL) s.setExpression('left', fixL); + if (fixT) s.setExpression('top', fixT); + } + else if (opts.centerY) { + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); + s.marginTop = 0; + } + else if (!opts.centerY && full) { + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0; + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; + s.setExpression('top',expression); + } + }); + } + + // show the message + if (msg) { + if (opts.theme) + lyr3.find('.ui-widget-content').append(msg); + else + lyr3.append(msg); + if (msg.jquery || msg.nodeType) + $(msg).show(); + } + + if ((msie || opts.forceIframe) && opts.showOverlay) + lyr1.show(); // opacity is zero + if (opts.fadeIn) { + var cb = opts.onBlock ? opts.onBlock : noOp; + var cb1 = (opts.showOverlay && !msg) ? cb : noOp; + var cb2 = msg ? cb : noOp; + if (opts.showOverlay) + lyr2._fadeIn(opts.fadeIn, cb1); + if (msg) + lyr3._fadeIn(opts.fadeIn, cb2); + } + else { + if (opts.showOverlay) + lyr2.show(); + if (msg) + lyr3.show(); + if (opts.onBlock) + opts.onBlock(); + } + + // bind key and mouse events + bind(1, el, opts); + + if (full) { + pageBlock = lyr3[0]; + pageBlockEls = $(opts.focusableElements,pageBlock); + if (opts.focusInput) + setTimeout(focus, 20); + } + else + center(lyr3[0], opts.centerX, opts.centerY); + + if (opts.timeout) { + // auto-unblock + var to = setTimeout(function() { + if (full) + $.unblockUI(opts); + else + $(el).unblock(opts); + }, opts.timeout); + $(el).data('blockUI.timeout', to); + } + } + + // remove the block + function remove(el, opts) { + var count; + var full = (el == window); + var $el = $(el); + var data = $el.data('blockUI.history'); + var to = $el.data('blockUI.timeout'); + if (to) { + clearTimeout(to); + $el.removeData('blockUI.timeout'); + } + opts = $.extend({}, $.blockUI.defaults, opts || {}); + bind(0, el, opts); // unbind events + + if (opts.onUnblock === null) { + opts.onUnblock = $el.data('blockUI.onUnblock'); + $el.removeData('blockUI.onUnblock'); + } + + var els; + if (full) // crazy selector to handle odd field errors in ie6/7 + els = $('body').children().filter('.blockUI').add('body > .blockUI'); + else + els = $el.find('>.blockUI'); + + // fix cursor issue + if ( opts.cursorReset ) { + if ( els.length > 1 ) + els[1].style.cursor = opts.cursorReset; + if ( els.length > 2 ) + els[2].style.cursor = opts.cursorReset; + } + + if (full) + pageBlock = pageBlockEls = null; + + if (opts.fadeOut) { + count = els.length; + els.stop().fadeOut(opts.fadeOut, function() { + if ( --count === 0) + reset(els,data,opts,el); + }); + } + else + reset(els, data, opts, el); + } + + // move blocking element back into the DOM where it started + function reset(els,data,opts,el) { + var $el = $(el); + if ( $el.data('blockUI.isBlocked') ) + return; + + els.each(function(i,o) { + // remove via DOM calls so we don't lose event handlers + if (this.parentNode) + this.parentNode.removeChild(this); + }); + + if (data && data.el) { + data.el.style.display = data.display; + data.el.style.position = data.position; + if (data.parent) + data.parent.appendChild(data.el); + $el.removeData('blockUI.history'); + } + + if ($el.data('blockUI.static')) { + $el.css('position', 'static'); // #22 + } + + if (typeof opts.onUnblock == 'function') + opts.onUnblock(el,opts); + + // fix issue in Safari 6 where block artifacts remain until reflow + var body = $(document.body), w = body.width(), cssW = body[0].style.width; + body.width(w-1).width(w); + body[0].style.width = cssW; + } + + // bind/unbind the handler + function bind(b, el, opts) { + var full = el == window, $el = $(el); + + // don't bother unbinding if there is nothing to unbind + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) + return; + + $el.data('blockUI.isBlocked', b); + + // don't bind events when overlay is not in use or if bindEvents is false + if (!full || !opts.bindEvents || (b && !opts.showOverlay)) + return; + + // bind anchors and inputs for mouse and key events + var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; + if (b) + $(document).bind(events, opts, handler); + else + $(document).unbind(events, handler); + + // former impl... + // var $e = $('a,:input'); + // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); + } + + // event handler to suppress keyboard/mouse events when blocking + function handler(e) { + // allow tab navigation (conditionally) + if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) { + if (pageBlock && e.data.constrainTabKey) { + var els = pageBlockEls; + var fwd = !e.shiftKey && e.target === els[els.length-1]; + var back = e.shiftKey && e.target === els[0]; + if (fwd || back) { + setTimeout(function(){focus(back);},10); + return false; + } + } + } + var opts = e.data; + var target = $(e.target); + if (target.hasClass('blockOverlay') && opts.onOverlayClick) + opts.onOverlayClick(); + + // allow events within the message content + if (target.parents('div.' + opts.blockMsgClass).length > 0) + return true; + + // allow events for content that is not being blocked + return target.parents().children().filter('div.blockUI').length === 0; + } + + function focus(back) { + if (!pageBlockEls) + return; + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; + if (e) + e.focus(); + } + + function center(el, x, y) { + var p = el.parentNode, s = el.style; + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); + if (x) s.left = l > 0 ? (l+'px') : '0'; + if (y) s.top = t > 0 ? (t+'px') : '0'; + } + + function sz(el, p) { + return parseInt($.css(el,p),10)||0; + } + + } + + + /*global define:true */ + if (typeof define === 'function' && define.amd && define.amd.jQuery) { + define(['jquery'], setup); + } else { + setup(jQuery); + } + +})(); diff --git a/project/static/js/lib/jquery.form.js b/project/static/js/lib/jquery.form.js new file mode 100644 index 0000000..13e9a55 --- /dev/null +++ b/project/static/js/lib/jquery.form.js @@ -0,0 +1,1089 @@ +/*! + * jQuery Form Plugin + * version: 3.14 (30-JUL-2012) + * @requires jQuery v1.3.2 or later + * + * Examples and documentation at: http://malsup.com/jquery/form/ + * Project repository: https://github.com/malsup/form + * Dual licensed under the MIT and GPL licenses: + * http://malsup.github.com/mit-license.txt + * http://malsup.github.com/gpl-license-v2.txt + */ +/*global ActiveXObject alert */ +;(function($) { +"use strict"; + +/* + Usage Note: + ----------- + Do not use both ajaxSubmit and ajaxForm on the same form. These + functions are mutually exclusive. Use ajaxSubmit if you want + to bind your own submit handler to the form. For example, + + $(document).ready(function() { + $('#myForm').on('submit', function(e) { + e.preventDefault(); // <-- important + $(this).ajaxSubmit({ + target: '#output' + }); + }); + }); + + Use ajaxForm when you want the plugin to manage all the event binding + for you. For example, + + $(document).ready(function() { + $('#myForm').ajaxForm({ + target: '#output' + }); + }); + + You can also use ajaxForm with delegation (requires jQuery v1.7+), so the + form does not have to exist when you invoke ajaxForm: + + $('#myForm').ajaxForm({ + delegation: true, + target: '#output' + }); + + When using ajaxForm, the ajaxSubmit function will be invoked for you + at the appropriate time. +*/ + +/** + * Feature detection + */ +var feature = {}; +feature.fileapi = $("").get(0).files !== undefined; +feature.formdata = window.FormData !== undefined; + +/** + * ajaxSubmit() provides a mechanism for immediately submitting + * an HTML form using AJAX. + */ +$.fn.ajaxSubmit = function(options) { + /*jshint scripturl:true */ + + // fast fail if nothing selected (http://dev.jquery.com/ticket/2752) + if (!this.length) { + log('ajaxSubmit: skipping submit process - no element selected'); + return this; + } + + var method, action, url, $form = this; + + if (typeof options == 'function') { + options = { success: options }; + } + + method = this.attr('method'); + action = this.attr('action'); + url = (typeof action === 'string') ? $.trim(action) : ''; + url = url || window.location.href || ''; + if (url) { + // clean url (don't include hash vaue) + url = (url.match(/^([^#]+)/)||[])[1]; + } + + options = $.extend(true, { + url: url, + success: $.ajaxSettings.success, + type: method || 'GET', + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank' + }, options); + + // hook for manipulating the form data before it is extracted; + // convenient for use with rich editors like tinyMCE or FCKEditor + var veto = {}; + this.trigger('form-pre-serialize', [this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-pre-serialize trigger'); + return this; + } + + // provide opportunity to alter form data before it is serialized + if (options.beforeSerialize && options.beforeSerialize(this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSerialize callback'); + return this; + } + + var traditional = options.traditional; + if ( traditional === undefined ) { + traditional = $.ajaxSettings.traditional; + } + + var elements = []; + var qx, a = this.formToArray(options.semantic, elements); + if (options.data) { + options.extraData = options.data; + qx = $.param(options.data, traditional); + } + + // give pre-submit callback an opportunity to abort the submit + if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) { + log('ajaxSubmit: submit aborted via beforeSubmit callback'); + return this; + } + + // fire vetoable 'validate' event + this.trigger('form-submit-validate', [a, this, options, veto]); + if (veto.veto) { + log('ajaxSubmit: submit vetoed via form-submit-validate trigger'); + return this; + } + + var q = $.param(a, traditional); + if (qx) { + q = ( q ? (q + '&' + qx) : qx ); + } + if (options.type.toUpperCase() == 'GET') { + options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q; + options.data = null; // data is null for 'get' + } + else { + options.data = q; // data is the query string for 'post' + } + + var callbacks = []; + if (options.resetForm) { + callbacks.push(function() { $form.resetForm(); }); + } + if (options.clearForm) { + callbacks.push(function() { $form.clearForm(options.includeHidden); }); + } + + // perform a load on the target only if dataType is not provided + if (!options.dataType && options.target) { + var oldSuccess = options.success || function(){}; + callbacks.push(function(data) { + var fn = options.replaceTarget ? 'replaceWith' : 'html'; + $(options.target)[fn](data).each(oldSuccess, arguments); + }); + } + else if (options.success) { + callbacks.push(options.success); + } + + options.success = function(data, status, xhr) { // jQuery 1.4+ passes xhr as 3rd arg + var context = options.context || this ; // jQuery 1.4+ supports scope context + for (var i=0, max=callbacks.length; i < max; i++) { + callbacks[i].apply(context, [data, status, xhr || $form, $form]); + } + }; + + // are there files to upload? + var fileInputs = $('input:file:enabled[value]', this); // [value] (issue #113) + var hasFileInputs = fileInputs.length > 0; + var mp = 'multipart/form-data'; + var multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp); + + var fileAPI = feature.fileapi && feature.formdata; + log("fileAPI :" + fileAPI); + var shouldUseFrame = (hasFileInputs || multipart) && !fileAPI; + + // options.iframe allows user to force iframe mode + // 06-NOV-09: now defaulting to iframe mode if file input is detected + if (options.iframe !== false && (options.iframe || shouldUseFrame)) { + // hack to fix Safari hang (thanks to Tim Molendijk for this) + // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d + if (options.closeKeepAlive) { + $.get(options.closeKeepAlive, function() { + fileUploadIframe(a); + }); + } + else { + fileUploadIframe(a); + } + } + else if ((hasFileInputs || multipart) && fileAPI) { + fileUploadXhr(a); + } + else { + $.ajax(options); + } + + // clear element array + for (var k=0; k < elements.length; k++) + elements[k] = null; + + // fire 'notify' event + this.trigger('form-submit-notify', [this, options]); + return this; + + // XMLHttpRequest Level 2 file uploads (big hat tip to francois2metz) + function fileUploadXhr(a) { + var formdata = new FormData(); + + for (var i=0; i < a.length; i++) { + formdata.append(a[i].name, a[i].value); + } + + if (options.extraData) { + for (var p in options.extraData) + if (options.extraData.hasOwnProperty(p)) + formdata.append(p, options.extraData[p]); + } + + options.data = null; + + var s = $.extend(true, {}, $.ajaxSettings, options, { + contentType: false, + processData: false, + cache: false, + type: 'POST' + }); + + if (options.uploadProgress) { + // workaround because jqXHR does not expose upload property + s.xhr = function() { + var xhr = jQuery.ajaxSettings.xhr(); + if (xhr.upload) { + xhr.upload.onprogress = function(event) { + var percent = 0; + var position = event.loaded || event.position; /*event.position is deprecated*/ + var total = event.total; + if (event.lengthComputable) { + percent = Math.ceil(position / total * 100); + } + options.uploadProgress(event, position, total, percent); + }; + } + return xhr; + }; + } + + s.data = null; + var beforeSend = s.beforeSend; + s.beforeSend = function(xhr, o) { + o.data = formdata; + if(beforeSend) + beforeSend.call(this, xhr, o); + }; + $.ajax(s); + } + + // private function for handling file uploads (hat tip to YAHOO!) + function fileUploadIframe(a) { + var form = $form[0], el, i, s, g, id, $io, io, xhr, sub, n, timedOut, timeoutHandle; + var useProp = !!$.fn.prop; + + if ($(':input[name=submit],:input[id=submit]', form).length) { + // if there is an input with a name or id of 'submit' then we won't be + // able to invoke the submit fn on the form (at least not x-browser) + alert('Error: Form elements must not have name or id of "submit".'); + return; + } + + if (a) { + // ensure that every serialized input is still enabled + for (i=0; i < elements.length; i++) { + el = $(elements[i]); + if ( useProp ) + el.prop('disabled', false); + else + el.removeAttr('disabled'); + } + } + + s = $.extend(true, {}, $.ajaxSettings, options); + s.context = s.context || s; + id = 'jqFormIO' + (new Date().getTime()); + if (s.iframeTarget) { + $io = $(s.iframeTarget); + n = $io.attr('name'); + if (!n) + $io.attr('name', id); + else + id = n; + } + else { + $io = $('