From 16d6a04f802753d7fa6002658a685cae6f73886a Mon Sep 17 00:00:00 2001 From: bahron83 Date: Mon, 4 Jun 2018 14:20:33 +0200 Subject: [PATCH] prepare pr to master --- .gitignore | 9 +- .travis.yml | 6 + Dockerfile | 3 +- Dockerfile.prod | 9 +- LICENSE | 30 +- docker-compose.prod.yml | 43 +- docker-compose.yml | 23 +- documentation/source/architecture.rst | 14 + documentation/source/crm.rst | 23 +- documentation/source/customisation.rst | 2 +- ...ixcrm_architecture_dedicated_webserver.png | Bin 0 -> 58457 bytes ...ixcrm_architecture_dedicated_webserver.svg | 577 + ...oalixcrm_architecture_django_webserver.png | Bin 0 -> 51555 bytes ...oalixcrm_architecture_django_webserver.svg | 579 + documentation/source/images/pdfcreation.png | Bin 0 -> 53470 bytes documentation/source/images/pdfcreation.svg | 136 +- documentation/source/index.rst | 3 +- entrypoint.prod.sh | 7 +- entrypoint.sh | 8 +- koalixcrm/__init__.py | 7 - koalixcrm/accounting/admin.py | 146 +- koalixcrm/accounting/exceptions.py | 17 + .../migrations/0006_auto_20180422_2048.py | 106 + .../migrations/0007_auto_20180422_2105.py | 31 + koalixcrm/accounting/models.py | 399 +- .../default_templates/de/balancesheet.xsl | 7 +- .../de/profitlossstatement.xsl | 8 +- .../default_templates/en/balancesheet.xsl | 97 +- .../en/profitlossstatement.xsl | 8 +- .../en/purchaseconfirmation.xsl | 438 - .../accounting/tests/__init__.py | 0 .../tests/test_accountingModelTest.py | 183 +- koalixcrm/accounting/tests/test_models.py | 6 - koalixcrm/celery.py | 22 - koalixcrm/crm/admin.py | 45 +- koalixcrm/crm/const/contactimport.py | 91 - koalixcrm/crm/const/modeltype.py | 10 - koalixcrm/crm/const/postaladdressprefix.py | 4 - koalixcrm/crm/const/purpose.py | 13 +- koalixcrm/crm/contact/contact.py | 130 +- koalixcrm/crm/contact/customer.py | 276 +- koalixcrm/crm/contact/data_import.py | 25 - koalixcrm/crm/contact/person.py | 8 - koalixcrm/crm/contact/supplier.py | 2 - koalixcrm/crm/documents/activity.py | 22 +- koalixcrm/crm/documents/contract.py | 47 +- koalixcrm/crm/documents/invoice.py | 35 +- koalixcrm/crm/documents/pdfexport.py | 154 +- .../crm/documents/purchaseconfirmation.py | 2 +- koalixcrm/crm/documents/salesdocument.py | 66 +- .../crm/documents/salesdocumentposition.py | 11 + koalixcrm/crm/documents/visit.py | 26 - koalixcrm/crm/exceptions.py | 15 + koalixcrm/crm/forms.py | 27 - .../management/commands/importcontactdata.py | 453 - .../koalixcrm_install_defaulttemplates.py | 21 +- .../crm/migrations/0025_auto_20180220_1640.py | 21 - .../crm/migrations/0025_auto_20180413_1937.py | 126 + .../crm/migrations/0026_auto_20180507_1957.py | 40 + koalixcrm/crm/migrations/0026_call.py | 33 - .../crm/migrations/0027_auto_20180220_2146.py | 38 - .../crm/migrations/0028_auto_20180220_2249.py | 55 - .../crm/migrations/0029_auto_20180220_2348.py | 49 - .../crm/migrations/0030_auto_20180221_1354.py | 25 - .../crm/migrations/0031_auto_20180221_1402.py | 34 - .../crm/migrations/0032_customer_people.py | 20 - .../crm/migrations/0033_auto_20180221_1539.py | 55 - .../crm/migrations/0034_auto_20180221_1555.py | 23 - .../0035_remove_call_template_set.py | 19 - .../crm/migrations/0036_auto_20180221_1612.py | 22 - .../crm/migrations/0037_customer_no_phones.py | 20 - koalixcrm/crm/migrations/0038_person_role.py | 20 - .../crm/migrations/0039_auto_20180221_1916.py | 35 - .../migrations/0040_callforcontact_cperson.py | 21 - .../crm/migrations/0041_auto_20180221_2048.py | 26 - .../crm/migrations/0042_auto_20180221_2056.py | 40 - .../crm/migrations/0043_auto_20180221_2057.py | 25 - .../migrations/0044_remove_customer_people.py | 19 - .../0045_remove_person_customers.py | 19 - .../crm/migrations/0046_auto_20180221_2112.py | 45 - .../crm/migrations/0047_auto_20180222_1101.py | 26 - .../crm/migrations/0048_auto_20180222_1350.py | 46 - .../crm/migrations/0049_auto_20180222_1358.py | 23 - .../crm/migrations/0050_auto_20180222_1554.py | 27 - .../crm/migrations/0051_auto_20180222_1740.py | 20 - .../crm/migrations/0052_auto_20180223_1609.py | 20 - .../crm/migrations/0053_auto_20180224_1614.py | 39 - .../crm/migrations/0054_auto_20180224_1954.py | 20 - .../crm/migrations/0055_auto_20180224_2002.py | 32 - .../crm/migrations/0056_auto_20180224_2039.py | 26 - .../crm/migrations/0057_visitforcontact.py | 31 - .../crm/migrations/0058_contactimportdata.py | 27 - koalixcrm/crm/migrations/0059_attributeset.py | 26 - koalixcrm/crm/migrations/0060_attribute.py | 29 - .../migrations/0061_product_attribute_set.py | 22 - .../crm/migrations/0062_auto_20180408_1757.py | 49 - .../crm/migrations/0063_auto_20180408_1918.py | 19 - .../crm/migrations/0064_auto_20180408_1929.py | 24 - .../0065_productattributeassociation.py | 29 - .../crm/migrations/0066_auto_20180409_1952.py | 30 - .../crm/migrations/0067_productforcustomer.py | 30 - .../0068_productforcustomer_product.py | 21 - .../crm/migrations/0069_auto_20180415_1626.py | 31 - .../crm/migrations/0070_auto_20180428_1619.py | 30 - .../crm/migrations/0071_auto_20180510_0929.py | 20 - .../crm/migrations/0072_auto_20180510_1531.py | 30 - .../migrations/0073_phonesystemforcustomer.py | 30 - .../crm/migrations/0074_auto_20180511_1005.py | 25 - .../crm/migrations/0075_auto_20180519_1530.py | 95 - koalixcrm/crm/models.py | 7 +- koalixcrm/crm/product/attribute.py | 39 - koalixcrm/crm/product/phonesystem.py | 20 - koalixcrm/crm/product/product.py | 49 +- koalixcrm/crm/reporting/__init__.py | 0 .../crm/reporting/employeeassignmenttotask.py | 31 + koalixcrm/crm/reporting/generictasklink.py | 28 + koalixcrm/crm/reporting/task.py | 102 + koalixcrm/crm/reporting/tasklinktype.py | 32 + koalixcrm/crm/reporting/taskstatus.py | 44 + koalixcrm/crm/reporting/urls.py | 10 + koalixcrm/crm/reporting/work.py | 99 + .../default_templates/de/deliveryorder.xsl | 1 + .../static/default_templates/de/invoice.xsl | 12 +- .../de/purchaseconfirmation.xsl | 1 + .../default_templates/de/purchaseorder.xsl | 1 + .../crm/static/default_templates/de/quote.xsl | 17 +- .../default_templates/en/deliveryorder.xsl | 1 + .../static/default_templates/en/invoice.xsl | 1 + .../en/purchaseconfirmation.xsl | 1 + .../default_templates/en/purchaseorder.xsl | 1 + .../crm/static/default_templates/en/quote.xsl | 1 + koalixcrm/crm/static/taskslookup.js | 15 + koalixcrm/crm/tasks.py | 33 - .../templates/crm/admin/registerPayment.html | 33 - .../templates/crm/admin/register_payment.html | 35 + .../templates/crm/admin/time_reporting.html | 104 + koalixcrm/crm/tests/__init__.py | 0 .../crm/tests/test_calculations_document.py | 114 + .../crm/tests/test_calculations_reporting.py | 180 + koalixcrm/crm/views.py | 105 - koalixcrm/crm/views/__init__.py | 0 koalixcrm/crm/views/monthlyreport.py | 217 + koalixcrm/crm/views/newdocument.py | 55 + koalixcrm/crm/views/pdfexport.py | 64 + koalixcrm/crm/views/restinterface.py | 31 + koalixcrm/djangoUserExtension/models.py | 31 + koalixcrm/subscriptions/admin.py | 6 +- log.txt | 1 - manage.py | 8 - projectsettings/__init__.py | 2 +- projectsettings/dashboard.py | 33 +- projectsettings/environment/development.env | 26 - .../data_files/contatti_test_import.xlsx | Bin 7581 -> 0 bytes .../contatti_test_import_14c4p1e.xlsx | Bin 8270 -> 0 bytes .../contatti_test_import_2Ecm1nx.xlsx | Bin 7619 -> 0 bytes .../contatti_test_import_2Q0f0Zy.xlsx | Bin 7619 -> 0 bytes .../contatti_test_import_59jaJH0.xlsx | Bin 8270 -> 0 bytes .../contatti_test_import_7b3skjA.xlsx | Bin 7583 -> 0 bytes .../contatti_test_import_8aYQ3xJ.xlsx | Bin 7619 -> 0 bytes .../contatti_test_import_90JUfUo.xlsx | Bin 7619 -> 0 bytes .../contatti_test_import_9lsOIXx.xlsx | Bin 7583 -> 0 bytes .../contatti_test_import_Fm0MG2h.xlsx | Bin 7581 -> 0 bytes .../contatti_test_import_JTAMGeo.xlsx | Bin 7617 -> 0 bytes .../contatti_test_import_KXuANep.xlsx | Bin 8213 -> 0 bytes .../contatti_test_import_L6y0dNG.xlsx | Bin 8270 -> 0 bytes .../contatti_test_import_MyQf5YE.xlsx | Bin 7583 -> 0 bytes .../contatti_test_import_PhiTotE.xlsx | Bin 7581 -> 0 bytes .../contatti_test_import_Pp3Y24G.xlsx | Bin 7583 -> 0 bytes .../contatti_test_import_RBsEYue.xlsx | Bin 7584 -> 0 bytes .../contatti_test_import_TMu9Rpx.xlsx | Bin 7619 -> 0 bytes .../contatti_test_import_VNk0e5B.xlsx | Bin 7583 -> 0 bytes .../contatti_test_import_bEqWmXS.xlsx | Bin 7619 -> 0 bytes .../contatti_test_import_e7bCzzS.xlsx | Bin 7583 -> 0 bytes .../contatti_test_import_fhn9Ujs.xlsx | Bin 7584 -> 0 bytes .../contatti_test_import_gqwz2BY.xlsx | Bin 7619 -> 0 bytes .../contatti_test_import_l0huEta.xlsx | Bin 7581 -> 0 bytes .../contatti_test_import_qt1Ckwh.xlsx | Bin 7617 -> 0 bytes .../media/data_files/fornitori.xlsx | Bin 7894 -> 0 bytes .../media/data_files/fornitori_Y8lxpZd.xlsx | Bin 7894 -> 0 bytes projectsettings/services/django-uwsgi.ini | 45 - projectsettings/services/webserver/Dockerfile | 15 - .../services/webserver/config/localhost.crt | 18 - .../services/webserver/config/localhost.key | 27 - .../services/webserver/config/nginx.tmpl | 61 - .../services/webserver/config/start.sh | 4 - projectsettings/settings/base_settings.py | 8 +- .../settings/development_settings.py | 22 +- projectsettings/static/admin/css/base.css | 978 - .../static/admin/css/changelists.css | 344 - .../static/admin/css/dashboard.css | 27 - projectsettings/static/admin/css/fonts.css | 20 - projectsettings/static/admin/css/forms.css | 515 - projectsettings/static/admin/css/login.css | 78 - projectsettings/static/admin/css/rtl.css | 264 - projectsettings/static/admin/css/widgets.css | 565 - .../static/admin/fonts/LICENSE.txt | 202 - projectsettings/static/admin/fonts/README.txt | 2 - .../admin/fonts/Roboto-Bold-webfont.woff | Bin 82564 -> 0 bytes .../admin/fonts/Roboto-Light-webfont.woff | Bin 81348 -> 0 bytes .../admin/fonts/Roboto-Regular-webfont.woff | Bin 80304 -> 0 bytes projectsettings/static/admin/img/LICENSE | 20 - projectsettings/static/admin/img/README.txt | 7 - .../static/admin/img/calendar-icons.svg | 14 - .../static/admin/img/gis/move_vertex_off.svg | 1 - .../static/admin/img/gis/move_vertex_on.svg | 1 - .../static/admin/img/icon-addlink.svg | 3 - .../static/admin/img/icon-alert.svg | 3 - .../static/admin/img/icon-calendar.svg | 9 - .../static/admin/img/icon-changelink.svg | 3 - .../static/admin/img/icon-clock.svg | 9 - .../static/admin/img/icon-deletelink.svg | 3 - projectsettings/static/admin/img/icon-no.svg | 3 - .../static/admin/img/icon-unknown-alt.svg | 3 - .../static/admin/img/icon-unknown.svg | 3 - projectsettings/static/admin/img/icon-yes.svg | 3 - .../static/admin/img/inline-delete.svg | 3 - projectsettings/static/admin/img/search.svg | 3 - .../static/admin/img/selector-icons.svg | 34 - .../static/admin/img/sorting-icons.svg | 19 - .../static/admin/img/tooltag-add.svg | 3 - .../static/admin/img/tooltag-arrowright.svg | 3 - projectsettings/static/admin/js/SelectBox.js | 144 - .../static/admin/js/SelectFilter2.js | 236 - projectsettings/static/admin/js/actions.js | 154 - .../static/admin/js/actions.min.js | 154 - .../admin/js/admin/DateTimeShortcuts.js | 3 - .../admin/js/admin/RelatedObjectLookups.js | 196 - projectsettings/static/admin/js/calendar.js | 3 - projectsettings/static/admin/js/cancel.js | 9 - .../static/admin/js/change_form.js | 20 - projectsettings/static/admin/js/collapse.js | 3 - .../static/admin/js/collapse.min.js | 3 - projectsettings/static/admin/js/core.js | 250 - projectsettings/static/admin/js/inlines.js | 3 - .../static/admin/js/inlines.min.js | 3 - .../static/admin/js/jquery.init.js | 3 - .../static/admin/js/popup_response.js | 16 - .../static/admin/js/prepopulate.js | 42 - .../static/admin/js/prepopulate.min.js | 42 - .../static/admin/js/prepopulate_init.js | 10 - projectsettings/static/admin/js/timeparse.js | 3 - projectsettings/static/admin/js/urlify.js | 179 - .../admin/js/vendor/jquery/LICENSE-JQUERY.txt | 26 - .../static/admin/js/vendor/jquery/jquery.js | 3 - .../admin/js/vendor/jquery/jquery.min.js | 3 - .../js/vendor/xregexp/LICENSE-XREGEXP.txt | 21 - .../static/admin/js/vendor/xregexp/xregexp.js | 2307 -- .../admin/js/vendor/xregexp/xregexp.min.js | 18 - .../default_templates/de/balancesheet.xsl | 229 - .../default_templates/de/deliveryorder.xsl | 591 - .../static/default_templates/de/invoice.xsl | 591 - .../de/profitlossstatement.xsl | 227 - .../de/purchaseconfirmation.xsl | 591 - .../default_templates/de/purchaseorder.xsl | 591 - .../static/default_templates/de/quote.xsl | 591 - .../default_templates/en/balancesheet.xsl | 229 - .../default_templates/en/deliveryorder.xsl | 591 - .../static/default_templates/en/invoice.xsl | 591 - .../en/profitlossstatement.xsl | 234 - .../en/purchaseconfirmation.xsl | 591 - .../default_templates/en/purchaseorder.xsl | 591 - .../static/default_templates/en/quote.xsl | 591 - .../generic/DejaVuSans-Bold.ttf | Bin 704128 -> 0 bytes .../default_templates/generic/DejaVuSans.ttf | Bin 756072 -> 0 bytes .../generic/dejavusans-bold.xml | 1 - .../default_templates/generic/dejavusans.xml | 1 - .../default_templates/generic/fontconfig.xml | 164 - .../static/default_templates/generic/logo.jpg | Bin 54101 -> 0 bytes .../static/filebrowser/css/filebrowser.css | 352 - .../static/filebrowser/css/uploadfield.css | 1 - .../static/filebrowser/img/TEST_IMAGE_000.jpg | Bin 870037 -> 0 bytes .../static/filebrowser/img/cancel.png | Bin 236 -> 0 bytes .../static/filebrowser/img/cancel_hover.png | Bin 236 -> 0 bytes .../static/filebrowser/img/completed.png | Bin 1122 -> 0 bytes .../filebrowser/img/fb-upload-spinner.gif | Bin 3027 -> 0 bytes .../static/filebrowser/img/fb-upload.png | Bin 1090 -> 0 bytes .../filebrowser/img/fb-upload_hover.png | Bin 1091 -> 0 bytes .../img/icon-pulldown-versions-active.png | Bin 165 -> 0 bytes .../img/icon-pulldown-versions-hover.png | Bin 165 -> 0 bytes .../img/icon-pulldown-versions.png | Bin 165 -> 0 bytes .../filebrowser/img/progress-bar-content.png | Bin 367 -> 0 bytes .../static/filebrowser/img/testimage.jpg | Bin 870037 -> 0 bytes .../static/filebrowser/js/AddFileBrowser.js | 42 - .../static/filebrowser/js/FB_CKEditor.js | 23 - .../filebrowser/js/FB_FileBrowseField.js | 32 - .../static/filebrowser/js/FB_TinyMCE.js | 28 - .../static/filebrowser/js/TinyMCEAdmin.js | 144 - .../static/filebrowser/js/fileuploader.js | 1250 - .../images/backgrounds/changelist-results.png | Bin 244 -> 0 bytes .../images/backgrounds/loading-small.gif | Bin 3027 -> 0 bytes .../images/backgrounds/messagelist.png | Bin 1247 -> 0 bytes .../images/backgrounds/nav-grabber.gif | Bin 116 -> 0 bytes .../backgrounds/ui-sortable-placeholder.png | Bin 259 -> 0 bytes .../grappelli/images/icons-s846f870921.png | Bin 9306 -> 0 bytes .../images/icons-small-scbbb475e49.png | Bin 926 -> 0 bytes .../grappelli/images/icons-small/add-link.png | Bin 986 -> 0 bytes .../images/icons-small/add-link_hover.png | Bin 986 -> 0 bytes .../images/icons-small/change-link.png | Bin 963 -> 0 bytes .../images/icons-small/change-link_hover.png | Bin 963 -> 0 bytes .../images/icons-small/delete-link.png | Bin 979 -> 0 bytes .../icons-small/filter-choice-selected.png | Bin 1098 -> 0 bytes .../images/icons-small/link-external.png | Bin 1030 -> 0 bytes .../icons-small/link-external_hover.png | Bin 1030 -> 0 bytes .../images/icons-small/link-internal.png | Bin 1020 -> 0 bytes .../icons-small/link-internal_hover.png | Bin 1022 -> 0 bytes .../images/icons-small/sort-remove.png | Bin 979 -> 0 bytes .../grappelli/images/icons/add-another.png | Bin 1000 -> 0 bytes .../images/icons/add-another_hover.png | Bin 1000 -> 0 bytes .../grappelli/images/icons/back-link.png | Bin 1009 -> 0 bytes .../images/icons/back-link_hover.png | Bin 1009 -> 0 bytes .../images/icons/breadcrumbs-rtl.png | Bin 1103 -> 0 bytes .../images/icons/breadcrumbs-rtl_hover.png | Bin 1104 -> 0 bytes .../grappelli/images/icons/breadcrumbs.png | Bin 1098 -> 0 bytes .../images/icons/breadcrumbs_hover.png | Bin 1094 -> 0 bytes .../images/icons/date-hierarchy-back-rtl.png | Bin 1092 -> 0 bytes .../icons/date-hierarchy-back-rtl_hover.png | Bin 1092 -> 0 bytes .../images/icons/date-hierarchy-back.png | Bin 1018 -> 0 bytes .../icons/date-hierarchy-back_hover.png | Bin 1018 -> 0 bytes .../grappelli/images/icons/datepicker.png | Bin 256 -> 0 bytes .../images/icons/datepicker_hover.png | Bin 265 -> 0 bytes .../grappelli/images/icons/datetime-now.png | Bin 1181 -> 0 bytes .../images/icons/datetime-now_hover.png | Bin 1136 -> 0 bytes .../grappelli/images/icons/form-select.png | Bin 289 -> 0 bytes .../images/icons/object-tools-add-link.png | Bin 1056 -> 0 bytes .../icons/object-tools-viewsite-link.png | Bin 1082 -> 0 bytes .../images/icons/pulldown-handler.png | Bin 225 -> 0 bytes .../images/icons/pulldown-handler_hover.png | Bin 228 -> 0 bytes .../icons/pulldown-handler_selected.png | Bin 228 -> 0 bytes .../images/icons/related-lookup-m2m.png | Bin 375 -> 0 bytes .../images/icons/related-lookup-m2m_hover.png | Bin 368 -> 0 bytes .../grappelli/images/icons/related-lookup.png | Bin 374 -> 0 bytes .../images/icons/related-lookup_hover.png | Bin 377 -> 0 bytes .../grappelli/images/icons/related-remove.png | Bin 1107 -> 0 bytes .../images/icons/related-remove_hover.png | Bin 1106 -> 0 bytes .../grappelli/images/icons/searchbox.png | Bin 3136 -> 0 bytes .../icons/selector-add-m2m-horizontal.png | Bin 2991 -> 0 bytes .../selector-add-m2m-horizontal_hover.png | Bin 2995 -> 0 bytes .../icons/selector-add-m2m-vertical.png | Bin 3023 -> 0 bytes .../icons/selector-add-m2m-vertical_hover.png | Bin 3023 -> 0 bytes .../images/icons/selector-filter.png | Bin 247 -> 0 bytes .../icons/selector-remove-m2m-horizontal.png | Bin 2998 -> 0 bytes .../selector-remove-m2m-horizontal_hover.png | Bin 3003 -> 0 bytes .../icons/selector-remove-m2m-vertical.png | Bin 3009 -> 0 bytes .../selector-remove-m2m-vertical_hover.png | Bin 3009 -> 0 bytes .../grappelli/images/icons/sort-remove.png | Bin 1130 -> 0 bytes .../images/icons/sort-remove_hover.png | Bin 1130 -> 0 bytes .../images/icons/sorted-ascending.png | Bin 1150 -> 0 bytes .../images/icons/sorted-descending.png | Bin 1148 -> 0 bytes .../grappelli/images/icons/status-no.png | Bin 323 -> 0 bytes .../grappelli/images/icons/status-unknown.png | Bin 406 -> 0 bytes .../grappelli/images/icons/status-yes.png | Bin 396 -> 0 bytes .../grappelli/images/icons/th-ascending.png | Bin 243 -> 0 bytes .../grappelli/images/icons/th-descending.png | Bin 240 -> 0 bytes .../grappelli/images/icons/timepicker.png | Bin 466 -> 0 bytes .../images/icons/timepicker_hover.png | Bin 463 -> 0 bytes .../images/icons/tools-add-handler.png | Bin 226 -> 0 bytes .../images/icons/tools-add-handler_hover.png | Bin 196 -> 0 bytes .../images/icons/tools-arrow-down-handler.png | Bin 228 -> 0 bytes .../icons/tools-arrow-down-handler_hover.png | Bin 225 -> 0 bytes .../images/icons/tools-arrow-up-handler.png | Bin 217 -> 0 bytes .../icons/tools-arrow-up-handler_hover.png | Bin 217 -> 0 bytes .../images/icons/tools-close-handler.png | Bin 256 -> 0 bytes .../icons/tools-close-handler_hover.png | Bin 270 -> 0 bytes .../icons/tools-delete-handler-predelete.png | Bin 1297 -> 0 bytes .../images/icons/tools-delete-handler.png | Bin 210 -> 0 bytes .../icons/tools-delete-handler_hover.png | Bin 237 -> 0 bytes .../images/icons/tools-drag-handler.png | Bin 253 -> 0 bytes .../images/icons/tools-drag-handler_hover.png | Bin 221 -> 0 bytes .../images/icons/tools-open-handler.png | Bin 274 -> 0 bytes .../images/icons/tools-open-handler_hover.png | Bin 274 -> 0 bytes .../images/icons/tools-remove-handler.png | Bin 180 -> 0 bytes .../icons/tools-remove-handler_hover.png | Bin 161 -> 0 bytes .../images/icons/tools-trash-handler.png | Bin 269 -> 0 bytes .../icons/tools-trash-handler_hover.png | Bin 277 -> 0 bytes .../icons/tools-trash-list-toggle-handler.png | Bin 263 -> 0 bytes .../tools-trash-list-toggle-handler_hover.png | Bin 219 -> 0 bytes .../images/icons/tools-viewsite-link.png | Bin 251 -> 0 bytes .../icons/tools-viewsite-link_hover.png | Bin 208 -> 0 bytes .../images/icons/ui-datepicker-next.png | Bin 1007 -> 0 bytes .../images/icons/ui-datepicker-next_hover.png | Bin 1007 -> 0 bytes .../images/icons/ui-datepicker-prev.png | Bin 1009 -> 0 bytes .../images/icons/ui-datepicker-prev_hover.png | Bin 1009 -> 0 bytes .../static/grappelli/img/admin/arrow-down.gif | Bin 80 -> 0 bytes .../static/grappelli/img/admin/arrow-up.gif | Bin 838 -> 0 bytes .../grappelli/jquery/LICENSE-JQUERY.txt | 26 - .../static/grappelli/jquery/jquery.min.js | 4 - .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 418 -> 0 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 312 -> 0 bytes .../ui/images/ui-bg_flat_10_000000_40x100.png | Bin 205 -> 0 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 348 -> 0 bytes .../ui/images/ui-bg_glass_65_ffffff_1x400.png | Bin 207 -> 0 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 5815 -> 0 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 278 -> 0 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 328 -> 0 bytes .../ui/images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../ui/images/ui-icons_228ef1_256x240.png | Bin 4549 -> 0 bytes .../ui/images/ui-icons_ef8c08_256x240.png | Bin 4549 -> 0 bytes .../ui/images/ui-icons_ffd27a_256x240.png | Bin 4549 -> 0 bytes .../ui/images/ui-icons_ffffff_256x240.png | Bin 6299 -> 0 bytes .../static/grappelli/jquery/ui/index.html | 513 - .../static/grappelli/jquery/ui/jquery-ui.css | 1225 - .../static/grappelli/jquery/ui/jquery-ui.js | 16617 -------------- .../grappelli/jquery/ui/jquery-ui.min.css | 7 - .../grappelli/jquery/ui/jquery-ui.min.js | 13 - .../jquery/ui/jquery-ui.structure.css | 833 - .../jquery/ui/jquery-ui.structure.min.css | 5 - .../grappelli/jquery/ui/jquery-ui.theme.css | 410 - .../jquery/ui/jquery-ui.theme.min.css | 5 - .../static/grappelli/js/grappelli.js | 174 - .../static/grappelli/js/grappelli.min.js | 1 - .../js/jquery.grp_autocomplete_fk.js | 146 - .../js/jquery.grp_autocomplete_generic.js | 183 - .../js/jquery.grp_autocomplete_m2m.js | 203 - .../grappelli/js/jquery.grp_collapsible.js | 35 - .../js/jquery.grp_collapsible_group.js | 54 - .../static/grappelli/js/jquery.grp_inline.js | 217 - .../grappelli/js/jquery.grp_related_fk.js | 66 - .../js/jquery.grp_related_generic.js | 89 - .../grappelli/js/jquery.grp_related_m2m.js | 62 - .../grappelli/js/jquery.grp_timepicker.js | 186 - .../stylesheets/mueller/grid/output-rtl.css | 1 - .../stylesheets/mueller/grid/output.css | 1 - .../stylesheets/partials/custom/tinymce.css | 1 - .../static/grappelli/stylesheets/rtl.css | 1 - .../static/grappelli/stylesheets/screen.css | 1 - .../static/grappelli/tinymce/changelog.txt | 477 - .../tinymce/examples/accessibility.html | 101 - .../tinymce/examples/css/content.css | 105 - .../grappelli/tinymce/examples/css/word.css | 53 - .../tinymce/examples/custom_formats.html | 111 - .../grappelli/tinymce/examples/full.html | 101 - .../grappelli/tinymce/examples/index.html | 10 - .../tinymce/examples/lists/image_list.js | 9 - .../tinymce/examples/lists/link_list.js | 10 - .../tinymce/examples/lists/media_list.js | 14 - .../tinymce/examples/lists/template_list.js | 9 - .../grappelli/tinymce/examples/media/logo.jpg | Bin 2729 -> 0 bytes .../tinymce/examples/media/logo_over.jpg | Bin 6473 -> 0 bytes .../tinymce/examples/media/sample.avi | Bin 82944 -> 0 bytes .../tinymce/examples/media/sample.dcr | Bin 6774 -> 0 bytes .../tinymce/examples/media/sample.flv | Bin 88722 -> 0 bytes .../tinymce/examples/media/sample.mov | Bin 55622 -> 0 bytes .../tinymce/examples/media/sample.ram | 1 - .../tinymce/examples/media/sample.rm | Bin 17846 -> 0 bytes .../tinymce/examples/media/sample.swf | Bin 6118 -> 0 bytes .../grappelli/tinymce/examples/menu.html | 18 - .../grappelli/tinymce/examples/simple.html | 47 - .../grappelli/tinymce/examples/skins.html | 216 - .../tinymce/examples/templates/layout1.htm | 15 - .../tinymce/examples/templates/snippet1.htm | 1 - .../grappelli/tinymce/examples/word.html | 72 - .../tinymce/jscripts/tiny_mce/langs/en.js | 1 - .../tinymce/jscripts/tiny_mce/license.txt | 504 - .../tiny_mce/plugins/advhr/css/advhr.css | 5 - .../tiny_mce/plugins/advhr/editor_plugin.js | 1 - .../plugins/advhr/editor_plugin_src.js | 57 - .../tiny_mce/plugins/advhr/js/rule.js | 43 - .../tiny_mce/plugins/advhr/langs/en_dlg.js | 1 - .../jscripts/tiny_mce/plugins/advhr/rule.htm | 58 - .../plugins/advimage/css/advimage.css | 12 - .../plugins/advimage/editor_plugin.js | 1 - .../plugins/advimage/editor_plugin_src.js | 50 - .../tiny_mce/plugins/advimage/image.htm | 222 - .../tiny_mce/plugins/advimage/img/sample.gif | Bin 1624 -> 0 bytes .../tiny_mce/plugins/advimage/js/image.js | 464 - .../tiny_mce/plugins/advimage/langs/en_dlg.js | 1 - .../plugins/advimage_orig/css/advimage.css | 13 - .../plugins/advimage_orig/editor_plugin.js | 1 - .../advimage_orig/editor_plugin_src.js | 50 - .../tiny_mce/plugins/advimage_orig/image.htm | 235 - .../plugins/advimage_orig/img/sample.gif | Bin 1624 -> 0 bytes .../plugins/advimage_orig/js/image.js | 464 - .../plugins/advimage_orig/langs/en_dlg.js | 1 - .../tiny_mce/plugins/advlink/css/advlink.css | 8 - .../tiny_mce/plugins/advlink/editor_plugin.js | 1 - .../plugins/advlink/editor_plugin_src.js | 61 - .../tiny_mce/plugins/advlink/js/advlink.js | 543 - .../tiny_mce/plugins/advlink/langs/en_dlg.js | 1 - .../tiny_mce/plugins/advlink/link.htm | 371 - .../plugins/advlink_orig/css/advlink.css | 8 - .../plugins/advlink_orig/editor_plugin.js | 1 - .../plugins/advlink_orig/editor_plugin_src.js | 61 - .../plugins/advlink_orig/js/advlink.js | 543 - .../plugins/advlink_orig/langs/en_dlg.js | 1 - .../tiny_mce/plugins/advlink_orig/link.htm | 338 - .../tiny_mce/plugins/advlist/editor_plugin.js | 1 - .../plugins/advlist/editor_plugin_src.js | 176 - .../plugins/autolink/editor_plugin.js | 1 - .../plugins/autolink/editor_plugin_src.js | 184 - .../plugins/autoresize/editor_plugin.js | 1 - .../plugins/autoresize/editor_plugin_src.js | 119 - .../plugins/autosave/editor_plugin.js | 1 - .../plugins/autosave/editor_plugin_src.js | 433 - .../tiny_mce/plugins/bbcode/editor_plugin.js | 1 - .../plugins/bbcode/editor_plugin_src.js | 120 - .../plugins/contextmenu/editor_plugin.js | 1 - .../plugins/contextmenu/editor_plugin_src.js | 163 - .../plugins/directionality/editor_plugin.js | 1 - .../directionality/editor_plugin_src.js | 85 - .../plugins/emotions/editor_plugin.js | 1 - .../plugins/emotions/editor_plugin_src.js | 43 - .../tiny_mce/plugins/emotions/emotions.htm | 42 - .../plugins/emotions/img/smiley-cool.gif | Bin 354 -> 0 bytes .../plugins/emotions/img/smiley-cry.gif | Bin 329 -> 0 bytes .../emotions/img/smiley-embarassed.gif | Bin 331 -> 0 bytes .../emotions/img/smiley-foot-in-mouth.gif | Bin 342 -> 0 bytes .../plugins/emotions/img/smiley-frown.gif | Bin 340 -> 0 bytes .../plugins/emotions/img/smiley-innocent.gif | Bin 336 -> 0 bytes .../plugins/emotions/img/smiley-kiss.gif | Bin 338 -> 0 bytes .../plugins/emotions/img/smiley-laughing.gif | Bin 343 -> 0 bytes .../emotions/img/smiley-money-mouth.gif | Bin 321 -> 0 bytes .../plugins/emotions/img/smiley-sealed.gif | Bin 323 -> 0 bytes .../plugins/emotions/img/smiley-smile.gif | Bin 344 -> 0 bytes .../plugins/emotions/img/smiley-surprised.gif | Bin 338 -> 0 bytes .../emotions/img/smiley-tongue-out.gif | Bin 328 -> 0 bytes .../plugins/emotions/img/smiley-undecided.gif | Bin 337 -> 0 bytes .../plugins/emotions/img/smiley-wink.gif | Bin 350 -> 0 bytes .../plugins/emotions/img/smiley-yell.gif | Bin 336 -> 0 bytes .../tiny_mce/plugins/emotions/js/emotions.js | 43 - .../tiny_mce/plugins/emotions/langs/en_dlg.js | 1 - .../tiny_mce/plugins/example/dialog.htm | 22 - .../tiny_mce/plugins/example/editor_plugin.js | 1 - .../plugins/example/editor_plugin_src.js | 84 - .../tiny_mce/plugins/example/img/example.gif | Bin 87 -> 0 bytes .../tiny_mce/plugins/example/js/dialog.js | 19 - .../tiny_mce/plugins/example/langs/en.js | 3 - .../tiny_mce/plugins/example/langs/en_dlg.js | 3 - .../example_dependency/editor_plugin.js | 1 - .../example_dependency/editor_plugin_src.js | 50 - .../plugins/fullpage/css/fullpage.css | 143 - .../plugins/fullpage/editor_plugin.js | 1 - .../plugins/fullpage/editor_plugin_src.js | 405 - .../tiny_mce/plugins/fullpage/fullpage.htm | 259 - .../tiny_mce/plugins/fullpage/js/fullpage.js | 232 - .../tiny_mce/plugins/fullpage/langs/en_dlg.js | 1 - .../plugins/fullscreen/editor_plugin.js | 1 - .../plugins/fullscreen/editor_plugin_src.js | 159 - .../plugins/fullscreen/fullscreen.htm | 110 - .../plugins/grappelli/editor_plugin.js | 1 - .../plugins/grappelli/editor_plugin_src.js | 206 - .../plugins/grappelli/img/show_advanced.png | Bin 320 -> 0 bytes .../plugins/grappelli/img/visualchars.png | Bin 285 -> 0 bytes .../tiny_mce/plugins/grappelli/langs/cs.js | 4 - .../tiny_mce/plugins/grappelli/langs/de.js | 4 - .../tiny_mce/plugins/grappelli/langs/en.js | 4 - .../tiny_mce/plugins/grappelli/langs/fr.js | 4 - .../tiny_mce/plugins/grappelli/langs/pl.js | 4 - .../tiny_mce/plugins/grappelli/langs/ru.js | 4 - .../grappelli_contextmenu/editor_plugin.js | 1 - .../editor_plugin_src.js | 250 - .../plugins/grappelli_contextmenu/langs/cs.js | 19 - .../plugins/grappelli_contextmenu/langs/de.js | 20 - .../plugins/grappelli_contextmenu/langs/en.js | 20 - .../plugins/grappelli_contextmenu/langs/fr.js | 10 - .../plugins/grappelli_contextmenu/langs/pl.js | 19 - .../plugins/grappelli_contextmenu/langs/ru.js | 20 - .../tiny_mce/plugins/iespell/editor_plugin.js | 1 - .../plugins/iespell/editor_plugin_src.js | 54 - .../plugins/inlinepopups/editor_plugin.js | 1 - .../plugins/inlinepopups/editor_plugin_src.js | 699 - .../skins/clearlooks2/img/alert.gif | Bin 810 -> 0 bytes .../skins/clearlooks2/img/button.gif | Bin 272 -> 0 bytes .../skins/clearlooks2/img/buttons.gif | Bin 1195 -> 0 bytes .../skins/clearlooks2/img/confirm.gif | Bin 907 -> 0 bytes .../skins/clearlooks2/img/corners.gif | Bin 909 -> 0 bytes .../skins/clearlooks2/img/horizontal.gif | Bin 769 -> 0 bytes .../skins/clearlooks2/img/vertical.gif | Bin 84 -> 0 bytes .../inlinepopups/skins/clearlooks2/window.css | 90 - .../plugins/inlinepopups/template.htm | 387 - .../plugins/insertdatetime/editor_plugin.js | 1 - .../insertdatetime/editor_plugin_src.js | 83 - .../tiny_mce/plugins/layer/editor_plugin.js | 1 - .../plugins/layer/editor_plugin_src.js | 262 - .../plugins/legacyoutput/editor_plugin.js | 1 - .../plugins/legacyoutput/editor_plugin_src.js | 139 - .../tiny_mce/plugins/lists/editor_plugin.js | 1 - .../plugins/lists/editor_plugin_src.js | 955 - .../tiny_mce/plugins/media/css/media.css | 17 - .../tiny_mce/plugins/media/editor_plugin.js | 1 - .../plugins/media/editor_plugin_src.js | 898 - .../tiny_mce/plugins/media/js/embed.js | 73 - .../tiny_mce/plugins/media/js/media.js | 513 - .../tiny_mce/plugins/media/langs/en_dlg.js | 1 - .../jscripts/tiny_mce/plugins/media/media.htm | 819 - .../tiny_mce/plugins/media/moxieplayer.swf | Bin 19980 -> 0 bytes .../tiny_mce/plugins/media_orig/css/media.css | 17 - .../plugins/media_orig/editor_plugin.js | 1 - .../plugins/media_orig/editor_plugin_src.js | 898 - .../tiny_mce/plugins/media_orig/js/embed.js | 73 - .../tiny_mce/plugins/media_orig/js/media.js | 513 - .../plugins/media_orig/langs/en_dlg.js | 1 - .../tiny_mce/plugins/media_orig/media.htm | 922 - .../plugins/media_orig/moxieplayer.swf | Bin 19980 -> 0 bytes .../plugins/nonbreaking/editor_plugin.js | 1 - .../plugins/nonbreaking/editor_plugin_src.js | 54 - .../plugins/noneditable/editor_plugin.js | 1 - .../plugins/noneditable/editor_plugin_src.js | 537 - .../plugins/pagebreak/editor_plugin.js | 1 - .../plugins/pagebreak/editor_plugin_src.js | 74 - .../tiny_mce/plugins/paste/editor_plugin.js | 1 - .../plugins/paste/editor_plugin_src.js | 885 - .../tiny_mce/plugins/paste/js/pastetext.js | 36 - .../tiny_mce/plugins/paste/js/pasteword.js | 51 - .../tiny_mce/plugins/paste/langs/en_dlg.js | 1 - .../tiny_mce/plugins/paste/pastetext.htm | 33 - .../tiny_mce/plugins/paste/pasteword.htm | 21 - .../plugins/paste_orig/editor_plugin.js | 1 - .../plugins/paste_orig/editor_plugin_src.js | 885 - .../plugins/paste_orig/js/pastetext.js | 36 - .../plugins/paste_orig/js/pasteword.js | 51 - .../plugins/paste_orig/langs/en_dlg.js | 1 - .../tiny_mce/plugins/paste_orig/pastetext.htm | 27 - .../tiny_mce/plugins/paste_orig/pasteword.htm | 21 - .../tiny_mce/plugins/preview/editor_plugin.js | 1 - .../plugins/preview/editor_plugin_src.js | 53 - .../tiny_mce/plugins/preview/example.html | 28 - .../plugins/preview/jscripts/embed.js | 73 - .../tiny_mce/plugins/preview/preview.html | 17 - .../tiny_mce/plugins/print/editor_plugin.js | 1 - .../plugins/print/editor_plugin_src.js | 34 - .../tiny_mce/plugins/save/editor_plugin.js | 1 - .../plugins/save/editor_plugin_src.js | 101 - .../searchreplace/css/searchreplace.css | 6 - .../plugins/searchreplace/editor_plugin.js | 1 - .../searchreplace/editor_plugin_src.js | 61 - .../plugins/searchreplace/js/searchreplace.js | 142 - .../plugins/searchreplace/langs/en_dlg.js | 1 - .../plugins/searchreplace/searchreplace.htm | 101 - .../searchreplace_orig/css/searchreplace.css | 6 - .../searchreplace_orig/editor_plugin.js | 1 - .../searchreplace_orig/editor_plugin_src.js | 61 - .../searchreplace_orig/js/searchreplace.js | 142 - .../searchreplace_orig/langs/en_dlg.js | 1 - .../searchreplace_orig/searchreplace.htm | 100 - .../plugins/spellchecker/css/content.css | 1 - .../plugins/spellchecker/editor_plugin.js | 1 - .../plugins/spellchecker/editor_plugin_src.js | 436 - .../plugins/spellchecker/img/wline.gif | Bin 46 -> 0 bytes .../tiny_mce/plugins/style/css/props.css | 14 - .../tiny_mce/plugins/style/editor_plugin.js | 1 - .../plugins/style/editor_plugin_src.js | 71 - .../tiny_mce/plugins/style/js/props.js | 709 - .../tiny_mce/plugins/style/langs/en_dlg.js | 1 - .../jscripts/tiny_mce/plugins/style/props.htm | 845 - .../tiny_mce/plugins/style/readme.txt | 19 - .../plugins/tabfocus/editor_plugin.js | 1 - .../plugins/tabfocus/editor_plugin_src.js | 122 - .../jscripts/tiny_mce/plugins/table/cell.htm | 180 - .../tiny_mce/plugins/table/css/cell.css | 17 - .../tiny_mce/plugins/table/css/row.css | 25 - .../tiny_mce/plugins/table/css/table.css | 13 - .../tiny_mce/plugins/table/editor_plugin.js | 1 - .../plugins/table/editor_plugin_src.js | 1456 -- .../tiny_mce/plugins/table/js/cell.js | 319 - .../tiny_mce/plugins/table/js/merge_cells.js | 27 - .../jscripts/tiny_mce/plugins/table/js/row.js | 254 - .../tiny_mce/plugins/table/js/table.js | 501 - .../tiny_mce/plugins/table/langs/en_dlg.js | 1 - .../tiny_mce/plugins/table/merge_cells.htm | 32 - .../jscripts/tiny_mce/plugins/table/row.htm | 158 - .../jscripts/tiny_mce/plugins/table/table.htm | 194 - .../tiny_mce/plugins/template/blank.htm | 12 - .../plugins/template/css/template.css | 23 - .../plugins/template/editor_plugin.js | 1 - .../plugins/template/editor_plugin_src.js | 159 - .../tiny_mce/plugins/template/js/template.js | 106 - .../tiny_mce/plugins/template/langs/en_dlg.js | 1 - .../tiny_mce/plugins/template/template.htm | 45 - .../tiny_mce/plugins/template_orig/blank.htm | 12 - .../plugins/template_orig/css/template.css | 23 - .../plugins/template_orig/editor_plugin.js | 1 - .../template_orig/editor_plugin_src.js | 159 - .../plugins/template_orig/js/template.js | 106 - .../plugins/template_orig/langs/en_dlg.js | 1 - .../plugins/template_orig/template.htm | 31 - .../plugins/visualblocks/css/visualblocks.css | 21 - .../plugins/visualblocks/editor_plugin.js | 1 - .../plugins/visualblocks/editor_plugin_src.js | 63 - .../plugins/visualchars/editor_plugin.js | 1 - .../plugins/visualchars/editor_plugin_src.js | 83 - .../plugins/wordcount/editor_plugin.js | 1 - .../plugins/wordcount/editor_plugin_src.js | 122 - .../tiny_mce/plugins/xhtmlxtras/abbr.htm | 142 - .../tiny_mce/plugins/xhtmlxtras/acronym.htm | 142 - .../plugins/xhtmlxtras/attributes.htm | 149 - .../tiny_mce/plugins/xhtmlxtras/cite.htm | 142 - .../plugins/xhtmlxtras/css/attributes.css | 11 - .../tiny_mce/plugins/xhtmlxtras/css/popup.css | 9 - .../tiny_mce/plugins/xhtmlxtras/del.htm | 162 - .../plugins/xhtmlxtras/editor_plugin.js | 1 - .../plugins/xhtmlxtras/editor_plugin_src.js | 132 - .../tiny_mce/plugins/xhtmlxtras/ins.htm | 162 - .../tiny_mce/plugins/xhtmlxtras/js/abbr.js | 28 - .../tiny_mce/plugins/xhtmlxtras/js/acronym.js | 28 - .../plugins/xhtmlxtras/js/attributes.js | 111 - .../tiny_mce/plugins/xhtmlxtras/js/cite.js | 28 - .../tiny_mce/plugins/xhtmlxtras/js/del.js | 53 - .../plugins/xhtmlxtras/js/element_common.js | 229 - .../tiny_mce/plugins/xhtmlxtras/js/ins.js | 53 - .../plugins/xhtmlxtras/langs/en_dlg.js | 1 - .../tiny_mce/themes/advanced/about.htm | 52 - .../tiny_mce/themes/advanced/anchor.htm | 26 - .../tiny_mce/themes/advanced/charmap.htm | 55 - .../tiny_mce/themes/advanced/color_picker.htm | 70 - .../themes/advanced/editor_template.js | 1 - .../themes/advanced/editor_template_src.js | 1490 -- .../tiny_mce/themes/advanced/image.htm | 80 - .../themes/advanced/img/colorpicker.jpg | Bin 2584 -> 0 bytes .../tiny_mce/themes/advanced/img/flash.gif | Bin 239 -> 0 bytes .../tiny_mce/themes/advanced/img/icons.gif | Bin 11982 -> 0 bytes .../tiny_mce/themes/advanced/img/iframe.gif | Bin 600 -> 0 bytes .../themes/advanced/img/pagebreak.gif | Bin 325 -> 0 bytes .../themes/advanced/img/quicktime.gif | Bin 301 -> 0 bytes .../themes/advanced/img/realmedia.gif | Bin 439 -> 0 bytes .../themes/advanced/img/shockwave.gif | Bin 384 -> 0 bytes .../tiny_mce/themes/advanced/img/trans.gif | Bin 43 -> 0 bytes .../tiny_mce/themes/advanced/img/video.gif | Bin 597 -> 0 bytes .../themes/advanced/img/windowsmedia.gif | Bin 415 -> 0 bytes .../tiny_mce/themes/advanced/js/about.js | 73 - .../tiny_mce/themes/advanced/js/anchor.js | 56 - .../tiny_mce/themes/advanced/js/charmap.js | 363 - .../themes/advanced/js/color_picker.js | 345 - .../tiny_mce/themes/advanced/js/image.js | 253 - .../tiny_mce/themes/advanced/js/link.js | 159 - .../themes/advanced/js/source_editor.js | 78 - .../tiny_mce/themes/advanced/langs/en.js | 1 - .../tiny_mce/themes/advanced/langs/en_dlg.js | 1 - .../tiny_mce/themes/advanced/shortcuts.htm | 47 - .../themes/advanced/skins/default/content.css | 50 - .../themes/advanced/skins/default/dialog.css | 118 - .../advanced/skins/default/img/buttons.png | Bin 3133 -> 0 bytes .../advanced/skins/default/img/items.gif | Bin 64 -> 0 bytes .../advanced/skins/default/img/menu_arrow.gif | Bin 68 -> 0 bytes .../advanced/skins/default/img/menu_check.gif | Bin 70 -> 0 bytes .../advanced/skins/default/img/progress.gif | Bin 1787 -> 0 bytes .../advanced/skins/default/img/tabs.gif | Bin 1322 -> 0 bytes .../themes/advanced/skins/default/ui.css | 219 - .../advanced/skins/grappelli/content.css | 30 - .../advanced/skins/grappelli/content_base.css | 56 - .../grappelli/content_documentstructure.css | 72 - .../content_documentstructure_cs.css | 17 - .../content_documentstructure_de.css | 17 - .../content_documentstructure_en.css | 17 - .../content_documentstructure_pl.css | 17 - .../advanced/skins/grappelli/content_grid.css | 85 - .../skins/grappelli/content_typography.css | 101 - .../advanced/skins/grappelli/customized.css | 22 - .../advanced/skins/grappelli/dialog.css | 55 - .../grappelli/img/buttons/blockquote.png | Bin 330 -> 0 bytes .../skins/grappelli/img/buttons/bold.png | Bin 274 -> 0 bytes .../skins/grappelli/img/buttons/bullist.png | Bin 205 -> 0 bytes .../skins/grappelli/img/buttons/charmap.png | Bin 324 -> 0 bytes .../skins/grappelli/img/buttons/cleanup.png | Bin 345 -> 0 bytes .../skins/grappelli/img/buttons/code.png | Bin 435 -> 0 bytes .../grappelli/img/buttons/fullscreen.png | Bin 252 -> 0 bytes .../skins/grappelli/img/buttons/image.png | Bin 325 -> 0 bytes .../skins/grappelli/img/buttons/italic.png | Bin 239 -> 0 bytes .../grappelli/img/buttons/justifycenter.png | Bin 169 -> 0 bytes .../grappelli/img/buttons/justifyfull.png | Bin 155 -> 0 bytes .../grappelli/img/buttons/justifyleft.png | Bin 166 -> 0 bytes .../grappelli/img/buttons/justifyright.png | Bin 164 -> 0 bytes .../skins/grappelli/img/buttons/link.png | Bin 280 -> 0 bytes .../skins/grappelli/img/buttons/media.png | Bin 301 -> 0 bytes .../skins/grappelli/img/buttons/numlist.png | Bin 286 -> 0 bytes .../skins/grappelli/img/buttons/pasteword.png | Bin 351 -> 0 bytes .../skins/grappelli/img/buttons/redo.png | Bin 295 -> 0 bytes .../skins/grappelli/img/buttons/search.png | Bin 414 -> 0 bytes .../grappelli/img/buttons/show_advanced.png | Bin 320 -> 0 bytes .../skins/grappelli/img/buttons/table.png | Bin 2933 -> 0 bytes .../img/buttons/table_cell_props.png | Bin 1083 -> 0 bytes .../grappelli/img/buttons/table_col_after.png | Bin 1092 -> 0 bytes .../img/buttons/table_col_before.png | Bin 1084 -> 0 bytes .../img/buttons/table_delete_col.png | Bin 1100 -> 0 bytes .../img/buttons/table_delete_row.png | Bin 1094 -> 0 bytes .../img/buttons/table_merge_cells.png | Bin 1064 -> 0 bytes .../grappelli/img/buttons/table_row_after.png | Bin 1087 -> 0 bytes .../img/buttons/table_row_before.png | Bin 2973 -> 0 bytes .../grappelli/img/buttons/table_row_props.png | Bin 1088 -> 0 bytes .../img/buttons/table_split_cells.png | Bin 1081 -> 0 bytes .../skins/grappelli/img/buttons/template.png | Bin 299 -> 0 bytes .../skins/grappelli/img/buttons/underline.png | Bin 252 -> 0 bytes .../skins/grappelli/img/buttons/undo.png | Bin 297 -> 0 bytes .../skins/grappelli/img/buttons/unlink.png | Bin 287 -> 0 bytes .../grappelli/img/buttons/visualchars.png | Bin 301 -> 0 bytes .../img/customized/button_pagebreak.png | Bin 1171 -> 0 bytes .../grappelli/img/customized/pagebreak.png | Bin 2242 -> 0 bytes .../img/icons/icon-fb_show-hover.png | Bin 3312 -> 0 bytes .../grappelli/img/icons/icon-fb_show.png | Bin 3305 -> 0 bytes .../grappelli/img/icons/icon-mceResize.png | Bin 266 -> 0 bytes .../skins/grappelli/img/menu/icon-mceOpen.png | Bin 182 -> 0 bytes .../themes/advanced/skins/grappelli/ui.css | 532 - .../advanced/skins/highcontrast/content.css | 24 - .../advanced/skins/highcontrast/dialog.css | 106 - .../themes/advanced/skins/highcontrast/ui.css | 106 - .../themes/advanced/skins/o2k7/content.css | 48 - .../themes/advanced/skins/o2k7/dialog.css | 118 - .../advanced/skins/o2k7/img/button_bg.png | Bin 2766 -> 0 bytes .../skins/o2k7/img/button_bg_black.png | Bin 651 -> 0 bytes .../skins/o2k7/img/button_bg_silver.png | Bin 2084 -> 0 bytes .../themes/advanced/skins/o2k7/ui.css | 222 - .../themes/advanced/skins/o2k7/ui_black.css | 8 - .../themes/advanced/skins/o2k7/ui_silver.css | 5 - .../themes/advanced/source_editor.htm | 26 - .../tiny_mce/themes/simple/editor_template.js | 1 - .../themes/simple/editor_template_src.js | 84 - .../tiny_mce/themes/simple/img/icons.gif | Bin 806 -> 0 bytes .../tiny_mce/themes/simple/langs/en.js | 1 - .../themes/simple/skins/default/content.css | 25 - .../themes/simple/skins/default/ui.css | 32 - .../themes/simple/skins/o2k7/content.css | 17 - .../simple/skins/o2k7/img/button_bg.png | Bin 5102 -> 0 bytes .../tiny_mce/themes/simple/skins/o2k7/ui.css | 35 - .../tinymce/jscripts/tiny_mce/tiny_mce.js | 1 - .../jscripts/tiny_mce/tiny_mce_popup.js | 5 - .../tinymce/jscripts/tiny_mce/tiny_mce_src.js | 19034 ---------------- .../tiny_mce/utils/editable_selects.js | 70 - .../jscripts/tiny_mce/utils/form_utils.js | 210 - .../tinymce/jscripts/tiny_mce/utils/mctabs.js | 162 - .../jscripts/tiny_mce/utils/validate.js | 252 - .../grappelli/tinymce_setup/tinymce_setup.js | 146 - .../static/nested_admin/src/drag-handle.png | Bin 172 -> 0 bytes .../src/nested-admin/jquery.djangoformset.js | 490 - .../src/nested-admin/jquery.djnutils.js | 203 - .../src/nested-admin/jquery.ui.djnsortable.js | 1114 - .../nested-admin/jquery.ui.nestedsortable.js | 653 - .../src/nested-admin/regexquote.js | 3 - .../nested_admin/src/nested-admin/sortable.js | 219 - .../nested_admin/src/nested-admin/utils.js | 213 - .../static/nested_admin/src/nested_admin.js | 37 - .../static/nested_admin/src/nested_admin.scss | 261 - .../src/vendor/browser-pack/_prelude.js | 1 - projectsettings/urls.py | 11 +- requirements/base_requirements.txt | 4 - requirements/development_requirements.txt | 2 +- requirements/test_requirements.txt | 3 +- setup.py | 15 +- 837 files changed, 3805 insertions(+), 97611 deletions(-) create mode 100644 documentation/source/architecture.rst create mode 100644 documentation/source/images/koalixcrm_architecture_dedicated_webserver.png create mode 100644 documentation/source/images/koalixcrm_architecture_dedicated_webserver.svg create mode 100644 documentation/source/images/koalixcrm_architecture_django_webserver.png create mode 100644 documentation/source/images/koalixcrm_architecture_django_webserver.svg create mode 100644 documentation/source/images/pdfcreation.png create mode 100644 koalixcrm/accounting/migrations/0006_auto_20180422_2048.py create mode 100644 koalixcrm/accounting/migrations/0007_auto_20180422_2105.py delete mode 100644 koalixcrm/accounting/static/default_templates/en/purchaseconfirmation.xsl rename projectsettings/static/grappelli/stylesheets/mueller/screen.css => koalixcrm/accounting/tests/__init__.py (100%) delete mode 100644 koalixcrm/accounting/tests/test_models.py delete mode 100644 koalixcrm/celery.py delete mode 100644 koalixcrm/crm/const/contactimport.py delete mode 100644 koalixcrm/crm/const/modeltype.py delete mode 100644 koalixcrm/crm/contact/data_import.py delete mode 100644 koalixcrm/crm/documents/visit.py delete mode 100644 koalixcrm/crm/forms.py delete mode 100644 koalixcrm/crm/management/commands/importcontactdata.py delete mode 100644 koalixcrm/crm/migrations/0025_auto_20180220_1640.py create mode 100644 koalixcrm/crm/migrations/0025_auto_20180413_1937.py create mode 100644 koalixcrm/crm/migrations/0026_auto_20180507_1957.py delete mode 100644 koalixcrm/crm/migrations/0026_call.py delete mode 100644 koalixcrm/crm/migrations/0027_auto_20180220_2146.py delete mode 100644 koalixcrm/crm/migrations/0028_auto_20180220_2249.py delete mode 100644 koalixcrm/crm/migrations/0029_auto_20180220_2348.py delete mode 100644 koalixcrm/crm/migrations/0030_auto_20180221_1354.py delete mode 100644 koalixcrm/crm/migrations/0031_auto_20180221_1402.py delete mode 100644 koalixcrm/crm/migrations/0032_customer_people.py delete mode 100644 koalixcrm/crm/migrations/0033_auto_20180221_1539.py delete mode 100644 koalixcrm/crm/migrations/0034_auto_20180221_1555.py delete mode 100644 koalixcrm/crm/migrations/0035_remove_call_template_set.py delete mode 100644 koalixcrm/crm/migrations/0036_auto_20180221_1612.py delete mode 100644 koalixcrm/crm/migrations/0037_customer_no_phones.py delete mode 100644 koalixcrm/crm/migrations/0038_person_role.py delete mode 100644 koalixcrm/crm/migrations/0039_auto_20180221_1916.py delete mode 100644 koalixcrm/crm/migrations/0040_callforcontact_cperson.py delete mode 100644 koalixcrm/crm/migrations/0041_auto_20180221_2048.py delete mode 100644 koalixcrm/crm/migrations/0042_auto_20180221_2056.py delete mode 100644 koalixcrm/crm/migrations/0043_auto_20180221_2057.py delete mode 100644 koalixcrm/crm/migrations/0044_remove_customer_people.py delete mode 100644 koalixcrm/crm/migrations/0045_remove_person_customers.py delete mode 100644 koalixcrm/crm/migrations/0046_auto_20180221_2112.py delete mode 100644 koalixcrm/crm/migrations/0047_auto_20180222_1101.py delete mode 100644 koalixcrm/crm/migrations/0048_auto_20180222_1350.py delete mode 100644 koalixcrm/crm/migrations/0049_auto_20180222_1358.py delete mode 100644 koalixcrm/crm/migrations/0050_auto_20180222_1554.py delete mode 100644 koalixcrm/crm/migrations/0051_auto_20180222_1740.py delete mode 100644 koalixcrm/crm/migrations/0052_auto_20180223_1609.py delete mode 100644 koalixcrm/crm/migrations/0053_auto_20180224_1614.py delete mode 100644 koalixcrm/crm/migrations/0054_auto_20180224_1954.py delete mode 100644 koalixcrm/crm/migrations/0055_auto_20180224_2002.py delete mode 100644 koalixcrm/crm/migrations/0056_auto_20180224_2039.py delete mode 100644 koalixcrm/crm/migrations/0057_visitforcontact.py delete mode 100644 koalixcrm/crm/migrations/0058_contactimportdata.py delete mode 100644 koalixcrm/crm/migrations/0059_attributeset.py delete mode 100644 koalixcrm/crm/migrations/0060_attribute.py delete mode 100644 koalixcrm/crm/migrations/0061_product_attribute_set.py delete mode 100644 koalixcrm/crm/migrations/0062_auto_20180408_1757.py delete mode 100644 koalixcrm/crm/migrations/0063_auto_20180408_1918.py delete mode 100644 koalixcrm/crm/migrations/0064_auto_20180408_1929.py delete mode 100644 koalixcrm/crm/migrations/0065_productattributeassociation.py delete mode 100644 koalixcrm/crm/migrations/0066_auto_20180409_1952.py delete mode 100644 koalixcrm/crm/migrations/0067_productforcustomer.py delete mode 100644 koalixcrm/crm/migrations/0068_productforcustomer_product.py delete mode 100644 koalixcrm/crm/migrations/0069_auto_20180415_1626.py delete mode 100644 koalixcrm/crm/migrations/0070_auto_20180428_1619.py delete mode 100644 koalixcrm/crm/migrations/0071_auto_20180510_0929.py delete mode 100644 koalixcrm/crm/migrations/0072_auto_20180510_1531.py delete mode 100644 koalixcrm/crm/migrations/0073_phonesystemforcustomer.py delete mode 100644 koalixcrm/crm/migrations/0074_auto_20180511_1005.py delete mode 100644 koalixcrm/crm/migrations/0075_auto_20180519_1530.py delete mode 100644 koalixcrm/crm/product/attribute.py delete mode 100644 koalixcrm/crm/product/phonesystem.py create mode 100644 koalixcrm/crm/reporting/__init__.py create mode 100644 koalixcrm/crm/reporting/employeeassignmenttotask.py create mode 100644 koalixcrm/crm/reporting/generictasklink.py create mode 100644 koalixcrm/crm/reporting/task.py create mode 100644 koalixcrm/crm/reporting/tasklinktype.py create mode 100644 koalixcrm/crm/reporting/taskstatus.py create mode 100644 koalixcrm/crm/reporting/urls.py create mode 100644 koalixcrm/crm/reporting/work.py create mode 100644 koalixcrm/crm/static/taskslookup.js delete mode 100644 koalixcrm/crm/tasks.py delete mode 100644 koalixcrm/crm/templates/crm/admin/registerPayment.html create mode 100644 koalixcrm/crm/templates/crm/admin/register_payment.html create mode 100644 koalixcrm/crm/templates/crm/admin/time_reporting.html create mode 100644 koalixcrm/crm/tests/__init__.py create mode 100644 koalixcrm/crm/tests/test_calculations_document.py create mode 100644 koalixcrm/crm/tests/test_calculations_reporting.py delete mode 100644 koalixcrm/crm/views.py create mode 100644 koalixcrm/crm/views/__init__.py create mode 100644 koalixcrm/crm/views/monthlyreport.py create mode 100644 koalixcrm/crm/views/newdocument.py create mode 100644 koalixcrm/crm/views/pdfexport.py create mode 100644 koalixcrm/crm/views/restinterface.py delete mode 100644 log.txt delete mode 100644 projectsettings/environment/development.env delete mode 100644 projectsettings/media/data_files/contatti_test_import.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_14c4p1e.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_2Ecm1nx.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_2Q0f0Zy.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_59jaJH0.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_7b3skjA.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_8aYQ3xJ.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_90JUfUo.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_9lsOIXx.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_Fm0MG2h.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_JTAMGeo.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_KXuANep.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_L6y0dNG.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_MyQf5YE.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_PhiTotE.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_Pp3Y24G.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_RBsEYue.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_TMu9Rpx.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_VNk0e5B.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_bEqWmXS.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_e7bCzzS.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_fhn9Ujs.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_gqwz2BY.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_l0huEta.xlsx delete mode 100644 projectsettings/media/data_files/contatti_test_import_qt1Ckwh.xlsx delete mode 100644 projectsettings/media/data_files/fornitori.xlsx delete mode 100644 projectsettings/media/data_files/fornitori_Y8lxpZd.xlsx delete mode 100644 projectsettings/services/django-uwsgi.ini delete mode 100644 projectsettings/services/webserver/Dockerfile delete mode 100644 projectsettings/services/webserver/config/localhost.crt delete mode 100644 projectsettings/services/webserver/config/localhost.key delete mode 100644 projectsettings/services/webserver/config/nginx.tmpl delete mode 100644 projectsettings/services/webserver/config/start.sh delete mode 100644 projectsettings/static/admin/css/base.css delete mode 100644 projectsettings/static/admin/css/changelists.css delete mode 100644 projectsettings/static/admin/css/dashboard.css delete mode 100644 projectsettings/static/admin/css/fonts.css delete mode 100644 projectsettings/static/admin/css/forms.css delete mode 100644 projectsettings/static/admin/css/login.css delete mode 100644 projectsettings/static/admin/css/rtl.css delete mode 100644 projectsettings/static/admin/css/widgets.css delete mode 100644 projectsettings/static/admin/fonts/LICENSE.txt delete mode 100644 projectsettings/static/admin/fonts/README.txt delete mode 100644 projectsettings/static/admin/fonts/Roboto-Bold-webfont.woff delete mode 100644 projectsettings/static/admin/fonts/Roboto-Light-webfont.woff delete mode 100644 projectsettings/static/admin/fonts/Roboto-Regular-webfont.woff delete mode 100644 projectsettings/static/admin/img/LICENSE delete mode 100644 projectsettings/static/admin/img/README.txt delete mode 100644 projectsettings/static/admin/img/calendar-icons.svg delete mode 100644 projectsettings/static/admin/img/gis/move_vertex_off.svg delete mode 100644 projectsettings/static/admin/img/gis/move_vertex_on.svg delete mode 100644 projectsettings/static/admin/img/icon-addlink.svg delete mode 100644 projectsettings/static/admin/img/icon-alert.svg delete mode 100644 projectsettings/static/admin/img/icon-calendar.svg delete mode 100644 projectsettings/static/admin/img/icon-changelink.svg delete mode 100644 projectsettings/static/admin/img/icon-clock.svg delete mode 100644 projectsettings/static/admin/img/icon-deletelink.svg delete mode 100644 projectsettings/static/admin/img/icon-no.svg delete mode 100644 projectsettings/static/admin/img/icon-unknown-alt.svg delete mode 100644 projectsettings/static/admin/img/icon-unknown.svg delete mode 100644 projectsettings/static/admin/img/icon-yes.svg delete mode 100644 projectsettings/static/admin/img/inline-delete.svg delete mode 100644 projectsettings/static/admin/img/search.svg delete mode 100644 projectsettings/static/admin/img/selector-icons.svg delete mode 100644 projectsettings/static/admin/img/sorting-icons.svg delete mode 100644 projectsettings/static/admin/img/tooltag-add.svg delete mode 100644 projectsettings/static/admin/img/tooltag-arrowright.svg delete mode 100644 projectsettings/static/admin/js/SelectBox.js delete mode 100644 projectsettings/static/admin/js/SelectFilter2.js delete mode 100644 projectsettings/static/admin/js/actions.js delete mode 100644 projectsettings/static/admin/js/actions.min.js delete mode 100644 projectsettings/static/admin/js/admin/DateTimeShortcuts.js delete mode 100644 projectsettings/static/admin/js/admin/RelatedObjectLookups.js delete mode 100644 projectsettings/static/admin/js/calendar.js delete mode 100644 projectsettings/static/admin/js/cancel.js delete mode 100644 projectsettings/static/admin/js/change_form.js delete mode 100644 projectsettings/static/admin/js/collapse.js delete mode 100644 projectsettings/static/admin/js/collapse.min.js delete mode 100644 projectsettings/static/admin/js/core.js delete mode 100644 projectsettings/static/admin/js/inlines.js delete mode 100644 projectsettings/static/admin/js/inlines.min.js delete mode 100644 projectsettings/static/admin/js/jquery.init.js delete mode 100644 projectsettings/static/admin/js/popup_response.js delete mode 100644 projectsettings/static/admin/js/prepopulate.js delete mode 100644 projectsettings/static/admin/js/prepopulate.min.js delete mode 100644 projectsettings/static/admin/js/prepopulate_init.js delete mode 100644 projectsettings/static/admin/js/timeparse.js delete mode 100644 projectsettings/static/admin/js/urlify.js delete mode 100644 projectsettings/static/admin/js/vendor/jquery/LICENSE-JQUERY.txt delete mode 100644 projectsettings/static/admin/js/vendor/jquery/jquery.js delete mode 100644 projectsettings/static/admin/js/vendor/jquery/jquery.min.js delete mode 100644 projectsettings/static/admin/js/vendor/xregexp/LICENSE-XREGEXP.txt delete mode 100644 projectsettings/static/admin/js/vendor/xregexp/xregexp.js delete mode 100644 projectsettings/static/admin/js/vendor/xregexp/xregexp.min.js delete mode 100644 projectsettings/static/default_templates/de/balancesheet.xsl delete mode 100644 projectsettings/static/default_templates/de/deliveryorder.xsl delete mode 100644 projectsettings/static/default_templates/de/invoice.xsl delete mode 100644 projectsettings/static/default_templates/de/profitlossstatement.xsl delete mode 100644 projectsettings/static/default_templates/de/purchaseconfirmation.xsl delete mode 100644 projectsettings/static/default_templates/de/purchaseorder.xsl delete mode 100644 projectsettings/static/default_templates/de/quote.xsl delete mode 100644 projectsettings/static/default_templates/en/balancesheet.xsl delete mode 100644 projectsettings/static/default_templates/en/deliveryorder.xsl delete mode 100644 projectsettings/static/default_templates/en/invoice.xsl delete mode 100644 projectsettings/static/default_templates/en/profitlossstatement.xsl delete mode 100644 projectsettings/static/default_templates/en/purchaseconfirmation.xsl delete mode 100644 projectsettings/static/default_templates/en/purchaseorder.xsl delete mode 100644 projectsettings/static/default_templates/en/quote.xsl delete mode 100644 projectsettings/static/default_templates/generic/DejaVuSans-Bold.ttf delete mode 100644 projectsettings/static/default_templates/generic/DejaVuSans.ttf delete mode 100644 projectsettings/static/default_templates/generic/dejavusans-bold.xml delete mode 100644 projectsettings/static/default_templates/generic/dejavusans.xml delete mode 100644 projectsettings/static/default_templates/generic/fontconfig.xml delete mode 100644 projectsettings/static/default_templates/generic/logo.jpg delete mode 100644 projectsettings/static/filebrowser/css/filebrowser.css delete mode 100644 projectsettings/static/filebrowser/css/uploadfield.css delete mode 100644 projectsettings/static/filebrowser/img/TEST_IMAGE_000.jpg delete mode 100644 projectsettings/static/filebrowser/img/cancel.png delete mode 100644 projectsettings/static/filebrowser/img/cancel_hover.png delete mode 100644 projectsettings/static/filebrowser/img/completed.png delete mode 100644 projectsettings/static/filebrowser/img/fb-upload-spinner.gif delete mode 100644 projectsettings/static/filebrowser/img/fb-upload.png delete mode 100644 projectsettings/static/filebrowser/img/fb-upload_hover.png delete mode 100644 projectsettings/static/filebrowser/img/icon-pulldown-versions-active.png delete mode 100644 projectsettings/static/filebrowser/img/icon-pulldown-versions-hover.png delete mode 100644 projectsettings/static/filebrowser/img/icon-pulldown-versions.png delete mode 100644 projectsettings/static/filebrowser/img/progress-bar-content.png delete mode 100644 projectsettings/static/filebrowser/img/testimage.jpg delete mode 100644 projectsettings/static/filebrowser/js/AddFileBrowser.js delete mode 100644 projectsettings/static/filebrowser/js/FB_CKEditor.js delete mode 100644 projectsettings/static/filebrowser/js/FB_FileBrowseField.js delete mode 100644 projectsettings/static/filebrowser/js/FB_TinyMCE.js delete mode 100644 projectsettings/static/filebrowser/js/TinyMCEAdmin.js delete mode 100644 projectsettings/static/filebrowser/js/fileuploader.js delete mode 100644 projectsettings/static/grappelli/images/backgrounds/changelist-results.png delete mode 100644 projectsettings/static/grappelli/images/backgrounds/loading-small.gif delete mode 100644 projectsettings/static/grappelli/images/backgrounds/messagelist.png delete mode 100644 projectsettings/static/grappelli/images/backgrounds/nav-grabber.gif delete mode 100644 projectsettings/static/grappelli/images/backgrounds/ui-sortable-placeholder.png delete mode 100644 projectsettings/static/grappelli/images/icons-s846f870921.png delete mode 100644 projectsettings/static/grappelli/images/icons-small-scbbb475e49.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/add-link.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/add-link_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/change-link.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/change-link_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/delete-link.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/filter-choice-selected.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/link-external.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/link-external_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/link-internal.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/link-internal_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons-small/sort-remove.png delete mode 100644 projectsettings/static/grappelli/images/icons/add-another.png delete mode 100644 projectsettings/static/grappelli/images/icons/add-another_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/back-link.png delete mode 100644 projectsettings/static/grappelli/images/icons/back-link_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/breadcrumbs-rtl.png delete mode 100644 projectsettings/static/grappelli/images/icons/breadcrumbs-rtl_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/breadcrumbs.png delete mode 100644 projectsettings/static/grappelli/images/icons/breadcrumbs_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/date-hierarchy-back-rtl.png delete mode 100644 projectsettings/static/grappelli/images/icons/date-hierarchy-back-rtl_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/date-hierarchy-back.png delete mode 100644 projectsettings/static/grappelli/images/icons/date-hierarchy-back_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/datepicker.png delete mode 100644 projectsettings/static/grappelli/images/icons/datepicker_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/datetime-now.png delete mode 100644 projectsettings/static/grappelli/images/icons/datetime-now_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/form-select.png delete mode 100644 projectsettings/static/grappelli/images/icons/object-tools-add-link.png delete mode 100644 projectsettings/static/grappelli/images/icons/object-tools-viewsite-link.png delete mode 100644 projectsettings/static/grappelli/images/icons/pulldown-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/pulldown-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/pulldown-handler_selected.png delete mode 100644 projectsettings/static/grappelli/images/icons/related-lookup-m2m.png delete mode 100644 projectsettings/static/grappelli/images/icons/related-lookup-m2m_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/related-lookup.png delete mode 100644 projectsettings/static/grappelli/images/icons/related-lookup_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/related-remove.png delete mode 100644 projectsettings/static/grappelli/images/icons/related-remove_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/searchbox.png delete mode 100644 projectsettings/static/grappelli/images/icons/selector-add-m2m-horizontal.png delete mode 100644 projectsettings/static/grappelli/images/icons/selector-add-m2m-horizontal_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/selector-add-m2m-vertical.png delete mode 100644 projectsettings/static/grappelli/images/icons/selector-add-m2m-vertical_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/selector-filter.png delete mode 100644 projectsettings/static/grappelli/images/icons/selector-remove-m2m-horizontal.png delete mode 100644 projectsettings/static/grappelli/images/icons/selector-remove-m2m-horizontal_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/selector-remove-m2m-vertical.png delete mode 100644 projectsettings/static/grappelli/images/icons/selector-remove-m2m-vertical_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/sort-remove.png delete mode 100644 projectsettings/static/grappelli/images/icons/sort-remove_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/sorted-ascending.png delete mode 100644 projectsettings/static/grappelli/images/icons/sorted-descending.png delete mode 100644 projectsettings/static/grappelli/images/icons/status-no.png delete mode 100644 projectsettings/static/grappelli/images/icons/status-unknown.png delete mode 100644 projectsettings/static/grappelli/images/icons/status-yes.png delete mode 100644 projectsettings/static/grappelli/images/icons/th-ascending.png delete mode 100644 projectsettings/static/grappelli/images/icons/th-descending.png delete mode 100644 projectsettings/static/grappelli/images/icons/timepicker.png delete mode 100644 projectsettings/static/grappelli/images/icons/timepicker_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-add-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-add-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-arrow-down-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-arrow-down-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-arrow-up-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-arrow-up-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-close-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-close-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-delete-handler-predelete.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-delete-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-delete-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-drag-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-drag-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-open-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-open-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-remove-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-remove-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-trash-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-trash-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-trash-list-toggle-handler.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-trash-list-toggle-handler_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-viewsite-link.png delete mode 100644 projectsettings/static/grappelli/images/icons/tools-viewsite-link_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/ui-datepicker-next.png delete mode 100644 projectsettings/static/grappelli/images/icons/ui-datepicker-next_hover.png delete mode 100644 projectsettings/static/grappelli/images/icons/ui-datepicker-prev.png delete mode 100644 projectsettings/static/grappelli/images/icons/ui-datepicker-prev_hover.png delete mode 100644 projectsettings/static/grappelli/img/admin/arrow-down.gif delete mode 100644 projectsettings/static/grappelli/img/admin/arrow-up.gif delete mode 100644 projectsettings/static/grappelli/jquery/LICENSE-JQUERY.txt delete mode 100644 projectsettings/static/grappelli/jquery/jquery.min.js delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-bg_diagonals-thick_20_666666_40x40.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-bg_flat_10_000000_40x100.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-bg_glass_100_f6f6f6_1x400.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-bg_glass_100_fdf5ce_1x400.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-icons_222222_256x240.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-icons_228ef1_256x240.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-icons_ef8c08_256x240.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-icons_ffd27a_256x240.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/images/ui-icons_ffffff_256x240.png delete mode 100644 projectsettings/static/grappelli/jquery/ui/index.html delete mode 100644 projectsettings/static/grappelli/jquery/ui/jquery-ui.css delete mode 100644 projectsettings/static/grappelli/jquery/ui/jquery-ui.js delete mode 100644 projectsettings/static/grappelli/jquery/ui/jquery-ui.min.css delete mode 100644 projectsettings/static/grappelli/jquery/ui/jquery-ui.min.js delete mode 100644 projectsettings/static/grappelli/jquery/ui/jquery-ui.structure.css delete mode 100644 projectsettings/static/grappelli/jquery/ui/jquery-ui.structure.min.css delete mode 100644 projectsettings/static/grappelli/jquery/ui/jquery-ui.theme.css delete mode 100644 projectsettings/static/grappelli/jquery/ui/jquery-ui.theme.min.css delete mode 100644 projectsettings/static/grappelli/js/grappelli.js delete mode 100644 projectsettings/static/grappelli/js/grappelli.min.js delete mode 100644 projectsettings/static/grappelli/js/jquery.grp_autocomplete_fk.js delete mode 100644 projectsettings/static/grappelli/js/jquery.grp_autocomplete_generic.js delete mode 100644 projectsettings/static/grappelli/js/jquery.grp_autocomplete_m2m.js delete mode 100644 projectsettings/static/grappelli/js/jquery.grp_collapsible.js delete mode 100644 projectsettings/static/grappelli/js/jquery.grp_collapsible_group.js delete mode 100644 projectsettings/static/grappelli/js/jquery.grp_inline.js delete mode 100644 projectsettings/static/grappelli/js/jquery.grp_related_fk.js delete mode 100644 projectsettings/static/grappelli/js/jquery.grp_related_generic.js delete mode 100644 projectsettings/static/grappelli/js/jquery.grp_related_m2m.js delete mode 100644 projectsettings/static/grappelli/js/jquery.grp_timepicker.js delete mode 100644 projectsettings/static/grappelli/stylesheets/mueller/grid/output-rtl.css delete mode 100644 projectsettings/static/grappelli/stylesheets/mueller/grid/output.css delete mode 100644 projectsettings/static/grappelli/stylesheets/partials/custom/tinymce.css delete mode 100644 projectsettings/static/grappelli/stylesheets/rtl.css delete mode 100644 projectsettings/static/grappelli/stylesheets/screen.css delete mode 100644 projectsettings/static/grappelli/tinymce/changelog.txt delete mode 100644 projectsettings/static/grappelli/tinymce/examples/accessibility.html delete mode 100644 projectsettings/static/grappelli/tinymce/examples/css/content.css delete mode 100644 projectsettings/static/grappelli/tinymce/examples/css/word.css delete mode 100644 projectsettings/static/grappelli/tinymce/examples/custom_formats.html delete mode 100644 projectsettings/static/grappelli/tinymce/examples/full.html delete mode 100644 projectsettings/static/grappelli/tinymce/examples/index.html delete mode 100644 projectsettings/static/grappelli/tinymce/examples/lists/image_list.js delete mode 100644 projectsettings/static/grappelli/tinymce/examples/lists/link_list.js delete mode 100644 projectsettings/static/grappelli/tinymce/examples/lists/media_list.js delete mode 100644 projectsettings/static/grappelli/tinymce/examples/lists/template_list.js delete mode 100644 projectsettings/static/grappelli/tinymce/examples/media/logo.jpg delete mode 100644 projectsettings/static/grappelli/tinymce/examples/media/logo_over.jpg delete mode 100644 projectsettings/static/grappelli/tinymce/examples/media/sample.avi delete mode 100644 projectsettings/static/grappelli/tinymce/examples/media/sample.dcr delete mode 100644 projectsettings/static/grappelli/tinymce/examples/media/sample.flv delete mode 100644 projectsettings/static/grappelli/tinymce/examples/media/sample.mov delete mode 100644 projectsettings/static/grappelli/tinymce/examples/media/sample.ram delete mode 100644 projectsettings/static/grappelli/tinymce/examples/media/sample.rm delete mode 100644 projectsettings/static/grappelli/tinymce/examples/media/sample.swf delete mode 100644 projectsettings/static/grappelli/tinymce/examples/menu.html delete mode 100644 projectsettings/static/grappelli/tinymce/examples/simple.html delete mode 100644 projectsettings/static/grappelli/tinymce/examples/skins.html delete mode 100644 projectsettings/static/grappelli/tinymce/examples/templates/layout1.htm delete mode 100644 projectsettings/static/grappelli/tinymce/examples/templates/snippet1.htm delete mode 100644 projectsettings/static/grappelli/tinymce/examples/word.html delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/langs/en.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/license.txt delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/css/advhr.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/js/rule.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/css/advimage.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/img/sample.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/css/advimage.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/image.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/img/sample.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/js/image.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/css/advlink.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/css/advlink.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/js/advlink.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/link.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/emotions.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/js/emotions.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/dialog.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/img/example.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/js/dialog.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/langs/en.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/img/show_advanced.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/img/visualchars.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/cs.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/de.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/en.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/fr.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/pl.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/ru.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/cs.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/de.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/en.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/fr.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/pl.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/ru.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/template.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/css/media.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/js/embed.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/js/media.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/media.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/moxieplayer.swf delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/css/media.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/js/embed.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/js/media.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/media.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/moxieplayer.swf delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/js/pastetext.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/js/pasteword.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/pastetext.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/pasteword.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/js/pastetext.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/js/pasteword.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/pastetext.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/pasteword.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/example.html delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/jscripts/embed.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/preview.html delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/css/searchreplace.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/js/searchreplace.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/searchreplace.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/css/content.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/css/props.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/js/props.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/props.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/readme.txt delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/cell.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/cell.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/row.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/table.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/js/merge_cells.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/js/row.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/js/table.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/merge_cells.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/row.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/table.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/blank.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/css/template.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/js/template.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/template.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/blank.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/css/template.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/js/template.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/template.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/about.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/anchor.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/editor_template.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/image.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/flash.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/iframe.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/quicktime.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/realmedia.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/shockwave.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/trans.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/video.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/windowsmedia.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/about.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/image.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_base.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_cs.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_de.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_en.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_pl.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_grid.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_typography.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/customized.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/dialog.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/blockquote.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/bold.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/bullist.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/charmap.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/cleanup.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/code.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/fullscreen.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/image.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/italic.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifycenter.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyfull.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyleft.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyright.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/link.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/media.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/numlist.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/pasteword.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/redo.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/search.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/show_advanced.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_cell_props.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_col_after.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_col_before.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_delete_col.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_delete_row.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_merge_cells.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_after.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_before.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_props.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_split_cells.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/template.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/underline.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/undo.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/unlink.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/visualchars.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/customized/button_pagebreak.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/customized/pagebreak.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-fb_show-hover.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-fb_show.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-mceResize.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/menu/icon-mceOpen.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/ui.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/editor_template.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/img/icons.gif delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/langs/en.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/default/content.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/default/ui.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/tiny_mce.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/tiny_mce_popup.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/tiny_mce_src.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/utils/editable_selects.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/utils/form_utils.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/utils/mctabs.js delete mode 100644 projectsettings/static/grappelli/tinymce/jscripts/tiny_mce/utils/validate.js delete mode 100644 projectsettings/static/grappelli/tinymce_setup/tinymce_setup.js delete mode 100644 projectsettings/static/nested_admin/src/drag-handle.png delete mode 100644 projectsettings/static/nested_admin/src/nested-admin/jquery.djangoformset.js delete mode 100644 projectsettings/static/nested_admin/src/nested-admin/jquery.djnutils.js delete mode 100644 projectsettings/static/nested_admin/src/nested-admin/jquery.ui.djnsortable.js delete mode 100644 projectsettings/static/nested_admin/src/nested-admin/jquery.ui.nestedsortable.js delete mode 100644 projectsettings/static/nested_admin/src/nested-admin/regexquote.js delete mode 100644 projectsettings/static/nested_admin/src/nested-admin/sortable.js delete mode 100644 projectsettings/static/nested_admin/src/nested-admin/utils.js delete mode 100644 projectsettings/static/nested_admin/src/nested_admin.js delete mode 100644 projectsettings/static/nested_admin/src/nested_admin.scss delete mode 100644 projectsettings/static/nested_admin/src/vendor/browser-pack/_prelude.js diff --git a/.gitignore b/.gitignore index 1f649cb0..1d8a3154 100644 --- a/.gitignore +++ b/.gitignore @@ -21,8 +21,9 @@ pip-log.txt .tox *~ -# VS Code +# IntelliJ +*.iml +/.idea/ + +#VSCODE .vscode -projectsettings/media/uploads -projectsettings/media/data_files -projectsettings/media/tmp diff --git a/.travis.yml b/.travis.yml index e470d6f6..dc3c2674 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,12 @@ language: python python: - '3.4' +before_install: + - wget https://github.com/mozilla/geckodriver/releases/download/v0.20.1/geckodriver-v0.20.1-linux64.tar.gz + - mkdir geckodriver + - tar -xzf geckodriver*.tar.gz -C geckodriver + - export PATH=$PATH:$PWD/geckodriver + install: - python setup.py install - pip install -r requirements/heroku_requirements.txt diff --git a/Dockerfile b/Dockerfile index 832bfbea..0d57b1d2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,13 @@ FROM python:3.6 -RUN mkdir /app WORKDIR /app # Intall dependencies COPY /requirements/development_requirements.txt /app/ COPY /requirements/base_requirements.txt /app/ -RUN pip install -r development_requirements.txt COPY . /app RUN chmod +x /app/entrypoint.sh ENTRYPOINT ["/app/entrypoint.sh"] + diff --git a/Dockerfile.prod b/Dockerfile.prod index ffec0dd3..8926d967 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -1,17 +1,12 @@ FROM python:3.6 -RUN mkdir /app WORKDIR /app # Intall dependencies -COPY /requirements/development_requirements.txt /app/ COPY /requirements/base_requirements.txt /app/ -RUN pip install -r development_requirements.txt COPY . /app -# Add uWSGI config -ADD ./projectsettings/services/django-uwsgi.ini /etc/uwsgi/django-uwsgi.ini +RUN chmod +x /app/entrypoint.prod.sh +ENTRYPOINT ["/app/entrypoint.prod.sh"] -RUN chmod +x /app/entrypoint.sh -ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/LICENSE b/LICENSE index 114ca759..f5aebbdd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,13 +1,29 @@ -This software is published under the BSD license as listed below. +BSD 3-Clause License -Copyright © 2009-2018 Aaron Riedener, Untereggen, Switzerland +Copyright (c) 2009-2018, Aaron Riedener, Untereggen, Switzerland All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Aaron Riedener nor the names of the contributors to koalixcrm may be used to endorse or promote products derived from this software without specific prior written permission. +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index e0580bdc..8e3a7161 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,39 +1,14 @@ -version: '3' +version: '2.0' -services: +services: db: image: postgres - volumes: - - pgdata:/var/lib/postgresql/data - koalixcrm: - build: . - volumes: - - .:/app/ - - static-files:/app/projectsettings/static - - media-files:/app/projectsettings/media - expose: - - "8000" - depends_on: - - db - env_file: - - ./projectsettings/environment/development.env - webserver: - build: - context: . - dockerfile: ./projectsettings/services/webserver/Dockerfile - volumes: - - static-files:/app/projectsettings/static - - media-files:/app/projectsettings/media + koalixcrm: + image: koalixswitzerland/koalixcrm:1.12.dev20180210 + environment: + - DJANGO_SETTINGS_MODULE=projectsettings.settings.production_settings + - JAVA_HOME=/usr/bin/jdk1.8.0_162/jre ports: - - "80:80" - - "443:443" + - "8000:8000" depends_on: - - koalixcrm - env_file: - - ./projectsettings/environment/development.env - -volumes: - .: - static-files: - media-files: - pgdata: \ No newline at end of file + - db \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index f63f5a49..a154b3bf 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,21 +1,14 @@ -version: '3' +version: '2.0' -services: +services: db: image: postgres - volumes: - - pgdata:/var/lib/postgresql/data - koalixcrm: - build: . - volumes: - - .:/app/ + koalixcrm: + build: . + environment: + - DJANGO_SETTINGS_MODULE=projectsettings.settings.development_settings + - JAVA_HOME=/usr/bin/jdk1.8.0_162/jre ports: - "8000:8000" depends_on: - - db - env_file: - - ./projectsettings/environment/development.env - -volumes: - .: - pgdata: \ No newline at end of file + - db \ No newline at end of file diff --git a/documentation/source/architecture.rst b/documentation/source/architecture.rst new file mode 100644 index 00000000..d3276a1d --- /dev/null +++ b/documentation/source/architecture.rst @@ -0,0 +1,14 @@ +.. highlight:: rst + +Architecture +======== + +Standard installation with docker, postgres +------------------------------------------- +.. image:: /images/koalixcrm_architecture_django_webserver.png + +Standard installation with docker, postgres and apache2 +------------------------------------------------------- +.. image:: /images/koalixcrm_architecture_dedicated_webserver.png + + diff --git a/documentation/source/crm.rst b/documentation/source/crm.rst index 8c786184..8879525a 100644 --- a/documentation/source/crm.rst +++ b/documentation/source/crm.rst @@ -6,12 +6,21 @@ CRM Introduction ------------ -Objecttypes ------------ +Products +-------- -Contract +Contact +-------- + +Customer ^^^^^^^^ +Documents +--------- + +Sales Contract +^^^^^^^^^^^^^^ + Purchase Order ^^^^^^^^^^^^^^ @@ -21,12 +30,8 @@ Invoice Quote ^^^^^ -Customer -^^^^^^^^ +Reporting +--------- -Distributors -^^^^^^^^^^^^ -Suppliers -^^^^^^^^^ diff --git a/documentation/source/customisation.rst b/documentation/source/customisation.rst index 093e120f..3ed45271 100644 --- a/documentation/source/customisation.rst +++ b/documentation/source/customisation.rst @@ -42,7 +42,7 @@ After you finised translating the whole file test your translation by compiling django-admin compilemessages -After this you are able to use your translation. Sometimes seting your language in ``/var/www/koalixcrm/settings.py`` is required. +After this you are able to use your translation. Sometimes setting your language in ``/var/www/koalixcrm/settings.py`` is required. Go on with your translation for accounting and for djangouserextention folders. As soon as you finish this part you will be able to work with koalixcrm in your own language. But there is still something missing: the templatefiles for pdf creation have to be translated as well. diff --git a/documentation/source/images/koalixcrm_architecture_dedicated_webserver.png b/documentation/source/images/koalixcrm_architecture_dedicated_webserver.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb0c5583ff39fae1c09057a92a0e046240f736c GIT binary patch literal 58457 zcmeFZcTkgE_cj`mP!t71RFqCYiin7U^lE6*qzEEXL;(?L(rZBUF%bk&dR1vs1f&au z#K$NKQltt2f}u$$p@$HXoIH>E{@yur{`uz2oHO6d$H3&~u6wV0?Y-8zu4@N%+0yv% zLBWFn0N}8x3ETz%U|$CSK)PHUtUZAlS^TUIaFBti9T)2-n(G#l_5XnY6UQI`fCu-_ zA6vRSj}U9;iD1L4!M6UM!C^Puz~!p?a6`2^j(5#Vvg|DIRws+J%CAPz8v>)VCr zEl-9uh+G-lUH2C}@Dy-ByP-cy;E3F-IAwi4xr2|zUtDFw%gY`-27kL&am2OtG4fKX z^gyn-VMQ?4$*re)vWw~%-2!dQnAf?53@KI0#4OEmsVb_sKs##ZYxeoDH(onhZDRd; z&!kNM{cX&TUnEOo<$Z8I$~ zZ8}ZB7RJ@EaeIYi0-LOAthM_yS6k!N&K!1o`>tiu)dNq*UZ1G`-Pm$;l9c;L?PEBm ziick7YU3q)%1uY=w|}lVhgAICaFT^&ypdJOpd;I^dn8jh0JsLLJzXnN>%jY;Ruo5E zvP!}c;_tz!N-Eu)z=Q$XbCjK?AzcYOx!4#~v8g>BN;JZ1E|NvC&GGLY+sr(c3cz=b zi`OE!!}-29mnuGDvjX^+U1%gW;G`5WX z&kM^zY~SX?hy_5;bC$~h9R`G7xE$V%v|mugmM*HmhSdRA<($0K0t7tVV$1CcIM;=+ zit&fz&ezoymbNCK+@e8QJj+(Xk7ne3kLd41%Ed0$$KC~+TWVR5Y620q2g=Su<4kC0U7~_rrwcq z7f~F7<7Z))YFC${iN}(M2lH!_O59%RE?@k9ADc|6P99IYsk#Q{Dd#%Vek_wMEuJY* zuk&p02Hzhe4i!Q12D2}jr`A;5&b!G^>$y3*7c)|^C!KG51x{aZ>){~{l`KYNwKxJ& z!#Xa{_PZ*{3+1B=Ehhk1O9!TSuq6sj!xg*$ReK#p(CMdBy1Cns>BVEdCcj_O{6)HE z%{em;FJCK3=@R;hwf9xM2c7ROxpe^;i`Y6Ga`(KZqyN2~*lRr-4)qi>y9|YoUptIX zye7zO-vBG!!AL?+6?WQitY%i7u8ht2ZJVCX$Wus+=$h1;g*$BQC6*7i>m05VrK=N# z;i) zQ?*W!m{8KAKVzBcYBh@^q-AeTJGj!kwll#~<>mD-$m|)N6ix5%u-HuU(>`YLo3L3lH+Gm3j4b-YRt+PLFOcKwrtq0$xSt z&l~Q+7y+LY2%?y$A>xPz&#~jv0n;gtV?OZ9OkMaH`h*Ae0Q^$k$2ezX>YCTr_}Eye zS|V35uaprU0cxo)U2TpN8lb7fDWFXKT(cgo6dV@5sCA$}W%pdK`P`q0h>p-!;@52! zuRWLQ?)7c#w%64=H*tAC?LHE*d+_nX-qRP&do^3?A3L8-GWjwHrTwu0sm+LgohHgl zH2Zz0;?>1(!5V*V>wVz_F7uD0TKxC+wjCehz;w=*M)jj6rLs5rV+%E&bGo0qqTGSw zg`O*l6QC7J14x#JF%%f3>NWN11hwe4dH9kw9^rdea(ulqMJFt+1TEk3>MnnZ6etVn zT|rrTCkyIRMZ^f*G37y`-Rm3hu(ddziyHE8ShqHDhNq&7Oz5_=73=#{Ho zjD=3-kuJKZy`xv*-F*MvAB<=TA6l*YMCfYJSSZiR`<1QY5;@9`jjCwQF7oQ2%F+|7 zC9Q9RBFp+RwyQI1E~{o%*D^LV{W|riws6AK@=Eeo{ahQ-&B6Hqyy7k2g&GGW;myBR z%V|ym3xc9vuQ$g*2WgL@ZVNpuLB2SEg927O&w4NmsvKk4ASU1}Er&>DuSp}S^Md~5 zupA`{dwnIfl_bJ?`nRfRwYe}=dDZH@`@^!7w`J7{19?rS*Ukh8tesxdcVj0qr(NUH zQMq^jeP`aH1Geug%dy&v^h8H$6jB@nuZS;+M-MCr#UrkapEwwO&_103Lbt!%fNAY}twdA8^BJ%Q`ERSDxu5(FCy z$L_vwK%WrVQYX_yaTJ}57KwpW{c>h5-@@P~c6f+zebGvIvxsL9@}U+FHRlcxCR}j-yN9PEyEc7J2k5M0Ue?O4qpNfG zMpD!skwJ{fSBkj+Jl|;50UVjC0mHg9@~v-uyMt?-zduB|9*B-mtTh>D%%x!_|L%)> zj$DG2uYSO(xPKce3ymfk{Og20rSGyW7npS$&r#x5>k%BOuZn9qAg^DWiCmr~c9ebG z;D9VAa9NHhh#7-Vb5EL<)thtTV}MuXhG~JE+p#&MhD&8Z$01MORI6spHym*C>OLcV zA09z>`Wd~Nz-c>KR$pgZe_`a3N7OBkN5yq_H1e%QmV+SRuY-&G@!6OnOz40sGLBS| zzWoWR-n2BZSY;NiI;>+M(~%hKIC%vHaGBJp%4G$-!Lb4^q6$(-R=#v22BqiP_@)e% zYkq6{u}7Iha`&|%+9mrkHN^|PU9kmSdyx2U4iC4wGx@!`*OtQ)T3!M?H1fTW-!Q|Q z^)1%lQi&6>?VhPlgZ`RaFcwatM;|==N2lLDW)FrH)j8$2Xdf=u?O_)rNYJaAr-yJ)AuEA!+NY|Ay zjkb`Nzrq(u^YPVVha+W>u3$ArL5!%`iL+D%kAQ_GIAHzt(9~jiFG`tngABWWMu1-u zDPd$#2oQ#Y*JDkRV*U8uryGPN>{0*(HXXyHGd+}*eLM1VWzLa;?!7R*3R?jjA>*8z zy2Q#tInIQ@p~R1PXs60c6wt4%mj%5!tWhXG?cg{GTiYj8Rkgg^=&q_dzV39GsF=M& zo~zm?+SyM;e@WOq40DUU-~njYPik5DoLSeZ2#w$EmR~uhzb}D9j%b|?)A9f)5jxqC zaks5wd6m>R`%pqsZ|?6#0GK*mGLQ==?%^ZRtarYGHC;m)OaU6#2TkHd+6_waln!5u<$_jPXRv_uS*&F%n7@=&Q^DyPZcv zpWctvjiOTfh5`4S`7paZItE&fTbjf#X-eh$BGY)B7U<)X`Y%|G^8A~!3C#qF>Im19 zMt%#U-|FjPwZQuivJ&H`<7NO4j~DJ!`&?75LJVY%|%R#8(}V9AKc7M zWQxbuM8s06!RvkE^W$oHyJu30_eEs}^Y-L0`unE?W9LT4AIbJ*Cm?5NSBP0+@J;_| zsAC&7Vof-38Iea4%OcI{?;DL%>XA%;L&w02RbqjD7m&GDGW<-{>ONAaa^OxKZjj@n z(sJTv#lPuc@kpdLl9^kzpHbD$W$F4j`GBi+;ks!P1ml*zd+1_Le(H|gL_3;laY^O6rX zXB@%nn=5pM$~GO3>Bg+KA2W`VcyCc9&8O$4SqVN9egexB=z*5ZvyJY5Nhzw^a90i$ z#fh0|4fkiqrY%fblrO*9qIwWN^}WI_)HgMoZC|sviyy;%h~UGR%%$n(-!m52a|W-M zK~;}Gj*$cA944afv!xY%kg;~D+=CRM6I-21Hkt<)Fi;F-pVnO?M74-JDIY`gYC4S| zon$(Xu&)cHS$#jE^IU-zYTw~#&%l%~FD!0?VcWehl^C+s#G%`Ksu4!T8xqR8@02R_ z_uZY$Y+V#LXWGLno^!6d_U`2n0CLsVPPaUoJ!#K$l?L)rz5=Xa?t4kN?bQ=>orWPF zLSx;|;jJsRC;71a${CaW`3on36hkzjWKQ18qvqVE@ac<#1TCa)#ztfpc{@*tCvqWa@{gBca4Q3MTvDYRH2`m~f2 zLWZtMwo{}6(bFLIy5b9UCS92%BQ}-71<)}7$827ojfg_X7@bOyG|C(umfJ^}I1FZU z%&FH!kUB@;ZrdrWazdWC$b-}i4_QSys_?W(pcVa&>rr}{0V@h#c?HH5j!jIb2G1!(E+tqKf+MiI!--Eb=}U)I3_Cj-s*jhIqJbVO1ng0J3+c2<6Z8CcSZZ8)=wrc zOs_Di&6752>%vP)wuto|&)nD#f4t#o>{3>HZaoI`Xm>IuXP#O9pR5sz4>c71S;d`H zU|cMrjy&GjdK@z3^qecLIzJ<9b}&uONc7~rHy8`Bb7J1-`g@WyoN4M={x9>s?#Q|y zp)F4de;MtQY0Lli%JOCX&G9aB9V_=)A-qwgnuP_c;kpX6sa_}fZ8%zKsFy?s;Z zK^RRP?r2>!B8%%F=3<_cp?HLSwWi4SyGqR4MkF>8L7ZQFhr7M2fc(84Hwl0VRH`yW~tA>v={EIQ?Z;SSfcU3Kig=wWScuFE3 zEN7^Mi1kb@6g_q*F;Cq(0=d>3N1JD3Yv^M=R<~yf9_zUg ziM!frM*6!Li4Dw~O**g8^%Ad3Hb~O#OayG{<=alPr0!O`uu|NHv2L zttJk+nDM>GFUTdl7rI;;aKgk~R8w=~CPp`PszPHiD8ILZB2!PHhBZl_FDv%;;O=5N z=!y@V$TwL~ZL=>n|Hk1leiG^P*`$lAT`lcrU!b=iTd_gd;7RN3IQ!Z&zn3)#V)vhC z_oeh8#ba*B5Eq|%Aj`U&J_3H_Ih*ZM!YD#^Au9?kA+f`+lsRucR+jDa^dLwBozElV zymbz4Y?eRKj<@iv_y5Q>%fOi|M8(xyo-gV{!@-9H#DQlQAd)W;+*F5zx8%=3V>ApuTP>$|0r!p2>*gmK z_Jsn!j=Vh7YQNNBFiX{mA;>RCxN(T z{vvdrRL7=nNo>qBH3x z3}qr?a(JQ>v*1CNf_mWUKIzy@!-~pp@YZy1TszR1PxT8!KPh7>FU$OR7wVQof%2}y zHOfh%k%iJIJa%e+VWAN9jm8U-ff8H;Md<}mJXv!4tW#%tN=DfA9812TCu2iY!t}t>hRI-c-LEVVt1{ly4<=BoEJ)a zhvwwhC%@V+?uuk(CeDRiyYn%a(+WN+fg~BHv}O{yCw)hTpRI1S{?)Q1uXbk>_aw7*r_?$b-Y3(fP!RpI!nQ7i1)&*l zqI5g2?9>nAn)u%TxZ|3*1Xp^y0!Fw6cR2J7FWpb)jS`L zX);9b)8e?ECf5vok>R65=88K%hRiICElAe2e#A9}l;0BvZocV7a|BL-ga`HWyXA~u zDRzEcSTMsu&wX5Q%>EvF#goyab8!f zEQIkI9lh}UFhZx&)%-3^D!|JF9VR{3Q}};v@GxLTa(VUyCVx) zAK&}SCG;6SUDa?OT9ZL;iBh1dFr8;Qs<%TAr5?Pk-DN75XuXS(GFmbSs@@QTvQ=oK zrpJ|G{hJHH!UwHx(PPibBdQD|7flh>WXCmEF}qj^mvvwAm# zr0R`%9JFTVUaaVy8*zqwU~Fe2b&*f9ty#k8zJOfFW9wbx(z-kSd-6C&(?QSCh(~HJ zoDf3y63$-^138Oo(Qi;#$9;H)^PjVHZ`duaTJ6Oh&Q(DYh;U*v-OF7${0F3qRRF7J zmU*gk?1I+mDKdUdBDo3(r6|N{rBfZl!XnKjzA;H^4v&iI!WPlYB3raAiqJ0&uMOv0 z&!2>!cp6nEvHyj(oadbhVOsvdAe-SAXAXJikT# zT+;4g?TcDBY=k?#$M)V#OntfcuhR_~&q>}r>Fp=D4!3 z)ghs38Ji8Q!EXBPIk=m#yUUY@DCJXOK#Zi#mBu1tWP@%$I?ZVF)e@`nvZ90<|H5VG z!Gnu`Q1~Gi7ShZ>Pjdg;PS$a|zW?wHroLVOn{3~4QzbEu9{*-5k}BoRlY4OaJ3jyE zFE~|X@&GXfpfmLAP+Lc{rue^IRcdk<2Y6O|!Q($<&HwtgN^P?yK-gfj=RtE^SR4~r6n_H! ztz57Z zGMnUn*^_VwAlY`Ayr(|la^udmveoS)0RgJx6+yNmQwH_ldi&}^oAP^fycx<*)esq^ zmE?wZR+kwg9V6W_i{7J`SC`zKUo%6lxhj?c5g>a~YQcpzP2YNFzq+P@VW!isF0b5{ z>c8C_tWgv{TGv+z@B+$EEW@PAebEQBK<1W(oIo)U15|}Ki}`i>fba;j5Hru!# zSOMgb3-tIJ029n2V47eym#YktTw*xGMOy@0)Q3;72_LL_+K4!!bS(t7hAHpuM8%Ch z!@5ngPeZ1oH7qUOLTklp&jyGDaHNjEs^zU!3T(b5dsZ}Du!S$YZeU~&D`V>_Amw*U z>)8%9wQ8#0&cCu@ax~s7t`ceeb|9}7ntFLWydjs51I-I2aQqUajp9k(^bOsup-Cfg?wnxg8*CYyct3n5>piwnHZP z?>t%H{p?*41WW;w+v54P+P#nl9nBexqwtM3ZrVCBw0-k;f((h*w)xgLiSypW(zwPz z6(TMASc`DW+XTjGu&^aHCLh#purx#S%BjhwS?d@EoU2s~Jfp)VjDH_`@?T$=k61~w z^osAQbG_AF{kf~=RmdfjSgD3j@a3}OD;QtSkb*bM#s!uOT{(N1eDACOENF>Io%4TWE-O5Ue3@qUF&WOXnVxDD$-!Ofow{nQdaTZ-Vb!a-PYKjAkSJ@WC z5^VE*oKE}m^%anA{LupFhsD*5oNj~p*643ONw|5Nkv~fpHUYPj@4iLj<8GAa$Kos+ z?PG+phiN`N8{PF3%-20t&BfqY7sn>4z?rvKJ3>av2#r4}@UC3$htFkGJQ!UIY~`hc zj>uiHZ{o@8Kgy#6r>l?QJJL6H4K~A=oy&9!5wT}H*_Out`rfvOq-jDkULDDNe|JpY zk$M1|iGnl<0os5mWs$anJDGr3pq6n^|B?(g%vLj(t&9&k?3bp)JXgs~yqg=r$8?^) z4ZEx&El*IaWD2+;rs?G=oKUMn%1F~FZh?}zGE^MnQ@Jii{C*Liq%YZOyR>-454e8; zzvE!twv?#9e*hP;d(!y+vK=>G8uZr)d)FG@7S< z=(RguAvrbNxezOyuo3uYrseidFA1HM-1#jHLoYZ)yr}iW?zHZybdj8NZ6mD%>rbkz zp2u02uf{u0sv>8aRo6s_SC4Lp$BJSLFI}e`M0^>iu?0qB($n*EhTlwK-{rJ?qPNy3 z46r5a{%g^4#U-fzezY>ZxU234JZ`@T{&ewv)#|Dvx|&7l9ZMzM@OQVn14-L=u$SQ_ zie;vgGt!wa2UbmpMju?tS2*ii6N@!Ia!m>#^_U#+J=6rPZo5~;#^#WWpIv);7uo-< z{~fUyC1j!1={AIY?4?th^75KzE8E1*GtV$oV`6h#hbBc_wnVL)c)>mpgPdf!#w}^!BQ$0!M0~V}zIfJ{qML#yI82 zAAAhghe;uq)#2;wdYrZvf7*pQ*=Llg+@F_u!mqDI8CHQCvIr6 zP-~f?Wqj4y-y)2?Ivog(pzd@*TAm3}GHCfm+%B*3GuGdKBAXBrQWK4f7R3=%g{8z!E{zZT9ZKKR@|Ff zkkg7A*aiKyXq{x|`iiuOt3^dEN>`mu7juUh$8{siz@_|bAKm|ERoL9f zG+j*ad{Vpu0P1V3RXLEQ5qk~@d|9pWNsJatUEnxM@e92&vxR1_PWAaKEJ*ctL zO07GY3T1@_#~@?rTjWQcWPx(~s`X2AL5w!R=X(xbr`{Ig`K^G_Ph0$wV1A!sQhriu zykp&O#~&kWZc44+(yNwNT^xZGSe}~5U>u{36=rD`?e=cySX7p4X5FisN=}kAniMlL zKNlTVqJYd53A^ln$6~C~`TH+H&Omh0q!Cfk68x&SudB?uH2$;kE782hAZvTZV%5Hw zBXz(r0&^Fi;x(7+we9o-rzg=GgS4c`%7vgzW#ljvS$9Tj)y-PPIJqA

JBC@yG_ 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + koalixcrm back-end (django application) + + Database(postgresql database server application) + + + koalixcrm front-end (html and jquery based application) + Standardinstallation with docker with postgresql and apache2 + + apache fop(java application) + + + apache 2 + + + + + + + + + + File based + + TCP/IP + + TCP/IP + + TCP/IP + + koalixcrm-apache2-Dockerinstallation + + Browser ofEnd-user + + postgresql-Dockerinstallation + + libapache2 mod wsgi(apache library) + + diff --git a/documentation/source/images/koalixcrm_architecture_django_webserver.png b/documentation/source/images/koalixcrm_architecture_django_webserver.png new file mode 100644 index 0000000000000000000000000000000000000000..312a6396b0772a793ede2294ebeac1e1cc152ada GIT binary patch literal 51555 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 Wtyb1digz%8f9lHGN)?Z6!u}T=NJJ(8 literal 0 HcmV?d00001 diff --git a/documentation/source/images/koalixcrm_architecture_django_webserver.svg b/documentation/source/images/koalixcrm_architecture_django_webserver.svg new file mode 100644 index 00000000..021776fd --- /dev/null +++ b/documentation/source/images/koalixcrm_architecture_django_webserver.svg @@ -0,0 +1,579 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + koalixcrm back-end (django server application) + + Database(postgresql database server application) + + + koalixcrm front-end (html and jquery based application) + Standardinstallation with docker with postgresql + + apache fop(java application) + + + koalixcrm back-end (django server static file serve) + + + + + + + + + + File based + + TCP/IP + + TCP/IP + + TCP/IP + + koalixcrm-Dockerinstallation + + Browser ofEnd-user + + postgresql-Dockerinstallation + + diff --git a/documentation/source/images/pdfcreation.png b/documentation/source/images/pdfcreation.png new file mode 100644 index 0000000000000000000000000000000000000000..8aca0a64362ed67c29a59d3fa755b0c73c101cd1 GIT binary patch literal 53470 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%0D$)f7I&Mp|E@?X0i7MlHp3{s_oEH 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 literal 0 HcmV?d00001 diff --git a/documentation/source/images/pdfcreation.svg b/documentation/source/images/pdfcreation.svg index fb3fca74..bde0c6ce 100644 --- a/documentation/source/images/pdfcreation.svg +++ b/documentation/source/images/pdfcreation.svg @@ -13,8 +13,11 @@ height="297mm" id="svg2" version="1.1" - inkscape:version="0.48.0 r9654" - sodipodi:docname="Neues Dokument 1"> + inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" + sodipodi:docname="pdfcreation.svg" + inkscape:export-filename="/home/aaron/PycharmProjects/koalixcrm/documentation/source/images/pdfcreation.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> @@ -57,7 +60,7 @@ image/svg+xml - + @@ -95,60 +98,93 @@ y="695.50348" /> koalixcrmkoalixcrmdocument-xml-file + style="font-size:28px;line-height:1.25" + id="tspan5118">xml-file<xml></xml> Your indi-Your indi-vidual xsl-template -filevidual xsl-<xml>file + y="282.42639" + style="font-size:28px;line-height:1.25" + id="tspan5126"></xml> fo-xml-file + y="420.94489" + style="font-size:28px;line-height:1.25">fo-xml-file pdf-file + y="747.44696" + style="font-size:28px;line-height:1.25">pdf-file This part isThis part iscompletely donecompletely doneby apache-fop + x="-751.289" + y="212.36693" + id="tspan4665" + style="font-size:28px;line-height:1.25">by apache-fop <xml><xml></xml> + id="tspan4683" + style="font-size:28px;line-height:1.25"></xml> diff --git a/documentation/source/index.rst b/documentation/source/index.rst index 25e91ee4..34059117 100644 --- a/documentation/source/index.rst +++ b/documentation/source/index.rst @@ -4,7 +4,7 @@ Welcome to koalixcrm's documentation! Contents: .. toctree:: - :maxdepth: 3 + :maxdepth: 2 installation intro @@ -13,6 +13,7 @@ Contents: crm djangoUserExtention customisation + architecture faq Indices and tables diff --git a/entrypoint.prod.sh b/entrypoint.prod.sh index 28912987..7ab79801 100644 --- a/entrypoint.prod.sh +++ b/entrypoint.prod.sh @@ -25,9 +25,4 @@ chmod -R 755 projectsettings/static/pdf # Execute startup scripts python manage.py collectstatic --noinput python manage.py migrate - -# Create django user, will own the media dir -adduser --no-create-home --disabled-login --group --system django -chown -R django:django /app/projectsettings/media - -/usr/local/bin/uwsgi --emperor /etc/uwsgi/django-uwsgi.ini \ No newline at end of file +python manage.py runserver 0.0.0.0:8000 \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh index 6108a2e3..6ef73898 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,7 +1,7 @@ #!/bin/bash # Install dependencies -#pip install -r development_requirements.txt +pip install -r development_requirements.txt # Install FOP 2.2 wget http://archive.apache.org/dist/xmlgraphics/fop/binaries/fop-2.2-bin.tar.gz @@ -24,9 +24,5 @@ chmod -R 755 projectsettings/static/pdf # Execute startup scripts python manage.py collectstatic --noinput -#python manage.py makemigrations python manage.py migrate -#echo "from django.contrib.auth.models import User; User.objects.filter(email='admin@example.com').delete(); User.objects.create_superuser('admin', 'admin@example.com', 'sysadmin')" | python manage.py shell -python manage.py runserver 0.0.0.0:8000 - - +python manage.py runserver 0.0.0.0:8000 \ No newline at end of file diff --git a/koalixcrm/__init__.py b/koalixcrm/__init__.py index de98902b..e69de29b 100644 --- a/koalixcrm/__init__.py +++ b/koalixcrm/__init__.py @@ -1,7 +0,0 @@ -from __future__ import absolute_import, unicode_literals - -# This will make sure the app is always imported when -# Django starts so that shared_task will use this app. -from .celery import app as celery_app - -__all__ = ['celery_app'] \ No newline at end of file diff --git a/koalixcrm/accounting/admin.py b/koalixcrm/accounting/admin.py index 7b4b13b9..4dd1740d 100644 --- a/koalixcrm/accounting/admin.py +++ b/koalixcrm/accounting/admin.py @@ -5,30 +5,27 @@ from koalixcrm.accounting.views import * -class AccountingPeriodBooking(admin.TabularInline): - model = Booking - extra = 1 - show_change_link = True - can_delete = True - classes = ['collapse'] - fields = ('fromAccount', 'toAccount', 'description', 'amount', 'bookingDateOnly', 'staff', 'bookingReference',) - readonly_fields = ( - 'fromAccount', 'toAccount', 'description', 'amount', 'bookingDateOnly', 'staff', 'bookingReference',) - allow_add = True - - class OptionBooking(admin.ModelAdmin): - list_display = ('fromAccount', 'toAccount', 'amount', 'bookingDateOnly', 'staff') - fieldsets = ((_('Basic'), {'fields': ( - 'fromAccount', 'toAccount', 'amount', 'bookingDate', 'staff', 'description', 'bookingReference', - 'accountingPeriod')}),) + list_display = ('from_account', + 'to_account', + 'amount', + 'booking_date_only', + 'staff') + fieldsets = ((_('Basic'), {'fields': ('from_account', + 'to_account', + 'amount', + 'booking_date', + 'staff', + 'description', + 'booking_reference', + 'accounting_period')}),) save_as = True def save_model(self, request, obj, form, change): - if (change == True): - obj.lastmodifiedby = request.user + if change: + obj.last_modified_by = request.user else: - obj.lastmodifiedby = request.user + obj.last_modified_by = request.user obj.staff = request.user obj.save() @@ -39,11 +36,18 @@ class InlineBookings(admin.TabularInline): classes = ['collapse'] fieldsets = ( ('Basics', { - 'fields': ('fromAccount', 'toAccount', 'description', 'amount', 'bookingDate', 'staff', 'bookingReference',) + 'fields': ('from_account', + 'to_account', + 'description', + 'amount', + 'booking_date', + 'staff', + 'booking_reference',) }), ) allow_add = False + class AccountForm(forms.ModelForm): """AccountForm is used to overwrite the clean method of the original form and to add an additional checks to the model""" @@ -55,23 +59,23 @@ class Meta: def clean(self): super(AccountForm, self).clean() errors = [] - if (self.cleaned_data['isopenreliabilitiesaccount']): - openliabilitiesaccount = Account.objects.filter(isopenreliabilitiesaccount=True) - if (self.cleaned_data['accountType'] != "L"): + if (self.cleaned_data['is_open_reliabilities_account']): + open_reliabilities_account = Account.objects.filter(is_open_reliabilities_account=True) + if (self.cleaned_data['account_type'] != "L"): errors.append(_('The open liabilites account must be a liabities account')) - elif openliabilitiesaccount: + elif open_reliabilities_account: errors.append(_('There may only be one open liablities account in the system')) - if (self.cleaned_data['isopeninterestaccount']): - openinterestaccounts = Account.objects.filter(isopeninterestaccount=True) - if (self.cleaned_data['accountType'] != "A"): + if (self.cleaned_data['is_open_interest_account']): + open_interest_account = Account.objects.filter(is_open_interest_account=True) + if (self.cleaned_data['account_type'] != "A"): errors.append(_('The open intrests account must be an asset account')) - elif openinterestaccounts: + elif open_interest_account: errors.append(_('There may only be one open intrests account in the system')) - if (self.cleaned_data['isACustomerPaymentAccount']): - if (self.cleaned_data['accountType'] != "A"): + if (self.cleaned_data['is_a_customer_payment_account']): + if (self.cleaned_data['account_type'] != "A"): errors.append(_('A customer payment account must be an asset account')) - if (self.cleaned_data['isProductInventoryActiva']): - if (self.cleaned_data['accountType'] != "A"): + if (self.cleaned_data['is_product_inventory_activa']): + if (self.cleaned_data['account_type'] != "A"): errors.append(_('A product inventory account must be an asset account')) if len(errors) > 0: raise forms.ValidationError(errors) @@ -79,11 +83,23 @@ def clean(self): class OptionAccount(admin.ModelAdmin): - list_display = ('accountNumber', 'accountType', 'title', 'sumOfAllBookings') - list_display_links = ('accountNumber', 'accountType', 'title', 'sumOfAllBookings') - fieldsets = ((_('Basic'), {'fields': ( - 'accountNumber', 'accountType', 'title', 'description', 'isopenreliabilitiesaccount', 'isopeninterestaccount', - 'isProductInventoryActiva', 'isACustomerPaymentAccount')}),) + list_display = ('account_number', + 'account_type', + 'title', + 'sum_of_all_bookings') + list_display_links = ('account_number', + 'account_type', + 'title', + 'sum_of_all_bookings') + fieldsets = ((_('Basic'), + {'fields': ('account_number', + 'account_type', + 'title', + 'description', + 'is_open_reliabilities_account', + 'is_open_interest_account', + 'is_product_inventory_activa', + 'is_a_customer_payment_account')}),) save_as = True form = AccountForm @@ -111,14 +127,26 @@ def clean(self): class OptionAccountingPeriod(admin.ModelAdmin): - list_display = ('title', 'begin', 'end') - list_display_links = ('title', 'begin', 'end') + list_display = ('title', + 'begin', + 'end', + 'template_set_balance_sheet', + 'template_profit_loss_statement') + list_display_links = ('title', + 'begin', + 'end', + 'template_set_balance_sheet', + 'template_profit_loss_statement') fieldsets = ( (_('Basics'), { - 'fields': ('title', 'begin', 'end') + 'fields': ('title', + 'begin', + 'end', + 'template_set_balance_sheet', + 'template_profit_loss_statement') }), ) - inlines = [AccountingPeriodBooking, ] + inlines = [InlineBookings, ] save_as = True form = AccountingPeriodForm @@ -126,26 +154,36 @@ class OptionAccountingPeriod(admin.ModelAdmin): def save_formset(self, request, form, formset, change): instances = formset.save(commit=False) for instance in instances: - if (change == True): - instance.lastmodifiedby = request.user + if change: + instance.last_modified_by = request.user else: - instance.lastmodifiedby = request.user + instance.last_modified_by = request.user instance.staff = request.user instance.save() - def createBalanceSheet(self, request, queryset): + def create_pdf_of_balance_sheet(self, request, queryset): + from koalixcrm.crm.views.pdfexport import PDFExportView for obj in queryset: - response = exportPDF(self, request, obj, "balanceSheet", "/admin/accounting/accountingperiod/") + response = PDFExportView.export_pdf(self, + request, + obj, + ("/admin/accounting/"+obj.__class__.__name__.lower()+"/"), + obj.template_set_balance_sheet) return response - createBalanceSheet.short_description = _("Create PDF of Balance Sheet") + create_pdf_of_balance_sheet.short_description = _("Create PDF of Balance Sheet") - def createProfitLossStatement(self, request, queryset): + def create_pdf_of_profit_loss_statement(self, request, queryset): + from koalixcrm.crm.views.pdfexport import PDFExportView for obj in queryset: - response = exportPDF(self, request, obj, "profitLossStatement", "/admin/accounting/accountingperiod/") + response = PDFExportView.export_pdf(self, + request, + obj, + ("/admin/accounting/"+obj.__class__.__name__.lower()+"/"), + obj.template_profit_loss_statement,) return response - createProfitLossStatement.short_description = _("Create PDF of Profit Loss Statement Sheet") + create_pdf_of_profit_loss_statement.short_description = _("Create PDF of Profit Loss Statement Sheet") def exportAllAccounts(self, request, queryset): for obj in queryset: @@ -154,15 +192,15 @@ def exportAllAccounts(self, request, queryset): exportAllAccounts.short_description = _("Create XML of all Accounts") - actions = ['createBalanceSheet', 'createProfitLossStatement', 'exportAllAccounts', ] + actions = ['create_pdf_of_balance_sheet', 'create_pdf_of_profit_loss_statement', 'exportAllAccounts', ] class OptionProductCategorie(admin.ModelAdmin): - list_display = ('title', 'profitAccount', 'lossAccount') - list_display_links = ('title', 'profitAccount', 'lossAccount') + list_display = ('title', 'profit_account', 'loss_account') + list_display_links = ('title', 'profit_account', 'loss_account') fieldsets = ( (_('Basics'), { - 'fields': ('title', 'profitAccount', 'lossAccount') + 'fields': ('title', 'profit_account', 'loss_account') }), ) save_as = True diff --git a/koalixcrm/accounting/exceptions.py b/koalixcrm/accounting/exceptions.py index 2adba1a5..2a4ae541 100644 --- a/koalixcrm/accounting/exceptions.py +++ b/koalixcrm/accounting/exceptions.py @@ -15,3 +15,20 @@ def __init__(self, value): def __str__(self): return repr(self.value) + + +class AccountingPeriodNotFound(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + + +class TemplateSetMissingInAccountingPeriod(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + diff --git a/koalixcrm/accounting/migrations/0006_auto_20180422_2048.py b/koalixcrm/accounting/migrations/0006_auto_20180422_2048.py new file mode 100644 index 00000000..a8a95955 --- /dev/null +++ b/koalixcrm/accounting/migrations/0006_auto_20180422_2048.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-04-22 20:48 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('djangoUserExtension', '0004_auto_20171210_2126'), + ('accounting', '0005_auto_20171110_1732'), + ] + + operations = [ + migrations.AlterModelOptions( + name='account', + options={'ordering': ['account_number'], 'verbose_name': 'Account', 'verbose_name_plural': 'Account'}, + ), + migrations.RenameField( + model_name='account', + old_name='accountNumber', + new_name='account_number', + ), + migrations.RenameField( + model_name='account', + old_name='accountType', + new_name='account_type', + ), + migrations.RenameField( + model_name='account', + old_name='isACustomerPaymentAccount', + new_name='is_a_customer_payment_account', + ), + migrations.RenameField( + model_name='account', + old_name='isopeninterestaccount', + new_name='is_open_interest_account', + ), + migrations.RenameField( + model_name='account', + old_name='isopenreliabilitiesaccount', + new_name='is_open_reliabilities_account', + ), + migrations.RenameField( + model_name='account', + old_name='isProductInventoryActiva', + new_name='is_product_inventory_activa', + ), + migrations.RenameField( + model_name='booking', + old_name='accountingPeriod', + new_name='accounting_period', + ), + migrations.RenameField( + model_name='booking', + old_name='bookingDate', + new_name='booking_date', + ), + migrations.RenameField( + model_name='booking', + old_name='bookingReference', + new_name='booking_reference', + ), + migrations.RenameField( + model_name='booking', + old_name='dateofcreation', + new_name='date_of_creation', + ), + migrations.RenameField( + model_name='booking', + old_name='fromAccount', + new_name='from_account', + ), + migrations.RenameField( + model_name='booking', + old_name='lastmodification', + new_name='last_modification', + ), + migrations.RenameField( + model_name='booking', + old_name='lastmodifiedby', + new_name='last_modified_by', + ), + migrations.RenameField( + model_name='booking', + old_name='toAccount', + new_name='to_account', + ), + migrations.RenameField( + model_name='productcategorie', + old_name='lossAccount', + new_name='loss_account', + ), + migrations.RenameField( + model_name='productcategorie', + old_name='profitAccount', + new_name='profit_account', + ), + migrations.AddField( + model_name='accountingperiod', + name='template_set', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='djangoUserExtension.DocumentTemplate', verbose_name='Referred Template'), + ), + ] diff --git a/koalixcrm/accounting/migrations/0007_auto_20180422_2105.py b/koalixcrm/accounting/migrations/0007_auto_20180422_2105.py new file mode 100644 index 00000000..e0ed9fd2 --- /dev/null +++ b/koalixcrm/accounting/migrations/0007_auto_20180422_2105.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-04-22 21:05 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('djangoUserExtension', '0004_auto_20171210_2126'), + ('accounting', '0006_auto_20180422_2048'), + ] + + operations = [ + migrations.RemoveField( + model_name='accountingperiod', + name='template_set', + ), + migrations.AddField( + model_name='accountingperiod', + name='template_profit_loss_statement', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='db_profit_loss_statement_template_set', to='djangoUserExtension.DocumentTemplate', verbose_name='Referred template for profit, loss statement'), + ), + migrations.AddField( + model_name='accountingperiod', + name='template_set_balance_sheet', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='db_balancesheet_template_set', to='djangoUserExtension.DocumentTemplate', verbose_name='Referred template for balance sheet'), + ), + ] diff --git a/koalixcrm/accounting/models.py b/koalixcrm/accounting/models.py index fdf7d9af..825c4c1f 100644 --- a/koalixcrm/accounting/models.py +++ b/koalixcrm/accounting/models.py @@ -1,52 +1,134 @@ # -*- coding: utf-8 -*- - -import os from datetime import * -from subprocess import check_output -from subprocess import STDOUT -from xml.dom.minidom import Document - -from django.conf import settings -from django.core import serializers from django.db import models from django.utils.translation import ugettext as _ -from koalixcrm import djangoUserExtension -from koalixcrm.crm.exceptions import UserExtensionMissing from koalixcrm.accounting.const.accountTypeChoices import * -from koalixcrm.accounting.exceptions import NoObjectsToBeSerialzed -from koalixcrm.accounting.exceptions import ProgrammingError +from koalixcrm.accounting.exceptions import AccountingPeriodNotFound +from koalixcrm.accounting.exceptions import TemplateSetMissingInAccountingPeriod +from koalixcrm.crm.documents.pdfexport import PDFExport class AccountingPeriod(models.Model): - """Accounting period repesents the equivalent of the business logic element of a fiscal year - the accounting period is refered in the booking and is used as a supporting object to generate + """Accounting period represents the equivalent of the business logic element of a fiscal year + the accounting period is referred in the booking and is used as a supporting object to generate balance sheets and profit/loss statements""" title = models.CharField(max_length=200, verbose_name=_("Title")) # For example "Year 2009", "1st Quarter 2009" begin = models.DateField(verbose_name=_("Begin")) end = models.DateField(verbose_name=_("End")) + template_set_balance_sheet = models.ForeignKey("djangoUserExtension.DocumentTemplate", + verbose_name=_("Referred template for balance sheet"), + related_name='db_balancesheet_template_set', + null=True, + blank=True) + template_profit_loss_statement = models.ForeignKey("djangoUserExtension.DocumentTemplate", + verbose_name=_("Referred template for profit, loss statement"), + related_name='db_profit_loss_statement_template_set', + null=True, + blank=True) + + def get_template_set(self, template_set): + if template_set == self.template_set_balance_sheet: + if self.template_set_balance_sheet: + return self.template_set_balance_sheet + else: + raise TemplateSetMissingInAccountingPeriod((_("Template Set for balance sheet is missing in Accounting Period" + str(self)))) + elif template_set == self.template_profit_loss_statement: + if self.template_profit_loss_statement: + return self.template_profit_loss_statement + else: + raise TemplateSetMissingInAccountingPeriod((_("Template Set for profit loss statement is missing in Accounting Period" + str(self)))) + + def get_fop_config_file(self, template_set): + template_set = self.get_template_set(template_set) + return template_set.get_fop_config_file() + + def get_xsl_file(self, template_set): + template_set = self.get_template_set(template_set) + return template_set.get_xsl_file() + + def create_pdf(self, template_set, printed_by): + import koalixcrm.crm + return koalixcrm.crm.documents.pdfexport.PDFExport.create_pdf(self, template_set, printed_by) + + def overall_earnings(self): + earnings = 0; + accounts = Account.objects.all() + for account in list(accounts): + if account.account_type == "E": + earnings += account.sum_of_all_bookings_within_accounting_period(self) + return earnings + + def overall_spendings(self): + spendings = 0; + accounts = Account.objects.all() + for account in list(accounts): + if account.account_type == "S": + spendings += account.sum_of_all_bookings_within_accounting_period(self) + return spendings + + def overall_assets(self): + assets = 0; + accounts = Account.objects.all() + for account in list(accounts): + if account.account_type == "A": + assets += account.sum_of_all_bookings_through_now(self) + return assets + + def overall_liabilities(self): + liabilities = 0; + accounts = Account.objects.all() + for account in list(accounts): + if account.account_type == "L": + liabilities += account.sum_of_all_bookings_through_now(self) + return liabilities + + def serialize_to_xml(self): + objects = [self, ] + main_xml = PDFExport.write_xml(objects) + accounts = Account.objects.all() + for account in accounts: + account_xml = account.serialize_to_xml(self) + main_xml = PDFExport.merge_xml(main_xml, account_xml) + main_xml = PDFExport.append_element_to_pattern(main_xml, + "object/[@model='accounting.accountingperiod']", + "Overall_Earnings", + self.overall_earnings()) + main_xml = PDFExport.append_element_to_pattern(main_xml, + "object/[@model='accounting.accountingperiod']", + "Overall_Spendings", + self.overall_spendings()) + main_xml = PDFExport.append_element_to_pattern(main_xml, + "object/[@model='accounting.accountingperiod']", + "Overall_Assets", + self.overall_assets()) + main_xml = PDFExport.append_element_to_pattern(main_xml, + "object/[@model='accounting.accountingperiod']", + "Overall_Liabilities", + self.overall_liabilities()) + return main_xml @staticmethod - def getCurrentValidAccountingPeriod(): - """Returns the accounting period that is currently valid. Valid is an accountingPeriod when the current date - lies between begin and end of the accountingPeriod + def get_current_valid_accounting_period(): + """Returns the accounting period that is currently valid. Valid is an accounting_period when the current date + lies between begin and end of the accounting_period Args: no arguments Returns: - accoutingPeriod (AccoutingPeriod) + accounting_period (AccoutingPeriod) Raises: - NoFeasableAccountingPeriodFound when there is no valid accounting Period""" - currentValidAccountingPeriod = None - for accountingPeriod in AccountingPeriod.objects.all(): - if accountingPeriod.begin < date.today() and accountingPeriod.end > date.today(): - return accountingPeriod - if currentValidAccountingPeriod == None: - raise NoFeasableAccountingPeriodFound() + AccountingPeriodNotFound when there is no valid accounting Period""" + current_valid_accounting_period = None + for accounting_period in AccountingPeriod.objects.all(): + if accounting_period.begin < date.today() and accounting_period.end > date.today(): + return accounting_period + if not current_valid_accounting_period: + raise AccountingPeriodNotFound() @staticmethod - def getAllPriorAccountingPeriods(targetAccountingPeriod): + def get_all_prior_accounting_periods(target_accounting_period): """Returns the accounting period that is currently valid. Valid is an accountingPeriod when the current date lies between begin and end of the accountingPeriod @@ -54,131 +136,17 @@ def getAllPriorAccountingPeriods(targetAccountingPeriod): no arguments Returns: - accoutingPeriods (List of AccoutingPeriod) + accounting_period (List of AccoutingPeriod) Raises: - NoPriorAccountingPeriodFound when there is no valid accounting Period""" - currentValidAccountingPeriod = None - accountingPeriods = [] - for accountingPeriod in AccountingPeriod.objects.all(): - if accountingPeriod.end < targetAccountingPeriod.begin: - accountingPeriods.append(accountingPeriod) - if accountingPeriods == []: - raise NoPriorAccountingPeriodFound() - return accountingPeriods - - @staticmethod - def createXML(whatToCreate): - """This method serialize requestd objects into a XML file which is located in the PDF_OUTPUT_ROOT folder. - - Args: - whatToCreate (str): Which objects that have to be serialized - - Returns: - path_full to the location of the file - - Raises: - ProgrammingError will be raised when incorrect objects to be serialized was selected - NoObjectToBeSerialized will be raised when no object can be serialized""" - - XMLSerializer = serializers.get_serializer("xml") - xml_serializer = XMLSerializer() - if whatToCreate == "allAccount": - path_fullToOutputFile = os.path.join(settings.PDF_OUTPUT_ROOT, "accounts.xml") - objectsToSerialize = Account.objects.all() - else: - raise ProgrammingError( - _("During XML Export it was not correctly specified which data that has to be exported")) - out = open(os.path.join(settings.PDF_OUTPUT_ROOT, "accounts.xml"), "w") - if objectsToSerialize == '': - raise NoObjectsToBeSerialzed(_("During XML Export it was not correctly specied data has to be exported")) - else: - xml_serializer.serialize(objectsToSerialize, stream=out, indent=3) - out.close() - return path_fullToOutputFile - - # TODO def importAllAccountsXML(self): - - def createPDF(self, raisedbyuser, whatToCreate): - userExtension = djangoUserExtension.models.UserExtension.objects.filter(user=raisedbyuser.id) - if (len(userExtension) == 0): - raise UserExtensionMissing(_("During BalanceSheet PDF Export")) - doc = Document() - if whatToCreate == "balanceSheet": - main = doc.createElement("koalixaccountingbalacesheet") - out = open(os.path.join(settings.PDF_OUTPUT_ROOT, "balancesheet_" + str(self.id) + ".xml"), "wb") - else: - main = doc.createElement("koalixaccountingprofitlossstatement") - out = open(os.path.join(settings.PDF_OUTPUT_ROOT, "profitlossstatement_" + str(self.id) + ".xml"), "wb") - accountingPeriodName = doc.createElement("accountingPeriodName") - accountingPeriodName.appendChild(doc.createTextNode(self.__str__())) - main.appendChild(accountingPeriodName) - organisiationname = doc.createElement("organisiationname") - organisiationname.appendChild(doc.createTextNode(userExtension[0].defaultTemplateSet.organisationname)) - main.appendChild(organisiationname) - accountingPeriodTo = doc.createElement("accountingPeriodTo") - accountingPeriodTo.appendChild(doc.createTextNode(self.end.year.__str__())) - main.appendChild(accountingPeriodTo) - accountingPeriodFrom = doc.createElement("accountingPeriodFrom") - accountingPeriodFrom.appendChild(doc.createTextNode(self.begin.year.__str__())) - main.appendChild(accountingPeriodFrom) - headerPicture = doc.createElement("headerpicture") - headerPicture.appendChild(doc.createTextNode(userExtension[0].defaultTemplateSet.logo.path_full)) - main.appendChild(headerPicture) - accounts = Account.objects.all() - overallValueBalance = 0 - overallValueProfitLoss = 0 - for account in list(accounts): - withinAccountingPeriod = account.sumOfAllBookingsWithinAccountingPeriod(self) - beforeAccountingPeriod = account.sumOfAllBookingsBeforeAccountingPeriod(self) - currentValue = withinAccountingPeriod + beforeAccountingPeriod - if (currentValue != 0): - currentAccountElement = doc.createElement("Account") - accountNumber = doc.createElement("AccountNumber") - accountNumber.appendChild(doc.createTextNode(account.accountNumber.__str__())) - beforeAccountingPeriodAccountElement = doc.createElement("beforeAccountingPeriod") - beforeAccountingPeriodAccountElement.appendChild(doc.createTextNode(beforeAccountingPeriod.__str__())) - currentValueElement = doc.createElement("currentValue") - currentValueElement.appendChild(doc.createTextNode(currentValue.__str__())) - accountNameElement = doc.createElement("accountName") - accountNameElement.appendChild(doc.createTextNode(account.title)) - currentAccountElement.setAttribute("accountType", account.accountType.__str__()) - currentAccountElement.appendChild(accountNumber) - currentAccountElement.appendChild(accountNameElement) - currentAccountElement.appendChild(currentValueElement) - currentAccountElement.appendChild(beforeAccountingPeriodAccountElement) - main.appendChild(currentAccountElement) - if account.accountType == "A": - overallValueBalance = overallValueBalance + currentValue; - if account.accountType == "L": - overallValueBalance = overallValueBalance - currentValue; - if account.accountType == "E": - overallValueProfitLoss = overallValueProfitLoss + currentValue; - if account.accountType == "S": - overallValueProfitLoss = overallValueProfitLoss - currentValue; - totalProfitLoss = doc.createElement("TotalProfitLoss") - totalProfitLoss.appendChild(doc.createTextNode(overallValueProfitLoss.__str__())) - main.appendChild(totalProfitLoss) - totalBalance = doc.createElement("TotalBalance") - totalBalance.appendChild(doc.createTextNode(overallValueBalance.__str__())) - main.appendChild(totalBalance) - doc.appendChild(main) - out.write(doc.toprettyxml(indent=" ", newl="\n", encoding="utf-8")) - out.close() - if whatToCreate == "balanceSheet": - check_output( - [settings.FOP_EXECUTABLE, '-c', userExtension[0].defaultTemplateSet.fopConfigurationFile.path_full, '-xml', - os.path.join(settings.PDF_OUTPUT_ROOT, 'balancesheet_' + str(self.id) + '.xml'), '-xsl', - userExtension[0].defaultTemplateSet.balancesheetXSLFile.xslfile.path_full, '-pdf', - os.path.join(settings.PDF_OUTPUT_ROOT, 'balancesheet_' + str(self.id) + '.pdf')], stderr=STDOUT) - return os.path.join(settings.PDF_OUTPUT_ROOT, "balancesheet_" + str(self.id) + ".pdf") - else: - check_output( - [settings.FOP_EXECUTABLE, '-c', userExtension[0].defaultTemplateSet.fopConfigurationFile.path_full, '-xml', - os.path.join(settings.PDF_OUTPUT_ROOT, 'profitlossstatement_' + str(self.id) + '.xml'), '-xsl', - userExtension[0].defaultTemplateSet.profitLossStatementXSLFile.xslfile.path_full, '-pdf', - os.path.join(settings.PDF_OUTPUT_ROOT, 'profitlossstatement_' + str(self.id) + '.pdf')], stderr=STDOUT) - return os.path.join(settings.PDF_OUTPUT_ROOT, "profitlossstatement_" + str(self.id) + ".pdf") + AccountingPeriodNotFound when there is no valid accounting Period""" + accounting_periods = [] + for accounting_period in AccountingPeriod.objects.all(): + if accounting_period.end < target_accounting_period.begin: + accounting_periods.append(accounting_period) + if accounting_periods == []: + raise AccountingPeriodNotFound("Accounting Period does not exist") + return accounting_periods def __str__(self): return self.title @@ -192,81 +160,112 @@ class Meta: class Account(models.Model): - accountNumber = models.IntegerField(verbose_name=_("Account Number")) + account_number = models.IntegerField(verbose_name=_("Account Number")) title = models.CharField(verbose_name=_("Account Title"), max_length=50) - accountType = models.CharField(verbose_name=_("Account Type"), max_length=1, choices=ACCOUNTTYPECHOICES) + account_type = models.CharField(verbose_name=_("Account Type"), max_length=1, choices=ACCOUNTTYPECHOICES) description = models.TextField(verbose_name=_("Description"), null=True, blank=True) - isopenreliabilitiesaccount = models.BooleanField(verbose_name=_("Is The Open Liabilities Account")) - isopeninterestaccount = models.BooleanField(verbose_name=_("Is The Open Interests Account")) - isProductInventoryActiva = models.BooleanField(verbose_name=_("Is a Product Inventory Account")) - isACustomerPaymentAccount = models.BooleanField(verbose_name=_("Is a Customer Payment Account")) - - def sumOfAllBookings(self): - calculated_sum = self.allBookings(fromAccount=False) - self.allBookings(fromAccount=True) - if self.accountType == 'S' or self.accountType == 'L': + is_open_reliabilities_account = models.BooleanField(verbose_name=_("Is The Open Liabilities Account")) + is_open_interest_account = models.BooleanField(verbose_name=_("Is The Open Interests Account")) + is_product_inventory_activa = models.BooleanField(verbose_name=_("Is a Product Inventory Account")) + is_a_customer_payment_account = models.BooleanField(verbose_name=_("Is a Customer Payment Account")) + + def sum_of_all_bookings(self): + calculated_sum = self.all_bookings(from_account=False) - self.all_bookings(from_account=True) + if self.account_type == 'E' or self.account_type == 'L': calculated_sum = 0 - calculated_sum return calculated_sum - sumOfAllBookings.short_description = _("Value"); + sum_of_all_bookings.short_description = _("Value"); - def sumOfAllBookingsWithinAccountingPeriod(self, accountingPeriod): - calculated_sum = self.allBookingsInAccountingPeriod(fromAccount=False, - accountingPeriod=accountingPeriod) - self.allBookingsInAccountingPeriod( - fromAccount=True, accountingPeriod=accountingPeriod) - if self.accountType == 'S' or self.accountType == 'L': - calculated_sum = 0 - calculated_sum + def sum_of_all_bookings_within_accounting_period(self, accounting_period): + calculated_sum = self.all_bookings_within_accounting_period(from_account=False, + accounting_period=accounting_period) - \ + self.all_bookings_within_accounting_period(from_account=True, + accounting_period=accounting_period) + if self.account_type == 'E' or self.account_type == 'L': + calculated_sum = -calculated_sum return calculated_sum - def sumOfAllBookingsBeforeAccountingPeriod(self, currentAccountingPeriod): - accountingPeriods = AccountingPeriod.getAllPriorAccountingPeriods(currentAccountingPeriod) + def sum_of_all_bookings_before_accounting_period(self, current_accounting_period): + try: + accounting_periods = AccountingPeriod.get_all_prior_accounting_periods(current_accounting_period) + except AccountingPeriodNotFound as e: + return 0; sum = 0 - for accountingPeriod in accountingPeriods: - sum = sum + self.allBookingsInAccountingPeriod(fromAccount=False, - accountingPeriod=accountingPeriod) - self.allBookingsInAccountingPeriod( - fromAccount=True, accountingPeriod=accountingPeriod) - if self.accountType == 'S' or self.accountType == 'L': - sum = 0 - sum + for accounting_period in accounting_periods: + sum += self.all_bookings_within_accounting_period(from_account=False, + accounting_period=accounting_period) - self.all_bookings_within_accounting_period( + from_account=True, accounting_period=accounting_period) + if self.account_type == 'E' or self.account_type == 'L': + sum = -sum return sum - def allBookings(self, fromAccount): + def sum_of_all_bookings_through_now(self, current_accounting_period): + within_accounting_period = self.sum_of_all_bookings_within_accounting_period(current_accounting_period) + before_accounting_period = self.sum_of_all_bookings_before_accounting_period(current_accounting_period) + current_value = within_accounting_period + before_accounting_period + return current_value + + def all_bookings(self, from_account): sum = 0 - if fromAccount == True: - bookings = Booking.objects.filter(fromAccount=self.id) + if from_account: + bookings = Booking.objects.filter(from_account=self.id) else: - bookings = Booking.objects.filter(toAccount=self.id) + bookings = Booking.objects.filter(to_account=self.id) for booking in list(bookings): - sum = sum + booking.amount + sum += booking.amount return sum - def allBookingsInAccountingPeriod(self, fromAccount, accountingPeriod): + def all_bookings_within_accounting_period(self, from_account, accounting_period): sum = 0 - if (fromAccount == True): - bookings = Booking.objects.filter(fromAccount=self.id, accountingPeriod=accountingPeriod.id) + if from_account: + bookings = Booking.objects.filter(from_account=self.id, accounting_period=accounting_period.id) else: - bookings = Booking.objects.filter(toAccount=self.id, accountingPeriod=accountingPeriod.id) + bookings = Booking.objects.filter(to_account=self.id, accounting_period=accounting_period.id) for booking in list(bookings): - sum = sum + booking.amount + sum += booking.amount return sum + def serialize_to_xml(self, accounting_period): + objects = [self, ] + main_xml = PDFExport.write_xml(objects) + main_xml = PDFExport.append_element_to_pattern(main_xml, + "object/[@model='accounting.account']", + "sum_of_all_bookings_within_accounting_period", + self.sum_of_all_bookings_within_accounting_period(accounting_period)) + main_xml = PDFExport.append_element_to_pattern(main_xml, + "object/[@model='accounting.account']", + "sum_of_all_bookings_through_now", + self.sum_of_all_bookings_through_now(accounting_period)) + main_xml = PDFExport.append_element_to_pattern(main_xml, + "object/[@model='accounting.account']", + "sum_of_all_bookings_before_accounting_period", + self.sum_of_all_bookings_before_accounting_period(accounting_period)) + main_xml = PDFExport.append_element_to_pattern(main_xml, + "object/[@model='accounting.account']", + "sum_of_all_bookings_through_now", + self.sum_of_all_bookings()) + return main_xml + def __str__(self): - return self.accountNumber.__str__() + " " + self.title + return self.account_number.__str__() + " " + self.title class Meta: app_label = "accounting" verbose_name = _('Account') verbose_name_plural = _('Account') - ordering = ['accountNumber'] + ordering = ['account_number'] class ProductCategorie(models.Model): title = models.CharField(verbose_name=_("Product Categorie Title"), max_length=50) - profitAccount = models.ForeignKey(Account, verbose_name=_("Profit Account"), limit_choices_to={"accountType": "E"}, + profit_account = models.ForeignKey(Account, verbose_name=_("Profit Account"), limit_choices_to={"accountType": "E"}, related_name="db_profit_account") - lossAccount = models.ForeignKey(Account, verbose_name=_("Loss Account"), limit_choices_to={"accountType": "S"}, + loss_account = models.ForeignKey(Account, verbose_name=_("Loss Account"), limit_choices_to={"accountType": "S"}, related_name="db_loss_account") class Meta: @@ -279,27 +278,27 @@ def __str__(self): class Booking(models.Model): - fromAccount = models.ForeignKey(Account, verbose_name=_("From Account"), related_name="db_booking_fromaccount") - toAccount = models.ForeignKey(Account, verbose_name=_("To Account"), related_name="db_booking_toaccount") + from_account = models.ForeignKey(Account, verbose_name=_("From Account"), related_name="db_booking_fromaccount") + to_account = models.ForeignKey(Account, verbose_name=_("To Account"), related_name="db_booking_toaccount") amount = models.DecimalField(max_digits=20, decimal_places=2, verbose_name=_("Amount")) description = models.CharField(verbose_name=_("Description"), max_length=120, null=True, blank=True) - bookingReference = models.ForeignKey('crm.Invoice', verbose_name=_("Booking Reference"), null=True, blank=True) - bookingDate = models.DateTimeField(verbose_name=_("Booking at")) - accountingPeriod = models.ForeignKey(AccountingPeriod, verbose_name=_("AccountingPeriod")) + booking_reference = models.ForeignKey('crm.Invoice', verbose_name=_("Booking Reference"), null=True, blank=True) + booking_date = models.DateTimeField(verbose_name=_("Booking at")) + accounting_period = models.ForeignKey(AccountingPeriod, verbose_name=_("AccountingPeriod")) staff = models.ForeignKey('auth.User', limit_choices_to={'is_staff': True}, blank=True, verbose_name=_("Reference Staff"), related_name="db_booking_refstaff") - dateofcreation = models.DateTimeField(verbose_name=_("Created at"), auto_now=True) - lastmodification = models.DateTimeField(verbose_name=_("Last modified"), auto_now_add=True) - lastmodifiedby = models.ForeignKey('auth.User', limit_choices_to={'is_staff': True}, blank=True, + date_of_creation = models.DateTimeField(verbose_name=_("Created at"), auto_now=True) + last_modification = models.DateTimeField(verbose_name=_("Last modified"), auto_now_add=True) + last_modified_by = models.ForeignKey('auth.User', limit_choices_to={'is_staff': True}, blank=True, verbose_name=_("Last modified by"), related_name="db_booking_lstmodified") - def bookingDateOnly(self): - return self.bookingDate.date() + def booking_date_only(self): + return self.booking_date.date() - bookingDateOnly.short_description = _("Date"); + booking_date_only.short_description = _("Date"); def __str__(self): - return self.fromAccount.__str__() + " " + self.toAccount.__str__() + " " + self.amount.__str__() + return self.from_account.__str__() + " " + self.to_account.__str__() + " " + self.amount.__str__() class Meta: app_label = "accounting" diff --git a/koalixcrm/accounting/static/default_templates/de/balancesheet.xsl b/koalixcrm/accounting/static/default_templates/de/balancesheet.xsl index 546d3f0d..feda5199 100644 --- a/koalixcrm/accounting/static/default_templates/de/balancesheet.xsl +++ b/koalixcrm/accounting/static/default_templates/de/balancesheet.xsl @@ -215,12 +215,7 @@ - - - + diff --git a/koalixcrm/accounting/static/default_templates/de/profitlossstatement.xsl b/koalixcrm/accounting/static/default_templates/de/profitlossstatement.xsl index 892a2919..f69b8e55 100644 --- a/koalixcrm/accounting/static/default_templates/de/profitlossstatement.xsl +++ b/koalixcrm/accounting/static/default_templates/de/profitlossstatement.xsl @@ -212,13 +212,7 @@ - - - - + diff --git a/koalixcrm/accounting/static/default_templates/en/balancesheet.xsl b/koalixcrm/accounting/static/default_templates/en/balancesheet.xsl index 546d3f0d..2c94fc48 100644 --- a/koalixcrm/accounting/static/default_templates/en/balancesheet.xsl +++ b/koalixcrm/accounting/static/default_templates/en/balancesheet.xsl @@ -1,8 +1,9 @@ + - + @@ -10,7 +11,7 @@ page-height="29.7cm" page-width="21cm" margin-top="1.5cm" - margin-bottom="0.5cm" + margin-bottom="1.0cm" margin-left="1.5cm" margin-right="1.5cm"> @@ -20,32 +21,15 @@ - - - - - - - - - - - - - - - - - Balanancesheet of + Balanancesheet of "To be set in the Template file" - + @@ -100,34 +84,44 @@ - - - - - - - + + + - + - + - CHF + CHF + + + + + Total assets + + + + + + + + CHF + + - - - - - + + + + - + - + - CHF + CHF - + + + + Total liabilities + + + + + + + + CHF + + + - CHF + CHF - - - + diff --git a/koalixcrm/accounting/static/default_templates/en/profitlossstatement.xsl b/koalixcrm/accounting/static/default_templates/en/profitlossstatement.xsl index 579ee0cb..2a7ff54f 100644 --- a/koalixcrm/accounting/static/default_templates/en/profitlossstatement.xsl +++ b/koalixcrm/accounting/static/default_templates/en/profitlossstatement.xsl @@ -219,13 +219,7 @@ - - - - + diff --git a/koalixcrm/accounting/static/default_templates/en/purchaseconfirmation.xsl b/koalixcrm/accounting/static/default_templates/en/purchaseconfirmation.xsl deleted file mode 100644 index b8a5ef44..00000000 --- a/koalixcrm/accounting/static/default_templates/en/purchaseconfirmation.xsl +++ /dev/null @@ -1,438 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Erstelldatum: - - Kundennummer: - Auftragsnummer: - - MwSt.-Nummer: - Postkonto: - Gültig bis: - - Ansprechpartner: - Telefon Direkt: - E-mail Direkt: - - - - .. - - KU- - RE- - - keine - PC 000054545 - .. - - - +41(0)545878948 - - - - Guest Guesterich, Gueststreet, CH-9602 Bazenheid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   - - - Rechnung RE- - - - - - - - - - - - - - - - - Guest Guesterich         Gueststreet         9602 Bazenheid         +41 (0)71 511 21 18         info@koalix.com - - - Seite / - - - - - - - - - - - - - - - - - - - Pos. - - - - - Beschreibung - - - - - Anzahl - - - - - Einzelpreis - - - - - Rabatt - - - - - Betrag - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   - - - - - - - - - - - - - - - - - - - - - - % - - - - - - - - - - - - - - - - - - -   - - - - -   - - - - - Zwischensumme - - - - - - - - - - - - - - - - - - - - - - MwSt. - - - - - - - - - - - - - - - - - - - - - - Total - - - - - - - - - - - - - - - - -   - - - Freundliche Grüsse - - -   - - - Guest Guesterich - - - - - - - diff --git a/projectsettings/static/grappelli/stylesheets/mueller/screen.css b/koalixcrm/accounting/tests/__init__.py similarity index 100% rename from projectsettings/static/grappelli/stylesheets/mueller/screen.css rename to koalixcrm/accounting/tests/__init__.py diff --git a/koalixcrm/accounting/tests/test_accountingModelTest.py b/koalixcrm/accounting/tests/test_accountingModelTest.py index df8fe6b9..50694ce2 100644 --- a/koalixcrm/accounting/tests/test_accountingModelTest.py +++ b/koalixcrm/accounting/tests/test_accountingModelTest.py @@ -1,14 +1,183 @@ -from unittest import TestCase - +from django.test import TestCase from koalixcrm.accounting.models import Account +from koalixcrm.accounting.models import AccountingPeriod +from koalixcrm.accounting.models import Booking +from django.contrib.auth.models import User +from koalixcrm.crm.documents.pdfexport import PDFExport +import datetime class AccountingModelTest(TestCase): + def setUp(self): + user = User.objects.create(username='Username', + password="Userone") + + cash = Account.objects.create(account_number="1000", + title="Cash", + account_type="A", + description="Highest liquid asset", + is_open_interest_account=False, + is_open_reliabilities_account=False, + is_product_inventory_activa=False, + is_a_customer_payment_account=True) + bank_account = Account.objects.create(account_number="1300", + title="Bank Account", + account_type="A", + description="Moderate liquid asset", + is_open_interest_account=False, + is_open_reliabilities_account=False, + is_product_inventory_activa=False, + is_a_customer_payment_account=True) + bank_loan = Account.objects.create(account_number="2000", + title="Shortterm bankloans", + account_type="L", + description="Shortterm loan", + is_open_interest_account=False, + is_open_reliabilities_account=False, + is_product_inventory_activa=False, + is_a_customer_payment_account=False) + investment_capital = Account.objects.create(account_number="2900", + title="Investment capital", + account_type="L", + description="Very longterm loan", + is_open_interest_account=False, + is_open_reliabilities_account=False, + is_product_inventory_activa=False, + is_a_customer_payment_account=False) + spendings = Account.objects.create(account_number="3000", + title="Spendings", + account_type="S", + description="Purchase spendings", + is_open_interest_account=False, + is_open_reliabilities_account=False, + is_product_inventory_activa=False, + is_a_customer_payment_account=False) + earnings = Account.objects.create(account_number="4000", + title="Earnings", + account_type="E", + description="Sales account", + is_open_interest_account=False, + is_open_reliabilities_account=False, + is_product_inventory_activa=False, + is_a_customer_payment_account=False) + datetime_now = datetime.datetime(2024, 1, 1, 0, 00) + from_date = datetime_now.date() + to_date = (datetime_now + datetime.timedelta(days=365)).date() + accounting_period_2024 = AccountingPeriod.objects.create(title="Fiscal year 2024", + begin=from_date, + end=to_date) + from_date = (datetime_now + datetime.timedelta(days=(365+1))).date() + to_date = (datetime_now + datetime.timedelta(days=(365*2))).date() + accounting_period_2025 = AccountingPeriod.objects.create(title="Fiscal year 2025", + begin=from_date, + end=to_date) + from_date = (datetime_now + datetime.timedelta(days=(365*2+1))).date() + to_date = (datetime_now + datetime.timedelta(days=(365*3))).date() + AccountingPeriod.objects.create(title="Fiscal year 2026", + begin=from_date, + end=to_date) + Booking.objects.create(from_account=cash, + to_account=spendings, + amount="1000", + description="This is the first booking", + booking_date=datetime.date.today(), + accounting_period=accounting_period_2025, + staff=user, + last_modified_by=user) + + Booking.objects.create(from_account=earnings, + to_account=cash, + amount="500", + description="This is the first booking", + booking_date=datetime.date.today(), + accounting_period=accounting_period_2025, + staff=user, + last_modified_by=user) + + Booking.objects.create(from_account=bank_loan, + to_account=cash, + amount="5000", + description="This is the first booking", + booking_date=datetime.date.today(), + accounting_period=accounting_period_2025, + staff=user, + last_modified_by=user) + + Booking.objects.create(from_account=investment_capital, + to_account=bank_account, + amount="490000", + description="This is the first booking", + booking_date=datetime.date.today(), + accounting_period=accounting_period_2024, + staff=user, + last_modified_by=user) def test_sumOfAllBookings(self): - account = Account( - accountNumber=1234, - title="Account1234") + cash_account = Account.objects.get(title="Cash") + spendings_account = Account.objects.get(title="Spendings") + earnings_account = Account.objects.get(title="Earnings") + self.assertEqual((cash_account.sum_of_all_bookings()).__str__(), "4500.00") + self.assertEqual((spendings_account.sum_of_all_bookings()).__str__(), "1000.00") + self.assertEqual((earnings_account.sum_of_all_bookings()).__str__(), "500.00") + + def test_sumOfAllBookingsBeforeAccountPeriod(self): + cash_account = Account.objects.get(title="Cash") + spendings_account = Account.objects.get(title="Spendings") + earnings_account = Account.objects.get(title="Earnings") + accounting_period_2026 = AccountingPeriod.objects.get(title="Fiscal year 2026") + self.assertEqual((cash_account.sum_of_all_bookings_before_accounting_period(accounting_period_2026)).__str__(), "4500.00") + self.assertEqual((spendings_account.sum_of_all_bookings_before_accounting_period(accounting_period_2026)).__str__(), "1000.00") + self.assertEqual((earnings_account.sum_of_all_bookings_before_accounting_period(accounting_period_2026)).__str__(), "500.00") + + def test_sumOfAllBookingsWithinAccountgPeriod(self): + cash_account = Account.objects.get(title="Cash") + spendings_account = Account.objects.get(title="Spendings") + earnings_account = Account.objects.get(title="Earnings") + accounting_period_2024 = AccountingPeriod.objects.get(title="Fiscal year 2024") + self.assertEqual((cash_account.sum_of_all_bookings_within_accounting_period(accounting_period_2024)).__str__(), "0") + self.assertEqual((spendings_account.sum_of_all_bookings_within_accounting_period(accounting_period_2024)).__str__(), "0") + self.assertEqual((earnings_account.sum_of_all_bookings_within_accounting_period(accounting_period_2024)).__str__(), "0") + + def test_overall_liabilities(self): + accounting_period_2025 = AccountingPeriod.objects.get(title="Fiscal year 2025") + self.assertEqual( + (accounting_period_2025.overall_liabilities()).__str__(), "495000.00") + + def test_overall_assets(self): + accounting_period_2025 = AccountingPeriod.objects.get(title="Fiscal year 2025") + self.assertEqual( + (accounting_period_2025.overall_assets()).__str__(), "494500.00") + + def test_overall_earnings(self): + accounting_period_2025 = AccountingPeriod.objects.get(title="Fiscal year 2025") + self.assertEqual( + (accounting_period_2025.overall_earnings()).__str__(), "500.00") + + def test_overall_spendings(self): + accounting_period_2025 = AccountingPeriod.objects.get(title="Fiscal year 2025") + self.assertEqual( + (accounting_period_2025.overall_spendings()).__str__(), "1000.00") - assert account.accountNumber == 1234 - assert account.title == "Account1234" + def test_serialize_to_xml(self): + accounting_period_2025 = AccountingPeriod.objects.get(title="Fiscal year 2025") + xml = accounting_period_2025.serialize_to_xml() + result=PDFExport.find_element_in_xml(xml,"object/[@model='accounting.account']/field[@name='title']", 'Earnings') + self.assertEqual(result, 1) + result=PDFExport.find_element_in_xml(xml,"object/[@model='accounting.account']/field[@name='title']", 'Spendings') + self.assertEqual(result, 1) + result=PDFExport.find_element_in_xml(xml,"object/[@model='accounting.account']/field[@name='title']", 'Investment capital') + self.assertEqual(result, 1) + result=PDFExport.find_element_in_xml(xml,"object/[@model='accounting.account']/field[@name='title']", 'Shortterm bankloans') + self.assertEqual(result, 1) + result=PDFExport.find_element_in_xml(xml,"object/[@model='accounting.account']/field[@name='title']",'Cash') + self.assertEqual(result, 1) + result=PDFExport.find_element_in_xml(xml,"object/[@model='accounting.account']/field[@name='title']",'Bank Account') + self.assertEqual(result, 1) + result=PDFExport.find_element_in_xml(xml,"object/[@model='accounting.accountingperiod']/Overall_Spendings", '1000.00') + self.assertEqual(result, 1) + result=PDFExport.find_element_in_xml(xml,"object/[@model='accounting.accountingperiod']/Overall_Earnings", '500.00') + self.assertEqual(result, 1) + result=PDFExport.find_element_in_xml(xml,"object/[@model='accounting.accountingperiod']/Overall_Assets", '494500.00') + self.assertEqual(result, 1) + result=PDFExport.find_element_in_xml(xml,"object/[@model='accounting.accountingperiod']/Overall_Liabilities", '495000.00') + self.assertEqual(result, 1) diff --git a/koalixcrm/accounting/tests/test_models.py b/koalixcrm/accounting/tests/test_models.py deleted file mode 100644 index 1488766f..00000000 --- a/koalixcrm/accounting/tests/test_models.py +++ /dev/null @@ -1,6 +0,0 @@ -import unittest - - -class TestExample(unittest.TestCase): - def test_hello_world(self): - self.assertEqual("hello world", "hello world") \ No newline at end of file diff --git a/koalixcrm/celery.py b/koalixcrm/celery.py deleted file mode 100644 index 1576e3e2..00000000 --- a/koalixcrm/celery.py +++ /dev/null @@ -1,22 +0,0 @@ -from __future__ import absolute_import, unicode_literals -import os -from celery import Celery - -# set the default Django settings module for the 'celery' program. -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'projectsettings.settings.development_settings') - -app = Celery('koalixcrm') - -# Using a string here means the worker doesn't have to serialize -# the configuration object to child processes. -# - namespace='CELERY' means all celery-related configuration keys -# should have a `CELERY_` prefix. -app.config_from_object('django.conf:settings', namespace='CELERY') - -# Load task modules from all registered Django app configs. -app.autodiscover_tasks() - - -@app.task(bind=True) -def debug_task(self): - print('Request: {0!r}'.format(self.request)) \ No newline at end of file diff --git a/koalixcrm/crm/admin.py b/koalixcrm/crm/admin.py index 21557884..6675719f 100644 --- a/koalixcrm/crm/admin.py +++ b/koalixcrm/crm/admin.py @@ -8,47 +8,30 @@ from koalixcrm.crm.documents.paymentreminder import PaymentReminder, OptionPaymentReminder from koalixcrm.crm.documents.purchaseorder import PurchaseOrder, OptionPurchaseOrder from koalixcrm.crm.documents.contract import Contract, OptionContract -from koalixcrm.crm.documents.activity import Call -from koalixcrm.crm.documents.visit import Visit, OptionVisit from koalixcrm.crm.product.tax import Tax, OptionTax from koalixcrm.crm.product.unit import Unit, OptionUnit from koalixcrm.crm.product.product import Product, OptionProduct from koalixcrm.crm.product.currency import Currency, OptionCurrency -from koalixcrm.crm.product.attribute import AttributeSet, OptionAttributeSet, Attribute, OptionAttribute from koalixcrm.crm.contact.customer import Customer, OptionCustomer from koalixcrm.crm.contact.supplier import Supplier, OptionSupplier from koalixcrm.crm.contact.customergroup import CustomerGroup, OptionCustomerGroup from koalixcrm.crm.contact.customerbillingcycle import CustomerBillingCycle, OptionCustomerBillingCycle from koalixcrm.crm.contact.person import Person -from koalixcrm.crm.contact.contact import CallForContact, OptionCall, OptionPerson -from koalixcrm.crm.contact.data_import import ContactImportData -from koalixcrm.crm.forms import ImportDataContactForm +from koalixcrm.crm.contact.contact import OptionPerson, CallForContact, VisitForContact +from koalixcrm.crm.documents.activity import OptionCall, OptionVisit +from koalixcrm.crm.reporting.task import Task, OptionTask +from koalixcrm.crm.reporting.tasklinktype import TaskLinkType, OptionTaskLinkType +from koalixcrm.crm.reporting.taskstatus import TaskStatus, OptionTaskStatus +from koalixcrm.crm.reporting.work import Work, OptionWork -class ContactImportDataAdmin(admin.ModelAdmin): - model = ContactImportData - list_display = ('data_file', 'contact_type',) - form = ImportDataContactForm - group_fieldsets = True - - def get_actions(self, request): - actions = super(ContactImportDataAdmin, self).get_actions(request) - if 'delete_selected' in actions: - del actions['delete_selected'] - return actions - - def get_form(self, request, obj=None, **kwargs): - form = super(ContactImportDataAdmin, self).get_form(request, obj, **kwargs) - form.current_user = request.user - return form - - def __init__(self, *args, **kwargs): - super(ContactImportDataAdmin, self).__init__(*args, **kwargs) - #self.list_display_links = (None, ) admin.site.register(Customer, OptionCustomer) admin.site.register(CustomerGroup, OptionCustomerGroup) admin.site.register(CustomerBillingCycle, OptionCustomerBillingCycle) admin.site.register(Supplier, OptionSupplier) +admin.site.register(Person, OptionPerson) +admin.site.register(CallForContact, OptionCall) +admin.site.register(VisitForContact, OptionVisit) admin.site.register(Contract, OptionContract) admin.site.register(Quote, OptionQuote) @@ -62,10 +45,8 @@ def __init__(self, *args, **kwargs): admin.site.register(Currency, OptionCurrency) admin.site.register(Tax, OptionTax) admin.site.register(Product, OptionProduct) -admin.site.register(AttributeSet, OptionAttributeSet) -admin.site.register(Attribute, OptionAttribute) -admin.site.register(CallForContact, OptionCall) -admin.site.register(Visit, OptionVisit) -admin.site.register(Person, OptionPerson) -admin.site.register(ContactImportData, ContactImportDataAdmin) +admin.site.register(Task, OptionTask) +admin.site.register(TaskLinkType, OptionTaskLinkType) +admin.site.register(TaskStatus, OptionTaskStatus) +admin.site.register(Work, OptionWork) diff --git a/koalixcrm/crm/const/contactimport.py b/koalixcrm/crm/const/contactimport.py deleted file mode 100644 index 30d9decb..00000000 --- a/koalixcrm/crm/const/contactimport.py +++ /dev/null @@ -1,91 +0,0 @@ -#IMPOTER FILE COLUMN MAPPING -COMPANY = 0 -ISLEAD = 1 -TYPEOFACTIVITY = 2 -RATING = 3 -VAT = 4 -ZIPCODE = 5 -ADDRESS = 6 -ADDRESS_NO = 7 -CITY = 8 -STATE = 9 -COUNTRY = 10 -MOBILE1 = 11 -PHONE1 = 12 -PHONE2 = 13 -FAX = 14 -PERSONPREFIX = 15 -NAME = 16 -LASTNAME = 17 -ROLE = 18 -PERSONEMAIL = 19 -COMPANYEMAIL = 20 -FIRSTCONTACTDATE = 21 -LASTCONTACTDATE = 22 -EXTLINENOTES = 23 -EXTERNALLINES = 24 -INTERNALLINES = 25 -LINETYPE = 26 -HASSWITCHBOARD = 27 -YEAROFINSTALLATION = 28 -SWITCHBOARDMODEL = 29 -SWITCHBOARDPROVIDER = 30 -MAINTAINER = 31 -PHONEPROVIDE1 = 32 -PHONEPROVIDER2 = 33 -MOBILEPROVIDER = 34 -PHONEEXPIREDATE = 35 -ANALOGPHONES = 36 -DIGITALPHONES = 37 -PHONEMANUFACTURER1 = 38 -PHONEMANUFACTURER2 = 39 -HASINTERNET = 40 -TYPEOFINTERNETCONNECTION = 41 -PHONEMANUFACTURER3 = 42 -PHONEEXPENSES = 43 -INTERNETPROVIDER = 44 -LAN_PC = 45 -INTERNETEXPIREDATE = 46 -INTERNETEXPENSES = 47 -PCMANUFACTURER = 48 -HASPOS = 49 -PHONEFROMPC = 50 -HASCCTV = 51 -ISDIGITALCCTV = 52 -NUMBEROFVC = 53 -WANTSCCTV = 54 -NOOFEMPLOYEES = 55 -TURNOVER = 56 -NETREVENUE = 57 -SHARECAPITAL = 58 -MEETINGNOTES = 59 - -#VALUES -SKIP_ROW_VALUE = '6' - -PHONE_SYSTEM_P_TYPE = 'phone_system' -ANALOG_PHONE_P_TYPE = 'analog_phones' -DIGITAL_PHONE_P_TYPE = 'digital_phones' -INTERNET_P_TYPE = 'internet' -MOBILE_P_TYPE = 'mobile' - -DEFAULT_ATTRIBUTE_SET = 'base_product' -DEFAULT_PHONE_SERVICE_TYPE = 'Sistema telefonico' -DEFAULT_PHONE_ATTRIBUTE_SET = 'Centralino' -DEFAULT_PHONE_PRODUCT = 'CENT01' -DEFAULT_PHONE_PRODUCT_TITLE = 'Centralino Base' -DEFAULT_PHONE_SUPPLIER = 'Telecom' -DEFAULT_PHONE_ATTRIBUTE_SET2 = 'Telefono' -DEFAULT_PHONE_PRODUCT2 = 'PHONE01' -DEFAULT_PHONE_PRODUCT_TITLE2 = 'Telefono base' -DEFAULT_ANALOG_PHONE_SERVICE_TYPE = 'Telefoni analogici' -DEFAULT_DIGITAL_PHONE_SERVICE_TYPE = 'Telefoni digitali' -DEFAULT_MOBILE_SERVICE_TYPE = 'Telefonia mobile' -DEFAULT_INTERNET_SERVICE_TYPE = 'Connettività' -DEFAULT_INTERNET_ATTRIBUTE_SET = 'Connessione' -DEFAULT_INTERNET_PRODUCT = 'CONN01' -DEFAULT_INTERNET_PRODUCT_TITLE = 'Connessione base' -DEFAULT_EMPTY_SUPPLIER = 'Altro' -DEFAULT_TAX = 'IVA22' -DEFAULT_UNIT = 'PZ' -DEFAULT_UNIT_DESCRIPTION = 'Piece' diff --git a/koalixcrm/crm/const/modeltype.py b/koalixcrm/crm/const/modeltype.py deleted file mode 100644 index 9558f482..00000000 --- a/koalixcrm/crm/const/modeltype.py +++ /dev/null @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -* - -from django.utils.translation import ugettext as _ - -MODELTYPE = ( - ('V', _('Varchar')), - ('I', _('Integer')), - ('D', _('Decimal')), - ('T', _('Text')), -) \ No newline at end of file diff --git a/koalixcrm/crm/const/postaladdressprefix.py b/koalixcrm/crm/const/postaladdressprefix.py index e4477c65..894c2988 100644 --- a/koalixcrm/crm/const/postaladdressprefix.py +++ b/koalixcrm/crm/const/postaladdressprefix.py @@ -7,8 +7,4 @@ ('W', _('Mrs')), ('H', _('Mr')), ('G', _('Ms')), - ('J', _('J.D.')), - ('A', _('Ar')), - ('I', _('Ing')), - ('D', _('Dott')), ) diff --git a/koalixcrm/crm/const/purpose.py b/koalixcrm/crm/const/purpose.py index 3a6d874a..b1976882 100644 --- a/koalixcrm/crm/const/purpose.py +++ b/koalixcrm/crm/const/purpose.py @@ -13,7 +13,6 @@ ('O', _('Business')), ('P', _('Mobile Private')), ('B', _('Mobile Business')), - ('F', _('Fax')), ) PURPOSESTEXTPARAGRAPHINDOCUMENTS = ( @@ -35,11 +34,7 @@ ('A', _('Assistance call')), ) -SERVICETYPE = ( - ('P', _('Phone')), -) - -CONTACTTYPE = ( - ('C', _('Customer')), - ('S', _('Supplier')), -) +PURPOSEVISITINCUSTOMER = ( + ('F', _('First commercial visit')), + ('S', _('Installation')), +) \ No newline at end of file diff --git a/koalixcrm/crm/contact/contact.py b/koalixcrm/crm/contact/contact.py index 0a869dc5..3daf49b4 100644 --- a/koalixcrm/crm/contact/contact.py +++ b/koalixcrm/crm/contact/contact.py @@ -2,10 +2,7 @@ from django.db import models from django.contrib import admin -from django import forms from django.utils.translation import ugettext as _ -from koalixcrm.crm.const.country import * -from koalixcrm.crm.const.postaladdressprefix import * from koalixcrm.crm.contact.phoneaddress import PhoneAddress from koalixcrm.crm.contact.emailaddress import EmailAddress from koalixcrm.crm.contact.postaladdress import PostalAddress @@ -15,31 +12,26 @@ from koalixcrm.globalSupportFunctions import xstr from koalixcrm.crm.inlinemixin import LimitedAdminInlineMixin -from django.utils import timezone - class Contact(models.Model): name = models.CharField(max_length=300, verbose_name=_("Name")) - dateofcreation = models.DateTimeField(verbose_name=_("Created at"), auto_now_add=True) - lastmodification = models.DateTimeField(verbose_name=_("Last modified"), auto_now=True) - lastmodifiedby = models.ForeignKey('auth.User', limit_choices_to={'is_staff': True}, blank=True, + date_of_creation = models.DateTimeField(verbose_name=_("Created at"), auto_now_add=True) + last_modification = models.DateTimeField(verbose_name=_("Last modified"), auto_now=True) + last_modified_by = models.ForeignKey('auth.User', limit_choices_to={'is_staff': True}, blank=True, verbose_name=_("Last modified by"), editable=True) - vatnumber = models.CharField(max_length=20, verbose_name=_("Vat Number"), blank=True) - - people = models.ManyToManyField("Person", through='ContactPersonAssociation', verbose_name=_('Has contact'), blank=True) - - def __str__(self): - return self.name class Meta: app_label = "crm" verbose_name = _('Contact') verbose_name_plural = _('Contact') + def __str__(self): + return self.name + class PhoneAddressForContact(PhoneAddress): purpose = models.CharField(verbose_name=_("Purpose"), max_length=1, choices=PURPOSESADDRESSINCUSTOMER) - company = models.ForeignKey(Contact) + person = models.ForeignKey(Contact) class Meta: app_label = "crm" @@ -52,7 +44,7 @@ def __str__(self): class EmailAddressForContact(EmailAddress): purpose = models.CharField(verbose_name=_("Purpose"), max_length=1, choices=PURPOSESADDRESSINCUSTOMER) - company = models.ForeignKey(Contact) + person = models.ForeignKey(Contact) class Meta: app_label = "crm" @@ -65,7 +57,7 @@ def __str__(self): class PostalAddressForContact(PostalAddress): purpose = models.CharField(verbose_name=_("Purpose"), max_length=1, choices=PURPOSESADDRESSINCUSTOMER) - company = models.ForeignKey(Contact) + person = models.ForeignKey(Contact) class Meta: app_label = "crm" @@ -112,10 +104,53 @@ class ContactEmailAddress(admin.TabularInline): ) allow_add = True +class ContactPersonAssociation(models.Model): + contact = models.ForeignKey(Contact, related_name='person_association', blank=True, null=True) + person = models.ForeignKey(Person, related_name='contact_association', blank=True, null=True) + + class Meta: + app_label = "crm" + verbose_name = _('Contacts') + verbose_name_plural = _('Contacts') + + def __str__(self): + return '' + +class PeopleInlineAdmin(admin.TabularInline): + model = ContactPersonAssociation + extra = 0 + show_change_link = True + +class CompaniesInlineAdmin(admin.TabularInline): + model = ContactPersonAssociation + extra = 0 + show_change_link = True + +class OptionPerson(admin.ModelAdmin): + list_display = ('id', 'name', 'prename', 'email', 'role', 'get_companies',) + #filter_horizontal = ('companies',) + fieldsets = (('', {'fields': ('prefix','name','prename','role','email','phone',)}),) + allow_add = True + inlines = [CompaniesInlineAdmin] + pluginProcessor = PluginProcessor() + inlines.extend(pluginProcessor.getPluginAdditions("personInline")) + + actions = [] + pluginProcessor = PluginProcessor() + inlines.extend(pluginProcessor.getPluginAdditions("personActions")) + + def get_companies(self, obj): + items = [] + for c in obj.companies.all(): + items.append(c.name) + return ','.join(items) + + get_companies.short_description = _("Works at") + class CallForContact(Call): - purpose = models.CharField(verbose_name=_("Purpose"), max_length=1, choices=PURPOSECALLINCUSTOMER) company = models.ForeignKey(Contact) cperson = models.ForeignKey(Person, verbose_name=_("Person"), blank=True, null=True) + purpose = models.CharField(verbose_name=_("Purpose"), max_length=1, choices=PURPOSECALLINCUSTOMER) class Meta: app_label = "crm" @@ -126,9 +161,9 @@ def __str__(self): return xstr(self.description) + ' ' + xstr(self.date_due) class VisitForContact(Call): - purpose = models.CharField(verbose_name=_("Purpose"), max_length=1, choices=PURPOSECALLINCUSTOMER) company = models.ForeignKey(Contact) cperson = models.ForeignKey(Person, verbose_name=_("Person"), blank=True, null=True) + purpose = models.CharField(verbose_name=_("Purpose"), max_length=1, choices=PURPOSEVISITINCUSTOMER) ref_call = models.ForeignKey(CallForContact, verbose_name=_("Reference Call"), blank=True, null=True) class Meta: @@ -169,63 +204,6 @@ class ContactVisit(LimitedAdminInlineMixin, admin.StackedInline): def get_filters(self, request, obj): return getattr(self, 'filters', ()) if obj is None else (('cperson', dict(companies=obj.id)),('ref_call', dict(company=obj.id, status='S'))) -class OptionCall(admin.ModelAdmin): - list_display = ('id','description','date_due','purpose','get_contactname', 'status', 'is_call_overdue',) - list_filter = [CallOverdueFilter] - - def get_contactname(self, obj): - return obj.company.name - - get_contactname.short_description = _("Company") - - def is_call_overdue(self, obj): - return (obj.date_due < timezone.now() and obj.status not in ['F', 'S']) - - is_call_overdue.short_description = _("Is call overdue") - -class ContactPersonAssociation(models.Model): - contact = models.ForeignKey(Contact, related_name='person_association', blank=True, null=True) - person = models.ForeignKey(Person, related_name='contact_association', blank=True, null=True) - - class Meta: - app_label = "crm" - verbose_name = _('Contacts') - verbose_name_plural = _('Contacts') - - def __str__(self): - return '' - -class PeopleInlineAdmin(admin.TabularInline): - model = ContactPersonAssociation - extra = 0 - show_change_link = True - -class CompaniesInlineAdmin(admin.TabularInline): - model = ContactPersonAssociation - extra = 0 - show_change_link = True - -class OptionPerson(admin.ModelAdmin): - list_display = ('id', 'name', 'prename', 'email', 'role', 'get_companies',) - #filter_horizontal = ('companies',) - fieldsets = (('', {'fields': ('prefix','name','prename','role','email','phone',)}),) - allow_add = True - inlines = [CompaniesInlineAdmin] - pluginProcessor = PluginProcessor() - inlines.extend(pluginProcessor.getPluginAdditions("personInline")) - - actions = [] - pluginProcessor = PluginProcessor() - inlines.extend(pluginProcessor.getPluginAdditions("personActions")) - - def get_companies(self, obj): - items = [] - for c in obj.companies.all(): - items.append(c.name) - return ','.join(items) - - get_companies.short_description = _("Works at") - class StateFilter(admin.SimpleListFilter): title = _('State') parameter_name = 'state' diff --git a/koalixcrm/crm/contact/customer.py b/koalixcrm/crm/contact/customer.py index 2bc6fa99..a6c7e897 100644 --- a/koalixcrm/crm/contact/customer.py +++ b/koalixcrm/crm/contact/customer.py @@ -1,244 +1,47 @@ # -*- coding: utf-8 -*- +from django.http import HttpResponseRedirect from django.db import models from django.contrib import admin from django.utils.translation import ugettext as _ from koalixcrm.plugin import * -from koalixcrm import djangoUserExtension from koalixcrm.crm.contact.contact import Contact, ContactCall, ContactVisit, PeopleInlineAdmin, PostalAddressForContact, ContactPostalAddress, ContactPhoneAddress, ContactEmailAddress, CityFilter, StateFilter -from koalixcrm.crm.contact.supplier import Supplier -from koalixcrm.crm.product.product import Product -from koalixcrm.crm.contact.person import * -from django.http import HttpResponseRedirect +from koalixcrm.crm.documents.contract import Contract -import koalixcrm.crm.documents.contract class Customer(Contact): - defaultCustomerBillingCycle = models.ForeignKey('CustomerBillingCycle', verbose_name=_('Default Billing Cycle')) - ismemberof = models.ManyToManyField("CustomerGroup", verbose_name=_('Is member of'), blank=True) - isLead = models.BooleanField(default=True) + default_customer_billing_cycle = models.ForeignKey('CustomerBillingCycle', verbose_name=_('Default Billing Cycle')) + is_member_of = models.ManyToManyField("CustomerGroup", verbose_name=_('Is member of'), blank=True) + is_lead = models.BooleanField(default=True) - def createContract(self, request): - contract = koalixcrm.crm.documents.contract.Contract() - contract.default_customer = self - contract.default_currency = djangoUserExtension.models.UserExtension.objects.filter(user=request.user.id)[ - 0].defaultCurrency - contract.last_modified_by = request.user - contract.staff = request.user - contract.save() + def create_contract(self, request): + contract = Contract() + contract.create_from_reference(self, request.user) return contract - def createInvoice(self, request): - contract = self.createContract(request) - invoice = contract.createInvoice() + def create_invoice(self, request): + contract = self.create_contract(request) + invoice = contract.create_invoice() return invoice - def createQuote(self): - contract = self.createContract() - quote = contract.createQuote() + def create_quote(self, request): + contract = self.create_contract(request) + quote = contract.create_quote() return quote - def isInGroup(self, customerGroup): - for customerGroupMembership in self.ismemberof.all(): - if (customerGroupMembership.id == customerGroup.id): + def is_in_group(self, customer_group): + for customer_group_membership in self.is_member_of.all(): + if customer_group_membership.id == customer_group.id: return 1 return 0 - '''def hasPerson(self, person): - for customerContact in self.people.all(): - if (customerContact.id == person.id): - return 1 - return 0''' - class Meta: app_label = "crm" verbose_name = _('Customer') verbose_name_plural = _('Customers') def __str__(self): - return '{} ({})'.format(str(self.name), self.id) - -class ProductForCustomer(models.Model): - customer = models.ForeignKey(Customer, related_name='supplier_association', blank=True, null=True) - product = models.ForeignKey(Product, verbose_name=_("Related Product"), blank=True, null=True) - supplier = models.ForeignKey(Supplier, related_name='customer_association', blank=True, null=True) - service_type = models.CharField(verbose_name=_("Service Type"), max_length=100, blank=True, null=True) - quantity = models.IntegerField(verbose_name=_("Quantity"), blank=True, null=True) - maintainer = models.CharField(verbose_name=_("Maintainer"), max_length=100, blank=True, null=True) - year = models.CharField(verbose_name=_("Year of installation"), max_length=50, blank=True, null=True) - expire_date = models.DateTimeField(verbose_name=_("Expire Date"), blank=True, null=True) - - class Meta: - app_label = "crm" - verbose_name = _('Product') - verbose_name_plural = _('Products') - - def __str__(self): - return str(self.id) - -class SwitchboardForCustomer(ProductForCustomer): - internal_lines = models.IntegerField(verbose_name=_("Internal lines"), blank=True, null=True) - external_lines = models.IntegerField(verbose_name=_("External lines"), blank=True, null=True) - - class Meta: - app_label = "crm" - verbose_name = _('Switchboard') - verbose_name_plural = _('Switchboards') - - def __str__(self): - return str(self.id) - -class AnalogPhoneForCustomer(ProductForCustomer): - class Meta: - app_label = "crm" - verbose_name = _('Analog Phone') - verbose_name_plural = _('Analog Phones') - - def __str__(self): - return str(self.id) - -class DigitalPhoneForCustomer(ProductForCustomer): - class Meta: - app_label = "crm" - verbose_name = _('Digital Phone') - verbose_name_plural = _('Digital Phones') - - def __str__(self): - return str(self.id) - -class InternetForCustomer(ProductForCustomer): - class Meta: - app_label = "crm" - verbose_name = _('Internet Connection') - verbose_name_plural = _('Internet Connections') - - def __str__(self): - return str(self.id) - -class MobileForCustomer(ProductForCustomer): - class Meta: - app_label = "crm" - verbose_name = _('Mobile Service') - verbose_name_plural = _('Mobile Services') - - def __str__(self): - return str(self.id) - - -class CustomerPhoneSystem(admin.StackedInline): - model = SwitchboardForCustomer - extra = 0 - classes = ['collapse'] - raw_id_fields = ("product",) - autocomplete_lookup_fields = { - 'fk': ['product'], - } - fieldsets = ( - (None, {'fields': ['product']}), - ('Additional data', { - 'fields': ( - 'service_type', 'supplier', 'expire_date', 'year', 'external_lines', 'internal_lines',) - }), - ) - - def __str__(self): - return '{} ({})'.format(str(self.product.name), self.product.id) - -class CustomerAnalogPhones(admin.StackedInline): - model = AnalogPhoneForCustomer - extra = 0 - classes = ['collapse'] - raw_id_fields = ("product",) - autocomplete_lookup_fields = { - 'fk': ['product'], - } - fieldsets = ( - (None, {'fields': ['product']}), - ('Additional data', { - 'fields': ( - 'service_type', 'supplier', 'expire_date', 'year',) - }), - ) - - def __str__(self): - return '{} ({})'.format(str(self.product.name), self.product.id) - -class CustomerDigitalPhones(admin.StackedInline): - model = DigitalPhoneForCustomer - extra = 0 - classes = ['collapse'] - raw_id_fields = ("product",) - autocomplete_lookup_fields = { - 'fk': ['product'], - } - fieldsets = ( - (None, {'fields': ['product']}), - ('Additional data', { - 'fields': ( - 'service_type', 'supplier', 'expire_date', 'year',) - }), - ) - - def __str__(self): - return '{} ({})'.format(str(self.product.name), self.product.id) - -class CustomerMobilePhones(admin.StackedInline): - model = MobileForCustomer - extra = 0 - classes = ['collapse'] - raw_id_fields = ("product",) - autocomplete_lookup_fields = { - 'fk': ['product'], - } - fieldsets = ( - (None, {'fields': ['product']}), - ('Additional data', { - 'fields': ( - 'service_type', 'supplier', 'expire_date', 'year',) - }), - ) - - def __str__(self): - return '{} ({})'.format(str(self.product.name), self.product.id) - -class CustomerInternetConnection(admin.StackedInline): - model = InternetForCustomer - extra = 0 - classes = ['collapse'] - raw_id_fields = ("product",) - autocomplete_lookup_fields = { - 'fk': ['product'], - } - fieldsets = ( - (None, {'fields': ['product']}), - ('Additional data', { - 'fields': ( - 'service_type', 'supplier', 'expire_date', 'year',) - }), - ) - - def __str__(self): - return '{} ({})'.format(str(self.product.name), self.product.id) - -'''class PhoneProviderFilter(admin.SimpleListFilter): - title = _('Phone provider') - parameter_name = 'phone_provider' - - def lookups(self, request, model_admin): - list = [] - for s in Supplier.objects.all(): - list.append((s.id, _(s.name))) - return ( - list - ) - - def queryset(self, request, queryset): - for p in PhoneSystemForCustomer.objects.all(): - if self.value() == str(p.supplier.id): - cust_per_supplier = PhoneSystemForCustomer.objects.filter(supplier=p.supplier) - ids = [(c.customer.id) for c in cust_per_supplier] - return queryset.filter(pk__in=ids) - return queryset''' + return str(self.id) + ' ' + self.name class IsLeadFilter(admin.SimpleListFilter): title = _('Is lead') @@ -259,20 +62,18 @@ def queryset(self, request, queryset): return queryset class OptionCustomer(admin.ModelAdmin): - list_display = ('id', 'name', 'defaultCustomerBillingCycle', 'get_state', 'get_town', 'dateofcreation', 'get_is_lead',) - list_filter = ('ismemberof', StateFilter, CityFilter, IsLeadFilter) - #list_display_links = ('name',) - fieldsets = (('', {'fields': ('name', 'defaultCustomerBillingCycle', 'ismemberof',)}),) + list_display = ('id', 'name', 'default_customer_billing_cycle', 'get_state', 'get_town', 'date_of_creation', 'get_is_lead',) + list_filter = ('is_member_of', StateFilter, CityFilter, IsLeadFilter) + fieldsets = (('', {'fields': ('name', 'default_customer_billing_cycle', 'is_member_of',)}),) allow_add = True ordering = ('id',) search_fields = ('id', 'name') - inlines = [ContactPostalAddress, ContactPhoneAddress, ContactEmailAddress, PeopleInlineAdmin, CustomerPhoneSystem, CustomerAnalogPhones, CustomerDigitalPhones, CustomerMobilePhones, CustomerInternetConnection, ContactCall, ContactVisit] - + inlines = [ContactPostalAddress, ContactPhoneAddress, ContactEmailAddress, PeopleInlineAdmin, ContactCall, ContactVisit] pluginProcessor = PluginProcessor() inlines.extend(pluginProcessor.getPluginAdditions("customerInline")) def get_postal_address(self, obj): - return PostalAddressForContact.objects.filter(company=obj.id).first() + return PostalAddressForContact.objects.filter(person=obj.id).first() def get_state(self, obj): address = self.get_postal_address(obj) @@ -287,45 +88,44 @@ def get_town(self, obj): get_town.short_description = _("City") def get_is_lead(self, obj): - return obj.isLead + return obj.is_lead get_is_lead.short_description = _("Is Lead") - def createContract(self, request, queryset): + def create_contract(self, request, queryset): for obj in queryset: - contract = obj.createContract(request) + contract = obj.create_contract(request) response = HttpResponseRedirect('/admin/crm/contract/' + str(contract.id)) return response - createContract.short_description = _("Create Contract") + create_contract.short_description = _("Create Contract") @staticmethod - def createQuote(self, request, queryset): + def create_quote(self, request, queryset): for obj in queryset: - quote = obj.createQuote() + quote = obj.create_quote(request) response = HttpResponseRedirect('/admin/crm/quote/' + str(quote.id)) return response - createQuote.short_description = _("Create Quote") + create_quote.short_description = _("Create Quote") @staticmethod - def createInvoice(self, request, queryset): + def create_invoice(self, request, queryset): for obj in queryset: - invoice = obj.createInvoice() + invoice = obj.create_invoice(request) response = HttpResponseRedirect('/admin/crm/invoice/' + str(invoice.id)) return response - createInvoice.short_description = _("Create Invoice") + create_invoice.short_description = _("Create Invoice") def save_model(self, request, obj, form, change): - if (change == True): - obj.lastmodifiedby = request.user + if change: + obj.last_modified_by = request.user else: - obj.lastmodifiedby = request.user + obj.last_modified_by = request.user obj.staff = request.user obj.save() - actions = ['createContract', 'createInvoice', 'createQuote'] + actions = ['create_contract', 'create_invoice', 'create_quote'] pluginProcessor = PluginProcessor() - inlines.extend(pluginProcessor.getPluginAdditions("customerActions")) - + inlines.extend(pluginProcessor.getPluginAdditions("customerActions")) \ No newline at end of file diff --git a/koalixcrm/crm/contact/data_import.py b/koalixcrm/crm/contact/data_import.py deleted file mode 100644 index bf0e9dfa..00000000 --- a/koalixcrm/crm/contact/data_import.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.db import models -from django.utils.translation import ugettext as _ -from koalixcrm.crm.const.purpose import * - -class ContactImportData(models.Model): - data_file = models.FileField(upload_to='data_files', max_length=255) - - contact_type = models.CharField(verbose_name=_("Contact Type"), max_length=1, choices=CONTACTTYPE) - - def file_link(self): - if self.data_file: - return "download" % (self.data_file.url,) - else: - return "No attachment" - - file_link.allow_tags = True - - def __str__(self): - return '{}'.format(self.data_file.name) - - class Meta: - """ - """ - verbose_name = 'Contact: Import Data from XLSX file' - verbose_name_plural = 'Contacts: Import Data from XLSX file' diff --git a/koalixcrm/crm/contact/person.py b/koalixcrm/crm/contact/person.py index c7366a2b..01b1790c 100644 --- a/koalixcrm/crm/contact/person.py +++ b/koalixcrm/crm/contact/person.py @@ -5,7 +5,6 @@ from django.utils.translation import ugettext as _ from koalixcrm.crm.const.postaladdressprefix import * from koalixcrm.plugin import * -#from koalixcrm.crm.contact.contact import ContactPersonAssociation class Person(models.Model): prefix = models.CharField(max_length=1, choices=POSTALADDRESSPREFIX, verbose_name=_("Prefix"), blank=True, @@ -24,10 +23,3 @@ class Meta: app_label = "crm" verbose_name = _('Person') verbose_name_plural = _('People') - - - - - - - diff --git a/koalixcrm/crm/contact/supplier.py b/koalixcrm/crm/contact/supplier.py index 94881a22..c8552b3f 100644 --- a/koalixcrm/crm/contact/supplier.py +++ b/koalixcrm/crm/contact/supplier.py @@ -9,7 +9,6 @@ from koalixcrm.crm.contact.contact import ContactEmailAddress - class Supplier(Contact): offersShipmentToCustomers = models.BooleanField(verbose_name=_("Offers Shipment to Customer")) @@ -24,7 +23,6 @@ def __str__(self): class OptionSupplier(admin.ModelAdmin): list_display = ('id', 'name', 'offersShipmentToCustomers') - #ist_display_links = ('name',) fieldsets = (('', {'fields': ('name', 'offersShipmentToCustomers')}),) inlines = [ContactPostalAddress, ContactPhoneAddress, ContactEmailAddress] allow_add = True diff --git a/koalixcrm/crm/documents/activity.py b/koalixcrm/crm/documents/activity.py index b455606b..26823645 100644 --- a/koalixcrm/crm/documents/activity.py +++ b/koalixcrm/crm/documents/activity.py @@ -7,7 +7,6 @@ from koalixcrm.crm.const.status import * from koalixcrm.plugin import * - from django.utils import timezone class Call(models.Model): @@ -42,3 +41,24 @@ def queryset(self, request, queryset): else: return queryset +class OptionCall(admin.ModelAdmin): + list_display = ('id','description','date_due','purpose','get_contactname', 'status', 'is_call_overdue',) + list_filter = [CallOverdueFilter] + + def get_contactname(self, obj): + return obj.company.name + + get_contactname.short_description = _("Company") + + def is_call_overdue(self, obj): + return (obj.date_due < timezone.now() and obj.status not in ['F', 'S']) + + is_call_overdue.short_description = _("Is call overdue") + +class OptionVisit(admin.ModelAdmin): + list_display = ('id','description','date_due','purpose','get_contactname', 'status', 'ref_call',) + + def get_contactname(self, obj): + return obj.company.name + + get_contactname.short_description = _("Company") diff --git a/koalixcrm/crm/documents/contract.py b/koalixcrm/crm/documents/contract.py index 5ad973bb..0f90a719 100644 --- a/koalixcrm/crm/documents/contract.py +++ b/koalixcrm/crm/documents/contract.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -from datetime import * from django.db import models from django.contrib import admin from django.utils.translation import ugettext as _ @@ -17,9 +16,11 @@ from koalixcrm.crm.documents.invoice import InlineInvoice from koalixcrm.crm.documents.quote import InlineQuote from koalixcrm.crm.exceptions import * -from koalixcrm.crm.views import create_new_document +from koalixcrm.djangoUserExtension.models import UserExtension import koalixcrm.crm.documents.calculations import koalixcrm.crm.documents.pdfexport +from rest_framework import serializers + class PostalAddressForContract(PostalAddress): purpose = models.CharField(verbose_name=_("Purpose"), max_length=1, choices=PURPOSESADDRESSINCONTRACT) @@ -123,19 +124,29 @@ def get_template_set(self, calling_model): else: raise TemplateSetMissingInContract("The Contract has no Default Template Set selected") + def create_from_reference(self, calling_model, staff): + staff_user_extension = UserExtension.get_user_extension(staff.id) + self.default_customer = calling_model + self.default_currency = staff_user_extension.defaultCurrency + self.default_template_set = staff_user_extension.defaultTemplateSet + self.last_modified_by = staff + self.staff = staff + self.save() + return self + def create_invoice(self): invoice = Invoice() - invoice.create_invoice(self) + invoice.create_from_reference(self) return invoice def create_quote(self): quote = Quote() - quote.create_quote(self) + quote.create_from_reference(self) return quote def create_purchase_order(self): purchase_order = PurchaseOrder() - purchase_order.create_purchase_order(self) + purchase_order.create_from_reference(self) return purchase_order def __str__(self): @@ -158,8 +169,9 @@ class OptionContract(admin.ModelAdmin): inlines.extend(pluginProcessor.getPluginAdditions("contractInlines")) def create_quote(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.quote.Quote, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -167,8 +179,9 @@ def create_quote(self, request, queryset): create_quote.short_description = _("Create Quote") def create_invoice(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.invoice.Invoice, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -176,8 +189,9 @@ def create_invoice(self, request, queryset): create_invoice.short_description = _("Create Invoice") def create_purchase_confirmation(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.purchaseconfirmation.PurchaseConfirmation, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -185,8 +199,9 @@ def create_purchase_confirmation(self, request, queryset): create_purchase_confirmation.short_description = _("Create Purchase Confirmation") def create_delivery_note(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.deliverynote.DeliveryNote, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -194,8 +209,9 @@ def create_delivery_note(self, request, queryset): create_delivery_note.short_description = _("Create Delivery note") def create_payment_reminder(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.paymentreminder.PaymentReminder, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -203,8 +219,9 @@ def create_payment_reminder(self, request, queryset): create_payment_reminder.short_description = _("Create Payment Reminder") def create_purchase_order(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.purchaseorder.PurchaseOrder, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -212,7 +229,7 @@ def create_purchase_order(self, request, queryset): create_purchase_order.short_description = _("Create Purchase Order") def save_model(self, request, obj, form, change): - if (change == True): + if change: obj.last_modified_by = request.user else: obj.last_modified_by = request.user @@ -223,3 +240,9 @@ def save_model(self, request, obj, form, change): pluginProcessor = PluginProcessor() actions.extend(pluginProcessor.getPluginAdditions("contractActions")) + +class ContractJSONSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Contract + fields = ('id', + 'description',) \ No newline at end of file diff --git a/koalixcrm/crm/documents/invoice.py b/koalixcrm/crm/documents/invoice.py index e4199f70..f5149740 100644 --- a/koalixcrm/crm/documents/invoice.py +++ b/koalixcrm/crm/documents/invoice.py @@ -15,6 +15,7 @@ from koalixcrm.accounting.models import Account from django.contrib.admin import helpers from django.shortcuts import render +from django.contrib import messages from django.template.context_processors import csrf @@ -28,7 +29,7 @@ def create_from_reference(self, calling_model): self.create_sales_document(calling_model) self.status = 'C' self.payable_until = date.today() + \ - timedelta(days=self.customer.defaultCustomerBillingCycle.time_to_payment_date) + timedelta(days=self.customer.default_customer_billing_cycle.time_to_payment_date) self.date_of_creation = date.today().__str__() self.template_set = self.contract.get_template_set(self) self.save() @@ -38,18 +39,18 @@ def create_from_reference(self, calling_model): def register_invoice_in_accounting(self, request): dict_prices = dict() dict_tax = dict() - current_valid_accounting_period = accounting.models.AccountingPeriod.getCurrentValidAccountingPeriod() + current_valid_accounting_period = accounting.models.AccountingPeriod.get_current_valid_accounting_period() activa_account = accounting.models.Account.objects.filter(isopeninterestaccount=True) if not self.is_complete_with_price(): raise IncompleteInvoice(_("Complete invoice and run price recalculation. Price may not be Zero")) if len(activa_account) == 0: raise OpenInterestAccountMissing(_("Please specify one open intrest account in the accounting")) - for position in list(SalesDocumentPosition.objects.filter(contract=self.id)): - profit_account = position.product.accoutingProductCategorie.profitAccount - dict_prices[profit_account] = position.lastCalculatedPrice - dict_tax[profit_account] = position.lastCalculatedTax + for position in list(SalesDocumentPosition.objects.filter(sales_document=self.id)): + profit_account = position.product.accounting_product_categorie.profitAccount + dict_prices[profit_account] = position.last_calculated_price + dict_tax[profit_account] = position.last_calculated_tax - for booking in accounting.models.Booking.objects.filter(accountingPeriod=currentValidAccountingPeriod): + for booking in accounting.models.Booking.objects.filter(accountingPeriod=current_valid_accounting_period): if booking.bookingReference == self: raise InvoiceAlreadyRegistered() for profit_account, amount in iter(dict_prices.items()): @@ -64,16 +65,16 @@ def register_invoice_in_accounting(self, request): booking.lastmodifiedby = request.user booking.save() - def register_payment_in_accounting(self, request, amount, paymentaccount): - current_valid_accounting_period = accounting.models.AccountingPeriod.getCurrentValidAccountingPeriod() + def register_payment_in_accounting(self, request, amount, payment_account): + current_valid_accounting_period = accounting.models.AccountingPeriod.get_current_valid_accounting_period() activa_account = accounting.models.Account.objects.filter(isopeninterestaccount=True) booking = accounting.models.Booking() - booking.toAccount = paymentaccount + booking.toAccount = payment_account booking.fromAccount = activa_account[0] booking.bookingDate = date.today().__str__() booking.bookingReference = self booking.accountingPeriod = current_valid_accounting_period - booking.amount = self.last_calculated_price + booking.amount = amount booking.staff = request.user booking.lastmodifiedby = request.user booking.save() @@ -99,9 +100,9 @@ class OptionInvoice(OptionSalesDocument): ) class PaymentForm(forms.Form): - paymentAmount = forms.DecimalField() + payment_amount = forms.DecimalField() _selected_action = forms.CharField(widget=forms.MultipleHiddenInput) - paymentAccount = forms.ModelChoiceField(Account.objects.filter(accountType="A")) + payment_account = forms.ModelChoiceField(Account.objects.filter(account_type="A")) def register_invoice_in_accounting(self, request, queryset): try: @@ -128,13 +129,13 @@ def register_payment_in_accounting(self, request, queryset): form = None if request.POST.get('post'): if 'cancel' in request.POST: - self.message_user(request, _("Canceled registeration of payment in the accounting"), level=messages.ERROR) + self.message_user(request, _("Canceled registration of payment in the accounting"), level=messages.ERROR) return elif 'register' in request.POST: form = self.PaymentForm(request.POST) if form.is_valid(): - payment_amount = form.cleaned_data['paymentAmount'] - payment_account = form.cleaned_data['paymentAccount'] + payment_amount = form.cleaned_data['payment_amount'] + payment_account = form.cleaned_data['payment_account'] for obj in queryset: obj.register_payment_in_accounting(request, payment_amount, payment_account) self.message_user(request, _("Successfully registered Payment in the Accounting")) @@ -143,7 +144,7 @@ def register_payment_in_accounting(self, request, queryset): form = self.PaymentForm c = {'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME, 'queryset': queryset, 'form': form} c.update(csrf(request)) - return render(request, 'crm/admin/registerPayment.html', c) + return render(request, 'crm/admin/register_payment.html', c) register_payment_in_accounting.short_description = _("Register Payment in Accounting") diff --git a/koalixcrm/crm/documents/pdfexport.py b/koalixcrm/crm/documents/pdfexport.py index 953be317..6b01d752 100644 --- a/koalixcrm/crm/documents/pdfexport.py +++ b/koalixcrm/crm/documents/pdfexport.py @@ -3,94 +3,90 @@ import os from subprocess import check_output from subprocess import STDOUT - from django.conf import settings -from django.contrib import auth from django.core import serializers from django.utils.translation import ugettext as _ from koalixcrm.crm.exceptions import * -from koalixcrm import djangoUserExtension from koalixcrm.crm.contact.contact import Contact -from koalixcrm.crm.contact.contact import PostalAddressForContact -from koalixcrm.crm.contact.phoneaddress import PhoneAddress -from koalixcrm.crm.contact.emailaddress import EmailAddress -from koalixcrm.crm.contact.postaladdress import PostalAddress -from koalixcrm.crm.product.currency import Currency -from koalixcrm.crm.product.unit import Unit -from koalixcrm.crm.product.product import Product from lxml import etree - from koalixcrm.crm.documents.salesdocumentposition import Position import koalixcrm.crm.documents.salesdocument +import koalixcrm.djangoUserExtension.models class PDFExport: @staticmethod - def extend_xml_with_root_element(file_with_serialized_xml): - xml = etree.parse(file_with_serialized_xml) - root_element = xml.getroot() - filebrowser_directory = etree.SubElement(root_element, "filebrowser_directory") - filebrowser_directory.text = settings.MEDIA_ROOT - xml.write(file_with_serialized_xml) + def find_element_in_xml(xml_string, find_pattern, find_value): + parser = etree.XMLParser(encoding='utf-8') + root_element = etree.fromstring(xml_string.encode('utf-8'), parser=parser) + found_element = root_element.findall(find_pattern) + if found_element is None: + return 0 + else: + for element in found_element: + if element.text == find_value: + return 1 + return 0 + @staticmethod - def add_positions(objects_to_serialize, position_class, object_to_create_pdf): - objects_to_serialize += list(position_class.objects.filter(sales_document=object_to_create_pdf.id)) - for position in list(position_class.objects.filter(sales_document=object_to_create_pdf.id)): - objects_to_serialize += list(Position.objects.filter(id=position.id)) - objects_to_serialize += list(Product.objects.filter(id=position.product.id)) - objects_to_serialize += list(Unit.objects.filter(id=position.unit.id)) - return objects_to_serialize + def append_element_to_root(xml_string, name_of_element, value_of_element): + parser = etree.XMLParser(encoding='utf-8') + root_element = etree.fromstring(xml_string.encode('utf-8'), parser=parser) + new_element = etree.SubElement(root_element, name_of_element) + new_element.text = value_of_element.__str__() + return (etree.tostring(root_element, + encoding='UTF-8', + xml_declaration=True, + pretty_print=True)).decode('utf-8') @staticmethod - def create_list_of_objects_to_serialize(object_to_create_pdf): + def append_element_to_pattern(xml_string, find_pattern, name_of_element, value_of_element): + parser = etree.XMLParser(encoding='utf-8') + root_element = etree.fromstring(xml_string.encode('utf-8'), parser=parser) + found_element = root_element.find(find_pattern) + new_element = etree.SubElement(found_element, name_of_element) + new_element.text = value_of_element.__str__() + return (etree.tostring(root_element, + encoding='UTF-8', + xml_declaration=True, + pretty_print=True)).decode('utf-8') + + @staticmethod + def merge_xml(xml_string_1, xml_string_2): + parser = etree.XMLParser(encoding='utf-8') + root_element_1 = etree.fromstring(xml_string_1.encode('utf-8'), parser=parser) + root_element_2 = etree.fromstring(xml_string_2.encode('utf-8'), parser=parser) + for child in root_element_2: + root_element_1.append(child) + return (etree.tostring(root_element_1, + encoding='UTF-8', + xml_declaration=True, + pretty_print=True)).decode('utf-8') - position_class = koalixcrm.crm.documents.salesdocumentposition.SalesDocumentPosition - objects_to_serialize = list(type(object_to_create_pdf).objects.filter(id=object_to_create_pdf.id)) - objects_to_serialize += list(koalixcrm.crm.documents.salesdocument.SalesDocument.objects.filter(id=object_to_create_pdf.id)) - if isinstance(object_to_create_pdf, koalixcrm.crm.documents.purchaseorder.PurchaseOrder): - objects_to_serialize += list(Contact.objects.filter(id=object_to_create_pdf.supplier.id)) - objects_to_serialize += list(PostalAddressForContact.objects.filter(person=object_to_create_pdf.supplier.id)) - for address in list(PostalAddressForContact.objects.filter(person=object_to_create_pdf.supplier.id)): - objects_to_serialize += list(PostalAddress.objects.filter(id=address.id)) + + @staticmethod + def create_list_of_objects_to_serialize(object_to_create_pdf): + if isinstance(object_to_create_pdf, koalixcrm.crm.documents.salesdocument.SalesDocument): + return object_to_create_pdf.serialize_to_xml() + elif isinstance(object_to_create_pdf, koalixcrm.accounting.models.AccountingPeriod): + return object_to_create_pdf.serialize_to_xml() else: - objects_to_serialize += list(Contact.objects.filter(id=object_to_create_pdf.customer.id)) - objects_to_serialize += list(PostalAddressForContact.objects.filter(person=object_to_create_pdf.customer.id)) - for address in list(PostalAddressForContact.objects.filter(person=object_to_create_pdf.customer.id)): - objects_to_serialize += list(PostalAddress.objects.filter(id=address.id)) - objects_to_serialize += list(koalixcrm.crm.documents.salesdocument.TextParagraphInSalesDocument.objects.filter(sales_document=object_to_create_pdf.id)) - objects_to_serialize += list(Currency.objects.filter(id=object_to_create_pdf.currency.id)) - objects_to_serialize = PDFExport.add_positions(objects_to_serialize, position_class, object_to_create_pdf) - objects_to_serialize += list(auth.models.User.objects.filter(id=object_to_create_pdf.staff.id)) - userExtension = djangoUserExtension.models.UserExtension.objects.filter(user=object_to_create_pdf.staff.id) - if len(userExtension) == 0: - raise UserExtensionMissing(_("During "+str(object_to_create_pdf)+" PDF Export")) - phone_address = djangoUserExtension.models.UserExtensionPhoneAddress.objects.filter( - userExtension=userExtension[0].id) - if len(phone_address) == 0: - raise UserExtensionPhoneAddressMissing(_("During "+type(object_to_create_pdf)+" PDF Export")) - email_address = djangoUserExtension.models.UserExtensionEmailAddress.objects.filter( - userExtension=userExtension[0].id) - if len(email_address) == 0: - raise UserExtensionEmailAddressMissing(_("During "+type(object_to_create_pdf)+" PDF Export")) - objects_to_serialize += list(userExtension) - objects_to_serialize += list(EmailAddress.objects.filter(id=email_address[0].id)) - objects_to_serialize += list(PhoneAddress.objects.filter(id=phone_address[0].id)) - template_set = djangoUserExtension.models.DocumentTemplate.objects.filter( - id=object_to_create_pdf.template_set.id) - if len(template_set) == 0: - raise TemplateSetMissing(_("During "+type(object_to_create_pdf)+" PDF Export")) - objects_to_serialize += list(template_set) - return objects_to_serialize + raise NoSerializationPatternFound(_("During "+str(object_to_create_pdf)+" PDF Export")) @staticmethod - def write_xml_file(objects_to_serialize, file_with_serialized_xml): - XMLSerializer = serializers.get_serializer("xml") - xml_serializer = XMLSerializer() - out = open(file_with_serialized_xml, "wb") - xml_serializer.serialize(objects_to_serialize, stream=out, indent=3) - out.close() + def write_xml(objects_to_serialize): + xml = serializers.serialize("xml", objects_to_serialize, indent=3) + return xml + + @staticmethod + def write_xml_file(xml, file_path): + f = open(file_path, "wb+") + f.truncate() + f.write(xml.encode('utf-8')) + f.close() + @staticmethod def perform_xsl_transformation(file_with_serialized_xml, xsl_file, fop_config_file, file_output_pdf): @@ -101,23 +97,29 @@ def perform_xsl_transformation(file_with_serialized_xml, xsl_file, fop_config_fi '-pdf', file_output_pdf], stderr=STDOUT) @staticmethod - def create_pdf(object_to_create_pdf): + def create_pdf(object_to_create_pdf, template_set, printed_by): # define the files which are involved in pdf creation process - fop_config_file = object_to_create_pdf.get_fop_config_file() - xsl_file = object_to_create_pdf.get_xsl_file() + fop_config_file = object_to_create_pdf.get_fop_config_file(template_set) + xsl_file = object_to_create_pdf.get_xsl_file(template_set) file_with_serialized_xml = os.path.join(settings.PDF_OUTPUT_ROOT, (str(type(object_to_create_pdf).__name__) + "_" + str(object_to_create_pdf.id) + ".xml")) file_output_pdf = os.path.join(settings.PDF_OUTPUT_ROOT, (str(type(object_to_create_pdf).__name__) + "_" + str(object_to_create_pdf.id) + ".pdf")) - # list the sub-objects which to be serialized - objects_to_serialize = PDFExport.create_list_of_objects_to_serialize(object_to_create_pdf) + # list the sub-objects which have to be serialized + xml_string = PDFExport.create_list_of_objects_to_serialize(object_to_create_pdf) + objects_to_serialize = list(koalixcrm.djangoUserExtension.models.DocumentTemplate.objects.filter(id=template_set.id)) + xml_string_temp = PDFExport.write_xml(objects_to_serialize) + xml_string = PDFExport.merge_xml(xml_string, xml_string_temp) + objects_to_serialize = koalixcrm.djangoUserExtension.models.UserExtension.objects_to_serialize(object_to_create_pdf, printed_by) + xml_string_temp = PDFExport.write_xml(objects_to_serialize) + xml_string = PDFExport.merge_xml(xml_string, xml_string_temp) - # serialize the objects to xml-file - PDFExport.write_xml_file(objects_to_serialize, file_with_serialized_xml) + # extend the xml-string with required basic settings + xml_string = PDFExport.append_element_to_root(xml_string, "filebrowser_directory", settings.MEDIA_ROOT) - # extend the xml-file with required basic settings - PDFExport.extend_xml_with_root_element(file_with_serialized_xml) + # write xml-string to xml-file + PDFExport.write_xml_file(xml_string, file_with_serialized_xml) # perform xsl transformation PDFExport.perform_xsl_transformation(file_with_serialized_xml, xsl_file, fop_config_file, file_output_pdf) diff --git a/koalixcrm/crm/documents/purchaseconfirmation.py b/koalixcrm/crm/documents/purchaseconfirmation.py index 22e77ca7..8cce4baa 100644 --- a/koalixcrm/crm/documents/purchaseconfirmation.py +++ b/koalixcrm/crm/documents/purchaseconfirmation.py @@ -33,4 +33,4 @@ class OptionPurchaseConfirmation(OptionSalesDocument): save_as = OptionSalesDocument.save_as inlines = OptionSalesDocument.inlines actions = ['create_invoice', 'create_quote', - 'create_delivery_note', 'create_purchase_order', 'create_pdf'] + 'create_delivery_note', 'create_purchase_order', 'create_', 'create_pdf'] diff --git a/koalixcrm/crm/documents/salesdocument.py b/koalixcrm/crm/documents/salesdocument.py index d5418d5b..371b305d 100644 --- a/koalixcrm/crm/documents/salesdocument.py +++ b/koalixcrm/crm/documents/salesdocument.py @@ -10,13 +10,11 @@ from koalixcrm.crm.contact.emailaddress import EmailAddress from koalixcrm.crm.contact.postaladdress import PostalAddress from koalixcrm.crm.documents.salesdocumentposition import SalesDocumentPosition, SalesDocumentInlinePosition -from koalixcrm.djangoUserExtension.models import TextParagraphInDocumentTemplate -from koalixcrm.crm.views import export_pdf -from koalixcrm.crm.views import create_new_document +from koalixcrm.djangoUserExtension.models import TextParagraphInDocumentTemplate, UserExtension from koalixcrm.crm.product.product import Product from koalixcrm.crm.exceptions import TemplateSetMissingInContract import koalixcrm.crm.documents.calculations -import koalixcrm.crm.documents.pdfexport +from koalixcrm.crm.documents.pdfexport import PDFExport class TextParagraphInSalesDocument(models.Model): @@ -70,6 +68,33 @@ class Meta: verbose_name = _('Sales Document') verbose_name_plural = _('Sales Documents') + def serialize_to_xml(self): + from koalixcrm.crm.contact.contact import PostalAddressForContact + from koalixcrm.crm.contact.postaladdress import PostalAddress + from koalixcrm.crm.product.currency import Currency + from koalixcrm.crm.contact.contact import Contact + from django.contrib import auth + objects = [self, ] + position_class = koalixcrm.crm.documents.salesdocumentposition.SalesDocumentPosition + objects += list(koalixcrm.crm.documents.salesdocument.SalesDocument.objects.filter(id=self.id)) + if isinstance(self, koalixcrm.crm.documents.purchaseorder.PurchaseOrder): + objects += list(Contact.objects.filter(id=self.supplier.id)) + objects += list(PostalAddressForContact.objects.filter(person=self.supplier.id)) + for address in list(PostalAddressForContact.objects.filter(person=self.supplier.id)): + objects += list(PostalAddress.objects.filter(id=address.id)) + else: + objects += list(Contact.objects.filter(id=self.customer.id)) + objects += list(PostalAddressForContact.objects.filter(person=self.customer.id)) + for address in list(PostalAddressForContact.objects.filter(person=self.customer.id)): + objects += list(PostalAddress.objects.filter(id=address.id)) + objects += list(TextParagraphInSalesDocument.objects.filter(sales_document=self.id)) + objects += list(Currency.objects.filter(id=self.currency.id)) + objects += SalesDocumentPosition.add_positions(position_class, self) + objects += list(auth.models.User.objects.filter(id=self.staff.id)) + objects += UserExtension.objects_to_serialize(self, self.staff) + main_xml = PDFExport.write_xml(objects) + return main_xml + def is_complete_with_price(self): """ Checks whether the SalesContract is completed with a price, in case the SalesContract was not completed or the price calculation was not performed, @@ -109,10 +134,10 @@ def attach_sales_document_positions(self, calling_model): new_position = SalesDocumentPosition() new_position.create_position(sales_document_position, self) - def create_pdf(self): + def create_pdf(self, template_set, printed_by): self.last_print_date = datetime.now() self.save() - return koalixcrm.crm.documents.pdfexport.PDFExport.create_pdf(self) + return koalixcrm.crm.documents.pdfexport.PDFExport.create_pdf(self, template_set, printed_by) def get_template_set(self): if self.template_set: @@ -120,11 +145,11 @@ def get_template_set(self): else: raise TemplateSetMissingInContract((_("Template Set missing in Sales Document" + str(self)))) - def get_fop_config_file(self): + def get_fop_config_file(self, template_set): template_set = self.get_template_set() return template_set.get_fop_config_file() - def get_xsl_file(self): + def get_xsl_file(self, template_set): template_set = self.get_template_set() return template_set.get_xsl_file() @@ -268,8 +293,9 @@ def save_model(self, request, obj, form, change): obj.save() def create_quote(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.quote.Quote, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -277,8 +303,9 @@ def create_quote(self, request, queryset): create_quote.short_description = _("Create Quote") def create_invoice(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.invoice.Invoice, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -286,8 +313,9 @@ def create_invoice(self, request, queryset): create_invoice.short_description = _("Create Invoice") def create_purchase_confirmation(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.purchaseconfirmation.PurchaseConfirmation, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -295,8 +323,9 @@ def create_purchase_confirmation(self, request, queryset): create_purchase_confirmation.short_description = _("Create Purchase Confirmation") def create_delivery_note(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.deliverynote.DeliveryNote, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -304,8 +333,9 @@ def create_delivery_note(self, request, queryset): create_delivery_note.short_description = _("Create Delivery note") def create_payment_reminder(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.paymentreminder.PaymentReminder, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -313,8 +343,9 @@ def create_payment_reminder(self, request, queryset): create_payment_reminder.short_description = _("Create Payment Reminder") def create_purchase_order(self, request, queryset): + from koalixcrm.crm.views.newdocument import CreateNewDocumentView for obj in queryset: - response = create_new_document(self, request, obj, + response = CreateNewDocumentView.create_new_document(self, request, obj, koalixcrm.crm.documents.purchaseorder.PurchaseOrder, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) return response @@ -322,8 +353,13 @@ def create_purchase_order(self, request, queryset): create_purchase_order.short_description = _("Create Purchase Order") def create_pdf(self, request, queryset): + from koalixcrm.crm.views.pdfexport import PDFExportView for obj in queryset: - response = export_pdf(self, request, obj, ("/admin/crm/"+obj.__class__.__name__.lower()+"/")) + response = PDFExportView.export_pdf(self, + request, + obj, + ("/admin/crm/"+obj.__class__.__name__.lower()+"/"), + obj.template_set) return response create_pdf.short_description = _("Create PDF") diff --git a/koalixcrm/crm/documents/salesdocumentposition.py b/koalixcrm/crm/documents/salesdocumentposition.py index fe7f9961..57fb7534 100644 --- a/koalixcrm/crm/documents/salesdocumentposition.py +++ b/koalixcrm/crm/documents/salesdocumentposition.py @@ -42,6 +42,17 @@ class Meta: verbose_name = _('Position in Sales Document') verbose_name_plural = _('Positions Sales Document') + @staticmethod + def add_positions(position_class, object_to_create_pdf): + from koalixcrm.crm.product.unit import Unit + from koalixcrm.crm.product.product import Product + objects = list(position_class.objects.filter(sales_document=object_to_create_pdf.id)) + for position in list(position_class.objects.filter(sales_document=object_to_create_pdf.id)): + objects += list(Position.objects.filter(id=position.id)) + objects += list(Product.objects.filter(id=position.product.id)) + objects += list(Unit.objects.filter(id=position.unit.id)) + return objects + def create_position(self, calling_model, attach_to_model): """Copies all the content of the calling model and attaches links itself to the attach_to_model, this function is usually diff --git a/koalixcrm/crm/documents/visit.py b/koalixcrm/crm/documents/visit.py deleted file mode 100644 index 6ff77fa9..00000000 --- a/koalixcrm/crm/documents/visit.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- - -from datetime import * -from django.db import models -from django.contrib import admin -from django.utils.translation import ugettext as _ - -from koalixcrm.plugin import * - -class Visit(models.Model): - staff = models.ForeignKey('auth.User', limit_choices_to={'is_staff': True}, blank=True, verbose_name=_("Staff"), - related_name="db_relvisitstaff", null=True) - description = models.TextField(verbose_name=_("Description")) - default_customer = models.ForeignKey("Customer", verbose_name=_("Default Customer"), null=True, blank=True) - default_supplier = models.ForeignKey("Supplier", verbose_name=_("Default Supplier"), null=True, blank=True) - default_template_set = models.ForeignKey("djangoUserExtension.TemplateSet", verbose_name=_("Default Template Set"), null=True, blank=True) - date_of_creation = models.DateTimeField(verbose_name=_("Created at"), auto_now_add=True) - last_modification = models.DateTimeField(verbose_name=_("Last modified"), auto_now=True) - last_modified_by = models.ForeignKey('auth.User', limit_choices_to={'is_staff': True}, - verbose_name=_("Last modified by"), related_name="db_visitlstmodified") - - def __str__(self): - return _("Call") + " " + str(self.id) - -class OptionVisit(admin.ModelAdmin): - list_display = ('id',) \ No newline at end of file diff --git a/koalixcrm/crm/exceptions.py b/koalixcrm/crm/exceptions.py index 595f324f..71dfc192 100644 --- a/koalixcrm/crm/exceptions.py +++ b/koalixcrm/crm/exceptions.py @@ -49,6 +49,13 @@ def __str__(self): return repr(self.value) +class TooManyUserExtensionsAvailable(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + class UserExtensionPhoneAddressMissing(Exception): def __init__(self, value): self.value = value @@ -65,6 +72,14 @@ def __str__(self): return repr(self.value) +class NoSerializationPatternFound(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + + class OpenInterestAccountMissing(Exception): def __init__(self, value): self.value = value diff --git a/koalixcrm/crm/forms.py b/koalixcrm/crm/forms.py deleted file mode 100644 index c69e1238..00000000 --- a/koalixcrm/crm/forms.py +++ /dev/null @@ -1,27 +0,0 @@ -import os -from django.conf import settings -from django.core.files.storage import default_storage -from django.core.files.base import ContentFile -from django import forms -from django.forms import models -from koalixcrm.crm.contact.data_import import ContactImportData -from koalixcrm.crm.tasks import import_contact_data - -class ImportDataContactForm(models.ModelForm): - - class Meta: - model = ContactImportData - fields = ('contact_type', 'data_file',) - - def clean_data_file(self): - file_xlsx = self.cleaned_data['data_file'] - path = default_storage.save('tmp/'+file_xlsx.name, - ContentFile(file_xlsx.read())) - - tmp_file = os.path.join(settings.MEDIA_ROOT, path) - - contact_type = self.cleaned_data['contact_type'] - current_user = self.current_user.id - import_contact_data(tmp_file, contact_type, current_user) - - return file_xlsx \ No newline at end of file diff --git a/koalixcrm/crm/management/commands/importcontactdata.py b/koalixcrm/crm/management/commands/importcontactdata.py deleted file mode 100644 index c66d34f3..00000000 --- a/koalixcrm/crm/management/commands/importcontactdata.py +++ /dev/null @@ -1,453 +0,0 @@ -from optparse import make_option -from django.core.management.base import BaseCommand, CommandError -from django.db import transaction -import re - -from django.contrib.auth.models import User - -from koalixcrm.crm.contact.contact import Contact, PostalAddressForContact, PhoneAddressForContact, EmailAddressForContact, ContactPersonAssociation, CallForContact -from koalixcrm.crm.contact.person import Person -from koalixcrm.crm.contact.customer import Customer, SwitchboardForCustomer, AnalogPhoneForCustomer, DigitalPhoneForCustomer, InternetForCustomer, MobileForCustomer -from koalixcrm.crm.contact.supplier import Supplier -from koalixcrm.crm.contact.customerbillingcycle import CustomerBillingCycle -from koalixcrm.crm.contact.customergroup import CustomerGroup -from koalixcrm.crm.product.product import Product -from koalixcrm.crm.product.unit import Unit -from koalixcrm.crm.product.tax import Tax -from koalixcrm.crm.product.attribute import AttributeSet -from koalixcrm.crm.const.purpose import * -from koalixcrm.crm.const.contactimport import * - -import xlrd -from xlrd.sheet import ctype_text -from dateutil.parser import parse -import datetime - - -class Object(object): - pass - -class Command(BaseCommand): - help = 'Import Contact Data.' - - USERID = 0 - def set_user_id(self, user_id): - with open('log.txt', 'w') as logfile: - logfile.write("User id : %s" % user_id) - self.USERID = user_id - - def get_user_id(self): - return self.USERID - - def format_phone_number(self, value): - res = str(value).replace(" ", "") - res = re.sub(r"^[a-zA-Z]+(\d+)$", r"\1", res) - res = re.sub(r"^(\d+)[a-zA-Z]+$", r"\1", res) - res = re.sub(r"\.0$", r"", res) - return res - - def format_city_name(self, value): - res = str(value).strip() - res = re.sub(r"^(.*)\s?\([a-zA-Z]+\)$", r"\1", res) - return res.title() - - def format_state_name(self, value): - if str(value): - return str(value).strip().upper() - return value - - def format_int_string(self, value): - if str(value): - res = str(value).strip() - res = re.sub(r".0$", r"", res) - return res - - def prepare_product_args(self, product_type, sheet, row_num): - DEFAULT_RETURN = None, None - specific_product_args = None - - if product_type == PHONE_SYSTEM_P_TYPE: - check_field = sheet.cell(row_num, HASSWITCHBOARD).value - if not check_field: return DEFAULT_RETURN - model_name = str(sheet.cell(row_num, SWITCHBOARDMODEL).value) - - p_product_number = model_name[:30] if model_name else DEFAULT_PHONE_PRODUCT - p_title = model_name if model_name else DEFAULT_PHONE_PRODUCT_TITLE - p_description = None - p_default_unit, created = Unit.objects.get_or_create(short_name=DEFAULT_UNIT, description=DEFAULT_UNIT_DESCRIPTION) - p_tax, created = Tax.objects.get_or_create(name=DEFAULT_TAX) - p_attribute_set, created = AttributeSet.objects.get_or_create(name=DEFAULT_PHONE_ATTRIBUTE_SET) - supplier_name = str(sheet.cell(row_num, SWITCHBOARDPROVIDER).value) if str(sheet.cell(row_num, SWITCHBOARDPROVIDER).value) else DEFAULT_EMPTY_SUPPLIER - p_service_type = DEFAULT_PHONE_SERVICE_TYPE - try: - p_expire_date = parse(str(sheet.cell(row_num, PHONEEXPIREDATE).value)) - except ValueError: - p_expire_date = None - p_year = str(sheet.cell(row_num, YEAROFINSTALLATION).value).strip() - p_quantity = 1 - p_maintainer = sheet.cell(row_num, MAINTAINER).value - p_internal_lines = int(sheet.cell(row_num, INTERNALLINES).value) if sheet.cell(row_num, INTERNALLINES).value else 0 - p_external_lines = int(sheet.cell(row_num, EXTERNALLINES).value) if sheet.cell(row_num, EXTERNALLINES).value else 0 - - specific_product_args = { - 'internal_lines': p_internal_lines, - 'external_lines': p_external_lines - } - - elif product_type == ANALOG_PHONE_P_TYPE: - check_field = sheet.cell(row_num, ANALOGPHONES).value - if not check_field: return DEFAULT_RETURN - model_name = str(sheet.cell(row_num, PHONEMANUFACTURER1).value) - - p_product_number = model_name[:30] if model_name else DEFAULT_PHONE_PRODUCT - p_title = model_name if model_name else DEFAULT_PHONE_PRODUCT_TITLE - p_description = None - p_default_unit, created = Unit.objects.get_or_create(short_name=DEFAULT_UNIT, description=DEFAULT_UNIT_DESCRIPTION) - p_tax, created = Tax.objects.get_or_create(name=DEFAULT_TAX) - p_attribute_set, created = AttributeSet.objects.get_or_create(name=DEFAULT_PHONE_ATTRIBUTE_SET) - supplier_name = str(sheet.cell(row_num, PHONEMANUFACTURER1).value) if str(sheet.cell(row_num, PHONEMANUFACTURER1).value) else DEFAULT_EMPTY_SUPPLIER - p_service_type = DEFAULT_ANALOG_PHONE_SERVICE_TYPE - p_expire_date = None - p_year = None - p_quantity = ANALOGPHONES - p_maintainer = None - - elif product_type == DIGITAL_PHONE_P_TYPE: - check_field = sheet.cell(row_num, DIGITALPHONES).value - if not check_field: return DEFAULT_RETURN - model_name = str(sheet.cell(row_num, PHONEMANUFACTURER1).value) - - p_product_number = model_name[:30] if model_name else DEFAULT_PHONE_PRODUCT2 - p_title = model_name if model_name else DEFAULT_PHONE_PRODUCT_TITLE2 - p_description = None - p_default_unit, created = Unit.objects.get_or_create(short_name=DEFAULT_UNIT, description=DEFAULT_UNIT_DESCRIPTION) - p_tax, created = Tax.objects.get_or_create(name=DEFAULT_TAX) - p_attribute_set, created = AttributeSet.objects.get_or_create(name=DEFAULT_PHONE_ATTRIBUTE_SET2) - supplier_name = str(sheet.cell(row_num, PHONEMANUFACTURER1).value) if str(sheet.cell(row_num, PHONEMANUFACTURER1).value) else DEFAULT_EMPTY_SUPPLIER - p_service_type = DEFAULT_DIGITAL_PHONE_SERVICE_TYPE - p_expire_date = None - p_year = None - p_quantity = DIGITALPHONES - p_maintainer = None - - elif product_type == MOBILE_P_TYPE: - check_field = sheet.cell(row_num, MOBILEPROVIDER).value - if not check_field: return DEFAULT_RETURN - model_name = str(sheet.cell(row_num, PHONEMANUFACTURER2).value) - - p_product_number = model_name[:30] if model_name else DEFAULT_PHONE_PRODUCT2 - p_title = model_name if model_name else DEFAULT_PHONE_PRODUCT_TITLE2 - p_description = None - p_default_unit, created = Unit.objects.get_or_create(short_name=DEFAULT_UNIT, description=DEFAULT_UNIT_DESCRIPTION) - p_tax, created = Tax.objects.get_or_create(name=DEFAULT_TAX) - p_attribute_set, created = AttributeSet.objects.get_or_create(name=DEFAULT_PHONE_ATTRIBUTE_SET2) - supplier_name = str(sheet.cell(row_num, PHONEMANUFACTURER2).value) if str(sheet.cell(row_num, PHONEMANUFACTURER2).value) else DEFAULT_EMPTY_SUPPLIER - p_service_type = DEFAULT_MOBILE_SERVICE_TYPE - p_expire_date = None - p_year = None - p_quantity = None - p_maintainer = None - - elif product_type == INTERNET_P_TYPE: - check_field = sheet.cell(row_num, TYPEOFINTERNETCONNECTION).value - if not check_field: return DEFAULT_RETURN - model_name = str(sheet.cell(row_num, TYPEOFINTERNETCONNECTION).value) - - p_product_number = model_name[:30] if model_name else DEFAULT_INTERNET_PRODUCT - p_title = model_name if model_name else DEFAULT_INTERNET_PRODUCT_TITLE - p_description = None - p_default_unit, created = Unit.objects.get_or_create(short_name=DEFAULT_UNIT, description=DEFAULT_UNIT_DESCRIPTION) - p_tax, created = Tax.objects.get_or_create(name=DEFAULT_TAX) - p_attribute_set, created = AttributeSet.objects.get_or_create(name=DEFAULT_INTERNET_ATTRIBUTE_SET) - supplier_name = str(sheet.cell(row_num, INTERNETPROVIDER).value) if str(sheet.cell(row_num, INTERNETPROVIDER).value) else DEFAULT_EMPTY_SUPPLIER - p_service_type = DEFAULT_INTERNET_SERVICE_TYPE - try: - p_expire_date = parse(str(sheet.cell(row_num, INTERNETEXPIREDATE).value)) - except ValueError: - p_expire_date = None - p_year = str(sheet.cell(row_num, YEAROFINSTALLATION).value).strip(), - p_quantity = 1 - p_maintainer = None - - - product_args = { - 'product_number': p_product_number, - 'title': p_title, - 'description': p_description, - 'default_unit': p_default_unit, - 'tax': p_tax, - 'attribute_set': p_attribute_set - } - - relation_args = { - 'supplier': self.get_or_create_supplier_by_name(supplier_name), - 'service_type': p_service_type, - 'quantity': p_quantity, - 'expire_date': p_expire_date, - 'year': p_year, - 'maintainer': p_maintainer - } - if specific_product_args: - relation_args = { **relation_args, **specific_product_args } - - return product_args, relation_args - - - def add_product(self, product_type, contact, sheet, row_num): - product_args, relation_args = self.prepare_product_args(product_type, sheet, row_num) - if product_args is None: return - - product, created = Product.objects.update_or_create(**product_args) - if product_type == PHONE_SYSTEM_P_TYPE: - switchboard, created = SwitchboardForCustomer.objects.get_or_create( - customer=contact, - product=product, - ) - - updated = SwitchboardForCustomer.objects.filter(pk=switchboard.pk).update(**relation_args) - elif product_type == ANALOG_PHONE_P_TYPE: - analogphone, created = AnalogPhoneForCustomer.objects.get_or_create( - customer=contact, - product=product, - ) - updated = AnalogPhoneForCustomer.objects.filter(pk=analogphone.pk).update(**relation_args) - elif product_type == DIGITAL_PHONE_P_TYPE: - digitalphone, created = DigitalPhoneForCustomer.objects.get_or_create( - customer=contact, - product=product, - ) - updated = DigitalPhoneForCustomer.objects.filter(pk=digitalphone.pk).update(**relation_args) - elif product_type == MOBILE_P_TYPE: - mobilephone, created = MobileForCustomer.objects.get_or_create( - customer=contact, - product=product, - ) - updated = MobileForCustomer.objects.filter(pk=mobilephone.pk).update(**relation_args) - elif product_type == INTERNET_P_TYPE: - internet, created = InternetForCustomer.objects.get_or_create( - customer=contact, - product=product, - ) - updated = InternetForCustomer.objects.filter(pk=internet.pk).update(**relation_args) - - - def get_or_create_supplier_by_name(self, name): - with open('log.txt', 'w') as logfile: - logfile.write("get User id : %s" % self.get_user_id()) - supplier_args = { - 'name': name, - 'lastmodifiedby': User.objects.get(id=self.get_user_id()), - 'vatnumber': '0', - 'offersShipmentToCustomers': False - } - supplier, created = Supplier.objects.get_or_create(**supplier_args) - return supplier - - def add_arguments(self, parser): - parser.add_argument( - '-x', - '--excel-file', - dest='excel_file', - type=str, - help='Input Contacts Table as XLSX File.') - parser.add_argument( - '-t', - '--contact-type', - dest='contact_type', - type=str, - help='Customer/Supplier') - parser.add_argument( - '-u', - '--current-user', - dest='current_user', - type=str, - help='Current user.') - return parser - - def handle(self, **options): - excel_file = options.get('excel_file') - contact_type = options.get('contact_type') - user_id = options.get('current_user') - - self.set_user_id(user_id) - - if not excel_file or len(excel_file) == 0: - raise CommandError("Input Contacts '--excel_file' is mandatory") - - wb = xlrd.open_workbook(filename=excel_file) - - sheet = wb.sheet_by_index(0) - row_headers = sheet.row(0) - - col_num = 0 - for idx, cell_obj in enumerate(row_headers): - col_num += 1 - if col_num >= 0: - count = 0 - for row_num in range(1, sheet.nrows): - #check rating - if str(sheet.cell(row_num, RATING).value) != SKIP_ROW_VALUE: - #Create generic object for Contact - contact = None - person = None - c = Object() - c.name = str(sheet.cell(row_num, COMPANY).value).strip() - c.vatnumber = str(sheet.cell(row_num, VAT).value).strip() - c.lastmodification = datetime.datetime.now() - c.lastmodifiedby = User.objects.get(id=user_id) - - #Initialize dictionaries for related Classes - pa = {} - pha_mobile = {} - pha_1 = {} - pha_2 = {} - pha_fax = {} - ea = {} - call = {} - - _pa_prename = sheet.cell(row_num, LASTNAME).value - pa['prefix'] = sheet.cell(row_num, PERSONPREFIX).value - pa['name'] = sheet.cell(row_num, NAME).value - pa['addressline1'] = str(sheet.cell(row_num, ADDRESS).value).strip() - pa['addressline2'] = self.format_int_string(sheet.cell(row_num, ADDRESS_NO).value) - #pa['addressline3'] = sheet.cell(row_num, 0).value - #pa['addressline4'] = sheet.cell(row_num, 0).value - pa['zipcode'] = int(sheet.cell(row_num, ZIPCODE).value) if (sheet.cell(row_num, ZIPCODE).value) else 0 - pa['town'] = self.format_city_name(sheet.cell(row_num, CITY).value) - pa['state'] = self.format_state_name(sheet.cell(row_num, STATE).value) - pa['country'] = sheet.cell(row_num, COUNTRY).value - - _mobile = str(sheet.cell(row_num, MOBILE1).value) - _phone_1 = str(sheet.cell(row_num, PHONE1).value) - _phone_2 = str(sheet.cell(row_num, PHONE2).value) - _fax = str(sheet.cell(row_num, FAX).value) - pha_mobile['phone'] = self.format_phone_number(_mobile)[:20] - pha_1['phone'] = self.format_phone_number(_phone_1)[:20] - pha_2['phone'] = self.format_phone_number(_phone_2)[:20] - pha_fax['phone'] = self.format_phone_number(_fax)[:20] - - #create record for Person if prename and email found - prename = str(sheet.cell(row_num, LASTNAME).value) - email = str(sheet.cell(row_num, PERSONEMAIL).value) - if prename and email: - person, created = Person.objects.get_or_create(email=email) - person.prefix = sheet.cell(row_num, PERSONPREFIX).value - person.name = sheet.cell(row_num, NAME).value - person.prename = prename - person.phone = self.format_phone_number(_mobile)[:20] - person.role = sheet.cell(row_num, ROLE).value - with transaction.atomic(): - person.save() - - ea['email'] = sheet.cell(row_num, COMPANYEMAIL).value - - #Determine Contact Type (Customer or Supplier) - if contact_type == 'C': - isLead = str(sheet.cell(row_num, ISLEAD).value) - c.isLead = isLead == '1' - c.defaultCustomerBillingCycle = CustomerBillingCycle.objects.all()[:1].get() - customer_group = str(sheet.cell(row_num, TYPEOFACTIVITY).value).strip() - - try: - customer = Customer.objects.get(name__iexact=c.name.lower()) - for key, value in vars(c).items(): - setattr(customer, key, value) - with transaction.atomic(): - customer.save() - except Customer.DoesNotExist: - #set date of creation only if new Entry - #raise NameError("customer non trovato: {}".format(c.name)) - c.dateofcreation = datetime.datetime.now() - customer = Customer(**vars(c)) - with transaction.atomic(): - customer.save() - if customer_group != '': - group, created = CustomerGroup.objects.get_or_create(name=customer_group) - customer.ismemberof.add(group) - contact = customer - - #region products - #Switchboard - self.add_product(PHONE_SYSTEM_P_TYPE, contact, sheet, row_num) - - #Analog phones - self.add_product(ANALOG_PHONE_P_TYPE, contact, sheet, row_num) - - #Digital phones - self.add_product(DIGITAL_PHONE_P_TYPE, contact, sheet, row_num) - - #Internet provider - self.add_product(INTERNET_P_TYPE, contact, sheet, row_num) - - #Phone provider - pp = {} - - #Mobile provider - mb = {} - self.add_product(MOBILE_P_TYPE, contact, sheet, row_num) - - #endregion - - #Set objects from inlines - if pa['zipcode'] > 0: - pa['purpose'] = 'O' - pa['company'] = contact - postal_address, created = PostalAddressForContact.objects.get_or_create(company=contact, purpose='O', prename=_pa_prename) - updated = PostalAddressForContact.objects.filter(pk=postal_address.pk).update(**pa) - - if pha_mobile['phone']: - pha_mobile['purpose'] = 'B' - pha_mobile['company'] = contact - phone_address_mobile = PhoneAddressForContact.objects.update_or_create(**pha_mobile) - - if pha_1['phone']: - pha_1['purpose'] = 'O' - pha_1['company'] = contact - phone_address_1 = PhoneAddressForContact.objects.update_or_create(**pha_1) - - if pha_2['phone']: - pha_2['purpose'] = 'O' - pha_2['company'] = contact - phone_address_2 = PhoneAddressForContact.objects.update_or_create(**pha_2) - - if pha_fax['phone']: - pha_fax['purpose'] = 'F' - pha_fax['company'] = contact - phone_address_fax = PhoneAddressForContact.objects.update_or_create(**pha_fax) - - if ea['email']: - ea['purpose'] = 'O' - ea['company'] = contact - email_address = EmailAddressForContact.objects.update_or_create(**ea) - - #create a call to report existing notes on Lead - if str(sheet.cell(row_num, MEETINGNOTES).value): - call['description'] = str(sheet.cell(row_num, MEETINGNOTES).value) - call['status'] = 'D' - call['purpose'] = 'S' - call['company'] = contact - call_for_contact = CallForContact.objects.update_or_create(**call) - - if person: - ContactPersonAssociation.objects.update_or_create(contact=contact, person=person) - - count += 1 - print('imported contact {}'.format(contact.name)) - - elif contact_type == 'S': - c.offersShipmentToCustomers = False - try: - supplier = Supplier.objects.get(name=c.name) - for key, value in vars(c).items(): - setattr(supplier, key, value) - supplier.save() - except Supplier.DoesNotExist: - supplier = Supplier(**vars(c)) - supplier.save() - contact = supplier - else: - raise CommandError("Cannot determine contact type") - - return '{}'.format(count) - - \ No newline at end of file diff --git a/koalixcrm/crm/management/commands/koalixcrm_install_defaulttemplates.py b/koalixcrm/crm/management/commands/koalixcrm_install_defaulttemplates.py index c1282d25..eba26673 100644 --- a/koalixcrm/crm/management/commands/koalixcrm_install_defaulttemplates.py +++ b/koalixcrm/crm/management/commands/koalixcrm_install_defaulttemplates.py @@ -22,13 +22,13 @@ class Command(BaseCommand): @staticmethod def store_default_template_xsl_file(language, file_name): file_path = Command.path_of_default_template_file(language, file_name) - xsl_file = Command.store_xsl_file(file_path, file_name) + xsl_file = Command.store_xsl_file(file_path) return xsl_file @staticmethod def path_of_default_template_file(language, file_name): file_path = path.join(settings.STATIC_ROOT, "default_templates", language, file_name) - f = None + f = None; try: f = open(file_path,'r') except (FileNotFoundError) as e: @@ -40,20 +40,17 @@ def path_of_default_template_file(language, file_name): return file_path @staticmethod - def store_xsl_file(xsl_file_path, file_name): - if file_name[:-4] == 'invoice': - xsl_file = djangoUserExtension.models.InvoiceTemplate() - xsl_file.title = path.basename(xsl_file_path) - xsl_file.xslfile = FileObject(xsl_file_path) - xsl_file.save() - return xsl_file - return - + def store_xsl_file(xsl_file_path): + xsl_file = djangoUserExtension.models.XSLFile() + xsl_file.title = path.basename(xsl_file_path) + xsl_file.xslfile = FileObject(xsl_file_path) + xsl_file.save() + return xsl_file def handle(self, *args, **options): template_set = djangoUserExtension.models.TemplateSet() template_set.title = 'default_template_set' - template_set.invoice_template = Command.store_default_template_xsl_file("en", "invoice.xsl") + template_set.invoiceXSLFile = Command.store_default_template_xsl_file("en", "invoice.xsl") template_set.quoteXSLFile = Command.store_default_template_xsl_file("en", "quote.xsl") template_set.purchaseconfirmationXSLFile = Command.store_default_template_xsl_file("en", "purchaseconfirmation.xsl") template_set.purchaseorderXSLFile = Command.store_default_template_xsl_file("en", "purchaseorder.xsl") diff --git a/koalixcrm/crm/migrations/0025_auto_20180220_1640.py b/koalixcrm/crm/migrations/0025_auto_20180220_1640.py deleted file mode 100644 index 3259e9cd..00000000 --- a/koalixcrm/crm/migrations/0025_auto_20180220_1640.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-20 16:40 -from __future__ import unicode_literals - -import django.core.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0024_auto_20180122_2121'), - ] - - operations = [ - migrations.AlterField( - model_name='position', - name='position_number', - field=models.PositiveIntegerField(validators=[django.core.validators.MinValueValidator(1)], verbose_name='Position Number'), - ), - ] diff --git a/koalixcrm/crm/migrations/0025_auto_20180413_1937.py b/koalixcrm/crm/migrations/0025_auto_20180413_1937.py new file mode 100644 index 00000000..df512aa9 --- /dev/null +++ b/koalixcrm/crm/migrations/0025_auto_20180413_1937.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-04-13 19:37 +from __future__ import unicode_literals + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('djangoUserExtension', '0004_auto_20171210_2126'), + ('contenttypes', '0002_remove_content_type_name'), + ('crm', '0024_auto_20180122_2121'), + ] + + operations = [ + migrations.CreateModel( + name='EmployeeAssignmentToTask', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('planned_effort', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='Effort')), + ('employee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='djangoUserExtension.UserExtension')), + ], + options={ + 'verbose_name': 'Employee Assignment', + 'verbose_name_plural': 'Employee Assignments', + }, + ), + migrations.CreateModel( + name='GenericTaskLink', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('object_id', models.PositiveIntegerField()), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ], + options={ + 'verbose_name': 'Task Link', + 'verbose_name_plural': 'Task Links', + }, + ), + migrations.CreateModel( + name='Task', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('short_description', models.CharField(blank=True, max_length=100, null=True, verbose_name='Description')), + ('planned_start_date', models.DateField(verbose_name='Planned Start Date')), + ('planned_end_date', models.DateField(verbose_name='Planned End Date')), + ('description', models.TextField(blank=True, null=True, verbose_name='Description')), + ('last_status_change', models.DateField(blank=True, verbose_name='Last Status Change')), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='crm.Contract', verbose_name='Contract')), + ], + options={ + 'verbose_name': 'Task', + 'verbose_name_plural': 'Tasks', + }, + ), + migrations.CreateModel( + name='TaskLinkType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=300, verbose_name='Title')), + ('description', models.TextField(blank=True, null=True, verbose_name='Text')), + ], + options={ + 'verbose_name': 'Task Link Type', + 'verbose_name_plural': 'Task Link Type', + }, + ), + migrations.CreateModel( + name='TaskStatus', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=250, verbose_name='Title')), + ('description', models.TextField(blank=True, null=True, verbose_name='Text')), + ('is_done', models.BooleanField(verbose_name='Status represents task done')), + ], + options={ + 'verbose_name': 'Task Status', + 'verbose_name_plural': 'Task Status', + }, + ), + migrations.CreateModel( + name='Work', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('date', models.DateField(verbose_name='Date')), + ('start_time', models.DateTimeField(verbose_name='Start Time')), + ('stop_time', models.DateTimeField(verbose_name='Stop Time')), + ('short_description', models.CharField(max_length=300, verbose_name='Short Description')), + ('description', models.TextField(blank=True, null=True, verbose_name='Text')), + ('employee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='djangoUserExtension.UserExtension')), + ('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='crm.Task', verbose_name='Task')), + ], + options={ + 'verbose_name': 'Work', + 'verbose_name_plural': 'Work', + }, + ), + migrations.AlterField( + model_name='position', + name='position_number', + field=models.PositiveIntegerField(validators=[django.core.validators.MinValueValidator(1)], verbose_name='Position Number'), + ), + migrations.AddField( + model_name='task', + name='status', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='crm.TaskStatus', verbose_name='Task Status'), + ), + migrations.AddField( + model_name='generictasklink', + name='task', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='crm.Task', verbose_name='Task'), + ), + migrations.AddField( + model_name='generictasklink', + name='task_link_type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='crm.TaskLinkType', verbose_name='Task Link Type'), + ), + migrations.AddField( + model_name='employeeassignmenttotask', + name='task', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='crm.Task', verbose_name='Task'), + ), + ] diff --git a/koalixcrm/crm/migrations/0026_auto_20180507_1957.py b/koalixcrm/crm/migrations/0026_auto_20180507_1957.py new file mode 100644 index 00000000..cd49e7ce --- /dev/null +++ b/koalixcrm/crm/migrations/0026_auto_20180507_1957.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2018-05-07 19:57 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0025_auto_20180413_1937'), + ] + + operations = [ + migrations.RenameField( + model_name='contact', + old_name='dateofcreation', + new_name='date_of_creation', + ), + migrations.RenameField( + model_name='contact', + old_name='lastmodification', + new_name='last_modification', + ), + migrations.RenameField( + model_name='contact', + old_name='lastmodifiedby', + new_name='last_modified_by', + ), + migrations.RenameField( + model_name='customer', + old_name='defaultCustomerBillingCycle', + new_name='default_customer_billing_cycle', + ), + migrations.RenameField( + model_name='customer', + old_name='ismemberof', + new_name='is_member_of', + ), + ] diff --git a/koalixcrm/crm/migrations/0026_call.py b/koalixcrm/crm/migrations/0026_call.py deleted file mode 100644 index 8a7a32a6..00000000 --- a/koalixcrm/crm/migrations/0026_call.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-20 17:53 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('djangoUserExtension', '0004_auto_20171210_2126'), - ('crm', '0025_auto_20180220_1640'), - ] - - operations = [ - migrations.CreateModel( - name='Call', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.TextField(verbose_name='Description')), - ('date_of_creation', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), - ('last_modification', models.DateTimeField(auto_now=True, verbose_name='Last modified')), - ('default_customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='crm.Customer', verbose_name='Default Customer')), - ('default_supplier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='crm.Supplier', verbose_name='Default Supplier')), - ('default_template_set', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='djangoUserExtension.TemplateSet', verbose_name='Default Template Set')), - ('last_modified_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='db_calllstmodified', to=settings.AUTH_USER_MODEL, verbose_name='Last modified by')), - ('staff', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='db_relcallstaff', to=settings.AUTH_USER_MODEL, verbose_name='Staff')), - ], - ), - ] diff --git a/koalixcrm/crm/migrations/0027_auto_20180220_2146.py b/koalixcrm/crm/migrations/0027_auto_20180220_2146.py deleted file mode 100644 index 928ee11e..00000000 --- a/koalixcrm/crm/migrations/0027_auto_20180220_2146.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-20 21:46 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('djangoUserExtension', '0004_auto_20171210_2126'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('crm', '0026_call'), - ] - - operations = [ - migrations.CreateModel( - name='Visit', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.TextField(verbose_name='Description')), - ('date_of_creation', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), - ('last_modification', models.DateTimeField(auto_now=True, verbose_name='Last modified')), - ('default_customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='crm.Customer', verbose_name='Default Customer')), - ('default_supplier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='crm.Supplier', verbose_name='Default Supplier')), - ('default_template_set', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='djangoUserExtension.TemplateSet', verbose_name='Default Template Set')), - ('last_modified_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='db_visitlstmodified', to=settings.AUTH_USER_MODEL, verbose_name='Last modified by')), - ('staff', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='db_relvisitstaff', to=settings.AUTH_USER_MODEL, verbose_name='Staff')), - ], - ), - migrations.AddField( - model_name='contact', - name='town', - field=models.CharField(max_length=300, null=True, verbose_name='City'), - ), - ] diff --git a/koalixcrm/crm/migrations/0028_auto_20180220_2249.py b/koalixcrm/crm/migrations/0028_auto_20180220_2249.py deleted file mode 100644 index 651b3f63..00000000 --- a/koalixcrm/crm/migrations/0028_auto_20180220_2249.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-20 22:49 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0027_auto_20180220_2146'), - ] - - operations = [ - migrations.AddField( - model_name='contact', - name='addressline1', - field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Addressline 1'), - ), - migrations.AddField( - model_name='contact', - name='addressline2', - field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Addressline 2'), - ), - migrations.AddField( - model_name='contact', - name='addressline3', - field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Addressline 3'), - ), - migrations.AddField( - model_name='contact', - name='addressline4', - field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Addressline 4'), - ), - migrations.AddField( - model_name='contact', - name='country', - field=models.CharField(blank=True, choices=[('AF', 'Afghanistan'), ('AX', 'Aland Islands'), ('AL', 'Albania'), ('DZ', 'Algeria'), ('AS', 'American Samoa'), ('AD', 'Andorra'), ('AO', 'Angola'), ('AI', 'Anguilla'), ('AQ', 'Antarctica'), ('AG', 'Antigua and Barbuda'), ('AR', 'Argentina'), ('AM', 'Armenia'), ('AW', 'Aruba'), ('AU', 'Australia'), ('AT', 'Austria'), ('AZ', 'Azerbaijan'), ('BS', 'the Bahamas'), ('BH', 'Bahrain'), ('BD', 'Bangladesh'), ('BB', 'Barbados'), ('BY', 'Belarus'), ('BE', 'Belgium'), ('BZ', 'Belize'), ('BJ', 'Benin'), ('BM', 'Bermuda'), ('BT', 'Bhutan'), ('BO', 'Bolivia'), ('BA', 'Bosnia and Herzegovina'), ('BW', 'Botswana'), ('BV', 'Bouvet Island'), ('BR', 'Brazil'), ('IO', 'British Indian Ocean Territory'), ('BN', 'Brunei Darussalam'), ('BG', 'Bulgaria'), ('BF', 'Burkina Faso'), ('BI', 'Burundi'), ('KH', 'Cambodia'), ('CM', 'Cameroon'), ('CA', 'Canada'), ('CV', 'Cape Verde'), ('KY', 'Cayman Islands'), ('CF', 'Central African Republic'), ('TD', 'Chad'), ('CL', 'Chile'), ('CN', 'China'), ('CX', 'Christmas Island'), ('CC', 'Cocos (Keeling) Islands'), ('CO', 'Colombia'), ('KM', 'Comoros'), ('CG', 'Congo'), ('CD', 'Democratic Republic of the Congo'), ('CK', 'Cook Islands'), ('CR', 'Costa Rica'), ('CI', "Cote d'Ivoire"), ('HR', 'Croatia'), ('CU', 'Cuba'), ('CY', 'Cyprus'), ('CZ', 'Czech Republic'), ('DK', 'Denmark'), ('DJ', 'Djibouti'), ('DM', 'Dominica'), ('DO', 'Dominican Republic'), ('EC', 'Ecuador'), ('EG', 'Egypt'), ('SV', 'El Salvador'), ('GQ', 'Equatorial Guinea'), ('ER', 'Eritrea'), ('EE', 'Estonia'), ('ET', 'Ethiopia'), ('FK', 'Falkland Islands (Malvinas)'), ('FO', 'Faroe Islands'), ('FJ', 'Fiji'), ('FI', 'Finland'), ('FR', 'France'), ('GF', 'French Guiana'), ('PF', 'French Polynesia'), ('TF', 'French Southern and Antarctic Lands'), ('GA', 'Gabon'), ('GM', 'Gambia'), ('GE', 'Georgia'), ('DE', 'Germany'), ('GH', 'Ghana'), ('GI', 'Gibraltar'), ('GR', 'Greece'), ('GL', 'Greenland'), ('GD', 'Grenada'), ('GP', 'Guadeloupe'), ('GU', 'Guam'), ('GT', 'Guatemala'), ('GG', 'Guernsey'), ('GN', 'Guinea'), ('GW', 'Guinea-Bissau'), ('GY', 'Guyana'), ('HT', 'Haiti'), ('HM', 'Heard Island and McDonald Islands'), ('VA', 'Vatican City Holy See'), ('HN', 'Honduras'), ('HK', 'Hong Kong'), ('HU', 'Hungary'), ('IS', 'Iceland'), ('IN', 'India'), ('ID', 'Indonesia'), ('IR', 'Iran'), ('IQ', 'Iraq'), ('IE', 'Ireland'), ('IM', 'Isle of Man'), ('IL', 'Israel'), ('IT', 'Italy'), ('JM', 'Jamaica'), ('JP', 'Japan'), ('JE', 'Jersey'), ('JO', 'Jordan'), ('KZ', 'Kazakhstan'), ('KE', 'Kenya'), ('KI', 'Kiribati'), ('KP', 'North Korea'), ('KR', 'South Korea'), ('KW', 'Kuwait'), ('KG', 'Kyrgyzstan'), ('LA', 'Laos Lao'), ('LV', 'Latvia'), ('LB', 'Lebanon'), ('LS', 'Lesotho'), ('LR', 'Liberia'), ('LY', 'Libya Libyan Arab Jamahiriya'), ('LI', 'Liechtenstein'), ('LT', 'Lithuania'), ('LU', 'Luxembourg'), ('MO', 'Macau Macao'), ('MK', 'Macedonia'), ('MG', 'Madagascar'), ('MW', 'Malawi'), ('MY', 'Malaysia'), ('MV', 'Maldives'), ('ML', 'Mali'), ('MT', 'Malta'), ('MH', 'Marshall Islands'), ('MQ', 'Martinique'), ('MR', 'Mauritania'), ('MU', 'Mauritius'), ('YT', 'Mayotte'), ('MX', 'Mexico'), ('FM', 'Micronesia'), ('MD', 'Moldova'), ('MC', 'Monaco'), ('MN', 'Mongolia'), ('ME', 'Montenegro'), ('MS', 'Montserrat'), ('MA', 'Morocco'), ('MZ', 'Mozambique'), ('MM', 'Myanmar'), ('NA', 'Namibia'), ('NR', 'Nauru'), ('NP', 'Nepal'), ('NL', 'Netherlands'), ('AN', 'Netherlands Antilles'), ('NC', 'New Caledonia'), ('NZ', 'New Zealand'), ('NI', 'Nicaragua'), ('NE', 'Niger'), ('NG', 'Nigeria'), ('NU', 'Niue'), ('NF', 'Norfolk Island Norfolk Island'), ('MP', 'Northern Mariana Islands'), ('NO', 'Norway'), ('OM', 'Oman'), ('PK', 'Pakistan'), ('PW', 'Palau'), ('PS', 'Palestinian Territory'), ('PA', 'Panama'), ('PG', 'Papua New Guinea'), ('PY', 'Paraguay'), ('PE', 'Peru'), ('PH', 'Philippines'), ('PN', 'Pitcairn Islands'), ('PL', 'Poland'), ('PT', 'Portugal'), ('PR', 'Puerto Rico'), ('QA', 'Qatar'), ('RE', 'Reunion'), ('RO', 'Romania'), ('RU', 'Russia'), ('RW', 'Rwanda'), ('SH', 'Saint Helena'), ('KN', 'Saint Kitts and Nevis'), ('LC', 'Saint Lucia'), ('PM', 'Saint Pierre and Miquelon'), ('VC', 'Saint Vincent and the Grenadines'), ('WS', 'Samoa'), ('SM', 'San Marino'), ('ST', 'Sao Tome and Principe'), ('SA', 'Saudi Arabia'), ('SN', 'Senegal'), ('RS', 'Serbia'), ('SC', 'Seychelles'), ('SL', 'Sierra Leone'), ('SG', 'Singapore'), ('SK', 'Slovakia'), ('SI', 'Slovenia'), ('SB', 'Solomon Islands'), ('SO', 'Somalia'), ('ZA', 'South Africa'), ('GS', 'South Georgia and the South Sandwich Islands'), ('ES', 'Spain'), ('LK', 'Sri Lanka'), ('SD', 'Sudan'), ('SR', 'Suriname'), ('SJ', 'Svalbard and Jan Mayen'), ('SZ', 'Swaziland'), ('SE', 'Sweden'), ('CH', 'Switzerland'), ('SY', 'Syria'), ('TW', 'Taiwan'), ('TJ', 'Tajikistan'), ('TZ', 'Tanzania'), ('TH', 'Thailand'), ('TL', 'East Timor'), ('TG', 'Togo'), ('TK', 'Tokelau'), ('TO', 'Tonga'), ('TT', 'Trinidad and Tobago'), ('TN', 'Tunisia'), ('TR', 'Turkey'), ('TM', 'Turkmenistan'), ('TC', 'Turks and Caicos Islands'), ('TV', 'Tuvalu'), ('UG', 'Uganda'), ('UA', 'Ukraine'), ('AE', 'United Arab Emirates'), ('GB', 'United Kingdom'), ('US', 'United States'), ('UM', 'United States Minor Outlying Islands'), ('UY', 'Uruguay'), ('UZ', 'Uzbekistan'), ('VU', 'Vanuatu'), ('VE', 'Venezuela'), ('VN', 'Vietnam Viet Nam'), ('VG', 'British Virgin Islands'), ('VI', 'United States Virgin Islands'), ('WF', 'Wallis and Futuna'), ('EH', 'Western Sahara'), ('YE', 'Yemen'), ('ZM', 'Zambia'), ('ZW', 'Zimbabwe')], max_length=2, null=True, verbose_name='Country'), - ), - migrations.AddField( - model_name='contact', - name='state', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='State'), - ), - migrations.AddField( - model_name='contact', - name='zipcode', - field=models.IntegerField(blank=True, null=True, verbose_name='Zipcode'), - ), - migrations.AlterField( - model_name='contact', - name='town', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='City'), - ), - ] diff --git a/koalixcrm/crm/migrations/0029_auto_20180220_2348.py b/koalixcrm/crm/migrations/0029_auto_20180220_2348.py deleted file mode 100644 index 4ada4758..00000000 --- a/koalixcrm/crm/migrations/0029_auto_20180220_2348.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-20 23:48 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0028_auto_20180220_2249'), - ] - - operations = [ - migrations.CreateModel( - name='CustomerPersonAssociation', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_association', to='crm.Customer')), - ], - ), - migrations.CreateModel( - name='Person', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('prefix', models.CharField(blank=True, choices=[('F', 'Company'), ('W', 'Mrs'), ('H', 'Mr'), ('G', 'Ms')], max_length=1, null=True, verbose_name='Prefix')), - ('name', models.CharField(blank=True, max_length=100, null=True, verbose_name='Name')), - ('prename', models.CharField(blank=True, max_length=100, null=True, verbose_name='Prename')), - ('email', models.EmailField(max_length=200, verbose_name='Email Address')), - ('phone', models.CharField(max_length=20, verbose_name='Phone Number')), - ('customers', models.ManyToManyField(through='crm.CustomerPersonAssociation', to='crm.Customer')), - ], - options={ - 'verbose_name': 'Person', - 'verbose_name_plural': 'People', - }, - ), - migrations.AddField( - model_name='customerpersonassociation', - name='person', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customer_association', to='crm.Person'), - ), - migrations.AddField( - model_name='customer', - name='people', - field=models.ManyToManyField(through='crm.CustomerPersonAssociation', to='crm.Person'), - ), - ] diff --git a/koalixcrm/crm/migrations/0030_auto_20180221_1354.py b/koalixcrm/crm/migrations/0030_auto_20180221_1354.py deleted file mode 100644 index c53d408e..00000000 --- a/koalixcrm/crm/migrations/0030_auto_20180221_1354.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 13:54 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0029_auto_20180220_2348'), - ] - - operations = [ - migrations.AlterField( - model_name='customer', - name='people', - field=models.ManyToManyField(blank=True, through='crm.CustomerPersonAssociation', to='crm.Person'), - ), - migrations.AlterField( - model_name='person', - name='customers', - field=models.ManyToManyField(blank=True, through='crm.CustomerPersonAssociation', to='crm.Customer'), - ), - ] diff --git a/koalixcrm/crm/migrations/0031_auto_20180221_1402.py b/koalixcrm/crm/migrations/0031_auto_20180221_1402.py deleted file mode 100644 index d34c3638..00000000 --- a/koalixcrm/crm/migrations/0031_auto_20180221_1402.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 14:02 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0030_auto_20180221_1354'), - ] - - operations = [ - migrations.RemoveField( - model_name='customerpersonassociation', - name='customer', - ), - migrations.RemoveField( - model_name='customerpersonassociation', - name='person', - ), - migrations.RemoveField( - model_name='customer', - name='people', - ), - migrations.RemoveField( - model_name='person', - name='customers', - ), - migrations.DeleteModel( - name='CustomerPersonAssociation', - ), - ] diff --git a/koalixcrm/crm/migrations/0032_customer_people.py b/koalixcrm/crm/migrations/0032_customer_people.py deleted file mode 100644 index 4066ac2c..00000000 --- a/koalixcrm/crm/migrations/0032_customer_people.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 14:03 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0031_auto_20180221_1402'), - ] - - operations = [ - migrations.AddField( - model_name='customer', - name='people', - field=models.ManyToManyField(blank=True, to='crm.Person', verbose_name='Has contact'), - ), - ] diff --git a/koalixcrm/crm/migrations/0033_auto_20180221_1539.py b/koalixcrm/crm/migrations/0033_auto_20180221_1539.py deleted file mode 100644 index 82a14d17..00000000 --- a/koalixcrm/crm/migrations/0033_auto_20180221_1539.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 15:39 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0032_customer_people'), - ] - - operations = [ - migrations.CreateModel( - name='CallForContact', - fields=[ - ('call_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.Call')), - ('purpose', models.CharField(choices=[('F', 'First commercial call'), ('S', 'Planned commercial call'), ('A', 'Assistance call')], max_length=1, verbose_name='Purpose')), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='crm.Contact')), - ], - options={ - 'verbose_name': 'Call For Contact', - 'verbose_name_plural': 'Call For Contact', - }, - bases=('crm.call',), - ), - migrations.RenameField( - model_name='call', - old_name='default_customer', - new_name='customer', - ), - migrations.RenameField( - model_name='call', - old_name='default_supplier', - new_name='supplier', - ), - migrations.RenameField( - model_name='call', - old_name='default_template_set', - new_name='template_set', - ), - migrations.AddField( - model_name='call', - name='date_due', - field=models.DateTimeField(blank=True, default=datetime.datetime.now, verbose_name='Date due'), - ), - migrations.AddField( - model_name='call', - name='status', - field=models.CharField(choices=[('P', 'Planned'), ('D', 'Delayed'), ('R', 'ToRecall'), ('A', 'Failed')], default='P', max_length=1, verbose_name='Status'), - ), - ] diff --git a/koalixcrm/crm/migrations/0034_auto_20180221_1555.py b/koalixcrm/crm/migrations/0034_auto_20180221_1555.py deleted file mode 100644 index d7b01e53..00000000 --- a/koalixcrm/crm/migrations/0034_auto_20180221_1555.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 15:55 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0033_auto_20180221_1539'), - ] - - operations = [ - migrations.RemoveField( - model_name='call', - name='customer', - ), - migrations.RemoveField( - model_name='call', - name='supplier', - ), - ] diff --git a/koalixcrm/crm/migrations/0035_remove_call_template_set.py b/koalixcrm/crm/migrations/0035_remove_call_template_set.py deleted file mode 100644 index 4a07f3e9..00000000 --- a/koalixcrm/crm/migrations/0035_remove_call_template_set.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 16:04 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0034_auto_20180221_1555'), - ] - - operations = [ - migrations.RemoveField( - model_name='call', - name='template_set', - ), - ] diff --git a/koalixcrm/crm/migrations/0036_auto_20180221_1612.py b/koalixcrm/crm/migrations/0036_auto_20180221_1612.py deleted file mode 100644 index 2f1c518f..00000000 --- a/koalixcrm/crm/migrations/0036_auto_20180221_1612.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 16:12 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0035_remove_call_template_set'), - ] - - operations = [ - migrations.AlterField( - model_name='call', - name='last_modified_by', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='db_calllstmodified', to=settings.AUTH_USER_MODEL, verbose_name='Last modified by'), - ), - ] diff --git a/koalixcrm/crm/migrations/0037_customer_no_phones.py b/koalixcrm/crm/migrations/0037_customer_no_phones.py deleted file mode 100644 index 733c12f3..00000000 --- a/koalixcrm/crm/migrations/0037_customer_no_phones.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 18:16 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0036_auto_20180221_1612'), - ] - - operations = [ - migrations.AddField( - model_name='customer', - name='no_phones', - field=models.IntegerField(blank=True, null=True, verbose_name='No Phones'), - ), - ] diff --git a/koalixcrm/crm/migrations/0038_person_role.py b/koalixcrm/crm/migrations/0038_person_role.py deleted file mode 100644 index 5687ad5b..00000000 --- a/koalixcrm/crm/migrations/0038_person_role.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 18:23 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0037_customer_no_phones'), - ] - - operations = [ - migrations.AddField( - model_name='person', - name='role', - field=models.CharField(blank=True, max_length=20, null=True, verbose_name='Role'), - ), - ] diff --git a/koalixcrm/crm/migrations/0039_auto_20180221_1916.py b/koalixcrm/crm/migrations/0039_auto_20180221_1916.py deleted file mode 100644 index 177a9e03..00000000 --- a/koalixcrm/crm/migrations/0039_auto_20180221_1916.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 19:16 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0038_person_role'), - ] - - operations = [ - migrations.RenameField( - model_name='callforcontact', - old_name='person', - new_name='company', - ), - migrations.RenameField( - model_name='emailaddressforcontact', - old_name='person', - new_name='company', - ), - migrations.RenameField( - model_name='phoneaddressforcontact', - old_name='person', - new_name='company', - ), - migrations.RenameField( - model_name='postaladdressforcontact', - old_name='person', - new_name='company', - ), - ] diff --git a/koalixcrm/crm/migrations/0040_callforcontact_cperson.py b/koalixcrm/crm/migrations/0040_callforcontact_cperson.py deleted file mode 100644 index c7f9bb9c..00000000 --- a/koalixcrm/crm/migrations/0040_callforcontact_cperson.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 19:58 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0039_auto_20180221_1916'), - ] - - operations = [ - migrations.AddField( - model_name='callforcontact', - name='cperson', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='crm.Person'), - ), - ] diff --git a/koalixcrm/crm/migrations/0041_auto_20180221_2048.py b/koalixcrm/crm/migrations/0041_auto_20180221_2048.py deleted file mode 100644 index 1af27d78..00000000 --- a/koalixcrm/crm/migrations/0041_auto_20180221_2048.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 20:48 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0040_callforcontact_cperson'), - ] - - operations = [ - migrations.AddField( - model_name='person', - name='customers', - field=models.ManyToManyField(blank=True, to='crm.Customer', verbose_name='Works at'), - ), - migrations.AlterField( - model_name='callforcontact', - name='cperson', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='crm.Person', verbose_name='Person'), - ), - ] diff --git a/koalixcrm/crm/migrations/0042_auto_20180221_2056.py b/koalixcrm/crm/migrations/0042_auto_20180221_2056.py deleted file mode 100644 index 79ffa59b..00000000 --- a/koalixcrm/crm/migrations/0042_auto_20180221_2056.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 20:56 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0041_auto_20180221_2048'), - ] - - operations = [ - migrations.CreateModel( - name='CustomerPersonAssociation', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ], - ), - migrations.RemoveField( - model_name='customer', - name='people', - ), - migrations.RemoveField( - model_name='person', - name='customers', - ), - migrations.AddField( - model_name='customerpersonassociation', - name='customer', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_association', to='crm.Customer'), - ), - migrations.AddField( - model_name='customerpersonassociation', - name='person', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customer_association', to='crm.Person'), - ), - ] diff --git a/koalixcrm/crm/migrations/0043_auto_20180221_2057.py b/koalixcrm/crm/migrations/0043_auto_20180221_2057.py deleted file mode 100644 index 855b243f..00000000 --- a/koalixcrm/crm/migrations/0043_auto_20180221_2057.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 20:57 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0042_auto_20180221_2056'), - ] - - operations = [ - migrations.AddField( - model_name='customer', - name='people', - field=models.ManyToManyField(blank=True, through='crm.CustomerPersonAssociation', to='crm.Person', verbose_name='Has contact'), - ), - migrations.AddField( - model_name='person', - name='customers', - field=models.ManyToManyField(blank=True, through='crm.CustomerPersonAssociation', to='crm.Customer', verbose_name='Works at'), - ), - ] diff --git a/koalixcrm/crm/migrations/0044_remove_customer_people.py b/koalixcrm/crm/migrations/0044_remove_customer_people.py deleted file mode 100644 index efd6d74b..00000000 --- a/koalixcrm/crm/migrations/0044_remove_customer_people.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 21:08 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0043_auto_20180221_2057'), - ] - - operations = [ - migrations.RemoveField( - model_name='customer', - name='people', - ), - ] diff --git a/koalixcrm/crm/migrations/0045_remove_person_customers.py b/koalixcrm/crm/migrations/0045_remove_person_customers.py deleted file mode 100644 index 3248328b..00000000 --- a/koalixcrm/crm/migrations/0045_remove_person_customers.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 21:10 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0044_remove_customer_people'), - ] - - operations = [ - migrations.RemoveField( - model_name='person', - name='customers', - ), - ] diff --git a/koalixcrm/crm/migrations/0046_auto_20180221_2112.py b/koalixcrm/crm/migrations/0046_auto_20180221_2112.py deleted file mode 100644 index f7a1e75a..00000000 --- a/koalixcrm/crm/migrations/0046_auto_20180221_2112.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-21 21:12 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0045_remove_person_customers'), - ] - - operations = [ - migrations.CreateModel( - name='ContactPersonAssociation', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('contact', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='person_association', to='crm.Contact')), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contact_association', to='crm.Person')), - ], - ), - migrations.RemoveField( - model_name='customerpersonassociation', - name='customer', - ), - migrations.RemoveField( - model_name='customerpersonassociation', - name='person', - ), - migrations.DeleteModel( - name='CustomerPersonAssociation', - ), - migrations.AddField( - model_name='contact', - name='people', - field=models.ManyToManyField(blank=True, through='crm.ContactPersonAssociation', to='crm.Person', verbose_name='Has contact'), - ), - migrations.AddField( - model_name='person', - name='companies', - field=models.ManyToManyField(blank=True, through='crm.ContactPersonAssociation', to='crm.Contact', verbose_name='Works at'), - ), - ] diff --git a/koalixcrm/crm/migrations/0047_auto_20180222_1101.py b/koalixcrm/crm/migrations/0047_auto_20180222_1101.py deleted file mode 100644 index bda7368c..00000000 --- a/koalixcrm/crm/migrations/0047_auto_20180222_1101.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-22 11:01 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0046_auto_20180221_2112'), - ] - - operations = [ - migrations.AlterField( - model_name='contactpersonassociation', - name='contact', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='person_association', to='crm.Contact'), - ), - migrations.AlterField( - model_name='contactpersonassociation', - name='person', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contact_association', to='crm.Person'), - ), - ] diff --git a/koalixcrm/crm/migrations/0048_auto_20180222_1350.py b/koalixcrm/crm/migrations/0048_auto_20180222_1350.py deleted file mode 100644 index 5eb99485..00000000 --- a/koalixcrm/crm/migrations/0048_auto_20180222_1350.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-22 13:50 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0047_auto_20180222_1101'), - ] - - operations = [ - migrations.CreateModel( - name='PhoneSystem', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('system_model', models.CharField(blank=True, max_length=200, null=True, verbose_name='Model')), - ('year', models.IntegerField(blank=True, null=True, verbose_name='Year of installation')), - ('n_phones_ana', models.IntegerField(blank=True, null=True, verbose_name='Analog phones')), - ('n_phones_dig', models.IntegerField(blank=True, null=True, verbose_name='Digital phones')), - ('n_ext_lines', models.IntegerField(blank=True, null=True, verbose_name='External lines')), - ], - options={ - 'verbose_name': 'Phone System', - 'verbose_name_plural': 'Phone System', - }, - ), - migrations.RemoveField( - model_name='customer', - name='no_phones', - ), - migrations.CreateModel( - name='PhoneSystemForCustomer', - fields=[ - ('phonesystem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.PhoneSystem')), - ('service_type', models.CharField(blank=True, max_length=100, null=True, verbose_name='Service Type')), - ('expire_date', models.DateTimeField(blank=True, verbose_name='Expire Date')), - ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supplier_association', to='crm.Customer')), - ('supplier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='customer_association', to='crm.Supplier')), - ], - bases=('crm.phonesystem',), - ), - ] diff --git a/koalixcrm/crm/migrations/0049_auto_20180222_1358.py b/koalixcrm/crm/migrations/0049_auto_20180222_1358.py deleted file mode 100644 index 67f4a3ca..00000000 --- a/koalixcrm/crm/migrations/0049_auto_20180222_1358.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-22 13:58 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0048_auto_20180222_1350'), - ] - - operations = [ - migrations.RemoveField( - model_name='contact', - name='addressline3', - ), - migrations.RemoveField( - model_name='contact', - name='addressline4', - ), - ] diff --git a/koalixcrm/crm/migrations/0050_auto_20180222_1554.py b/koalixcrm/crm/migrations/0050_auto_20180222_1554.py deleted file mode 100644 index c2dee17c..00000000 --- a/koalixcrm/crm/migrations/0050_auto_20180222_1554.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-22 15:54 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0049_auto_20180222_1358'), - ] - - operations = [ - migrations.AlterModelOptions( - name='callforcontact', - options={'verbose_name': 'Calls', 'verbose_name_plural': 'Calls'}, - ), - migrations.AlterModelOptions( - name='contactpersonassociation', - options={'verbose_name': 'Contacts', 'verbose_name_plural': 'Contacts'}, - ), - migrations.AlterModelOptions( - name='phonesystemforcustomer', - options={'verbose_name': 'Phone System', 'verbose_name_plural': 'Phone System'}, - ), - ] diff --git a/koalixcrm/crm/migrations/0051_auto_20180222_1740.py b/koalixcrm/crm/migrations/0051_auto_20180222_1740.py deleted file mode 100644 index 7a1f8803..00000000 --- a/koalixcrm/crm/migrations/0051_auto_20180222_1740.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-22 17:40 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0050_auto_20180222_1554'), - ] - - operations = [ - migrations.AlterField( - model_name='phonesystemforcustomer', - name='expire_date', - field=models.DateTimeField(blank=True, null=True, verbose_name='Expire Date'), - ), - ] diff --git a/koalixcrm/crm/migrations/0052_auto_20180223_1609.py b/koalixcrm/crm/migrations/0052_auto_20180223_1609.py deleted file mode 100644 index e11bc3fc..00000000 --- a/koalixcrm/crm/migrations/0052_auto_20180223_1609.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-23 16:09 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0051_auto_20180222_1740'), - ] - - operations = [ - migrations.AlterField( - model_name='call', - name='status', - field=models.CharField(choices=[('P', 'Planned'), ('D', 'Delayed'), ('R', 'ToRecall'), ('A', 'Failed'), ('S', 'Success')], default='P', max_length=1, verbose_name='Status'), - ), - ] diff --git a/koalixcrm/crm/migrations/0053_auto_20180224_1614.py b/koalixcrm/crm/migrations/0053_auto_20180224_1614.py deleted file mode 100644 index 2030cae8..00000000 --- a/koalixcrm/crm/migrations/0053_auto_20180224_1614.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-24 16:14 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0052_auto_20180223_1609'), - ] - - operations = [ - migrations.RemoveField( - model_name='contact', - name='addressline1', - ), - migrations.RemoveField( - model_name='contact', - name='addressline2', - ), - migrations.RemoveField( - model_name='contact', - name='country', - ), - migrations.RemoveField( - model_name='contact', - name='state', - ), - migrations.RemoveField( - model_name='contact', - name='town', - ), - migrations.RemoveField( - model_name='contact', - name='zipcode', - ), - ] diff --git a/koalixcrm/crm/migrations/0054_auto_20180224_1954.py b/koalixcrm/crm/migrations/0054_auto_20180224_1954.py deleted file mode 100644 index 47f2b197..00000000 --- a/koalixcrm/crm/migrations/0054_auto_20180224_1954.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-24 19:54 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0053_auto_20180224_1614'), - ] - - operations = [ - migrations.AlterField( - model_name='call', - name='status', - field=models.CharField(choices=[('P', 'Planned'), ('D', 'Delayed'), ('R', 'ToRecall'), ('F', 'Failed'), ('S', 'Success')], default='P', max_length=1, verbose_name='Status'), - ), - ] diff --git a/koalixcrm/crm/migrations/0055_auto_20180224_2002.py b/koalixcrm/crm/migrations/0055_auto_20180224_2002.py deleted file mode 100644 index 4b1b5dd4..00000000 --- a/koalixcrm/crm/migrations/0055_auto_20180224_2002.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-24 20:02 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0054_auto_20180224_1954'), - ] - - operations = [ - migrations.CreateModel( - name='VisitForContact', - fields=[ - ('callforcontact_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.CallForContact')), - ('ref_call', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='crm.Call', verbose_name='Reference Call')), - ], - options={ - 'verbose_name': 'Visit', - 'verbose_name_plural': 'Visits', - }, - bases=('crm.callforcontact',), - ), - migrations.AlterModelOptions( - name='callforcontact', - options={'verbose_name': 'Call', 'verbose_name_plural': 'Calls'}, - ), - ] diff --git a/koalixcrm/crm/migrations/0056_auto_20180224_2039.py b/koalixcrm/crm/migrations/0056_auto_20180224_2039.py deleted file mode 100644 index a65241df..00000000 --- a/koalixcrm/crm/migrations/0056_auto_20180224_2039.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-24 20:39 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0055_auto_20180224_2002'), - ] - - operations = [ - migrations.RemoveField( - model_name='visitforcontact', - name='callforcontact_ptr', - ), - migrations.RemoveField( - model_name='visitforcontact', - name='ref_call', - ), - migrations.DeleteModel( - name='VisitForContact', - ), - ] diff --git a/koalixcrm/crm/migrations/0057_visitforcontact.py b/koalixcrm/crm/migrations/0057_visitforcontact.py deleted file mode 100644 index ab14ea1a..00000000 --- a/koalixcrm/crm/migrations/0057_visitforcontact.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-02-24 20:39 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0056_auto_20180224_2039'), - ] - - operations = [ - migrations.CreateModel( - name='VisitForContact', - fields=[ - ('call_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.Call')), - ('purpose', models.CharField(choices=[('F', 'First commercial call'), ('S', 'Planned commercial call'), ('A', 'Assistance call')], max_length=1, verbose_name='Purpose')), - ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='crm.Contact')), - ('cperson', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='crm.Person', verbose_name='Person')), - ('ref_call', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='crm.CallForContact', verbose_name='Reference Call')), - ], - options={ - 'verbose_name': 'Visit', - 'verbose_name_plural': 'Visits', - }, - bases=('crm.call',), - ), - ] diff --git a/koalixcrm/crm/migrations/0058_contactimportdata.py b/koalixcrm/crm/migrations/0058_contactimportdata.py deleted file mode 100644 index a6a9b242..00000000 --- a/koalixcrm/crm/migrations/0058_contactimportdata.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-03-04 14:12 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0057_visitforcontact'), - ] - - operations = [ - migrations.CreateModel( - name='ContactImportData', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('data_file', models.FileField(max_length=255, upload_to='data_files')), - ('contact_type', models.CharField(choices=[('C', 'Customer'), ('S', 'Supplier')], max_length=1, verbose_name='Contact Type')), - ], - options={ - 'verbose_name': 'Contact: Import Data from XLSX file', - 'verbose_name_plural': 'Contacts: Import Data from XLSX file', - }, - ), - ] diff --git a/koalixcrm/crm/migrations/0059_attributeset.py b/koalixcrm/crm/migrations/0059_attributeset.py deleted file mode 100644 index aad7c496..00000000 --- a/koalixcrm/crm/migrations/0059_attributeset.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-08 17:24 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0058_contactimportdata'), - ] - - operations = [ - migrations.CreateModel( - name='AttributeSet', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=50, verbose_name='Attribute Set')), - ], - options={ - 'verbose_name': 'Attribute Set', - 'verbose_name_plural': 'Attribute Set', - }, - ), - ] diff --git a/koalixcrm/crm/migrations/0060_attribute.py b/koalixcrm/crm/migrations/0060_attribute.py deleted file mode 100644 index 111b1ca2..00000000 --- a/koalixcrm/crm/migrations/0060_attribute.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-08 17:26 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0059_attributeset'), - ] - - operations = [ - migrations.CreateModel( - name='Attribute', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('code', models.CharField(max_length=50, verbose_name='Attribute Code')), - ('name', models.CharField(max_length=200, verbose_name='Attribute Name')), - ('model_type', models.CharField(choices=[('V', 'Varchar'), ('I', 'Integer'), ('D', 'Decimal'), ('T', 'Text')], max_length=1, verbose_name='Model Type')), - ('attribute_set', models.ManyToManyField(blank=True, to='crm.AttributeSet', verbose_name='Is member of')), - ], - options={ - 'verbose_name': 'Attribute', - 'verbose_name_plural': 'Attributes', - }, - ), - ] diff --git a/koalixcrm/crm/migrations/0061_product_attribute_set.py b/koalixcrm/crm/migrations/0061_product_attribute_set.py deleted file mode 100644 index 991e00ce..00000000 --- a/koalixcrm/crm/migrations/0061_product_attribute_set.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-08 17:30 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0060_attribute'), - ] - - operations = [ - migrations.AddField( - model_name='product', - name='attribute_set', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='crm.AttributeSet', verbose_name='Attribute Set'), - preserve_default=False, - ), - ] diff --git a/koalixcrm/crm/migrations/0062_auto_20180408_1757.py b/koalixcrm/crm/migrations/0062_auto_20180408_1757.py deleted file mode 100644 index 35bc224a..00000000 --- a/koalixcrm/crm/migrations/0062_auto_20180408_1757.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-08 17:57 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0061_product_attribute_set'), - ] - - operations = [ - migrations.CreateModel( - name='ProductForCustomer', - fields=[ - ('product_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.Product')), - ('service_type', models.CharField(blank=True, max_length=100, null=True, verbose_name='Service Type')), - ('expire_date', models.DateTimeField(blank=True, null=True, verbose_name='Expire Date')), - ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supplier_association', to='crm.Customer')), - ('supplier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='customer_association', to='crm.Supplier')), - ], - options={ - 'verbose_name': 'Phone System', - 'verbose_name_plural': 'Phone System', - }, - bases=('crm.product',), - ), - migrations.RemoveField( - model_name='phonesystemforcustomer', - name='customer', - ), - migrations.RemoveField( - model_name='phonesystemforcustomer', - name='phonesystem_ptr', - ), - migrations.RemoveField( - model_name='phonesystemforcustomer', - name='supplier', - ), - migrations.DeleteModel( - name='PhoneSystem', - ), - migrations.DeleteModel( - name='PhoneSystemForCustomer', - ), - ] diff --git a/koalixcrm/crm/migrations/0063_auto_20180408_1918.py b/koalixcrm/crm/migrations/0063_auto_20180408_1918.py deleted file mode 100644 index af0a81f4..00000000 --- a/koalixcrm/crm/migrations/0063_auto_20180408_1918.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-08 19:18 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0062_auto_20180408_1757'), - ] - - operations = [ - migrations.AlterModelOptions( - name='productforcustomer', - options={'verbose_name': 'Product', 'verbose_name_plural': 'Products'}, - ), - ] diff --git a/koalixcrm/crm/migrations/0064_auto_20180408_1929.py b/koalixcrm/crm/migrations/0064_auto_20180408_1929.py deleted file mode 100644 index e3bbac26..00000000 --- a/koalixcrm/crm/migrations/0064_auto_20180408_1929.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-08 19:29 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0063_auto_20180408_1918'), - ] - - operations = [ - migrations.RemoveField( - model_name='attribute', - name='attribute_set', - ), - migrations.AddField( - model_name='attributeset', - name='attributes', - field=models.ManyToManyField(blank=True, to='crm.Attribute', verbose_name='Attributes'), - ), - ] diff --git a/koalixcrm/crm/migrations/0065_productattributeassociation.py b/koalixcrm/crm/migrations/0065_productattributeassociation.py deleted file mode 100644 index a28e3008..00000000 --- a/koalixcrm/crm/migrations/0065_productattributeassociation.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-09 18:55 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0064_auto_20180408_1929'), - ] - - operations = [ - migrations.CreateModel( - name='ProductAttributeAssociation', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('value', models.CharField(blank=True, max_length=255, null=True, verbose_name='Value')), - ('attribute', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='related_attribute', to='crm.Attribute')), - ('product', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='related_product', to='crm.Product')), - ], - options={ - 'verbose_name': 'Specific field', - 'verbose_name_plural': 'Specific fields', - }, - ), - ] diff --git a/koalixcrm/crm/migrations/0066_auto_20180409_1952.py b/koalixcrm/crm/migrations/0066_auto_20180409_1952.py deleted file mode 100644 index af83477a..00000000 --- a/koalixcrm/crm/migrations/0066_auto_20180409_1952.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-09 19:52 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0065_productattributeassociation'), - ] - - operations = [ - migrations.RemoveField( - model_name='productforcustomer', - name='customer', - ), - migrations.RemoveField( - model_name='productforcustomer', - name='product_ptr', - ), - migrations.RemoveField( - model_name='productforcustomer', - name='supplier', - ), - migrations.DeleteModel( - name='ProductForCustomer', - ), - ] diff --git a/koalixcrm/crm/migrations/0067_productforcustomer.py b/koalixcrm/crm/migrations/0067_productforcustomer.py deleted file mode 100644 index 812300e2..00000000 --- a/koalixcrm/crm/migrations/0067_productforcustomer.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-09 19:52 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0066_auto_20180409_1952'), - ] - - operations = [ - migrations.CreateModel( - name='ProductForCustomer', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('service_type', models.CharField(blank=True, max_length=100, null=True, verbose_name='Service Type')), - ('expire_date', models.DateTimeField(blank=True, null=True, verbose_name='Expire Date')), - ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='supplier_association', to='crm.Customer')), - ('supplier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='customer_association', to='crm.Supplier')), - ], - options={ - 'verbose_name': 'Product', - 'verbose_name_plural': 'Products', - }, - ), - ] diff --git a/koalixcrm/crm/migrations/0068_productforcustomer_product.py b/koalixcrm/crm/migrations/0068_productforcustomer_product.py deleted file mode 100644 index 6df6be16..00000000 --- a/koalixcrm/crm/migrations/0068_productforcustomer_product.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-09 19:56 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0067_productforcustomer'), - ] - - operations = [ - migrations.AddField( - model_name='productforcustomer', - name='product', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='crm.Product'), - ), - ] diff --git a/koalixcrm/crm/migrations/0069_auto_20180415_1626.py b/koalixcrm/crm/migrations/0069_auto_20180415_1626.py deleted file mode 100644 index 623260fa..00000000 --- a/koalixcrm/crm/migrations/0069_auto_20180415_1626.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-15 16:26 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0068_productforcustomer_product'), - ] - - operations = [ - migrations.AddField( - model_name='contact', - name='vatnumber', - field=models.CharField(blank=True, max_length=20, verbose_name='Vat Number'), - ), - migrations.AddField( - model_name='customer', - name='isLead', - field=models.BooleanField(default=True), - ), - migrations.AlterField( - model_name='productforcustomer', - name='product', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='crm.Product', verbose_name='Related Product'), - ), - ] diff --git a/koalixcrm/crm/migrations/0070_auto_20180428_1619.py b/koalixcrm/crm/migrations/0070_auto_20180428_1619.py deleted file mode 100644 index 4feb8781..00000000 --- a/koalixcrm/crm/migrations/0070_auto_20180428_1619.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-04-28 16:19 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0069_auto_20180415_1626'), - ] - - operations = [ - migrations.AlterField( - model_name='emailaddressforcontact', - name='purpose', - field=models.CharField(choices=[('H', 'Private'), ('O', 'Business'), ('P', 'Mobile Private'), ('B', 'Mobile Business'), ('F', 'Fax')], max_length=1, verbose_name='Purpose'), - ), - migrations.AlterField( - model_name='phoneaddressforcontact', - name='purpose', - field=models.CharField(choices=[('H', 'Private'), ('O', 'Business'), ('P', 'Mobile Private'), ('B', 'Mobile Business'), ('F', 'Fax')], max_length=1, verbose_name='Purpose'), - ), - migrations.AlterField( - model_name='postaladdressforcontact', - name='purpose', - field=models.CharField(choices=[('H', 'Private'), ('O', 'Business'), ('P', 'Mobile Private'), ('B', 'Mobile Business'), ('F', 'Fax')], max_length=1, verbose_name='Purpose'), - ), - ] diff --git a/koalixcrm/crm/migrations/0071_auto_20180510_0929.py b/koalixcrm/crm/migrations/0071_auto_20180510_0929.py deleted file mode 100644 index 336d8b9b..00000000 --- a/koalixcrm/crm/migrations/0071_auto_20180510_0929.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-05-10 09:29 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0070_auto_20180428_1619'), - ] - - operations = [ - migrations.AlterField( - model_name='person', - name='role', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Role'), - ), - ] diff --git a/koalixcrm/crm/migrations/0072_auto_20180510_1531.py b/koalixcrm/crm/migrations/0072_auto_20180510_1531.py deleted file mode 100644 index ca6bd240..00000000 --- a/koalixcrm/crm/migrations/0072_auto_20180510_1531.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-05-10 15:31 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0071_auto_20180510_0929'), - ] - - operations = [ - migrations.AlterField( - model_name='person', - name='prefix', - field=models.CharField(blank=True, choices=[('F', 'Company'), ('W', 'Mrs'), ('H', 'Mr'), ('G', 'Ms'), ('J', 'J.D.'), ('A', 'Ar'), ('I', 'Ing'), ('D', 'Dott')], max_length=1, null=True, verbose_name='Prefix'), - ), - migrations.AlterField( - model_name='postaladdress', - name='prefix', - field=models.CharField(blank=True, choices=[('F', 'Company'), ('W', 'Mrs'), ('H', 'Mr'), ('G', 'Ms'), ('J', 'J.D.'), ('A', 'Ar'), ('I', 'Ing'), ('D', 'Dott')], max_length=1, null=True, verbose_name='Prefix'), - ), - migrations.AlterField( - model_name='product', - name='product_number', - field=models.CharField(blank=True, max_length=30, null=True, verbose_name='Product Number'), - ), - ] diff --git a/koalixcrm/crm/migrations/0073_phonesystemforcustomer.py b/koalixcrm/crm/migrations/0073_phonesystemforcustomer.py deleted file mode 100644 index 4799d259..00000000 --- a/koalixcrm/crm/migrations/0073_phonesystemforcustomer.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-05-11 09:07 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0072_auto_20180510_1531'), - ] - - operations = [ - migrations.CreateModel( - name='PhoneSystemForCustomer', - fields=[ - ('productforcustomer_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.ProductForCustomer')), - ('year', models.IntegerField(blank=True, null=True, verbose_name='Year of installation')), - ('no_ext_lines', models.IntegerField(blank=True, null=True, verbose_name='External lines')), - ('no_int_lines', models.IntegerField(blank=True, null=True, verbose_name='Internal lines')), - ], - options={ - 'verbose_name': 'Phone System', - 'verbose_name_plural': 'Phone Systems', - }, - bases=('crm.productforcustomer',), - ), - ] diff --git a/koalixcrm/crm/migrations/0074_auto_20180511_1005.py b/koalixcrm/crm/migrations/0074_auto_20180511_1005.py deleted file mode 100644 index de1270bf..00000000 --- a/koalixcrm/crm/migrations/0074_auto_20180511_1005.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-05-11 10:05 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0073_phonesystemforcustomer'), - ] - - operations = [ - migrations.AddField( - model_name='phonesystemforcustomer', - name='maintainer', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Maintainer'), - ), - migrations.AlterField( - model_name='phonesystemforcustomer', - name='year', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Year of installation'), - ), - ] diff --git a/koalixcrm/crm/migrations/0075_auto_20180519_1530.py b/koalixcrm/crm/migrations/0075_auto_20180519_1530.py deleted file mode 100644 index c7d830ea..00000000 --- a/koalixcrm/crm/migrations/0075_auto_20180519_1530.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.11 on 2018-05-19 15:30 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('crm', '0074_auto_20180511_1005'), - ] - - operations = [ - migrations.RemoveField( - model_name='phonesystemforcustomer', - name='productforcustomer_ptr', - ), - migrations.DeleteModel( - name='PhoneSystemForCustomer', - ), - migrations.CreateModel( - name='AnalogPhoneForCustomer', - fields=[ - ('productforcustomer_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.ProductForCustomer')), - ], - options={ - 'verbose_name': 'Analog Phone', - 'verbose_name_plural': 'Analog Phones', - }, - bases=('crm.productforcustomer',), - ), - migrations.CreateModel( - name='DigitalPhoneForCustomer', - fields=[ - ('productforcustomer_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.ProductForCustomer')), - ], - options={ - 'verbose_name': 'Digital Phone', - 'verbose_name_plural': 'Digital Phones', - }, - bases=('crm.productforcustomer',), - ), - migrations.CreateModel( - name='InternetForCustomer', - fields=[ - ('productforcustomer_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.ProductForCustomer')), - ], - options={ - 'verbose_name': 'Internet Connection', - 'verbose_name_plural': 'Internet Connections', - }, - bases=('crm.productforcustomer',), - ), - migrations.CreateModel( - name='MobileForCustomer', - fields=[ - ('productforcustomer_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.ProductForCustomer')), - ], - options={ - 'verbose_name': 'Mobile Service', - 'verbose_name_plural': 'Mobile Services', - }, - bases=('crm.productforcustomer',), - ), - migrations.CreateModel( - name='SwitchboardForCustomer', - fields=[ - ('productforcustomer_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='crm.ProductForCustomer')), - ('internal_lines', models.IntegerField(blank=True, null=True, verbose_name='Internal lines')), - ('external_lines', models.IntegerField(blank=True, null=True, verbose_name='External lines')), - ], - options={ - 'verbose_name': 'Switchboard', - 'verbose_name_plural': 'Switchboards', - }, - bases=('crm.productforcustomer',), - ), - migrations.AddField( - model_name='productforcustomer', - name='maintainer', - field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Maintainer'), - ), - migrations.AddField( - model_name='productforcustomer', - name='quantity', - field=models.IntegerField(blank=True, null=True, verbose_name='Quantity'), - ), - migrations.AddField( - model_name='productforcustomer', - name='year', - field=models.CharField(blank=True, max_length=50, null=True, verbose_name='Year of installation'), - ), - ] diff --git a/koalixcrm/crm/models.py b/koalixcrm/crm/models.py index db4cdf06..030f0591 100644 --- a/koalixcrm/crm/models.py +++ b/koalixcrm/crm/models.py @@ -26,7 +26,12 @@ from koalixcrm.crm.product.tax import * from koalixcrm.crm.product.unit import * - +from koalixcrm.crm.reporting.employeeassignmenttotask import * +from koalixcrm.crm.reporting.generictasklink import * +from koalixcrm.crm.reporting.task import * +from koalixcrm.crm.reporting.tasklinktype import * +from koalixcrm.crm.reporting.taskstatus import * +from koalixcrm.crm.reporting.work import * diff --git a/koalixcrm/crm/product/attribute.py b/koalixcrm/crm/product/attribute.py deleted file mode 100644 index 53ee3d29..00000000 --- a/koalixcrm/crm/product/attribute.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- - -from django.db import models -from django.contrib import admin -from django.utils.translation import ugettext as _ - -from koalixcrm.crm.const.modeltype import * - -class Attribute(models.Model): - code = models.CharField(verbose_name=_("Attribute Code"), max_length=50) - name = models.CharField(verbose_name=_("Attribute Name"), max_length=200) - model_type = models.CharField(verbose_name=_("Model Type"), max_length=1, choices=MODELTYPE) - - def __str__(self): - return str(self.id) + ' ' + self.name - - class Meta: - app_label = "crm" - verbose_name = _('Attribute') - verbose_name_plural = _('Attributes') - -class AttributeSet(models.Model): - name = models.CharField(verbose_name=_("Attribute Set"), max_length=50) - attributes = models.ManyToManyField("Attribute", verbose_name=_('Attributes'), blank=True) - - def __str__(self): - return str(self.id) + ' ' + self.name - - class Meta: - app_label = "crm" - verbose_name = _('Attribute Set') - verbose_name_plural = _('Attribute Set') - -class OptionAttribute(admin.ModelAdmin): - list_display = ('code', 'name', 'model_type',) - -class OptionAttributeSet(admin.ModelAdmin): - list_display = ('name',) - filter_horizontal = ('attributes',) diff --git a/koalixcrm/crm/product/phonesystem.py b/koalixcrm/crm/product/phonesystem.py deleted file mode 100644 index 127ba363..00000000 --- a/koalixcrm/crm/product/phonesystem.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- - -from django.db import models -from django.utils.translation import ugettext as _ -from koalixcrm.crm.product.product import Product - -class PhoneSystem(models.Model): - system_model = models.CharField(verbose_name=_("Model"), max_length=200, blank=True, null=True) - year = models.IntegerField(verbose_name=_("Year of installation"), blank=True, null=True) - n_phones_ana = models.IntegerField(verbose_name=_("Analog phones"), blank=True, null=True) - n_phones_dig = models.IntegerField(verbose_name=_("Digital phones"), blank=True, null=True) - n_ext_lines = models.IntegerField(verbose_name=_("External lines"), blank=True, null=True) - - class Meta: - app_label = "crm" - verbose_name = _('Phone System') - verbose_name_plural = _('Phone System') - - - diff --git a/koalixcrm/crm/product/product.py b/koalixcrm/crm/product/product.py index d67f1a09..5c3ae99f 100644 --- a/koalixcrm/crm/product/product.py +++ b/koalixcrm/crm/product/product.py @@ -8,13 +8,12 @@ from koalixcrm.crm.product.unit import ProductUnitTransform from koalixcrm.crm.product.price import ProductPrice import koalixcrm.crm.product.price -from koalixcrm.crm.product.attribute import AttributeSet, Attribute -from koalixcrm.crm.inlinemixin import LimitedAdminInlineMixin + class Product(models.Model): description = models.TextField(verbose_name=_("Description"), null=True, blank=True) title = models.CharField(verbose_name=_("Title"), max_length=200) - product_number = models.CharField(verbose_name=_("Product Number"), max_length=30, null=True, blank=True) + product_number = models.IntegerField(verbose_name=_("Product Number")) default_unit = models.ForeignKey("Unit", verbose_name=_("Unit")) date_of_creation = models.DateTimeField(verbose_name=_("Created at"), auto_now_add=True) last_modification = models.DateTimeField(verbose_name=_("Last modified"), auto_now=True) @@ -24,7 +23,6 @@ class Product(models.Model): accounting_product_categorie = models.ForeignKey('accounting.ProductCategorie', verbose_name=_("Accounting Product Categorie"), null=True, blank="True") - attribute_set = models.ForeignKey(AttributeSet, verbose_name=_("Attribute Set")) def get_price(self, date, unit, customer, currency): prices = koalixcrm.crm.product.price.Price.objects.filter(product=self.id) @@ -84,51 +82,12 @@ def __str__(self): "that matches the date") + ": " + self.date.__str__() + " ," + _( "customer") + ": " + self.customer.__str__() + " ," + _("currency")+ ": "+ self.currency.__str__()+ _(" and unit") + ":" + self.unit.__str__() - @staticmethod - def autocomplete_search_fields(): - return ("id__iexact", "title__icontains",) - -class ProductAttributeAssociation(models.Model): - product = models.ForeignKey(Product, related_name='related_product', blank=True, null=True) - attribute = models.ForeignKey(Attribute, related_name='related_attribute', blank=True, null=True) - value = models.CharField(max_length=255, verbose_name=_("Value"), blank=True, null=True) - - class Meta: - app_label = "crm" - verbose_name = _('Specific field') - verbose_name_plural = _('Specific fields') - - def __str__(self): - return '' - -class AttributeInlineAdmin(LimitedAdminInlineMixin, admin.TabularInline): - model = ProductAttributeAssociation - extra = 1 - classes = ['collapse'] - fieldsets = ( - ('Basics', { - 'fields': ( - 'attribute', 'value',) - }), - ) - allow_add = True - - def get_filters(self, request, obj): - return getattr(self, 'filters', ()) if obj is None else (('attribute', dict(attributeset=obj.id)),) class OptionProduct(admin.ModelAdmin): list_display = ('product_number', 'title', 'default_unit', 'tax', 'accounting_product_categorie') list_display_links = ('product_number',) fieldsets = ( (_('Basics'), { - 'fields': ('product_number', 'title', 'description', 'default_unit', 'tax', 'accounting_product_categorie', 'attribute_set') + 'fields': ('product_number', 'title', 'description', 'default_unit', 'tax', 'accounting_product_categorie') }),) - inlines = [ProductPrice, ProductUnitTransform, AttributeInlineAdmin] - - def get_readonly_fields(self, request, obj=None): - if obj: # editing an existing object - return self.readonly_fields + ('attribute_set',) - return self.readonly_fields - - def get_specific_fields(self, obj): - fields = obj.attribute_set.attributes \ No newline at end of file + inlines = [ProductPrice, ProductUnitTransform] \ No newline at end of file diff --git a/koalixcrm/crm/reporting/__init__.py b/koalixcrm/crm/reporting/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/koalixcrm/crm/reporting/employeeassignmenttotask.py b/koalixcrm/crm/reporting/employeeassignmenttotask.py new file mode 100644 index 00000000..d489e25a --- /dev/null +++ b/koalixcrm/crm/reporting/employeeassignmenttotask.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +from django.db import models +from django.utils.translation import ugettext as _ +from django.contrib import admin, messages +import koalixcrm + + +class EmployeeAssignmentToTask(models.Model): + employee = models.ForeignKey("djangoUserExtension.UserExtension") + planned_effort = models.DecimalField(verbose_name=_("Effort"), max_digits=10, decimal_places=2) + task = models.ForeignKey("Task", verbose_name=_('Task'), blank=False, null=False) + + def __str__(self): + return _("Employee Assignment") + ": " + str(self.employee.user.first_name) + + class Meta: + app_label = "crm" + verbose_name = _('Employee Assignment') + verbose_name_plural = _('Employee Assignments') + + +class InlineEmployeeAssignmentToTask(admin.TabularInline): + model = EmployeeAssignmentToTask + fieldsets = ( + (_('Work'), { + 'fields': ('employee', + 'planned_effort',) + }), + ) + extra = 1 \ No newline at end of file diff --git a/koalixcrm/crm/reporting/generictasklink.py b/koalixcrm/crm/reporting/generictasklink.py new file mode 100644 index 00000000..8787d923 --- /dev/null +++ b/koalixcrm/crm/reporting/generictasklink.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- + +from django.db import models +from django.utils.translation import ugettext as _ +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.admin import GenericTabularInline +from django.contrib.contenttypes.models import ContentType + + +class GenericTaskLink(models.Model): + task = models.ForeignKey("Task", verbose_name=_('Task'), blank=False, null=False) + task_link_type = models.ForeignKey("TaskLinkType", verbose_name=_('Task Link Type'), blank=False, null=False) + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + object_id = models.PositiveIntegerField() + generic_crm_object = GenericForeignKey('content_type', 'object_id') + + def __str__(self): + return _("Task Link") + + class Meta: + app_label = "crm" + verbose_name = _('Task Link') + verbose_name_plural = _('Task Links') + + +class InlineGenericTaskLink(GenericTabularInline): + model = GenericTaskLink + extra = 1 \ No newline at end of file diff --git a/koalixcrm/crm/reporting/task.py b/koalixcrm/crm/reporting/task.py new file mode 100644 index 00000000..96ce376a --- /dev/null +++ b/koalixcrm/crm/reporting/task.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- + +from django.db import models +from django.utils.translation import ugettext as _ +from django.contrib import admin +from koalixcrm.crm.reporting.employeeassignmenttotask import EmployeeAssignmentToTask, InlineEmployeeAssignmentToTask +from koalixcrm.crm.reporting.generictasklink import InlineGenericTaskLink +from koalixcrm.crm.reporting.work import InlineWork +from datetime import * +from rest_framework import serializers +import koalixcrm + + +class Task(models.Model): + short_description = models.CharField(verbose_name=_("Description"), max_length=100, blank=True, null=True) + planned_start_date = models.DateField(verbose_name=_("Planned Start Date"), blank=False, null=False) + planned_end_date = models.DateField(verbose_name=_("Planned End Date"), blank=False, null=False) + project = models.ForeignKey("Contract", verbose_name=_('Contract'), blank=False, null=False) + description = models.TextField(verbose_name=_("Description"), blank=True, null=True) + status = models.ForeignKey("TaskStatus", verbose_name=_('Task Status'), blank=False, null=False) + last_status_change = models.DateField(verbose_name=_("Last Status Change"), blank=True, null=False) + + def planned_duration(self): + if (not self.planned_start_date) or (not self.planned_end_date): + return 0 + elif self.planned_start_date > self.planned_end_date: + return 0 + else: + return self.planned_end_date-self.planned_start_date + + def planned_effort(self): + assignments_to_this_task = EmployeeAssignmentToTask.objects.filter(task=self.id) + sum_effort = 0 + for assignment_to_this_task in assignments_to_this_task: + sum_effort += assignment_to_this_task.planned_effort + return str(sum_effort)+" h" + + def effective_duration(self): + if self.status.is_done: + if self.planned_start_date > self.last_status_change: + return 0 + else: + return self.last_status_change - self.planned_start_date + + def effective_effort(self): + return str(koalixcrm.crm.reporting.work.Work.get_sum_effort_in_hours(self))+" h" + + def __str__(self): + return _("Task") + ": " + str(self.id) + " " + _("from Project") + ": " + str(self.project.id) + + class Meta: + app_label = "crm" + verbose_name = _('Task') + verbose_name_plural = _('Tasks') + + +class OptionTask(admin.ModelAdmin): + list_display = ('id', + 'short_description', + 'planned_start_date', + 'planned_end_date', + 'project', + 'status', + 'last_status_change', + 'planned_duration', + 'planned_effort', + 'effective_duration', + 'effective_effort') + list_display_links = ('id',) + list_filter = ('project',) + ordering = ('-id',) + + fieldsets = ( + (_('Work'), { + 'fields': ('short_description', + 'planned_start_date', + 'planned_end_date', + 'project', + 'description', + 'status') + }), + ) + save_as = True + inlines = [InlineEmployeeAssignmentToTask, + InlineGenericTaskLink, + InlineWork] + + def save_model(self, request, obj, form, change): + obj.last_status_change = date.today().__str__() + obj.save() + + +class TaskJSONSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Task + fields = ('id', + 'short_description', + 'planned_end_date', + 'planned_start_date', + 'project', + 'description', + 'status') diff --git a/koalixcrm/crm/reporting/tasklinktype.py b/koalixcrm/crm/reporting/tasklinktype.py new file mode 100644 index 00000000..2e90afa1 --- /dev/null +++ b/koalixcrm/crm/reporting/tasklinktype.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +from django.db import models +from django.utils.translation import ugettext as _ +from django.contrib import admin, messages + + +class TaskLinkType(models.Model): + title = models.CharField(verbose_name=_("Title"), max_length=300, blank=False, null=False) + description = models.TextField(verbose_name=_("Text"), blank=True, null=True) + + class Meta: + app_label = "crm" + verbose_name = _('Task Link Type') + verbose_name_plural = _('Task Link Type') + + def __str__(self): + return _("Task Link Type") + " ID: " + str(self.id) + " title: " + str(self.title) + + +class OptionTaskLinkType(admin.ModelAdmin): + list_display = ('id', + 'title', + 'description') + + fieldsets = ( + (_('TaskLinkType'), { + 'fields': ('title', + 'description') + }), + ) + save_as = True diff --git a/koalixcrm/crm/reporting/taskstatus.py b/koalixcrm/crm/reporting/taskstatus.py new file mode 100644 index 00000000..89c63632 --- /dev/null +++ b/koalixcrm/crm/reporting/taskstatus.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +from django.db import models +from django.utils.translation import ugettext as _ +from django.contrib import admin +from rest_framework import serializers + + +class TaskStatus(models.Model): + title = models.CharField(verbose_name=_("Title"), max_length=250, blank=False, null=False) + description = models.TextField(verbose_name=_("Text"), blank=True, null=True) + is_done = models.BooleanField(verbose_name=_("Status represents task done"),) + + class Meta: + app_label = "crm" + verbose_name = _('Task Status') + verbose_name_plural = _('Task Status') + + def __str__(self): + return _("Task Status") + " ID: " + str(self.id) + " title: " + str(self.title) + + +class OptionTaskStatus(admin.ModelAdmin): + list_display = ('id', + 'title', + 'description', + 'is_done') + + fieldsets = ( + (_('Work'), { + 'fields': ('title', + 'description', + 'is_done') + }), + ) + save_as = True + + +class TaskStatusJSONSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = TaskStatus + fields = ('id', + 'title', + 'description',) diff --git a/koalixcrm/crm/reporting/urls.py b/koalixcrm/crm/reporting/urls.py new file mode 100644 index 00000000..2cf5c057 --- /dev/null +++ b/koalixcrm/crm/reporting/urls.py @@ -0,0 +1,10 @@ +# coding: utf-8 + +# DJANGO IMPORTS +from django.conf.urls import url + +from koalixcrm.crm.views.monthlyreport import work_report + +urlpatterns = [ + url(r'^monthlyreport/$', work_report, name="monthly_report"), +] \ No newline at end of file diff --git a/koalixcrm/crm/reporting/work.py b/koalixcrm/crm/reporting/work.py new file mode 100644 index 00000000..fb403318 --- /dev/null +++ b/koalixcrm/crm/reporting/work.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- + +from django.db import models +from django.contrib import admin +from django.utils.translation import ugettext as _ + + +class Work(models.Model): + employee = models.ForeignKey("djangoUserExtension.UserExtension") + date = models.DateField(verbose_name=_("Date"), blank=False, null=False) + start_time = models.DateTimeField(verbose_name=_("Start Time"), blank=False, null=False) + stop_time = models.DateTimeField(verbose_name=_("Stop Time"), blank=False, null=False) + short_description = models.CharField(verbose_name=_("Short Description"), max_length=300, blank=False, null=False) + description = models.TextField(verbose_name=_("Text"), blank=True, null=True) + task = models.ForeignKey("Task", verbose_name=_('Task'), blank=False, null=False) + + @staticmethod + def get_sum_effort_in_hours(task): + work_objects = Work.objects.filter(task=task.id) + sum_effort = 0 + for work_object in work_objects: + if (not work_object.start_time) or (not work_object.stop_time): + sum_effort = 0 + elif work_object.start_time > work_object.stop_time: + sum_effort += 0 + else: + sum_effort += work_object.effort() + sum_effort_in_hours = sum_effort/3600 + return sum_effort_in_hours + + def effort(self): + if not self.stop_time or not self.start_time: + return 0 + else: + return (self.stop_time - self.start_time).total_seconds() + + def effort_as_string(self): + return str(self.effort()/3600) + " h" + + def __str__(self): + return _("Work") + ": " + str(self.id) + " " + _("from Person") + ": " + str(self.employee.id) + + class Meta: + app_label = "crm" + verbose_name = _('Work') + verbose_name_plural = _('Work') + + +class OptionWork(admin.ModelAdmin): + list_display = ('id', + 'employee', + 'task', + 'short_description', + 'date', + 'start_time', + 'stop_time', + 'effort_as_string',) + + list_display_links = ('id',) + list_filter = ('task', 'date') + ordering = ('-id',) + + fieldsets = ( + (_('Work'), { + 'fields': ('employee', + 'date', + 'start_time', + 'stop_time', + 'short_description', + 'description', + 'task') + }), + ) + save_as = True + + +class InlineWork(admin.TabularInline): + model = Work + readonly_fields = ('employee', + 'short_description', + 'date', + 'start_time', + 'stop_time',) + fieldsets = ( + (_('Work'), { + 'fields': ('employee', + 'short_description', + 'date', + 'start_time', + 'stop_time',) + }), + ) + extra = 0 + + def has_add_permission(self, request, obj=None): + return False + + def has_delete_permission(self, request, obj=None): + return False diff --git a/koalixcrm/crm/static/default_templates/de/deliveryorder.xsl b/koalixcrm/crm/static/default_templates/de/deliveryorder.xsl index 400ac23f..3c47dcb3 100644 --- a/koalixcrm/crm/static/default_templates/de/deliveryorder.xsl +++ b/koalixcrm/crm/static/default_templates/de/deliveryorder.xsl @@ -583,6 +583,7 @@ + diff --git a/koalixcrm/crm/static/default_templates/de/invoice.xsl b/koalixcrm/crm/static/default_templates/de/invoice.xsl index c8866036..9310e62b 100644 --- a/koalixcrm/crm/static/default_templates/de/invoice.xsl +++ b/koalixcrm/crm/static/default_templates/de/invoice.xsl @@ -55,7 +55,7 @@ text-align="left" >emailaddress@gmail.com +41 79 xxx xx xx + text-align="left" >+41 xx xxx xx xx @@ -304,20 +304,21 @@ font-family="BitstreamVeraSans" color="black" text-align="left" - margin-top="2cm" + margin-top="1cm" linefeed-treatment="preserve"> - - Rechnung - + margin-top="1cm" + margin-bottom="0.5cm"> + Rechnung - @@ -583,6 +584,7 @@ + diff --git a/koalixcrm/crm/static/default_templates/de/purchaseconfirmation.xsl b/koalixcrm/crm/static/default_templates/de/purchaseconfirmation.xsl index 6a2e7aa1..bf69bb60 100644 --- a/koalixcrm/crm/static/default_templates/de/purchaseconfirmation.xsl +++ b/koalixcrm/crm/static/default_templates/de/purchaseconfirmation.xsl @@ -583,6 +583,7 @@ + diff --git a/koalixcrm/crm/static/default_templates/de/purchaseorder.xsl b/koalixcrm/crm/static/default_templates/de/purchaseorder.xsl index 022f2163..8e3eff91 100644 --- a/koalixcrm/crm/static/default_templates/de/purchaseorder.xsl +++ b/koalixcrm/crm/static/default_templates/de/purchaseorder.xsl @@ -583,6 +583,7 @@ + diff --git a/koalixcrm/crm/static/default_templates/de/quote.xsl b/koalixcrm/crm/static/default_templates/de/quote.xsl index 74ff96a5..7ea75f61 100644 --- a/koalixcrm/crm/static/default_templates/de/quote.xsl +++ b/koalixcrm/crm/static/default_templates/de/quote.xsl @@ -304,20 +304,21 @@ font-family="BitstreamVeraSans" color="black" text-align="left" - margin-top="2cm" + margin-top="1cm" linefeed-treatment="preserve"> - - Offerte + margin-top="1cm" + margin-bottom="0.5cm"> + Offerte - @@ -326,9 +327,10 @@ font-family="BitstreamVeraSans" color="black" text-align="left" - margin-top="2cm" - linefeed-treatment="preserve" - page-break-after="always"> + margin-top="0.5cm" + margin-bottom="0.5cm" + linefeed-treatment="preserve" + page-break-after="always"> @@ -583,6 +585,7 @@ + diff --git a/koalixcrm/crm/static/default_templates/en/deliveryorder.xsl b/koalixcrm/crm/static/default_templates/en/deliveryorder.xsl index 6d0cfacb..2d857e31 100644 --- a/koalixcrm/crm/static/default_templates/en/deliveryorder.xsl +++ b/koalixcrm/crm/static/default_templates/en/deliveryorder.xsl @@ -583,6 +583,7 @@ + diff --git a/koalixcrm/crm/static/default_templates/en/invoice.xsl b/koalixcrm/crm/static/default_templates/en/invoice.xsl index f16a99f7..26d4f0f9 100644 --- a/koalixcrm/crm/static/default_templates/en/invoice.xsl +++ b/koalixcrm/crm/static/default_templates/en/invoice.xsl @@ -583,6 +583,7 @@ + diff --git a/koalixcrm/crm/static/default_templates/en/purchaseconfirmation.xsl b/koalixcrm/crm/static/default_templates/en/purchaseconfirmation.xsl index b4592b85..ae49284e 100644 --- a/koalixcrm/crm/static/default_templates/en/purchaseconfirmation.xsl +++ b/koalixcrm/crm/static/default_templates/en/purchaseconfirmation.xsl @@ -583,6 +583,7 @@ + diff --git a/koalixcrm/crm/static/default_templates/en/purchaseorder.xsl b/koalixcrm/crm/static/default_templates/en/purchaseorder.xsl index 022f2163..8e3eff91 100644 --- a/koalixcrm/crm/static/default_templates/en/purchaseorder.xsl +++ b/koalixcrm/crm/static/default_templates/en/purchaseorder.xsl @@ -583,6 +583,7 @@ + diff --git a/koalixcrm/crm/static/default_templates/en/quote.xsl b/koalixcrm/crm/static/default_templates/en/quote.xsl index 022f2163..8e3eff91 100644 --- a/koalixcrm/crm/static/default_templates/en/quote.xsl +++ b/koalixcrm/crm/static/default_templates/en/quote.xsl @@ -583,6 +583,7 @@ + diff --git a/koalixcrm/crm/static/taskslookup.js b/koalixcrm/crm/static/taskslookup.js new file mode 100644 index 00000000..d1563d6f --- /dev/null +++ b/koalixcrm/crm/static/taskslookup.js @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/koalixcrm/crm/tasks.py b/koalixcrm/crm/tasks.py deleted file mode 100644 index d055d957..00000000 --- a/koalixcrm/crm/tasks.py +++ /dev/null @@ -1,33 +0,0 @@ -import io - -from celery import shared_task -from django.conf import settings -from django.core.management import call_command - -from koalixcrm.crm.contact.customer import Customer -from koalixcrm.crm.contact.supplier import Supplier - -def import_contact_data(input_file, contact_type, current_user): - _import_contact_data.delay(input_file, contact_type, current_user) - -@shared_task -def _import_contact_data(input_file, contact_type, current_user): - out = io.StringIO() - contact = None - try: - call_command('importcontactdata', - excel_file=input_file, - contact_type=contact_type, - current_user=str(current_user), - stdout=out) - value = out.getvalue() - print('Number of contacts imported: {}'.format(value)) - - except ValueError as e: - value = None - if contact is not None: - contact.set_error() - error_message = "Sorry, the input file is not valid: {}".format(e) - raise - - \ No newline at end of file diff --git a/koalixcrm/crm/templates/crm/admin/registerPayment.html b/koalixcrm/crm/templates/crm/admin/registerPayment.html deleted file mode 100644 index a9f20759..00000000 --- a/koalixcrm/crm/templates/crm/admin/registerPayment.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "admin/base.html" %} -{% block title %} -Register Payment Amount -{% endblock %} - -{% block content %} - -

{% csrf_token %} - -{% for obj in queryset %} - - - - - - - -{% endfor %} - - - - - -{% endblock %} - diff --git a/koalixcrm/crm/templates/crm/admin/register_payment.html b/koalixcrm/crm/templates/crm/admin/register_payment.html new file mode 100644 index 00000000..cec83ba8 --- /dev/null +++ b/koalixcrm/crm/templates/crm/admin/register_payment.html @@ -0,0 +1,35 @@ +{% extends "admin/base.html" %} +{% block title %} +Register Payment Amount +{% endblock %} + +{% block content %} + +{% csrf_token %} +
- Amount to Register: - - {{ form }} - - Amount on Invoice: - - {{ obj.lastCalculatedPrice }} -
+{% for obj in queryset %} + + + {{ form }} + + + + + + +{% endfor %} + +{% endblock %} + diff --git a/koalixcrm/crm/templates/crm/admin/time_reporting.html b/koalixcrm/crm/templates/crm/admin/time_reporting.html new file mode 100644 index 00000000..07e71c5b --- /dev/null +++ b/koalixcrm/crm/templates/crm/admin/time_reporting.html @@ -0,0 +1,104 @@ +{% extends "admin/base.html" %} +{% block extrahead %} + +{% endblock %} +{% block title %} +Reporting +{% endblock %} + +{% block content %} +{% csrf_token %} + {{ formset.management_form }}
+ {{ range_selection_form}}

+
+
+ Amount to Register: + + Amount on Invoice: + + {{ obj.last_calculated_price }} +
+ + + + + +
+ {% for form in formset %} + {% if forloop.first %} + + {% for field in form.visible_fields %} + + {% endfor %} + + {% endif %} + {% for field in form.visible_fields %} + + {% endfor %} + {% for field in form.hidden_fields %}{{ field }} + {% endfor %} + {% endfor %} +
{{ field.label }}
{{ field }}
{{ field.errors }}
+ +
+
+ + + + + +{% endblock %} + diff --git a/koalixcrm/crm/tests/__init__.py b/koalixcrm/crm/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/koalixcrm/crm/tests/test_calculations_document.py b/koalixcrm/crm/tests/test_calculations_document.py new file mode 100644 index 00000000..e3001bea --- /dev/null +++ b/koalixcrm/crm/tests/test_calculations_document.py @@ -0,0 +1,114 @@ +from django.test import TestCase +from koalixcrm.crm.models import Contract +from koalixcrm.crm.models import Customer +from koalixcrm.crm.models import CustomerGroup +from koalixcrm.crm.models import CustomerBillingCycle +from koalixcrm.crm.models import Currency +from koalixcrm.crm.models import Product +from koalixcrm.crm.models import Tax +from koalixcrm.crm.models import Unit +from koalixcrm.crm.models import Quote +from koalixcrm.crm.models import Price +from koalixcrm.crm.models import SalesDocumentPosition +from django.contrib.auth.models import User +from koalixcrm.crm.documents.calculations import Calculations +import datetime + + +class DocumentCalculationsTest(TestCase): + def setUp(self): + datetime_now = datetime.datetime(2024, 1, 1, 0, 00) + valid_from = (datetime_now - datetime.timedelta(days=30)).date() + valid_until = (datetime_now + datetime.timedelta(days=30)).date() + date_now = datetime_now.date() + test_billing_cycle = CustomerBillingCycle.objects.create( + name="30 days to pay", + time_to_payment_date = 30, + payment_reminder_time_to_payment = 10 + ) + test_user = User.objects.create( + username='Username', + password="Userone") + test_customer_group = CustomerGroup.objects.create( + name = "Tripple A" + ) + test_customer = Customer.objects.create( + name="John Smith", + last_modified_by=test_user, + default_customer_billing_cycle=test_billing_cycle, + ) + test_customer.is_member_of=[test_customer_group,] + test_customer.save() + test_currency = Currency.objects.create( + description="Swiss Francs", + short_name = "CHF", + rounding = 0.05, + ) + test_contract = Contract.objects.create( + staff=test_user, + description = "This is a test contract", + default_customer = test_customer, + default_currency = test_currency, + last_modification = date_now, + last_modified_by = test_user + ) + test_unit = Unit.objects.create( + description="Kilogram", + short_name = "kg", + ) + test_tax = Tax.objects.create( + tax_rate = 7.7, + name = "MwSt 7.7%") + test_quote = Quote.objects.create( + valid_until=valid_until, + status="C", + contract=test_contract, + external_reference = "ThisIsAnExternalReference", + discount = "11.23", + description = "ThisIsATestOffer", + customer = test_customer, + staff = test_user, + currency = test_currency, + date_of_creation = date_now, + last_modified_by = test_user,) + for i in range(10): + test_product = Product.objects.create( + description="This is a test product " + i.__str__(), + title = "This is a test product " + i.__str__(), + product_number = 12334235+i, + default_unit = test_unit, + last_modification = date_now, + last_modified_by = test_user, + tax = test_tax, + ) + Price.objects.create( + product=test_product, + unit = test_unit, + currency = test_currency, + customer_group = test_customer_group, + price = i*100, + valid_from = valid_from, + valid_until = valid_until, + ) + SalesDocumentPosition.objects.create( + sales_document = test_quote, + position_number=i*10, + quantity = 0.333*i, + description = "This is a Testposition " + i.__str__(), + discount = i*5, + product = test_product, + unit = test_unit, + overwrite_product_price = False, + ) + def test_calculate_document_price(self): + datetime_now = datetime.datetime(2024, 1, 1, 0, 00) + date_now = datetime_now.date() + test_quote = Quote.objects.get(description="ThisIsATestOffer") + Calculations.calculate_document_price( + document=test_quote, + pricing_date=date_now) + self.assertEqual( + (test_quote.last_calculated_price).__str__(), "5431.50") + self.assertEqual( + (test_quote.last_calculated_tax).__str__(), "418.05") + diff --git a/koalixcrm/crm/tests/test_calculations_reporting.py b/koalixcrm/crm/tests/test_calculations_reporting.py new file mode 100644 index 00000000..56583ad3 --- /dev/null +++ b/koalixcrm/crm/tests/test_calculations_reporting.py @@ -0,0 +1,180 @@ +from django.test import TestCase +from django.test import LiveServerTestCase +from koalixcrm.crm.models import Contract +from koalixcrm.crm.models import Customer +from koalixcrm.crm.models import CustomerGroup +from koalixcrm.crm.models import CustomerBillingCycle +from koalixcrm.crm.models import Currency +from koalixcrm.crm.models import Task +from koalixcrm.crm.models import TaskStatus +from koalixcrm.djangoUserExtension.models import UserExtension +from koalixcrm.djangoUserExtension.models import TemplateSet +from koalixcrm.crm.models import Work +from koalixcrm.crm.models import EmployeeAssignmentToTask +from django.contrib.auth.models import User +from selenium import webdriver +from selenium.common.exceptions import TimeoutException +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +import datetime + + +class ReportingCalculationsTest(TestCase): + def setUp(self): + datetime_now=datetime.datetime(2024, 1, 1, 0, 00) + start_date=(datetime_now - datetime.timedelta(days=30)).date() + end_date=(datetime_now + datetime.timedelta(days=30)).date() + date_now=datetime_now.date() + test_billing_cycle=CustomerBillingCycle.objects.create( + name="30 days to pay", + time_to_payment_date=30, + payment_reminder_time_to_payment=10 + ) + test_user=User.objects.create_superuser( + username='admin', + password='admin', + email='admin@admin.com') + test_customer_group=CustomerGroup.objects.create( + name="Tripple A" + ) + test_customer=Customer.objects.create( + name="John Smith", + last_modified_by=test_user, + default_customer_billing_cycle=test_billing_cycle, + ) + test_customer.is_member_of=[test_customer_group,] + test_customer.save() + test_currency=Currency.objects.create( + description="Swiss Francs", + short_name="CHF", + rounding=0.05, + ) + test_template_set=TemplateSet.objects.create( + title="Just an empty Template Set" + ) + UserExtension.objects.create( + user=test_user, + defaultTemplateSet = test_template_set, + defaultCurrency = test_currency + ) + test_contract=Contract.objects.create( + staff=test_user, + description="This is a test contract", + default_customer=test_customer, + default_currency=test_currency, + last_modification=date_now, + last_modified_by=test_user + ) + test_task_status=TaskStatus.objects.create( + title="planned", + description="This represents the state when something has been planned but not yet started", + is_done=False + ) + Task.objects.create( + short_description="Test Task", + planned_start_date=start_date, + planned_end_date=end_date, + project=test_contract, + description="This is a simple test task", + status=test_task_status, + last_status_change=date_now + ) + + def test_calculate_document_price(self): + datetime_now = datetime.datetime(2024, 1, 1, 0, 00) + datetime_later = datetime.datetime(2024, 1, 1, 2, 00) + datetime_even_later = datetime.datetime(2024, 1, 1, 3, 30) + date_now = datetime_now.date() + test_task = Task.objects.get(short_description="Test Task") + self.assertEqual( + (test_task.planned_duration()).__str__(), "60 days, 0:00:00") + self.assertEqual( + (test_task.planned_effort()).__str__(), "0 h") + test_user = User.objects.get(username="admin") + test_employee = UserExtension.objects.get(user=test_user) + EmployeeAssignmentToTask.objects.create( + employee=test_employee, + planned_effort="2.00", + task=test_task + ) + EmployeeAssignmentToTask.objects.create( + employee=test_employee, + planned_effort="1.50", + task=test_task + ) + self.assertEqual( + (test_task.planned_effort()).__str__(), "3.50 h") + self.assertEqual( + (test_task.effective_effort()).__str__(), "0.0 h") + Work.objects.create( + employee=test_employee, + date=date_now, + start_time=datetime_now, + stop_time=datetime_later, + short_description="Not really relevant", + description="Performed some hard work", + task=test_task + ) + Work.objects.create( + employee=test_employee, + date=date_now, + start_time=datetime_later, + stop_time=datetime_even_later, + short_description="Not really relevant 2nd part", + description="Performed some hard work 2nd part", + task=test_task + ) + self.assertEqual( + (test_task.effective_effort()).__str__(), "3.5 h") + + +class ReportingCalculationsUITest(LiveServerTestCase): + + def setUp(self): + firefox_options = webdriver.firefox.options.Options() + firefox_options.set_headless(headless=True) + self.selenium = webdriver.Firefox(firefox_options=firefox_options) + prepare_test = ReportingCalculationsTest() + prepare_test.setUp() + + def tearDown(self): + self.selenium.quit() + + def test_registration_of_work(self): + selenium = self.selenium + #login + selenium.get('%s%s' % (self.live_server_url, '/admin/')) + timeout = 5 + try: + element_present = EC.presence_of_element_located((By.ID, 'id_username')) + WebDriverWait(selenium, timeout).until(element_present) + except TimeoutException: + print("Timed out waiting for page to load") + username = selenium.find_element_by_xpath('//*[@id="id_username"]') + password = selenium.find_element_by_xpath('//*[@id="id_password"]') + submit_button = selenium.find_element_by_xpath('/html/body/div/article/div/div/form/div/ul/li/input') + username.send_keys("admin") + password.send_keys("admin") + submit_button.send_keys(Keys.RETURN) + try: + element_present = EC.presence_of_element_located((By.ID, 'module_1_7')) + WebDriverWait(selenium, timeout).until(element_present) + except TimeoutException: + print("Timed out waiting for page to load") + #Opening the link we want to test + selenium.get('%s%s' % (self.live_server_url, '/koalixcrm/crm/reporting/monthlyreport/')) + try: + element_present = EC.presence_of_element_located((By.ID, 'id_form-0-projects')) + WebDriverWait(selenium, timeout).until(element_present) + except TimeoutException: + print("Timed out waiting for page to load") + #find the form element + project = selenium.find_element_by_xpath('//*[@id="id_form-0-projects"]') + task = selenium.find_element_by_xpath('//*[@id="id_form-0-task"]') + date = selenium.find_element_by_xpath('//*[@id="id_form-0-date"]') + start_time = selenium.find_element_by_xpath('//*[@id="id_form-0-start_time"]') + stop_time = selenium.find_element_by_xpath('//*[@id="id_form-0-stop_time"]') + description = selenium.find_element_by_xpath('//*[@id="id_form-0-description"]') + save = selenium.find_element_by_name('save') \ No newline at end of file diff --git a/koalixcrm/crm/views.py b/koalixcrm/crm/views.py deleted file mode 100644 index 1a99bd21..00000000 --- a/koalixcrm/crm/views.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- -from os import path -from wsgiref.util import FileWrapper -from django.contrib import messages -from subprocess import CalledProcessError - -from django.http import Http404 -from django.http import HttpResponse -from django.http import HttpResponseRedirect -from django.utils.translation import ugettext as _ -from koalixcrm.crm.exceptions import * -import koalixcrm - - -def export_pdf(calling_model_admin, request, document, redirect_to): - """This method exports PDFs provided by different Models in the crm application - - Args: - calling_model_admin (ModelAdmin): The calling ModelAdmin must be provided for error message response. - request: The request User is to know where to save the error message - document (Contract): The model from which a PDF should be exported - redirect_to (str): String that describes to where the method should redirect in case of an error - - Returns: - HTTpResponse with a PDF when successful - HTTpResponseRedirect when not successful - - Raises: - raises Http404 exception if anything goes wrong""" - try: - pdf = document.create_pdf() - response = HttpResponse(FileWrapper(open(pdf, 'rb')), content_type='application/pdf') - response['Content-Length'] = path.getsize(pdf) - except (TemplateSetMissing, UserExtensionMissing, CalledProcessError, UserExtensionEmailAddressMissing, UserExtensionPhoneAddressMissing) as e: - if isinstance(e, UserExtensionMissing): - response = HttpResponseRedirect(redirect_to) - calling_model_admin.message_user(request, _("User Extension Missing")) - elif isinstance(e, UserExtensionEmailAddressMissing): - response = HttpResponseRedirect(redirect_to) - calling_model_admin.message_user(request, _("User Extension Email Missing")) - elif isinstance(e, UserExtensionPhoneAddressMissing): - response = HttpResponseRedirect(redirect_to) - calling_model_admin.message_user(request, _("User Extension Phone Missing")) - elif isinstance(e, TemplateSetMissing): - response = HttpResponseRedirect(redirect_to) - calling_model_admin.message_user(request, _("Templateset Missing")) - elif isinstance(e, TemplateFOPConfigFileMissing): - response = HttpResponseRedirect(redirect_to) - calling_model_admin.message_user(request, _("Fop Config File Missing in TemplateSet")) - elif isinstance(e, TemplateXSLTFileMissing): - response = HttpResponseRedirect(redirect_to) - calling_model_admin.message_user(request, _("XSLT File Missing in TemplateSet")) - elif type(e) == CalledProcessError: - response = HttpResponseRedirect(redirect_to) - calling_model_admin.message_user(request, e.output) - else: - raise Http404 - return response - - -def create_new_document(calling_model_admin, request, calling_model, requested_document_type, redirect_to): - """This method exports PDFs provided by different Models in the crm application - - Args: - calling_model_admin (ModelAdmin): The calling ModelAdmin must be provided for error message response. - request: The request User is to know where to save the error message - calling_model (Contract or SalesDocument): The model from which a new document shall be created - requested_document_type (str): The document type name that shall be created - redirect_to (str): String that describes to where the method should redirect in case of an error - - Returns: - HTTpResponse with a PDF when successful - HTTpResponseRedirect when not successful - - Raises: - raises Http404 exception if anything goes wrong""" - try: - new_document = requested_document_type() - new_document.create_from_reference(calling_model) - calling_model_admin.message_user(request, _(str(new_document) + - " created")) - response = HttpResponseRedirect('/admin/crm/'+ - new_document.__class__.__name__.lower()+ - '/'+ - str(new_document.id)) - except (TemplateSetMissingInContract, TemplateMissingInTemplateSet) as e: - if isinstance(calling_model, koalixcrm.crm.documents.contract.Contract): - contract = calling_model - else: - contract = calling_model.contract - if isinstance(e, TemplateSetMissingInContract): - response = HttpResponseRedirect('/admin/crm/contract/'+ - str(contract.id)) - calling_model_admin.message_user(request, _("Missing Templateset "), - level=messages.ERROR) - elif isinstance(e, TemplateMissingInTemplateSet): - response = HttpResponseRedirect('/admin/djangoUserExtension/templateset/' + - str(contract.default_template_set.id)) - calling_model_admin.message_user(request, - (_("Missing template for ")+ - new_document.__class__.__name__), - level=messages.ERROR) - else: - raise Http404 - return response diff --git a/koalixcrm/crm/views/__init__.py b/koalixcrm/crm/views/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/koalixcrm/crm/views/monthlyreport.py b/koalixcrm/crm/views/monthlyreport.py new file mode 100644 index 00000000..4436599d --- /dev/null +++ b/koalixcrm/crm/views/monthlyreport.py @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- +from django.http import HttpResponseRedirect +from django.shortcuts import render +from django.template.context_processors import csrf +from django.contrib.admin.widgets import * +from koalixcrm.djangoUserExtension.models import UserExtension +from koalixcrm.crm.reporting.task import Task +from koalixcrm.crm.documents.contract import Contract +import datetime + + +class RangeSelectionForm(forms.Form): + from_date = forms.DateField(widget=AdminDateWidget) + to_date = forms.DateField(widget=AdminDateWidget) + original_from_date = forms.DateField(widget=forms.HiddenInput(), required=False) + original_to_date = forms.DateField(widget=forms.HiddenInput(), required=False) + + +class BaseWorkEntryFormset(forms.models.BaseFormSet): + def __init__(self,*args, **kwargs): + super(BaseWorkEntryFormset, self).__init__(*args, **kwargs) + + +class WorkEntry(forms.Form): + task_list = Task.objects.all() + projects = forms.ModelChoiceField(Contract.objects.all()) + task = forms.ModelChoiceField(task_list) + date = forms.DateField(widget=AdminDateWidget) + start_time = forms.TimeField(widget=AdminTimeWidget) + stop_time = forms.TimeField(widget=AdminTimeWidget) + description = forms.CharField(widget=AdminTextareaWidget) + work_id = forms.IntegerField(widget=forms.HiddenInput(), required=False) + + def __init__(self, *args, **kwargs ): + self.from_date = kwargs.pop('from_date') + self.to_date = kwargs.pop('to_date') + self.original_from_date = self.from_date + self.original_to_date = self.to_date + project_list = [] + for task_element in self.task_list: + project_list.append(task_element.project) + super(WorkEntry, self).__init__(*args, **kwargs) + + def clean_date(self): + date = self.cleaned_data['date'] + if (date < self.from_date): + raise forms.ValidationError('date is not within the selected range', code='invalid') + elif (self.to_date < date): + raise forms.ValidationError('date is not within the selected range', code='invalid') + return date + + +def generate_initial_data(start_date, stop_date, employee): + from koalixcrm.crm.reporting.work import Work + list_of_work = Work.objects.filter(employee=employee).filter(date__lte=stop_date).filter(date__gte=start_date).order_by("date") + initial = [] + for work in list_of_work: + initial.append({'work_id': work.id, + 'task': work.task, + 'projects': work.task.project, + 'date': work.date, + 'start_time': work.start_time, + 'stop_time': work.stop_time, + 'description': work.description}) + return initial + + +def evaluate_pre_check_from_date(range_selection_form): + original_from_date = range_selection_form.cleaned_data['original_from_date'] + new_from_date = range_selection_form.cleaned_data['from_date'] + if original_from_date < new_from_date: + from_date = original_from_date + else: + from_date = new_from_date + return from_date + + +def evaluate_pre_check_to_date(range_selection_form): + original_to_date = range_selection_form.cleaned_data['original_to_date'] + new_to_date = range_selection_form.cleaned_data['to_date'] + + if original_to_date > new_to_date: + to_date = original_to_date + else: + to_date = new_to_date + return to_date + + +def load_formset(range_selection_form, request): + WorkEntryFormSet = forms.formset_factory(WorkEntry, + extra=1, + max_num=60, + can_delete=True, + formset=BaseWorkEntryFormset) + from_date = evaluate_pre_check_from_date(range_selection_form) + to_date = evaluate_pre_check_to_date(range_selection_form) + form_kwargs = compose_form_kwargs(from_date, to_date) + pre_check_formset = WorkEntryFormSet(request.POST, + form_kwargs=form_kwargs) + return pre_check_formset + + +def compose_form_kwargs(from_date, to_date): + form_kwargs = {'from_date': from_date, 'to_date': to_date} + return form_kwargs + + +def create_updated_formset(range_selection_form, request): + WorkEntryFormSet = forms.formset_factory(WorkEntry, + extra=1, + max_num=60, + can_delete=True, + formset=BaseWorkEntryFormset) + employee = UserExtension.get_user_extension(request.user) + from_date = range_selection_form.cleaned_data['from_date'] + to_date = range_selection_form.cleaned_data['to_date'] + initial_formset_data = generate_initial_data(from_date, + to_date, + employee) + form_kwargs = compose_form_kwargs(from_date, to_date) + formset = WorkEntryFormSet(initial=initial_formset_data, + form_kwargs=form_kwargs) + return formset + + +def create_new_formset(from_date, to_date, request): + WorkEntryFormSet = forms.formset_factory(WorkEntry, + extra=1, + max_num=60, + can_delete=True, + formset=BaseWorkEntryFormset) + employee = UserExtension.get_user_extension(request.user) + initial_formset_data = generate_initial_data(from_date, + to_date, + employee) + form_kwargs = compose_form_kwargs(from_date, to_date) + formset = WorkEntryFormSet(initial=initial_formset_data, + form_kwargs=form_kwargs) + return formset + + +def update_work(form, request): + from koalixcrm.crm.reporting.work import Work + if form.has_changed(): + if form.cleaned_data['work_id']: + work = Work.objects.get(id=form.cleaned_data['work_id']) + else: + work = Work() + if form.cleaned_data['DELETE']: + work.delete() + else: + work.task = form.cleaned_data['task'] + work.employee = UserExtension.get_user_extension(request.user) + work.date = form.cleaned_data['date'] + work.start_time = datetime.datetime.combine(form.cleaned_data['date'], + form.cleaned_data['start_time']) + work.stop_time = datetime.datetime.combine(form.cleaned_data['date'], + form.cleaned_data['stop_time']) + work.description = form.cleaned_data['description'] + work.save() + + +def create_range_selection_form(from_date, to_date): + initial_form_data = {'from_date': from_date, + 'to_date': to_date, + 'original_from_date': from_date, + 'original_to_date': to_date} + range_selection_form = RangeSelectionForm(initial=initial_form_data) + return range_selection_form + + +def update_range_selection_form(old_range_selection_form): + from_date = old_range_selection_form.cleaned_data['from_date'] + to_date = old_range_selection_form.cleaned_data['to_date'] + initial_form_data = {'from_date': from_date, + 'to_date': to_date, + 'original_from_date': from_date, + 'original_to_date': to_date} + range_selection_form = RangeSelectionForm(initial=initial_form_data) + return range_selection_form + + +def work_report(request): + if request.POST.get('post'): + if 'cancel' in request.POST: + HttpResponseRedirect('/admin/') + elif 'save' in request.POST: + range_selection_form = RangeSelectionForm(request.POST) + if range_selection_form.is_valid(): + formset = load_formset(range_selection_form, + request) + if not formset.is_valid(): + c = {'range_selection_form': range_selection_form, + 'formset': formset} + c.update(csrf(request)) + return render(request, 'crm/admin/time_reporting.html', c) + else: + for form in formset: + update_work(form,request) + formset = create_updated_formset(range_selection_form, request) + range_selection_form = update_range_selection_form(range_selection_form) + c = {'range_selection_form': range_selection_form, + 'formset': formset} + c.update(csrf(request)) + return render(request, 'crm/admin/time_reporting.html', c) + HttpResponseRedirect('/admin/') + else: + datetime_now = datetime.datetime.today() + to_date = (datetime_now + datetime.timedelta(days=30)).date() + from_date = datetime_now.date() + range_selection_form = create_range_selection_form(from_date, to_date) + formset = create_new_formset(from_date, to_date, request) + c = {'formset': formset, + 'range_selection_form': range_selection_form} + c.update(csrf(request)) + return render(request, 'crm/admin/time_reporting.html', c) + diff --git a/koalixcrm/crm/views/newdocument.py b/koalixcrm/crm/views/newdocument.py new file mode 100644 index 00000000..845097ad --- /dev/null +++ b/koalixcrm/crm/views/newdocument.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +from django.http import Http404 +from django.http import HttpResponseRedirect +from django.utils.translation import ugettext as _ +from django.contrib import messages +from koalixcrm.crm.exceptions import * + + +class CreateNewDocumentView: + def create_new_document(calling_model_admin, request, calling_model, requested_document_type, redirect_to): + """This method exports PDFs provided by different Models in the crm application + + Args: + calling_model_admin (ModelAdmin): The calling ModelAdmin must be provided for error message response. + request: The request User is to know where to save the error message + calling_model (Contract or SalesDocument): The model from which a new document shall be created + requested_document_type (str): The document type name that shall be created + redirect_to (str): String that describes to where the method should redirect in case of an error + + Returns: + HTTpResponse with a PDF when successful + HTTpResponseRedirect when not successful + + Raises: + raises Http404 exception if anything goes wrong""" + from koalixcrm.crm.documents.contract import Contract + try: + new_document = requested_document_type() + new_document.create_from_reference(calling_model) + calling_model_admin.message_user(request, _(str(new_document) + + " created")) + response = HttpResponseRedirect('/admin/crm/'+ + new_document.__class__.__name__.lower()+ + '/'+ + str(new_document.id)) + except (TemplateSetMissingInContract, TemplateMissingInTemplateSet) as e: + if isinstance(calling_model, Contract): + contract = calling_model + else: + contract = calling_model.contract + if isinstance(e, TemplateSetMissingInContract): + response = HttpResponseRedirect('/admin/crm/contract/'+ + str(contract.id)) + calling_model_admin.message_user(request, _("Missing Templateset "), + level=messages.ERROR) + elif isinstance(e, TemplateMissingInTemplateSet): + response = HttpResponseRedirect('/admin/djangoUserExtension/templateset/' + + str(contract.default_template_set.id)) + calling_model_admin.message_user(request, + (_("Missing template for ")+ + new_document.__class__.__name__), + level=messages.ERROR) + else: + raise Http404 + return response diff --git a/koalixcrm/crm/views/pdfexport.py b/koalixcrm/crm/views/pdfexport.py new file mode 100644 index 00000000..d29830c4 --- /dev/null +++ b/koalixcrm/crm/views/pdfexport.py @@ -0,0 +1,64 @@ +# -*- coding: utf-8 -*- +from os import path +from wsgiref.util import FileWrapper +from subprocess import CalledProcessError +from django.http import Http404 +from django.http import HttpResponse +from django.http import HttpResponseRedirect +from django.utils.translation import ugettext as _ +from koalixcrm.crm.exceptions import * +from koalixcrm.accounting.exceptions import * + + +class PDFExportView: + def export_pdf(calling_model_admin, request, document, redirect_to, template_to_use): + """This method exports PDFs provided by different Models in the crm application + + Args: + calling_model_admin (ModelAdmin): The calling ModelAdmin must be provided for error message response. + request: The request User is to know where to save the error message + document (Contract): The model from which a PDF should be exported + redirect_to (str): String that describes to where the method should redirect in case of an error + template_to_use (Template Set): For some documents that need to be created there exists more + than one template with this parameter the template set can be set during the export function + + + Returns: + HTTpResponse with a PDF when successful + HTTpResponseRedirect when not successful + + Raises: + raises Http404 exception if anything goes wrong""" + try: + pdf = document.create_pdf(template_to_use, request.user) + response = HttpResponse(FileWrapper(open(pdf, 'rb')), content_type='application/pdf') + response['Content-Length'] = path.getsize(pdf) + except (TemplateSetMissing, + UserExtensionMissing, + CalledProcessError, + UserExtensionEmailAddressMissing, + UserExtensionPhoneAddressMissing) as e: + if isinstance(e, UserExtensionMissing): + response = HttpResponseRedirect(redirect_to) + calling_model_admin.message_user(request, _("User Extension Missing")) + elif isinstance(e, UserExtensionEmailAddressMissing): + response = HttpResponseRedirect(redirect_to) + calling_model_admin.message_user(request, _("User Extension Email Missing")) + elif isinstance(e, UserExtensionPhoneAddressMissing): + response = HttpResponseRedirect(redirect_to) + calling_model_admin.message_user(request, _("User Extension Phone Missing")) + elif isinstance(e, TemplateSetMissing): + response = HttpResponseRedirect(redirect_to) + calling_model_admin.message_user(request, _("Templateset Missing")) + elif isinstance(e, TemplateFOPConfigFileMissing): + response = HttpResponseRedirect(redirect_to) + calling_model_admin.message_user(request, _("Fop Config File Missing in TemplateSet")) + elif isinstance(e, TemplateXSLTFileMissing): + response = HttpResponseRedirect(redirect_to) + calling_model_admin.message_user(request, _("XSLT File Missing in TemplateSet")) + elif type(e) == CalledProcessError: + response = HttpResponseRedirect(redirect_to) + calling_model_admin.message_user(request, e.output) + else: + raise Http404 + return response diff --git a/koalixcrm/crm/views/restinterface.py b/koalixcrm/crm/views/restinterface.py new file mode 100644 index 00000000..1e2de7fd --- /dev/null +++ b/koalixcrm/crm/views/restinterface.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from rest_framework import viewsets +from koalixcrm.crm.reporting.task import Task, TaskJSONSerializer +from koalixcrm.crm.reporting.taskstatus import TaskStatus, TaskStatusJSONSerializer +from koalixcrm.crm.documents.contract import Contract, ContractJSONSerializer + + + +class TaskAsJSON(viewsets.ReadOnlyModelViewSet): + """ + API endpoint that allows users to be viewed. + """ + queryset = Task.objects.all() + serializer_class = TaskJSONSerializer + filter_fields = ('project',) + + +class ContractAsJSON(viewsets.ReadOnlyModelViewSet): + """ + API endpoint that allows users to be viewed. + """ + queryset = Contract.objects.all() + serializer_class = ContractJSONSerializer + + +class TaskStatusAsJSON(viewsets.ReadOnlyModelViewSet): + """ + API endpoint that allows users to be viewed. + """ + queryset = TaskStatus.objects.all() + serializer_class = TaskStatusJSONSerializer \ No newline at end of file diff --git a/koalixcrm/djangoUserExtension/models.py b/koalixcrm/djangoUserExtension/models.py index e473cc05..84cacf3f 100644 --- a/koalixcrm/djangoUserExtension/models.py +++ b/koalixcrm/djangoUserExtension/models.py @@ -15,6 +15,37 @@ class UserExtension(models.Model): defaultTemplateSet = models.ForeignKey("TemplateSet") defaultCurrency = models.ForeignKey("crm.Currency") + @staticmethod + def objects_to_serialize(object_to_create_pdf, reference_user): + from koalixcrm.crm.contact.phoneaddress import PhoneAddress + from koalixcrm.crm.contact.emailaddress import EmailAddress + from django.contrib import auth + objects = list(auth.models.User.objects.filter(id=reference_user.id)) + user_extension = UserExtension.objects.filter(user=reference_user.id) + if len(user_extension) == 0: + raise UserExtensionMissing(_("During "+str(object_to_create_pdf)+" PDF Export")) + phone_address = UserExtensionPhoneAddress.objects.filter( + userExtension=user_extension[0].id) + if len(phone_address) == 0: + raise UserExtensionPhoneAddressMissing(_("During "+str(object_to_create_pdf)+" PDF Export")) + email_address = UserExtensionEmailAddress.objects.filter( + userExtension=user_extension[0].id) + if len(email_address) == 0: + raise UserExtensionEmailAddressMissing(_("During "+str(object_to_create_pdf)+" PDF Export")) + objects += list(user_extension) + objects += list(EmailAddress.objects.filter(id=email_address[0].id)) + objects += list(PhoneAddress.objects.filter(id=phone_address[0].id)) + return objects + + @staticmethod + def get_user_extension(django_user): + user_extensions = UserExtension.objects.filter(user=django_user) + if len(user_extensions) > 1: + raise TooManyUserExtensionsAvailable(_("More than one User Extension define for user ") + django_user.__str__()) + elif len(user_extensions) == 0: + raise UserExtensionMissing(_("No User Extension define for user ") + django_user.__str__()) + return user_extensions[0] + class Meta: app_label = "djangoUserExtension" verbose_name = _('User Extention') diff --git a/koalixcrm/subscriptions/admin.py b/koalixcrm/subscriptions/admin.py index 9bc8061a..fba82bf1 100644 --- a/koalixcrm/subscriptions/admin.py +++ b/koalixcrm/subscriptions/admin.py @@ -44,14 +44,14 @@ class OptionSubscription(admin.ModelAdmin): @staticmethod def createInvoice(queryset): for obj in queryset: - invoice = obj.createInvoice() + invoice = obj.create_invoice() response = HttpResponseRedirect('/admin/crm/invoice/' + str(invoice.id)) return response @staticmethod def createQuote(queryset): for obj in queryset: - invoice = obj.createInvoice() + invoice = obj.create_invoice() response = HttpResponseRedirect('/admin/crm/invoice/' + str(invoice.id)) return response @@ -103,8 +103,6 @@ class KoalixcrmPluginInterface(object): quoteActions = [] customerInlines = [] customerActions = [] - personInline = [] - personActions = [] admin.site.register(Subscription, OptionSubscription) diff --git a/log.txt b/log.txt deleted file mode 100644 index 5de23c83..00000000 --- a/log.txt +++ /dev/null @@ -1 +0,0 @@ -get User id : 1 \ No newline at end of file diff --git a/manage.py b/manage.py index b2ef6790..1cf43233 100755 --- a/manage.py +++ b/manage.py @@ -2,14 +2,6 @@ import os import sys -'''import ptvsd -try: - ptvsd.enable_attach("my_secret", address = ('0.0.0.0', 3000)) - ptvsd.wait_for_attach() - ptvsd.break_into_debugger() -except: - pass''' - if __name__ == "__main__": try: from django.core.management import execute_from_command_line diff --git a/projectsettings/__init__.py b/projectsettings/__init__.py index 7c68785e..40a96afc 100644 --- a/projectsettings/__init__.py +++ b/projectsettings/__init__.py @@ -1 +1 @@ -# -*- coding: utf-8 -*- \ No newline at end of file +# -*- coding: utf-8 -*- diff --git a/projectsettings/dashboard.py b/projectsettings/dashboard.py index 90c3221b..1fef5f18 100644 --- a/projectsettings/dashboard.py +++ b/projectsettings/dashboard.py @@ -22,7 +22,7 @@ def init_with_context(self, context): site_name = get_admin_site_name(context) self.children.append(modules.Group( - _('CRMLite (based on koalixcrm V1.12dev2)'), + _('Group: koalixcrm V1.12dev2'), column=1, collapsible=True, children = [ @@ -48,22 +48,13 @@ def init_with_context(self, context): column=1, css_classes=('collapse closed',), models=('koalixcrm.crm.contact.contact.CallForContact', - 'koalixcrm.crm.documents.visit.Visit', - 'koalixcrm.crm.contact.data_import.ContactImportData'), - ), - modules.ModelList( - _('Data Import'), - column=1, - css_classes=('collapse closed',), - models=('koalixcrm.crm.contact.contact.ContactImportData'), + 'koalixcrm.crm.contact.contact.VisitForContact',), ), modules.ModelList( _('Products'), column=1, css_classes=('collapse closed',), - models=('koalixcrm.crm.product.product.Product', - 'koalixcrm.crm.product.attribute.AttributeSet', - 'koalixcrm.crm.product.attribute.Attribute'), + models=('koalixcrm.crm.product.product.Product',), ), modules.ModelList( _('Contacts'), @@ -71,7 +62,7 @@ def init_with_context(self, context): css_classes=('collapse closed',), models=('koalixcrm.crm.contact.customer.Customer', 'koalixcrm.crm.contact.supplier.Supplier', - 'koalixcrm.crm.contact.person.Person'), + 'koalixcrm.crm.contact.person.Person',), ), modules.ModelList( _('Accounting'), @@ -79,6 +70,20 @@ def init_with_context(self, context): css_classes=('collapse closed',), models=('koalixcrm.accounting.*',), ), + modules.ModelList( + _('Reporting'), + column=1, + css_classes=('collapse closed',), + models=('koalixcrm.crm.reporting.*',), + ), + modules.LinkList( + _('Report Personaly work'), + column=1, + children=[{'title': _('Monthly Report'), + 'url': '/koalixcrm/crm/reporting/monthlyreport/', + 'external': False,},] + ) + ] )) @@ -95,7 +100,7 @@ def init_with_context(self, context): models=('django.contrib.*',), ), modules.ModelList( - _('Settings'), + _('koalixcrm Settings'), column=1, css_classes=('collapse closed',), models=('koalixcrm.crm.contact.customerbillingcycle.CustomerBillingCycle', diff --git a/projectsettings/environment/development.env b/projectsettings/environment/development.env deleted file mode 100644 index 9ea08f45..00000000 --- a/projectsettings/environment/development.env +++ /dev/null @@ -1,26 +0,0 @@ -##### -# Environment -##### - -PRODUCTION=false -JAVA_HOME=/usr/bin/jdk1.8.0_162/jre - - -##### -# Django -##### - -DJANGO_SETTINGS_MODULE=projectsettings.settings.development_settings - -##### -# Nginx -##### - -# Server name used in nginx.tmpl (projectsettings/services/webserver/config/nginx.tmpl) -NGINX_SERVER_NAME=localhost - -# Here you can specify the location of your SSL/TLS certificate and key. -# This will be specified in the nginx.tmpl When specifying localhost it will -# use the self-signed certificate provided by this project -NGINX_CRT_NAME=localhost -NGINX_KEY_NAME=localhost diff --git a/projectsettings/media/data_files/contatti_test_import.xlsx b/projectsettings/media/data_files/contatti_test_import.xlsx deleted file mode 100644 index fc28fea55be66c6b9da23fa1f1c8a14904b12c61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7581 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 diff --git a/projectsettings/media/data_files/contatti_test_import_14c4p1e.xlsx b/projectsettings/media/data_files/contatti_test_import_14c4p1e.xlsx deleted file mode 100644 index 8d78418286d98c9846eef292bdb4067081ff5960..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8270 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 diff --git a/projectsettings/media/data_files/contatti_test_import_2Q0f0Zy.xlsx b/projectsettings/media/data_files/contatti_test_import_2Q0f0Zy.xlsx deleted file mode 100644 index 9a3c616d7b549c3a3150a7fb8a8ae1d53e695951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7619 zcmeHMbyQUC)~6dBI+d1=p`?@=x;v$DXpm7FL>OSCyIUlsTS6p6x*G;W2>}^ULO|df zeDA$_{oeOo-@0pk|J^-n&YW52?7h#~&yHvRww5Y71{n$t4i1W@TbUZlFNBXgxA3rY zhVb!TA1e|@RnUQea6~{voS#=CImouI9X6J!6cCg)bZK=bouB$~fL{oXN$CshSmnU4 z!*}E|mPsBQMPw;PD7clGa7D#@r}BHAOLVeB+wNpI%sgVC!g9lAplqtg`H&&O6}6U@ zf6h$1%g9`O&GH3ZOStW_tsm6oz6JV~?bb1@^cZdrKaVyDKY^xJm+mNpdwn!VQxF?p zGc1VXIbm1e6Ko^a90lp>=h0}iI`es*`f1>>&zRP%!X9Qf>(xc2y?!j&67G>LMY;*C zyo87~<0!;lwk4>48nmD89A~qaLeWyi#(7W{+_Z{(Z3#3KxxR zpN*S`9j~{GbEwXsYZpJD?SzYICB%k-yp}=9r5CqQCCKDxLmap|90>gW6Cp;YJ zBqeO#UdlsY0X2Zf6)Ol$$I78#uA~vTLdC2|2x^mwtzz-=semh$U{$N2`oI zePx0Z8|jWpi+S43;l0$ka6Ev2jPQ3DN+4JD5nn_16t-|0)AOu0JYsyn?NH|Fv)ot( zmy%xdDdNQia&oT{G`-K=8S414WP$i|+K*6CP(JlMq68`S9L2gslJ z%iGqt>_U53l0V?#*2o6Sd+##!<(R)s)gVGfRSa73`pEGrAdv^Q0#tHd zL@d!X3Z~3!x?7~I+U)gZGAO#41!^q{s>Yid$PLQ4nY2$9PP&FGrIJd{oB55)H{LH&B)P0!)fqL#HqJq!Q;AtaFGJup4JR zT<|9`BXRB%?w+51%*}DJLmS8Gjaqwp5iEE0y~_0Sldg( z#_m)@rfXy@ki&o~*Wpo{WJ6XOo-lWCzv%-DOiQB4edwwO%apetEq2~I(UQ}HnXXSM z=zKn-F#YZ>SD2|Qk1{v^>j%Wm?VyKYRy^`tlHF_f^mnXBT&)VsJi`Kty}jpRarl+= zxnok%&wC^S30P!NZ{fi08W0AJ4_a}*wLH@{$k0s$XMqf%)@kJax@z#6WmxZK9u|&; z#WzZbfx3IGNl3V%HwR}T+TCIIC`vTNqs<~(V)Xu9Rv+t!b_`vr_0K{dp>9#}Z8ohQ zbQbB%P^s1G=|s8H4Z1AM$XfGt2C~&x7`{!IN9$!s*nHJ+5bbN0o9tnpPuZwlOI9vm zm_y~4qB~K^6;kNQxUL>QRNjTZD9hj48+ykoAWO>8PU=e#^xRvy`v_rYf14A+FcnIY zcP^Gv7HkuUFK|wN$P2~`HRfF>hp$oXN7UZKR@snnCt?o^h~v?{dJzOv5u`5Y+Okf> zO_5AcdO67OQkl%ku~0t?_YBv(i!Fa!kd#jVM`vV7ZL2}NV`|lf<05#XioHFecGfZ6 zZFG*83cdUGN_dSfzb8Rd&f<1Q$jjy6TBm~D2H*Ck;==*0<9ljGeC(t%WNM>+ln(9Y z$~1vX3b869%;?34#;UNZ2<%g zhbfbe-vea{6KBiy_>hj@1(^vEx6Ad|kv@C``!)me&L}a&f)#BypceG|+639Z(jWw= z&zYiwbdOt63zYr9LG}wH1OWA=7Sw`LKeu-x>dV;3iznkK^W{6zKm+nmPu%6t)JN;{ za?YX?4jb}fb__~NO>V105iKq}y(0v0`>+v00FM|i!S&(#tb>}t#KY_koTd9YpO6@d5*e{t!Py~c^vC|bF@5L z8=IBH-~AcJfM!#Nl?zw#n^+yRBdHVjcPLFV;h^ z4|b#zB~0j`Dkk*!oF$|dgxtQO7+BiJs%jE%Ifk;)Pp0DKmn?`QpE?Jdo|^8oN%f4o zG25et*GpB$lzssZ!sL(4`$T>0^zyu+rJZfZ6wSS6aq^Hi{jFrPuqqrt-}c#!)CBXU z`-d3Ea?Qf!Me2(PgC|-5O*LuEG=rJ4&FVYVwrW#vHKrNo3*CX5z}$F4@4h6ymWJD% z3HxgA$}fj+`*fW~zSu4zL)5QVzj9to5t3Mskg%2zx3Ce%#LVLtLq*j?2U`|L;m5#& zczWy){AHi_2@~swyp0eo6PBY84cqZ%l8{N?1#6`(+IkoG6^C1Ak(8LX#0y}Zr(>!< ziz;PncsHHF9{m!=oeE&%OuA@ST|X3x=x{yh8>=2IV0SwpkjiJdkkq-7x|riX@X;X2 zGQQ&tUar9yfBp3V-Uuc6$k*vU<(2u&cnS#kGFN^Ks%2X`ULjy+v?Fnp-BrE4NBHDN z>XjHvHW0={L185O4^pqdk0Pe84p|fdw4WGSy1y$WXBCcFhU&a!HdF`G4U&ottGNMc z$beWiI4CMLPXZ`c!Ao@F(=uy&ByRNZK=vnB6*IdSBV0mU9cja2=(>4&8_jFE^o_60 z9&Uv2>(~obuW7EHo*!wRQZGNRLP29j`C!H=r3y+=j#kB8Si&UqX@+oG4mSk^_C#1+^Mdrx+u`et4;C%tOFjWr>f zqN7h`L@FzxX#mA1#7TUUP0~&42?K}Hk;AH+yQpZExB&=3F~Bd4^>8jEj49|l?{Fn< zM(u9yHu^TIj4TJuO(yJt@XC{1*q4Y*_Ojb*^}s%?dW}?DdH)klmHiE2@F?u41CYUD zGPFs0&U^F8r)X<<1eTI z4_i6HqR{}C#!|PEv1}5S@7S5MRjk>*1^P#X!V(&l4C^9i zmBU25m>w|)Go(HqfM%=Pyy4sy&e*KE6KiA9aX98qKsH_q7LwT_9HwdR54E?#(ElzG z*Fbu#-Tb_uNBl9u-_wVD+OuM;U0GNYf79AW%-?>Vjz7*oDnie}Rw0N4sJ82zw)a-Y z)Y#qcNX_>`VL;uaS#KnKuEa|{K&j8C75CK_ZgGe``3TeQ$crVC(T#kxI%dogM~!$C zhtrqM@|0OxQ$5%`5q(a~uk|X>~|uug~pB6Jt>6Lh?*mKSht7R3|uI7Xep3J$KmcdmN+F$mMvUGIhLsJK*)% zf~EI~bmn-Sgo%G{HO0oJC#5v48iFU~)28^SLK|+cm%WcjJ4brA z#pD_N^?rx2aMFnn9R&rB^&bSC;D3Yezd`rkp!JAi49FuNXFJGsqp|aiu1@4%3a;lmte?BDL8fpQ>`BpGv=SB+RVW`_O;<9uB#I zE#bMF%Poj^t2z!^hfBBH0J8bR5?-e`tKU5TsNeA5wYJ7hMP zLg5@SG z-%Mfb%>t^2iqJK9*>1lgt@b zOVEwL|DIOY@RqndHbEUFp{+U&!X6 z?}NgH1HxdbTY^eE@X;@+!kauAm1kwbPh*B3Oe%*(mG|S`~(& zs9tXY?`o%_K7&#VgJ#Bpe`lc?XycA_{FwA{0Hc<7X@`3#cjU|=yVku~OBW_9ZEYi| z#8QUcz>(s@z?UuqPSinP_HQXBze@s%HxPf~{y0ri51N4joQx194j z%?i|4!H`iU+L2`*9DQi=b9ct0$SmWR+D?fZSzziiBdiY;!?dOfB=M{(K%6vI|qXrNc|;fTb)roXZD!N%@|?Q zDi@@8aS}5dr^6a?X6fg}3mzGw8?7R0ILzrZ%GV$23hb2BYT<=0^z8NpEM)SJG8tl~ zn#c^rSk6zcb^BKhi%k0NXm`{C%K@3`h{d+xjKvOD>G%u0eufTaokmhF ztVE|C__sRgM8p{Pzrb{?pE!4$*L)W*zNRBkwTkmzh$=_!^68jTyk1yT#e11f_~lWP zVYv76Xzv-k7PCzSRcb+@R$XDH2&N~4b*|WtM+N;vZruvyJiPayzTiWz4b}nEy5^O_ zmGZk&xTxLmIX^>#Kl+gv*e0-NrZa@M@DxyddF=Zr{#JY9J#UEs_xO9>Yyn#|;$AY7 zBMuj6Z?yaiydrJ`8kvDwf#aAm+@-0BSMs#Q=Xfk08QM}fT@(~V-{uR>bD-S9*%r@? zBZj2eEQ)P6K1adkt71RcXQ{o_<}(QkF{d(*_07fV*5+&1&|NUCRVn)9rqdvoJ)ZdJ zkcZ|>9+788uWTHy@m^K2zqn-YbJ{6bhWGLZ2*%m3J4cN4rq9T2&0j+}$R^_&!hzUZ zdDz+NKJsvI1^-C0$tlAz3;blECjod|<(@LKmU+|cwvMuCCU}f0L723*nCK~VnF|_1 ziN&8<4|^RIl3$g()UJpMxPbLn2IR zQGH+Y^38lp3@YmJ5&f(VtXK239}$u1l!{?}=XKwv>{gP{5cc&L;OfnogEQeD21LWWy+)KceuQk+5LjEZ3uGM$l``x>#-wMj=R&7 ztKf!W{XV;4tL622FLRq}rZhlB9*qJb&61K;Ulf)Tv?Ux6BEN2cyZW>Qs~LZrGv9e$ zcCyuKeXZ~`)B(=#fL${7jEJg}yx~xxSVeu>6~lj@M%RT*&;hgP$gF+;Ok87DIW zTPk;?L&Ngh4M4*i);Fh48E+cJy2B5>AJNSD^FvOEU1@k*YJ5BIPiYO8wh71t$Vkkb zxL#yuNC-0boh=0yxcg{#>o=Dv)$-NUDQb*if#ov{siL)H4Os41>24k`Y5J!v*8tmG z!w)-D>Ij|-@Ei}?DUi&)f!fTO=`RjrJ$G(3Uh@#{yu9&M{lT73@Nz-DZpxJ$`UyVi z)sN0q@(GU&Khon+aR1KZX#ViHKc)!R(BVI`*pG=qd*T};080>t@QZlomC;CxlV8-z zPa;4 zzeda6P?5)ML78AJ9=Ho$9csP&Fe(( z!C}Px9%%-tzYR@NWJkl*W6F*V_pg~~aUgoDZlr1u_Rimo?2 zEYG;hgBWlU$&D^s=S3keoz)&*pz4kW6q-~gG~ZaAQ2j7IkXG4DB2(62_B1V~&rsHf z@=dS6gBv2{w@8Sh!>k#Ba8-O^(ovk7xH*~zOM95<#)8zc;G`&y+&R&UP=mm@+FC^Z z48|)ZLN$NQ33Hw?Y?T^-x9fLezVgAiD3s?|({&{XR&l!B$7Fga_tE&*6fsPwV z-EPfJp@B#O(!YzNV`7y02`(OJUI{|fu9Ra2r3Pdk&Y}_$tYqf!Kcz&>%GE*E4QRY} zH!DD6vBZ-J)cz>pa7B;Z)RFf>Smx5tRSqK|$3)jwpZZG5E{w#p!ANjLOBEH34CUvH z>(?RA^^EJ^>6eMu?~K2W8m?zRKZzQt>VHjyerNv`XTP3D{G=gdApMK|AJd87xqpR< zuCe%^M1=9z$o%h8e(in#UCJ|LApZ%z{{v+Dze~9!_){rAy5`@d{JI6Y-uV9{2+};) zh3a2z!0)WT*1PLH(oYIOM$$iCy=>5Gw{x0Fyn7&SNKS>U0 qRHXX9NO-@?`PECWGr&)BrvB4>prwk51T9cd@R6TEq|>bZ(EdMB*#zAH diff --git a/projectsettings/media/data_files/contatti_test_import_59jaJH0.xlsx b/projectsettings/media/data_files/contatti_test_import_59jaJH0.xlsx deleted file mode 100644 index 8d78418286d98c9846eef292bdb4067081ff5960..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8270 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 G`hNlTi0?K4 diff --git a/projectsettings/media/data_files/contatti_test_import_8aYQ3xJ.xlsx b/projectsettings/media/data_files/contatti_test_import_8aYQ3xJ.xlsx deleted file mode 100644 index 9a3c616d7b549c3a3150a7fb8a8ae1d53e695951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7619 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 diff --git a/projectsettings/media/data_files/contatti_test_import_90JUfUo.xlsx b/projectsettings/media/data_files/contatti_test_import_90JUfUo.xlsx deleted file mode 100644 index 9a3c616d7b549c3a3150a7fb8a8ae1d53e695951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7619 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 diff --git a/projectsettings/media/data_files/contatti_test_import_9lsOIXx.xlsx b/projectsettings/media/data_files/contatti_test_import_9lsOIXx.xlsx deleted file mode 100644 index 5f304f8cff6292463ccfad472c64145c9a84fd31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7583 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 G`hNlTi0?K4 diff --git a/projectsettings/media/data_files/contatti_test_import_Fm0MG2h.xlsx b/projectsettings/media/data_files/contatti_test_import_Fm0MG2h.xlsx deleted file mode 100644 index 238cb914152bd59800fa07690c4f72e8a48254c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7581 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 F{|~<|-=_co diff --git a/projectsettings/media/data_files/contatti_test_import_JTAMGeo.xlsx b/projectsettings/media/data_files/contatti_test_import_JTAMGeo.xlsx deleted file mode 100644 index ed94e7c429244faa2df89e1d95cc7863574675dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7617 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 OK|hb1hU@8L>%Rc_?lTSm diff --git a/projectsettings/media/data_files/contatti_test_import_L6y0dNG.xlsx b/projectsettings/media/data_files/contatti_test_import_L6y0dNG.xlsx deleted file mode 100644 index 8d78418286d98c9846eef292bdb4067081ff5960..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8270 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 HAEW;l>Jj{$ diff --git a/projectsettings/media/data_files/contatti_test_import_PhiTotE.xlsx b/projectsettings/media/data_files/contatti_test_import_PhiTotE.xlsx deleted file mode 100644 index fc28fea55be66c6b9da23fa1f1c8a14904b12c61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7581 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 diff --git a/projectsettings/media/data_files/contatti_test_import_Pp3Y24G.xlsx b/projectsettings/media/data_files/contatti_test_import_Pp3Y24G.xlsx deleted file mode 100644 index 5f304f8cff6292463ccfad472c64145c9a84fd31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7583 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 G`hNlTi0?K4 diff --git a/projectsettings/media/data_files/contatti_test_import_RBsEYue.xlsx b/projectsettings/media/data_files/contatti_test_import_RBsEYue.xlsx deleted file mode 100644 index eb2d1a2e45f9eb03de39174932f14371a3395564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7584 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 Gv;P;14g3E9 diff --git a/projectsettings/media/data_files/contatti_test_import_TMu9Rpx.xlsx b/projectsettings/media/data_files/contatti_test_import_TMu9Rpx.xlsx deleted file mode 100644 index 9a3c616d7b549c3a3150a7fb8a8ae1d53e695951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7619 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 diff --git a/projectsettings/media/data_files/contatti_test_import_VNk0e5B.xlsx b/projectsettings/media/data_files/contatti_test_import_VNk0e5B.xlsx deleted file mode 100644 index 5f304f8cff6292463ccfad472c64145c9a84fd31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7583 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 G`hNlTi0?K4 diff --git a/projectsettings/media/data_files/contatti_test_import_bEqWmXS.xlsx b/projectsettings/media/data_files/contatti_test_import_bEqWmXS.xlsx deleted file mode 100644 index 9a3c616d7b549c3a3150a7fb8a8ae1d53e695951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7619 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 diff --git a/projectsettings/media/data_files/contatti_test_import_e7bCzzS.xlsx b/projectsettings/media/data_files/contatti_test_import_e7bCzzS.xlsx deleted file mode 100644 index ad5c9ff365b4fa7229536d3c191bd9d4b5595d47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7583 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 HAEW;l>Jj{$ diff --git a/projectsettings/media/data_files/contatti_test_import_fhn9Ujs.xlsx b/projectsettings/media/data_files/contatti_test_import_fhn9Ujs.xlsx deleted file mode 100644 index eb2d1a2e45f9eb03de39174932f14371a3395564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7584 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 Gv;P;14g3E9 diff --git a/projectsettings/media/data_files/contatti_test_import_gqwz2BY.xlsx b/projectsettings/media/data_files/contatti_test_import_gqwz2BY.xlsx deleted file mode 100644 index 9a3c616d7b549c3a3150a7fb8a8ae1d53e695951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7619 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 diff --git a/projectsettings/media/data_files/contatti_test_import_l0huEta.xlsx b/projectsettings/media/data_files/contatti_test_import_l0huEta.xlsx deleted file mode 100644 index fc28fea55be66c6b9da23fa1f1c8a14904b12c61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7581 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 diff --git a/projectsettings/media/data_files/contatti_test_import_qt1Ckwh.xlsx b/projectsettings/media/data_files/contatti_test_import_qt1Ckwh.xlsx deleted file mode 100644 index ed94e7c429244faa2df89e1d95cc7863574675dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7617 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 avHv68B3> diff --git a/projectsettings/media/data_files/fornitori_Y8lxpZd.xlsx b/projectsettings/media/data_files/fornitori_Y8lxpZd.xlsx deleted file mode 100644 index 63b14cdbe2a86a3178985d00445ea311350ec4af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7894 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 avHv68B3> diff --git a/projectsettings/services/django-uwsgi.ini b/projectsettings/services/django-uwsgi.ini deleted file mode 100644 index 1c8478ff..00000000 --- a/projectsettings/services/django-uwsgi.ini +++ /dev/null @@ -1,45 +0,0 @@ -##### -# uWSGI configuration -# -# Change settings however you see fit. See following link for more in depth -# explanation of settings: -# http://ow.ly/IoWN7, http://ow.ly/IoYtp and http://ow.ly/IoWZp -##### - -[uwsgi] -uid = django -gid = django - -master = True -lazy-apps = True - -# Number of worker processes for handling requests -# %k = cpu count -processes = %(%k * 2) - -# Number of threads for handling requests -threads = %(%k * 2) - -# Respawn processes that take more than ... seconds -harakiri = 20 - -# Respawn processes after serving ... requests -max-requests = 5000 - -# Clear environment on exit -vacuum = True - -# the base directory (full path) -chdir = /app/ - -# Django's wsgi file (path starting from chdir/) -module = projectsettings.wsgi:application - -# location of settings -env = DJANGO_SETTINGS_MODULE=projectsettings.settings.development_settings - -# the socket -socket = :8000 - -# touch to reload uwsgi, usage: touch /etc/uwsgi/reload-uwsgi.ini -touch-reload=/etc/uwsgi/reload-uwsgi.ini diff --git a/projectsettings/services/webserver/Dockerfile b/projectsettings/services/webserver/Dockerfile deleted file mode 100644 index 5a50d670..00000000 --- a/projectsettings/services/webserver/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM nginx:1.11 - -# Add start script -ADD ./projectsettings/services/webserver/config/start.sh / -RUN chmod +x start.sh - -# Add nginx config file -ADD ./projectsettings/services/webserver/config/nginx.tmpl / - -# Add SSL certs to location specified in nginx.conf -ADD ./projectsettings/services/webserver/config/*.crt /etc/ssl/certs/ -ADD ./projectsettings/services/webserver/config/*.key /etc/ssl/private/ - -# Execute start script -CMD ["./start.sh"] diff --git a/projectsettings/services/webserver/config/localhost.crt b/projectsettings/services/webserver/config/localhost.crt deleted file mode 100644 index f88c154b..00000000 --- a/projectsettings/services/webserver/config/localhost.crt +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC+zCCAeOgAwIBAgIJAMoaz3CmjG3OMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV -BAMMCWxvY2FsaG9zdDAeFw0xNTAxMjExMTQ2NDNaFw0yNTAxMTgxMTQ2NDNaMBQx -EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAOTEOmKeZevAWzp9pCmfovm3bcxjuNu/GAQhbo+9C3pP57uEg7aHh2eBAOBx -ZT0Vjma1PD9Pi1duolGMmbdX6tTnfPfDoygnALbX/vvYHpcM086Yhs3UNEV/r5HG -7YFhNg9vioWs13rgdaAVSmJtSqX4Ay7BPxdeKYYDkrNOd4eJG5QJsWHfZXaL+4QU -RSj3LQ7Q22iDQ8/lYe8fI/uTE562GGdWniDt846cKlmEswo2M4Y8CL3ZS/7qmn34 -wfb7eCRksaGmucCoO1tIMnj/i1a4RC2oXLnyt+aN5mxIGdlT7h/3ilGGjhXgvTsu -fhHigBQ/QXs26l7YGMjOPWfFbikCAwEAAaNQME4wHQYDVR0OBBYEFCCbv2uewsWb -xbymmpyIAngK3TgRMB8GA1UdIwQYMBaAFCCbv2uewsWbxbymmpyIAngK3TgRMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBACzzjKtrHgFaJvRWSIRsFrxg -ZczrvoKqYADzQNBTZjCWzU9RHglcW+upACje67p73eDBwlohKHioeOTrZC+CE32N -ueJK3NzmU2WCWlyfmA+/kCRePzKUnxk4+JaOoVjKzXd7w0k8ymadzFjig55w1ylE -Nq4LcNl+HnKi3I6OwlaswRDbdigihZlzZntcuPDx3H2qJz2Qzmbn8f5qZT5TOQtU -VPZwQPZG+/e35EVXzRhDt+/9/XWARqtZiI0htQ5Lhgx1Z/KJuHTAMbK1O3hM4vwK -o+j67P4x8t5z04e9GBfHxrBUuw4g615u0d5SWTvD9gVpuCC4b+GltvdVENiUeew= ------END CERTIFICATE----- diff --git a/projectsettings/services/webserver/config/localhost.key b/projectsettings/services/webserver/config/localhost.key deleted file mode 100644 index c4818867..00000000 --- a/projectsettings/services/webserver/config/localhost.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA5MQ6Yp5l68BbOn2kKZ+i+bdtzGO4278YBCFuj70Lek/nu4SD -toeHZ4EA4HFlPRWOZrU8P0+LV26iUYyZt1fq1Od898OjKCcAttf++9gelwzTzpiG -zdQ0RX+vkcbtgWE2D2+KhazXeuB1oBVKYm1KpfgDLsE/F14phgOSs053h4kblAmx -Yd9ldov7hBRFKPctDtDbaINDz+Vh7x8j+5MTnrYYZ1aeIO3zjpwqWYSzCjYzhjwI -vdlL/uqaffjB9vt4JGSxoaa5wKg7W0gyeP+LVrhELahcufK35o3mbEgZ2VPuH/eK -UYaOFeC9Oy5+EeKAFD9BezbqXtgYyM49Z8VuKQIDAQABAoIBAQCJJqgGVgau140a -PRc9qSpxYipevm6muCNy3oRFgsYt11gMET9SIGDqien3paRXgeP06bUsE8lrarXA -BHZn+Dqe2AYRGOZpfTCtbkO9w21bi+I0Wzd+kTmhbRLaaBQeXCSoDmxTBjPNxGJg -zkLhTbrSVCW8Uzk7DkYAxYWfIG0DAOr25X6Z+ea36ZV/+MKaPesotdqHKMMHpcGq -XkJJMc9zau0R+DP7EkNiVWmBFkDghFzQVUY5Fk14OPUgT8J97715jAcgjP3r5v23 -N6BoNKirE8JoizOWZnoy9K3OZrk0DlFytqvqp89HL4cjl9pn2pIrwmqJgobTTa4g -oe9eKCLtAoGBAPuDXxoCHPvlFUz+q7kF1yLHQm3SIojra05Eng0MzspzlaKn8qZJ -pzEid2svy3rwWaQVQm32rJpbNI1PQnn8HE1FFdKGb16n5yv8+f++MXbtCi2uMVHm -5lDC6bqthJ0Rf6IepAthMohOm3wn4L0URDvLVAkOEl2D7n3Fp9MCwGYLAoGBAOjY -+btPd6mE2P9rmU46HxYWhvkJzeipPvdeU19myAjW7mRLFlfK7zo5rrM/2ggIAEUA -/HsXQnBggEiObN9ZiKOdjO8Da8AUtxFZBOhr8pflpb0Gd+vH3GY+aF+P8/IX5raA -J+WJOPAo+LVI63K92e92zbdjOc0yWNkfVe0xQeEbAoGAK3RgKwMwdMj4rCvYCYib -yfN5Y7YJp3RdPtGWKRUMaWgc81RnFRnmnBOjZE6Grn/2TOYrawpSefzGEKAgESlg -zmzgP1ZgyY7i3vO/UdNPgoej2Y6eENN++XcjoNA3+Fc8oQsANsMdUvWZ4ZKWPrTQ -sTAJHeNjguq3et16iHeSPE8CgYBPE8kUPPPFpXFQpUkmUQTXqoTiNNsyJbBVsDoe -TzimD+BcPUf0Pt4p5wcWpxuz2IvG44PbhdWxdoR6n6wH2k9WSZ5gWcgRLrfRc2sA -SBDWV06HOJgngfOu4Yju02Okl0tqNXHXOVgV78QvRPl5OVK3SaCppFAwCOY1rreu -2yilewKBgQDmRp/UM8HL9GfQc1mBhVIOjYqEWknN30TipJpY3LyKMdiNkWs7TGdN -+DVcXs6+ng+Cka+v0FrApMyJSuZgWd2YdS7VZRUSQCdbMkTe0WRIR0qe905aw9yG -L8iQjruxfNRJgYn8EYoXMfFRieDR2JXwVg2oUlefEjO+B4LvC7tVAg== ------END RSA PRIVATE KEY----- diff --git a/projectsettings/services/webserver/config/nginx.tmpl b/projectsettings/services/webserver/config/nginx.tmpl deleted file mode 100644 index 68dae418..00000000 --- a/projectsettings/services/webserver/config/nginx.tmpl +++ /dev/null @@ -1,61 +0,0 @@ -# normally you leave this at the default of 1024 -events { - worker_connections 1024; -} - -http { - # cf http://blog.maxcdn.com/accept-encoding-its-vary-important/ - gzip_vary on; - gzip_proxied any; - gzip_types *; - - # http://nginx.org/en/docs/http/configuring_https_servers.html#optimization - ssl_session_cache shared:SSL:1m; - ssl_session_timeout 10m; - - server_tokens off; - - upstream django { - server koalixcrm:8000; - } - - server { - # rewrite all HTTP to HTTPS - listen 80; - server_name ${NGINX_SERVER_NAME}; - - return 301 https://${NGINX_SERVER_NAME}$request_uri; - } - - server { - listen 443 ssl default_server; - server_name ${NGINX_SERVER_NAME}; - - # see http://nginx.org/en/docs/http/configuriNGINX_https_servers.html - ssl_certificate /etc/ssl/certs/${NGINX_CRT_NAME}.crt; - ssl_certificate_key /etc/ssl/private/${NGINX_KEY_NAME}.key; - - ssl_prefer_server_ciphers on; - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ie defaults minus SSLv3 - - location /static { - alias /app/projectsettings/static; - - # http://stackoverflow.com/q/19213510/1346257 - include /etc/nginx/mime.types; - } - - location = /robots.txt { return 200 "User-agent: *\nAllow: /"; } - location = /favicon.ico { access_log off; log_not_found off; return 404; } - - #Prevent serving of sysfiles / vim backup files - location ~ /\. { access_log off; log_not_found off; deny all; } - location ~ ~$ { access_log off; log_not_found off; deny all; } - - location / { - uwsgi_pass django; - include uwsgi_params; - } - } -} - diff --git a/projectsettings/services/webserver/config/start.sh b/projectsettings/services/webserver/config/start.sh deleted file mode 100644 index f912360c..00000000 --- a/projectsettings/services/webserver/config/start.sh +++ /dev/null @@ -1,4 +0,0 @@ -#! /bin/bash -envsubst < nginx.tmpl > /etc/nginx/nginx.conf - -nginx -g "daemon off;" diff --git a/projectsettings/settings/base_settings.py b/projectsettings/settings/base_settings.py index c8b15bd6..b4459a7c 100644 --- a/projectsettings/settings/base_settings.py +++ b/projectsettings/settings/base_settings.py @@ -33,6 +33,8 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'rest_framework', + 'django_filters', 'filebrowser' ] @@ -120,7 +122,7 @@ STATIC_ROOT = os.path.join(BASE_DIR, 'static') MEDIA_URL = "/media/" -MEDIA_ROOT = os.path.join(BASE_DIR, 'media') +MEDIA_ROOT = os.path.join(BASE_DIR) PROJECT_ROOT = BASE_DIR @@ -137,4 +139,8 @@ 'PNG': ['.png'], 'GIF': ['.gif'], 'TTF': ['.ttf'], +} + +REST_FRAMEWORK = { + 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',) } \ No newline at end of file diff --git a/projectsettings/settings/development_settings.py b/projectsettings/settings/development_settings.py index 8412f27c..b4ec067d 100644 --- a/projectsettings/settings/development_settings.py +++ b/projectsettings/settings/development_settings.py @@ -6,25 +6,9 @@ DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.postgresql', - 'NAME': 'postgres', - 'USER': 'postgres', - 'HOST': 'db', - 'PORT': 5432, + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } -GRAPPELLI_INDEX_DASHBOARD = 'projectsettings.dashboard.CustomIndexDashboard' - -GRAPPELLI_ADMIN_TITLE = 'JLSCom' - -ASYNC_SIGNALS = False -CELERY_BROKER_URL = 'memory://' -RABBITMQ_SIGNALS_BROKER_URL = 'amqp://localhost:5672' -if ASYNC_SIGNALS: - CELERY_BROKER_URL = RABBITMQ_SIGNALS_BROKER_URL - CELERY_RESULT_BACKEND = RABBITMQ_SIGNALS_BROKER_URL -CELERY_TASK_ALWAYS_EAGER = False if ASYNC_SIGNALS else True -CELERY_TASK_IGNORE_RESULT = False if ASYNC_SIGNALS else True -CELERY_TASK_SERIALIZER = 'json' -CELERY_ACCEPT_CONTENT = ['json', 'pickle'] \ No newline at end of file +GRAPPELLI_INDEX_DASHBOARD = 'projectsettings.dashboard.CustomIndexDashboard' \ No newline at end of file diff --git a/projectsettings/static/admin/css/base.css b/projectsettings/static/admin/css/base.css deleted file mode 100644 index b2a40c49..00000000 --- a/projectsettings/static/admin/css/base.css +++ /dev/null @@ -1,978 +0,0 @@ -/* - DJANGO Admin styles -*/ - -@import url(fonts.css); - -body { - margin: 0; - padding: 0; - font-size: 14px; - font-family: "Roboto","Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; - color: #333; - background: #fff; -} - -/* LINKS */ - -a:link, a:visited { - color: #447e9b; - text-decoration: none; -} - -a:focus, a:hover { - color: #036; -} - -a:focus { - text-decoration: underline; -} - -a img { - border: none; -} - -a.section:link, a.section:visited { - color: #fff; - text-decoration: none; -} - -a.section:focus, a.section:hover { - text-decoration: underline; -} - -/* GLOBAL DEFAULTS */ - -p, ol, ul, dl { - margin: .2em 0 .8em 0; -} - -p { - padding: 0; - line-height: 140%; -} - -h1,h2,h3,h4,h5 { - font-weight: bold; -} - -h1 { - margin: 0 0 20px; - font-weight: 300; - font-size: 20px; - color: #666; -} - -h2 { - font-size: 16px; - margin: 1em 0 .5em 0; -} - -h2.subhead { - font-weight: normal; - margin-top: 0; -} - -h3 { - font-size: 14px; - margin: .8em 0 .3em 0; - color: #666; - font-weight: bold; -} - -h4 { - font-size: 12px; - margin: 1em 0 .8em 0; - padding-bottom: 3px; -} - -h5 { - font-size: 10px; - margin: 1.5em 0 .5em 0; - color: #666; - text-transform: uppercase; - letter-spacing: 1px; -} - -ul li { - list-style-type: square; - padding: 1px 0; -} - -li ul { - margin-bottom: 0; -} - -li, dt, dd { - font-size: 13px; - line-height: 20px; -} - -dt { - font-weight: bold; - margin-top: 4px; -} - -dd { - margin-left: 0; -} - -form { - margin: 0; - padding: 0; -} - -fieldset { - margin: 0; - padding: 0; - border: none; - border-top: 1px solid #eee; -} - -blockquote { - font-size: 11px; - color: #777; - margin-left: 2px; - padding-left: 10px; - border-left: 5px solid #ddd; -} - -code, pre { - font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; - color: #666; - font-size: 12px; -} - -pre.literal-block { - margin: 10px; - background: #eee; - padding: 6px 8px; -} - -code strong { - color: #930; -} - -hr { - clear: both; - color: #eee; - background-color: #eee; - height: 1px; - border: none; - margin: 0; - padding: 0; - font-size: 1px; - line-height: 1px; -} - -/* TEXT STYLES & MODIFIERS */ - -.small { - font-size: 11px; -} - -.tiny { - font-size: 10px; -} - -p.tiny { - margin-top: -2px; -} - -.mini { - font-size: 10px; -} - -p.mini { - margin-top: -3px; -} - -.help, p.help, form p.help, div.help, form div.help, div.help li { - font-size: 11px; - color: #999; -} - -div.help ul { - margin-bottom: 0; -} - -.help-tooltip { - cursor: help; -} - -p img, h1 img, h2 img, h3 img, h4 img, td img { - vertical-align: middle; -} - -.quiet, a.quiet:link, a.quiet:visited { - color: #999; - font-weight: normal; -} - -.float-right { - float: right; -} - -.float-left { - float: left; -} - -.clear { - clear: both; -} - -.align-left { - text-align: left; -} - -.align-right { - text-align: right; -} - -.example { - margin: 10px 0; - padding: 5px 10px; - background: #efefef; -} - -.nowrap { - white-space: nowrap; -} - -/* TABLES */ - -table { - border-collapse: collapse; - border-color: #ccc; -} - -td, th { - font-size: 13px; - line-height: 16px; - border-bottom: 1px solid #eee; - vertical-align: top; - padding: 8px; - font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; -} - -th { - font-weight: 600; - text-align: left; -} - -thead th, -tfoot td { - color: #666; - padding: 5px 10px; - font-size: 11px; - background: #fff; - border: none; - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; -} - -tfoot td { - border-bottom: none; - border-top: 1px solid #eee; -} - -thead th.required { - color: #000; -} - -tr.alt { - background: #f6f6f6; -} - -.row1 { - background: #fff; -} - -.row2 { - background: #f9f9f9; -} - -/* SORTABLE TABLES */ - -thead th { - padding: 5px 10px; - line-height: normal; - text-transform: uppercase; - background: #f6f6f6; -} - -thead th a:link, thead th a:visited { - color: #666; -} - -thead th.sorted { - background: #eee; -} - -thead th.sorted .text { - padding-right: 42px; -} - -table thead th .text span { - padding: 8px 10px; - display: block; -} - -table thead th .text a { - display: block; - cursor: pointer; - padding: 8px 10px; -} - -table thead th .text a:focus, table thead th .text a:hover { - background: #eee; -} - -thead th.sorted a.sortremove { - visibility: hidden; -} - -table thead th.sorted:hover a.sortremove { - visibility: visible; -} - -table thead th.sorted .sortoptions { - display: block; - padding: 9px 5px 0 5px; - float: right; - text-align: right; -} - -table thead th.sorted .sortpriority { - font-size: .8em; - min-width: 12px; - text-align: center; - vertical-align: 3px; - margin-left: 2px; - margin-right: 2px; -} - -table thead th.sorted .sortoptions a { - position: relative; - width: 14px; - height: 14px; - display: inline-block; - background: url(../img/sorting-icons.svg) 0 0 no-repeat; - background-size: 14px auto; -} - -table thead th.sorted .sortoptions a.sortremove { - background-position: 0 0; -} - -table thead th.sorted .sortoptions a.sortremove:after { - content: '\\'; - position: absolute; - top: -6px; - left: 3px; - font-weight: 200; - font-size: 18px; - color: #999; -} - -table thead th.sorted .sortoptions a.sortremove:focus:after, -table thead th.sorted .sortoptions a.sortremove:hover:after { - color: #447e9b; -} - -table thead th.sorted .sortoptions a.sortremove:focus, -table thead th.sorted .sortoptions a.sortremove:hover { - background-position: 0 -14px; -} - -table thead th.sorted .sortoptions a.ascending { - background-position: 0 -28px; -} - -table thead th.sorted .sortoptions a.ascending:focus, -table thead th.sorted .sortoptions a.ascending:hover { - background-position: 0 -42px; -} - -table thead th.sorted .sortoptions a.descending { - top: 1px; - background-position: 0 -56px; -} - -table thead th.sorted .sortoptions a.descending:focus, -table thead th.sorted .sortoptions a.descending:hover { - background-position: 0 -70px; -} - -/* FORM DEFAULTS */ - -input, textarea, select, .form-row p, form .button { - margin: 2px 0; - padding: 2px 3px; - vertical-align: middle; - font-family: "Roboto", "Lucida Grande", Verdana, Arial, sans-serif; - font-weight: normal; - font-size: 13px; -} -.form-row div.help { - padding: 2px 3px; -} - -textarea { - vertical-align: top; -} - -input[type=text], input[type=password], input[type=email], input[type=url], -input[type=number], textarea, select, .vTextField { - border: 1px solid #ccc; - border-radius: 4px; - padding: 5px 6px; - margin-top: 0; -} - -input[type=text]:focus, input[type=password]:focus, input[type=email]:focus, -input[type=url]:focus, input[type=number]:focus, textarea:focus, select:focus, -.vTextField:focus { - border-color: #999; -} - -select { - height: 30px; -} - -select[multiple] { - min-height: 150px; -} - -/* FORM BUTTONS */ - -.button, input[type=submit], input[type=button], .submit-row input, a.button { - background: #79aec8; - padding: 10px 15px; - border: none; - border-radius: 4px; - color: #fff; - cursor: pointer; -} - -a.button { - padding: 4px 5px; -} - -.button:active, input[type=submit]:active, input[type=button]:active, -.button:focus, input[type=submit]:focus, input[type=button]:focus, -.button:hover, input[type=submit]:hover, input[type=button]:hover { - background: #609ab6; -} - -.button[disabled], input[type=submit][disabled], input[type=button][disabled] { - opacity: 0.4; -} - -.button.default, input[type=submit].default, .submit-row input.default { - float: right; - border: none; - font-weight: 400; - background: #417690; -} - -.button.default:active, input[type=submit].default:active, -.button.default:focus, input[type=submit].default:focus, -.button.default:hover, input[type=submit].default:hover { - background: #205067; -} - -.button[disabled].default, -input[type=submit][disabled].default, -input[type=button][disabled].default { - opacity: 0.4; -} - - -/* MODULES */ - -.module { - border: none; - margin-bottom: 30px; - background: #fff; -} - -.module p, .module ul, .module h3, .module h4, .module dl, .module pre { - padding-left: 10px; - padding-right: 10px; -} - -.module blockquote { - margin-left: 12px; -} - -.module ul, .module ol { - margin-left: 1.5em; -} - -.module h3 { - margin-top: .6em; -} - -.module h2, .module caption, .inline-group h2 { - margin: 0; - padding: 8px; - font-weight: 400; - font-size: 13px; - text-align: left; - background: #79aec8; - color: #fff; -} - -.module caption, -.inline-group h2 { - font-size: 12px; - letter-spacing: 0.5px; - text-transform: uppercase; -} - -.module table { - border-collapse: collapse; -} - -/* MESSAGES & ERRORS */ - -ul.messagelist { - padding: 0; - margin: 0; -} - -ul.messagelist li { - display: block; - font-weight: 400; - font-size: 13px; - padding: 10px 10px 10px 65px; - margin: 0 0 10px 0; - background: #dfd url(../img/icon-yes.svg) 40px 12px no-repeat; - background-size: 16px auto; - color: #333; -} - -ul.messagelist li.warning { - background: #ffc url(../img/icon-alert.svg) 40px 14px no-repeat; - background-size: 14px auto; -} - -ul.messagelist li.error { - background: #ffefef url(../img/icon-no.svg) 40px 12px no-repeat; - background-size: 16px auto; -} - -.errornote { - font-size: 14px; - font-weight: 700; - display: block; - padding: 10px 12px; - margin: 0 0 10px 0; - color: #ba2121; - border: 1px solid #ba2121; - border-radius: 4px; - background-color: #fff; - background-position: 5px 12px; -} - -ul.errorlist { - margin: 0 0 4px; - padding: 0; - color: #ba2121; - background: #fff; -} - -ul.errorlist li { - font-size: 13px; - display: block; - margin-bottom: 4px; -} - -ul.errorlist li:first-child { - margin-top: 0; -} - -ul.errorlist li a { - color: inherit; - text-decoration: underline; -} - -td ul.errorlist { - margin: 0; - padding: 0; -} - -td ul.errorlist li { - margin: 0; -} - -.form-row.errors { - margin: 0; - border: none; - border-bottom: 1px solid #eee; - background: none; -} - -.form-row.errors ul.errorlist li { - padding-left: 0; -} - -.errors input, .errors select, .errors textarea { - border: 1px solid #ba2121; -} - -div.system-message { - background: #ffc; - margin: 10px; - padding: 6px 8px; - font-size: .8em; -} - -div.system-message p.system-message-title { - padding: 4px 5px 4px 25px; - margin: 0; - color: #c11; - background: #ffefef url(../img/icon-no.svg) 5px 5px no-repeat; -} - -.description { - font-size: 12px; - padding: 5px 0 0 12px; -} - -/* BREADCRUMBS */ - -div.breadcrumbs { - background: #79aec8; - padding: 10px 40px; - border: none; - font-size: 14px; - color: #c4dce8; - text-align: left; -} - -div.breadcrumbs a { - color: #fff; -} - -div.breadcrumbs a:focus, div.breadcrumbs a:hover { - color: #c4dce8; -} - -/* ACTION ICONS */ - -.addlink { - padding-left: 16px; - background: url(../img/icon-addlink.svg) 0 1px no-repeat; -} - -.changelink, .inlinechangelink { - padding-left: 16px; - background: url(../img/icon-changelink.svg) 0 1px no-repeat; -} - -.deletelink { - padding-left: 16px; - background: url(../img/icon-deletelink.svg) 0 1px no-repeat; -} - -a.deletelink:link, a.deletelink:visited { - color: #CC3434; -} - -a.deletelink:focus, a.deletelink:hover { - color: #993333; - text-decoration: none; -} - -/* OBJECT TOOLS */ - -.object-tools { - font-size: 10px; - font-weight: bold; - padding-left: 0; - float: right; - position: relative; - margin-top: -48px; -} - -.form-row .object-tools { - margin-top: 5px; - margin-bottom: 5px; - float: none; - height: 2em; - padding-left: 3.5em; -} - -.object-tools li { - display: block; - float: left; - margin-left: 5px; - height: 16px; -} - -.object-tools a { - border-radius: 15px; -} - -.object-tools a:link, .object-tools a:visited { - display: block; - float: left; - padding: 3px 12px; - background: #999; - font-weight: 400; - font-size: 11px; - text-transform: uppercase; - letter-spacing: 0.5px; - color: #fff; -} - -.object-tools a:focus, .object-tools a:hover { - background-color: #417690; -} - -.object-tools a:focus{ - text-decoration: none; -} - -.object-tools a.viewsitelink, .object-tools a.golink,.object-tools a.addlink { - background-repeat: no-repeat; - background-position: right 7px center; - padding-right: 26px; -} - -.object-tools a.viewsitelink, .object-tools a.golink { - background-image: url(../img/tooltag-arrowright.svg); -} - -.object-tools a.addlink { - background-image: url(../img/tooltag-add.svg); -} - -/* OBJECT HISTORY */ - -table#change-history { - width: 100%; -} - -table#change-history tbody th { - width: 16em; -} - -/* PAGE STRUCTURE */ - -#container { - position: relative; - width: 100%; - min-width: 980px; - padding: 0; -} - -#content { - padding: 20px 40px; -} - -.dashboard #content { - width: 600px; -} - -#content-main { - float: left; - width: 100%; -} - -#content-related { - float: right; - width: 260px; - position: relative; - margin-right: -300px; -} - -#footer { - clear: both; - padding: 10px; -} - -/* COLUMN TYPES */ - -.colMS { - margin-right: 300px; -} - -.colSM { - margin-left: 300px; -} - -.colSM #content-related { - float: left; - margin-right: 0; - margin-left: -300px; -} - -.colSM #content-main { - float: right; -} - -.popup .colM { - width: auto; -} - -/* HEADER */ - -#header { - width: auto; - height: 40px; - padding: 10px 40px; - background: #417690; - line-height: 40px; - color: #ffc; - overflow: hidden; -} - -#header a:link, #header a:visited { - color: #fff; -} - -#header a:focus , #header a:hover { - text-decoration: underline; -} - -#branding { - float: left; -} - -#branding h1 { - padding: 0; - margin: 0 20px 0 0; - font-weight: 300; - font-size: 24px; - color: #f5dd5d; -} - -#branding h1, #branding h1 a:link, #branding h1 a:visited { - color: #f5dd5d; -} - -#branding h2 { - padding: 0 10px; - font-size: 14px; - margin: -8px 0 8px 0; - font-weight: normal; - color: #ffc; -} - -#branding a:hover { - text-decoration: none; -} - -#user-tools { - float: right; - padding: 0; - margin: 0 0 0 20px; - font-weight: 300; - font-size: 11px; - letter-spacing: 0.5px; - text-transform: uppercase; - text-align: right; -} - -#user-tools a { - border-bottom: 1px solid rgba(255, 255, 255, 0.25); -} - -#user-tools a:focus, #user-tools a:hover { - text-decoration: none; - border-bottom-color: #79aec8; - color: #79aec8; -} - -/* SIDEBAR */ - -#content-related { - background: #f8f8f8; -} - -#content-related .module { - background: none; -} - -#content-related h3 { - font-size: 14px; - color: #666; - padding: 0 16px; - margin: 0 0 16px; -} - -#content-related h4 { - font-size: 13px; -} - -#content-related p { - padding-left: 16px; - padding-right: 16px; -} - -#content-related .actionlist { - padding: 0; - margin: 16px; -} - -#content-related .actionlist li { - line-height: 1.2; - margin-bottom: 10px; - padding-left: 18px; -} - -#content-related .module h2 { - background: none; - padding: 16px; - margin-bottom: 16px; - border-bottom: 1px solid #eaeaea; - font-size: 18px; - color: #333; -} - -.delete-confirmation form input[type="submit"] { - background: #ba2121; - border-radius: 4px; - padding: 10px 15px; - color: #fff; -} - -.delete-confirmation form input[type="submit"]:active, -.delete-confirmation form input[type="submit"]:focus, -.delete-confirmation form input[type="submit"]:hover { - background: #a41515; -} - -.delete-confirmation form .cancel-link { - display: inline-block; - vertical-align: middle; - height: 15px; - line-height: 15px; - background: #ddd; - border-radius: 4px; - padding: 10px 15px; - color: #333; - margin: 0 0 0 10px; -} - -.delete-confirmation form .cancel-link:active, -.delete-confirmation form .cancel-link:focus, -.delete-confirmation form .cancel-link:hover { - background: #ccc; -} - -/* POPUP */ -.popup #content { - padding: 20px; -} - -.popup #container { - min-width: 0; -} - -.popup #header { - padding: 10px 20px; -} diff --git a/projectsettings/static/admin/css/changelists.css b/projectsettings/static/admin/css/changelists.css deleted file mode 100644 index 17690a34..00000000 --- a/projectsettings/static/admin/css/changelists.css +++ /dev/null @@ -1,344 +0,0 @@ -/* CHANGELISTS */ - -#changelist { - position: relative; - width: 100%; -} - -#changelist table { - width: 100%; -} - -.change-list .hiddenfields { display:none; } - -.change-list .filtered table { - border-right: none; -} - -.change-list .filtered { - min-height: 400px; -} - -.change-list .filtered .results, .change-list .filtered .paginator, -.filtered #toolbar, .filtered div.xfull { - margin-right: 280px; - width: auto; -} - -.change-list .filtered table tbody th { - padding-right: 1em; -} - -#changelist-form .results { - overflow-x: auto; -} - -#changelist .toplinks { - border-bottom: 1px solid #ddd; -} - -#changelist .paginator { - color: #666; - border-bottom: 1px solid #eee; - background: #fff; - overflow: hidden; -} - -/* CHANGELIST TABLES */ - -#changelist table thead th { - padding: 0; - white-space: nowrap; - vertical-align: middle; -} - -#changelist table thead th.action-checkbox-column { - width: 1.5em; - text-align: center; -} - -#changelist table tbody td.action-checkbox { - text-align: center; -} - -#changelist table tfoot { - color: #666; -} - -/* TOOLBAR */ - -#changelist #toolbar { - padding: 8px 10px; - margin-bottom: 15px; - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; - background: #f8f8f8; - color: #666; -} - -#changelist #toolbar form input { - border-radius: 4px; - font-size: 14px; - padding: 5px; - color: #333; -} - -#changelist #toolbar form #searchbar { - height: 19px; - border: 1px solid #ccc; - padding: 2px 5px; - margin: 0; - vertical-align: top; - font-size: 13px; -} - -#changelist #toolbar form #searchbar:focus { - border-color: #999; -} - -#changelist #toolbar form input[type="submit"] { - border: 1px solid #ccc; - padding: 2px 10px; - margin: 0; - vertical-align: middle; - background: #fff; - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - color: #333; -} - -#changelist #toolbar form input[type="submit"]:focus, -#changelist #toolbar form input[type="submit"]:hover { - border-color: #999; -} - -#changelist #changelist-search img { - vertical-align: middle; - margin-right: 4px; -} - -/* FILTER COLUMN */ - -#changelist-filter { - position: absolute; - top: 0; - right: 0; - z-index: 1000; - width: 240px; - background: #f8f8f8; - border-left: none; - margin: 0; -} - -#changelist-filter h2 { - font-size: 14px; - text-transform: uppercase; - letter-spacing: 0.5px; - padding: 5px 15px; - margin-bottom: 12px; - border-bottom: none; -} - -#changelist-filter h3 { - font-weight: 400; - font-size: 14px; - padding: 0 15px; - margin-bottom: 10px; -} - -#changelist-filter ul { - margin: 5px 0; - padding: 0 15px 15px; - border-bottom: 1px solid #eaeaea; -} - -#changelist-filter ul:last-child { - border-bottom: none; - padding-bottom: none; -} - -#changelist-filter li { - list-style-type: none; - margin-left: 0; - padding-left: 0; -} - -#changelist-filter a { - display: block; - color: #999; - text-overflow: ellipsis; - overflow-x: hidden; -} - -#changelist-filter li.selected { - border-left: 5px solid #eaeaea; - padding-left: 10px; - margin-left: -15px; -} - -#changelist-filter li.selected a { - color: #5b80b2; -} - -#changelist-filter a:focus, #changelist-filter a:hover, -#changelist-filter li.selected a:focus, -#changelist-filter li.selected a:hover { - color: #036; -} - -/* DATE DRILLDOWN */ - -.change-list ul.toplinks { - display: block; - float: left; - padding: 0; - margin: 0; - width: 100%; -} - -.change-list ul.toplinks li { - padding: 3px 6px; - font-weight: bold; - list-style-type: none; - display: inline-block; -} - -.change-list ul.toplinks .date-back a { - color: #999; -} - -.change-list ul.toplinks .date-back a:focus, -.change-list ul.toplinks .date-back a:hover { - color: #036; -} - -/* PAGINATOR */ - -.paginator { - font-size: 13px; - padding-top: 10px; - padding-bottom: 10px; - line-height: 22px; - margin: 0; - border-top: 1px solid #ddd; -} - -.paginator a:link, .paginator a:visited { - padding: 2px 6px; - background: #79aec8; - text-decoration: none; - color: #fff; -} - -.paginator a.showall { - padding: 0; - border: none; - background: none; - color: #5b80b2; -} - -.paginator a.showall:focus, .paginator a.showall:hover { - background: none; - color: #036; -} - -.paginator .end { - margin-right: 6px; -} - -.paginator .this-page { - padding: 2px 6px; - font-weight: bold; - font-size: 13px; - vertical-align: top; -} - -.paginator a:focus, .paginator a:hover { - color: white; - background: #036; -} - -/* ACTIONS */ - -.filtered .actions { - margin-right: 280px; - border-right: none; -} - -#changelist table input { - margin: 0; - vertical-align: baseline; -} - -#changelist table tbody tr.selected { - background-color: #FFFFCC; -} - -#changelist .actions { - padding: 10px; - background: #fff; - border-top: none; - border-bottom: none; - line-height: 24px; - color: #999; -} - -#changelist .actions.selected { - background: #fffccf; - border-top: 1px solid #fffee8; - border-bottom: 1px solid #edecd6; -} - -#changelist .actions span.all, -#changelist .actions span.action-counter, -#changelist .actions span.clear, -#changelist .actions span.question { - font-size: 13px; - margin: 0 0.5em; - display: none; -} - -#changelist .actions:last-child { - border-bottom: none; -} - -#changelist .actions select { - vertical-align: top; - height: 24px; - background: none; - color: #000; - border: 1px solid #ccc; - border-radius: 4px; - font-size: 14px; - padding: 0 0 0 4px; - margin: 0; - margin-left: 10px; -} - -#changelist .actions select:focus { - border-color: #999; -} - -#changelist .actions label { - display: inline-block; - vertical-align: middle; - font-size: 13px; -} - -#changelist .actions .button { - font-size: 13px; - border: 1px solid #ccc; - border-radius: 4px; - background: #fff; - box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset; - cursor: pointer; - height: 24px; - line-height: 1; - padding: 4px 8px; - margin: 0; - color: #333; -} - -#changelist .actions .button:focus, #changelist .actions .button:hover { - border-color: #999; -} diff --git a/projectsettings/static/admin/css/dashboard.css b/projectsettings/static/admin/css/dashboard.css deleted file mode 100644 index 1560c7b4..00000000 --- a/projectsettings/static/admin/css/dashboard.css +++ /dev/null @@ -1,27 +0,0 @@ -/* DASHBOARD */ - -.dashboard .module table th { - width: 100%; -} - -.dashboard .module table td { - white-space: nowrap; -} - -.dashboard .module table td a { - display: block; - padding-right: .6em; -} - -/* RECENT ACTIONS MODULE */ - -.module ul.actionlist { - margin-left: 0; -} - -ul.actionlist li { - list-style-type: none; - overflow: hidden; - text-overflow: ellipsis; - -o-text-overflow: ellipsis; -} diff --git a/projectsettings/static/admin/css/fonts.css b/projectsettings/static/admin/css/fonts.css deleted file mode 100644 index c837e017..00000000 --- a/projectsettings/static/admin/css/fonts.css +++ /dev/null @@ -1,20 +0,0 @@ -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Bold-webfont.woff'); - font-weight: 700; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Regular-webfont.woff'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: 'Roboto'; - src: url('../fonts/Roboto-Light-webfont.woff'); - font-weight: 300; - font-style: normal; -} diff --git a/projectsettings/static/admin/css/forms.css b/projectsettings/static/admin/css/forms.css deleted file mode 100644 index 77985d5d..00000000 --- a/projectsettings/static/admin/css/forms.css +++ /dev/null @@ -1,515 +0,0 @@ -@import url('widgets.css'); - -/* FORM ROWS */ - -.form-row { - overflow: hidden; - padding: 10px; - font-size: 13px; - border-bottom: 1px solid #eee; -} - -.form-row img, .form-row input { - vertical-align: middle; -} - -.form-row label input[type="checkbox"] { - margin-top: 0; - vertical-align: 0; -} - -form .form-row p { - padding-left: 0; -} - -.hidden { - display: none; -} - -/* FORM LABELS */ - -label { - font-weight: normal; - color: #666; - font-size: 13px; -} - -.required label, label.required { - font-weight: bold; - color: #333; -} - -/* RADIO BUTTONS */ - -form ul.radiolist li { - list-style-type: none; -} - -form ul.radiolist label { - float: none; - display: inline; -} - -form ul.radiolist input[type="radio"] { - margin: -2px 4px 0 0; - padding: 0; -} - -form ul.inline { - margin-left: 0; - padding: 0; -} - -form ul.inline li { - float: left; - padding-right: 7px; -} - -/* ALIGNED FIELDSETS */ - -.aligned label { - display: block; - padding: 4px 10px 0 0; - float: left; - width: 160px; - word-wrap: break-word; - line-height: 1; -} - -.aligned label:not(.vCheckboxLabel):after { - content: ''; - display: inline-block; - vertical-align: middle; - height: 26px; -} - -.aligned label + p, .aligned label + div.help, .aligned label + div.readonly { - padding: 6px 0; - margin-top: 0; - margin-bottom: 0; - margin-left: 170px; -} - -.aligned ul label { - display: inline; - float: none; - width: auto; -} - -.aligned .form-row input { - margin-bottom: 0; -} - -.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { - width: 350px; -} - -form .aligned ul { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned ul.radiolist { - display: inline-block; - margin: 0; - padding: 0; -} - -form .aligned p.help, -form .aligned div.help { - clear: left; - margin-top: 0; - margin-left: 160px; - padding-left: 10px; -} - -form .aligned label + p.help, -form .aligned label + div.help { - margin-left: 0; - padding-left: 0; -} - -form .aligned p.help:last-child, -form .aligned div.help:last-child { - margin-bottom: 0; - padding-bottom: 0; -} - -form .aligned input + p.help, -form .aligned textarea + p.help, -form .aligned select + p.help, -form .aligned input + div.help, -form .aligned textarea + div.help, -form .aligned select + div.help { - margin-left: 160px; - padding-left: 10px; -} - -form .aligned ul li { - list-style: none; -} - -form .aligned table p { - margin-left: 0; - padding-left: 0; -} - -.aligned .vCheckboxLabel { - float: none; - width: auto; - display: inline-block; - vertical-align: -3px; - padding: 0 0 5px 5px; -} - -.aligned .vCheckboxLabel + p.help, -.aligned .vCheckboxLabel + div.help { - margin-top: -4px; -} - -.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { - width: 610px; -} - -.checkbox-row p.help, -.checkbox-row div.help { - margin-left: 0; - padding-left: 0; -} - -fieldset .field-box { - float: left; - margin-right: 20px; -} - -/* WIDE FIELDSETS */ - -.wide label { - width: 200px; -} - -form .wide p, -form .wide input + p.help, -form .wide input + div.help { - margin-left: 200px; -} - -form .wide p.help, -form .wide div.help { - padding-left: 38px; -} - -form div.help ul { - padding-left: 0; - margin-left: 0; -} - -.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { - width: 450px; -} - -/* COLLAPSED FIELDSETS */ - -fieldset.collapsed * { - display: none; -} - -fieldset.collapsed h2, fieldset.collapsed { - display: block; -} - -fieldset.collapsed { - border: 1px solid #eee; - border-radius: 4px; - overflow: hidden; -} - -fieldset.collapsed h2 { - background: #f8f8f8; - color: #666; -} - -fieldset .collapse-toggle { - color: #fff; -} - -fieldset.collapsed .collapse-toggle { - background: transparent; - display: inline; - color: #447e9b; -} - -/* MONOSPACE TEXTAREAS */ - -fieldset.monospace textarea { - font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; -} - -/* SUBMIT ROW */ - -.submit-row { - padding: 12px 14px; - margin: 0 0 20px; - background: #f8f8f8; - border: 1px solid #eee; - border-radius: 4px; - text-align: right; - overflow: hidden; -} - -body.popup .submit-row { - overflow: auto; -} - -.submit-row input { - height: 35px; - line-height: 15px; - margin: 0 0 0 5px; -} - -.submit-row input.default { - margin: 0 0 0 8px; - text-transform: uppercase; -} - -.submit-row p { - margin: 0.3em; -} - -.submit-row p.deletelink-box { - float: left; - margin: 0; -} - -.submit-row a.deletelink { - display: block; - background: #ba2121; - border-radius: 4px; - padding: 10px 15px; - height: 15px; - line-height: 15px; - color: #fff; -} - -.submit-row a.deletelink:focus, -.submit-row a.deletelink:hover, -.submit-row a.deletelink:active { - background: #a41515; -} - -/* CUSTOM FORM FIELDS */ - -.vSelectMultipleField { - vertical-align: top; -} - -.vCheckboxField { - border: none; -} - -.vDateField, .vTimeField { - margin-right: 2px; - margin-bottom: 4px; -} - -.vDateField { - min-width: 6.85em; -} - -.vTimeField { - min-width: 4.7em; -} - -.vURLField { - width: 30em; -} - -.vLargeTextField, .vXMLLargeTextField { - width: 48em; -} - -.flatpages-flatpage #id_content { - height: 40.2em; -} - -.module table .vPositiveSmallIntegerField { - width: 2.2em; -} - -.vTextField { - width: 20em; -} - -.vIntegerField { - width: 5em; -} - -.vBigIntegerField { - width: 10em; -} - -.vForeignKeyRawIdAdminField { - width: 5em; -} - -/* INLINES */ - -.inline-group { - padding: 0; - margin: 0 0 30px; -} - -.inline-group thead th { - padding: 8px 10px; -} - -.inline-group .aligned label { - width: 160px; -} - -.inline-related { - position: relative; -} - -.inline-related h3 { - margin: 0; - color: #666; - padding: 5px; - font-size: 13px; - background: #f8f8f8; - border-top: 1px solid #eee; - border-bottom: 1px solid #eee; -} - -.inline-related h3 span.delete { - float: right; -} - -.inline-related h3 span.delete label { - margin-left: 2px; - font-size: 11px; -} - -.inline-related fieldset { - margin: 0; - background: #fff; - border: none; - width: 100%; -} - -.inline-related fieldset.module h3 { - margin: 0; - padding: 2px 5px 3px 5px; - font-size: 11px; - text-align: left; - font-weight: bold; - background: #bcd; - color: #fff; -} - -.inline-group .tabular fieldset.module { - border: none; -} - -.inline-related.tabular fieldset.module table { - width: 100%; -} - -.last-related fieldset { - border: none; -} - -.inline-group .tabular tr.has_original td { - padding-top: 2em; -} - -.inline-group .tabular tr td.original { - padding: 2px 0 0 0; - width: 0; - _position: relative; -} - -.inline-group .tabular th.original { - width: 0px; - padding: 0; -} - -.inline-group .tabular td.original p { - position: absolute; - left: 0; - height: 1.1em; - padding: 2px 9px; - overflow: hidden; - font-size: 9px; - font-weight: bold; - color: #666; - _width: 700px; -} - -.inline-group ul.tools { - padding: 0; - margin: 0; - list-style: none; -} - -.inline-group ul.tools li { - display: inline; - padding: 0 5px; -} - -.inline-group div.add-row, -.inline-group .tabular tr.add-row td { - color: #666; - background: #f8f8f8; - padding: 8px 10px; - border-bottom: 1px solid #eee; -} - -.inline-group .tabular tr.add-row td { - padding: 8px 10px; - border-bottom: 1px solid #eee; -} - -.inline-group ul.tools a.add, -.inline-group div.add-row a, -.inline-group .tabular tr.add-row td a { - background: url(../img/icon-addlink.svg) 0 1px no-repeat; - padding-left: 16px; - font-size: 12px; -} - -.empty-form { - display: none; -} - -/* RELATED FIELD ADD ONE / LOOKUP */ - -.add-another, .related-lookup { - margin-left: 5px; - display: inline-block; - vertical-align: middle; - background-repeat: no-repeat; - background-size: 14px; -} - -.add-another { - width: 16px; - height: 16px; - background-image: url(../img/icon-addlink.svg); -} - -.related-lookup { - width: 16px; - height: 16px; - background-image: url(../img/search.svg); -} - -form .related-widget-wrapper ul { - display: inline-block; - margin-left: 0; - padding-left: 0; -} - -.clearable-file-input input { - margin-top: 0; -} diff --git a/projectsettings/static/admin/css/login.css b/projectsettings/static/admin/css/login.css deleted file mode 100644 index cab3bbf5..00000000 --- a/projectsettings/static/admin/css/login.css +++ /dev/null @@ -1,78 +0,0 @@ -/* LOGIN FORM */ - -body.login { - background: #f8f8f8; -} - -.login #header { - height: auto; - padding: 5px 16px; -} - -.login #header h1 { - font-size: 18px; -} - -.login #header h1 a { - color: #fff; -} - -.login #content { - padding: 20px 20px 0; -} - -.login #container { - background: #fff; - border: 1px solid #eaeaea; - border-radius: 4px; - overflow: hidden; - width: 28em; - min-width: 300px; - margin: 100px auto; -} - -.login #content-main { - width: 100%; -} - -.login .form-row { - padding: 4px 0; - float: left; - width: 100%; - border-bottom: none; -} - -.login .form-row label { - padding-right: 0.5em; - line-height: 2em; - font-size: 1em; - clear: both; - color: #333; -} - -.login .form-row #id_username, .login .form-row #id_password { - clear: both; - padding: 8px; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.login span.help { - font-size: 10px; - display: block; -} - -.login .submit-row { - clear: both; - padding: 1em 0 0 9.4em; - margin: 0; - border: none; - background: none; - text-align: left; -} - -.login .password-reset-link { - text-align: center; -} diff --git a/projectsettings/static/admin/css/rtl.css b/projectsettings/static/admin/css/rtl.css deleted file mode 100644 index ef397815..00000000 --- a/projectsettings/static/admin/css/rtl.css +++ /dev/null @@ -1,264 +0,0 @@ -body { - direction: rtl; -} - -/* LOGIN */ - -.login .form-row { - float: right; -} - -.login .form-row label { - float: right; - padding-left: 0.5em; - padding-right: 0; - text-align: left; -} - -.login .submit-row { - clear: both; - padding: 1em 9.4em 0 0; -} - -/* GLOBAL */ - -th { - text-align: right; -} - -.module h2, .module caption { - text-align: right; -} - -.module ul, .module ol { - margin-left: 0; - margin-right: 1.5em; -} - -.addlink, .changelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.deletelink { - padding-left: 0; - padding-right: 16px; - background-position: 100% 1px; -} - -.object-tools { - float: left; -} - -thead th:first-child, -tfoot td:first-child { - border-left: none; -} - -/* LAYOUT */ - -#user-tools { - right: auto; - left: 0; - text-align: left; -} - -div.breadcrumbs { - text-align: right; -} - -#content-main { - float: right; -} - -#content-related { - float: left; - margin-left: -300px; - margin-right: auto; -} - -.colMS { - margin-left: 300px; - margin-right: 0; -} - -/* SORTABLE TABLES */ - -table thead th.sorted .sortoptions { - float: left; -} - -thead th.sorted .text { - padding-right: 0; - padding-left: 42px; -} - -/* dashboard styles */ - -.dashboard .module table td a { - padding-left: .6em; - padding-right: 16px; -} - -/* changelists styles */ - -.change-list .filtered table { - border-left: none; - border-right: 0px none; -} - -#changelist-filter { - right: auto; - left: 0; - border-left: none; - border-right: none; -} - -.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { - margin-right: 0; - margin-left: 280px; -} - -#changelist-filter li.selected { - border-left: none; - padding-left: 10px; - margin-left: 0; - border-right: 5px solid #eaeaea; - padding-right: 10px; - margin-right: -15px; -} - -.filtered .actions { - margin-left: 280px; - margin-right: 0; -} - -#changelist table tbody td:first-child, #changelist table tbody th:first-child { - border-right: none; - border-left: none; -} - -/* FORMS */ - -.aligned label { - padding: 0 0 3px 1em; - float: right; -} - -.submit-row { - text-align: left -} - -.submit-row p.deletelink-box { - float: right; -} - -.submit-row input.default { - margin-left: 0; -} - -.vDateField, .vTimeField { - margin-left: 2px; -} - -.aligned .form-row input { - margin-left: 5px; -} - -form .aligned p.help, form .aligned div.help { - clear: right; -} - -form ul.inline li { - float: right; - padding-right: 0; - padding-left: 7px; -} - -input[type=submit].default, .submit-row input.default { - float: left; -} - -fieldset .field-box { - float: right; - margin-left: 20px; - margin-right: 0; -} - -.errorlist li { - background-position: 100% 12px; - padding: 0; -} - -.errornote { - background-position: 100% 12px; - padding: 10px 12px; -} - -/* WIDGETS */ - -.calendarnav-previous { - top: 0; - left: auto; - right: 10px; -} - -.calendarnav-next { - top: 0; - right: auto; - left: 10px; -} - -.calendar caption, .calendarbox h2 { - text-align: center; -} - -.selector { - float: right; -} - -.selector .selector-filter { - text-align: right; -} - -.inline-deletelink { - float: left; -} - -form .form-row p.datetime { - overflow: hidden; -} - -.related-widget-wrapper { - float: right; -} - -/* MISC */ - -.inline-related h2, .inline-group h2 { - text-align: right -} - -.inline-related h3 span.delete { - padding-right: 20px; - padding-left: inherit; - left: 10px; - right: inherit; - float:left; -} - -.inline-related h3 span.delete label { - margin-left: inherit; - margin-right: 2px; -} - -/* IE7 specific bug fixes */ - -div.colM { - position: relative; -} - -.submit-row input { - float: left; -} diff --git a/projectsettings/static/admin/css/widgets.css b/projectsettings/static/admin/css/widgets.css deleted file mode 100644 index d3bd67ac..00000000 --- a/projectsettings/static/admin/css/widgets.css +++ /dev/null @@ -1,565 +0,0 @@ -/* SELECTOR (FILTER INTERFACE) */ - -.selector { - width: 800px; - float: left; -} - -.selector select { - width: 380px; - height: 17.2em; -} - -.selector-available, .selector-chosen { - float: left; - width: 380px; - text-align: center; - margin-bottom: 5px; -} - -.selector-chosen select { - border-top: none; -} - -.selector-available h2, .selector-chosen h2 { - border: 1px solid #ccc; - border-radius: 4px 4px 0 0; -} - -.selector-chosen h2 { - background: #79aec8; - color: #fff; -} - -.selector .selector-available h2 { - background: #f8f8f8; - color: #666; -} - -.selector .selector-filter { - background: white; - border: 1px solid #ccc; - border-width: 0 1px; - padding: 8px; - color: #999; - font-size: 10px; - margin: 0; - text-align: left; -} - -.selector .selector-filter label, -.inline-group .aligned .selector .selector-filter label { - float: left; - margin: 7px 0 0; - width: 18px; - height: 18px; - padding: 0; - overflow: hidden; - line-height: 1; -} - -.selector .selector-available input { - width: 320px; - margin-left: 8px; -} - -.selector ul.selector-chooser { - float: left; - width: 22px; - background-color: #eee; - border-radius: 10px; - margin: 10em 5px 0 5px; - padding: 0; -} - -.selector-chooser li { - margin: 0; - padding: 3px; - list-style-type: none; -} - -.selector select { - padding: 0 10px; - margin: 0 0 10px; - border-radius: 0 0 4px 4px; -} - -.selector-add, .selector-remove { - width: 16px; - height: 16px; - display: block; - text-indent: -3000px; - overflow: hidden; - cursor: default; - opacity: 0.3; -} - -.active.selector-add, .active.selector-remove { - opacity: 1; -} - -.active.selector-add:hover, .active.selector-remove:hover { - cursor: pointer; -} - -.selector-add { - background: url(../img/selector-icons.svg) 0 -96px no-repeat; -} - -.active.selector-add:focus, .active.selector-add:hover { - background-position: 0 -112px; -} - -.selector-remove { - background: url(../img/selector-icons.svg) 0 -64px no-repeat; -} - -.active.selector-remove:focus, .active.selector-remove:hover { - background-position: 0 -80px; -} - -a.selector-chooseall, a.selector-clearall { - display: inline-block; - height: 16px; - text-align: left; - margin: 1px auto 3px; - overflow: hidden; - font-weight: bold; - line-height: 16px; - color: #666; - text-decoration: none; - opacity: 0.3; -} - -a.active.selector-chooseall:focus, a.active.selector-clearall:focus, -a.active.selector-chooseall:hover, a.active.selector-clearall:hover { - color: #447e9b; -} - -a.active.selector-chooseall, a.active.selector-clearall { - opacity: 1; -} - -a.active.selector-chooseall:hover, a.active.selector-clearall:hover { - cursor: pointer; -} - -a.selector-chooseall { - padding: 0 18px 0 0; - background: url(../img/selector-icons.svg) right -160px no-repeat; - cursor: default; -} - -a.active.selector-chooseall:focus, a.active.selector-chooseall:hover { - background-position: 100% -176px; -} - -a.selector-clearall { - padding: 0 0 0 18px; - background: url(../img/selector-icons.svg) 0 -128px no-repeat; - cursor: default; -} - -a.active.selector-clearall:focus, a.active.selector-clearall:hover { - background-position: 0 -144px; -} - -/* STACKED SELECTORS */ - -.stacked { - float: left; - width: 490px; -} - -.stacked select { - width: 480px; - height: 10.1em; -} - -.stacked .selector-available, .stacked .selector-chosen { - width: 480px; -} - -.stacked .selector-available { - margin-bottom: 0; -} - -.stacked .selector-available input { - width: 422px; -} - -.stacked ul.selector-chooser { - height: 22px; - width: 50px; - margin: 0 0 10px 40%; - background-color: #eee; - border-radius: 10px; -} - -.stacked .selector-chooser li { - float: left; - padding: 3px 3px 3px 5px; -} - -.stacked .selector-chooseall, .stacked .selector-clearall { - display: none; -} - -.stacked .selector-add { - background: url(../img/selector-icons.svg) 0 -32px no-repeat; - cursor: default; -} - -.stacked .active.selector-add { - background-position: 0 -48px; - cursor: pointer; -} - -.stacked .selector-remove { - background: url(../img/selector-icons.svg) 0 0 no-repeat; - cursor: default; -} - -.stacked .active.selector-remove { - background-position: 0 -16px; - cursor: pointer; -} - -.selector .help-icon { - background: url(../img/icon-unknown.svg) 0 0 no-repeat; - display: inline-block; - vertical-align: middle; - margin: -2px 0 0 2px; - width: 13px; - height: 13px; -} - -.selector .selector-chosen .help-icon { - background: url(../img/icon-unknown-alt.svg) 0 0 no-repeat; -} - -.selector .search-label-icon { - background: url(../img/search.svg) 0 0 no-repeat; - display: inline-block; - height: 18px; - width: 18px; -} - -/* DATE AND TIME */ - -p.datetime { - line-height: 20px; - margin: 0; - padding: 0; - color: #666; - font-weight: bold; -} - -.datetime span { - white-space: nowrap; - font-weight: normal; - font-size: 11px; - color: #ccc; -} - -.datetime input, .form-row .datetime input.vDateField, .form-row .datetime input.vTimeField { - min-width: 0; - margin-left: 5px; - margin-bottom: 4px; -} - -table p.datetime { - font-size: 11px; - margin-left: 0; - padding-left: 0; -} - -.datetimeshortcuts .clock-icon, .datetimeshortcuts .date-icon { - position: relative; - display: inline-block; - vertical-align: middle; - height: 16px; - width: 16px; - overflow: hidden; -} - -.datetimeshortcuts .clock-icon { - background: url(../img/icon-clock.svg) 0 0 no-repeat; -} - -.datetimeshortcuts a:focus .clock-icon, -.datetimeshortcuts a:hover .clock-icon { - background-position: 0 -16px; -} - -.datetimeshortcuts .date-icon { - background: url(../img/icon-calendar.svg) 0 0 no-repeat; - top: -1px; -} - -.datetimeshortcuts a:focus .date-icon, -.datetimeshortcuts a:hover .date-icon { - background-position: 0 -16px; -} - -.timezonewarning { - font-size: 11px; - color: #999; -} - -/* URL */ - -p.url { - line-height: 20px; - margin: 0; - padding: 0; - color: #666; - font-size: 11px; - font-weight: bold; -} - -.url a { - font-weight: normal; -} - -/* FILE UPLOADS */ - -p.file-upload { - line-height: 20px; - margin: 0; - padding: 0; - color: #666; - font-size: 11px; - font-weight: bold; -} - -.aligned p.file-upload { - margin-left: 170px; -} - -.file-upload a { - font-weight: normal; -} - -.file-upload .deletelink { - margin-left: 5px; -} - -span.clearable-file-input label { - color: #333; - font-size: 11px; - display: inline; - float: none; -} - -/* CALENDARS & CLOCKS */ - -.calendarbox, .clockbox { - margin: 5px auto; - font-size: 12px; - width: 19em; - text-align: center; - background: white; - border: 1px solid #ddd; - border-radius: 4px; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); - overflow: hidden; - position: relative; -} - -.clockbox { - width: auto; -} - -.calendar { - margin: 0; - padding: 0; -} - -.calendar table { - margin: 0; - padding: 0; - border-collapse: collapse; - background: white; - width: 100%; -} - -.calendar caption, .calendarbox h2 { - margin: 0; - text-align: center; - border-top: none; - background: #f5dd5d; - font-weight: 700; - font-size: 12px; - color: #333; -} - -.calendar th { - padding: 8px 5px; - background: #f8f8f8; - border-bottom: 1px solid #ddd; - font-weight: 400; - font-size: 12px; - text-align: center; - color: #666; -} - -.calendar td { - font-weight: 400; - font-size: 12px; - text-align: center; - padding: 0; - border-top: 1px solid #eee; - border-bottom: none; -} - -.calendar td.selected a { - background: #79aec8; - color: #fff; -} - -.calendar td.nonday { - background: #f8f8f8; -} - -.calendar td.today a { - font-weight: 700; -} - -.calendar td a, .timelist a { - display: block; - font-weight: 400; - padding: 6px; - text-decoration: none; - color: #444; -} - -.calendar td a:focus, .timelist a:focus, -.calendar td a:hover, .timelist a:hover { - background: #79aec8; - color: white; -} - -.calendar td a:active, .timelist a:active { - background: #417690; - color: white; -} - -.calendarnav { - font-size: 10px; - text-align: center; - color: #ccc; - margin: 0; - padding: 1px 3px; -} - -.calendarnav a:link, #calendarnav a:visited, -#calendarnav a:focus, #calendarnav a:hover { - color: #999; -} - -.calendar-shortcuts { - background: white; - font-size: 11px; - line-height: 11px; - border-top: 1px solid #eee; - padding: 8px 0; - color: #ccc; -} - -.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { - display: block; - position: absolute; - top: 8px; - width: 15px; - height: 15px; - text-indent: -9999px; - padding: 0; -} - -.calendarnav-previous { - left: 10px; - background: url(../img/calendar-icons.svg) 0 0 no-repeat; -} - -.calendarbox .calendarnav-previous:focus, -.calendarbox .calendarnav-previous:hover { - background-position: 0 -15px; -} - -.calendarnav-next { - right: 10px; - background: url(../img/calendar-icons.svg) 0 -30px no-repeat; -} - -.calendarbox .calendarnav-next:focus, -.calendarbox .calendarnav-next:hover { - background-position: 0 -45px; -} - -.calendar-cancel { - margin: 0; - padding: 4px 0; - font-size: 12px; - background: #eee; - border-top: 1px solid #ddd; - color: #333; -} - -.calendar-cancel:focus, .calendar-cancel:hover { - background: #ddd; -} - -.calendar-cancel a { - color: black; - display: block; -} - -ul.timelist, .timelist li { - list-style-type: none; - margin: 0; - padding: 0; -} - -.timelist a { - padding: 2px; -} - -/* EDIT INLINE */ - -.inline-deletelink { - float: right; - text-indent: -9999px; - background: url(../img/inline-delete.svg) 0 0 no-repeat; - width: 16px; - height: 16px; - border: 0px none; -} - -.inline-deletelink:focus, .inline-deletelink:hover { - cursor: pointer; -} - -/* RELATED WIDGET WRAPPER */ -.related-widget-wrapper { - float: left; /* display properly in form rows with multiple fields */ - overflow: hidden; /* clear floated contents */ -} - -.related-widget-wrapper-link { - opacity: 0.3; -} - -.related-widget-wrapper-link:link { - opacity: .8; -} - -.related-widget-wrapper-link:link:focus, -.related-widget-wrapper-link:link:hover { - opacity: 1; -} - -select + .related-widget-wrapper-link, -.related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 7px; -} diff --git a/projectsettings/static/admin/fonts/LICENSE.txt b/projectsettings/static/admin/fonts/LICENSE.txt deleted file mode 100644 index 75b52484..00000000 --- a/projectsettings/static/admin/fonts/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/projectsettings/static/admin/fonts/README.txt b/projectsettings/static/admin/fonts/README.txt deleted file mode 100644 index cc2135a3..00000000 --- a/projectsettings/static/admin/fonts/README.txt +++ /dev/null @@ -1,2 +0,0 @@ -Roboto webfont source: https://www.google.com/fonts/specimen/Roboto -Weights used in this project: Light (300), Regular (400), Bold (700) diff --git a/projectsettings/static/admin/fonts/Roboto-Bold-webfont.woff b/projectsettings/static/admin/fonts/Roboto-Bold-webfont.woff deleted file mode 100644 index 03357ce4f5833006114f2e790a7b89dbf69d4f90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82564 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 U5+{zuf?@lC+j6Kse)s?X0ZPdgP5=M^ diff --git a/projectsettings/static/admin/img/LICENSE b/projectsettings/static/admin/img/LICENSE deleted file mode 100644 index a4faaa1d..00000000 --- a/projectsettings/static/admin/img/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Code Charm Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/projectsettings/static/admin/img/README.txt b/projectsettings/static/admin/img/README.txt deleted file mode 100644 index 43373ad1..00000000 --- a/projectsettings/static/admin/img/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -All icons are taken from Font Awesome (http://fontawesome.io/) project. -The Font Awesome font is licensed under the SIL OFL 1.1: -- http://scripts.sil.org/OFL - -SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG -Font-Awesome-SVG-PNG is licensed under the MIT license (see file license -in current folder). diff --git a/projectsettings/static/admin/img/calendar-icons.svg b/projectsettings/static/admin/img/calendar-icons.svg deleted file mode 100644 index dbf21c39..00000000 --- a/projectsettings/static/admin/img/calendar-icons.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/projectsettings/static/admin/img/gis/move_vertex_off.svg b/projectsettings/static/admin/img/gis/move_vertex_off.svg deleted file mode 100644 index 228854f3..00000000 --- a/projectsettings/static/admin/img/gis/move_vertex_off.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/projectsettings/static/admin/img/gis/move_vertex_on.svg b/projectsettings/static/admin/img/gis/move_vertex_on.svg deleted file mode 100644 index 96b87fdd..00000000 --- a/projectsettings/static/admin/img/gis/move_vertex_on.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/projectsettings/static/admin/img/icon-addlink.svg b/projectsettings/static/admin/img/icon-addlink.svg deleted file mode 100644 index e004fb16..00000000 --- a/projectsettings/static/admin/img/icon-addlink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/icon-alert.svg b/projectsettings/static/admin/img/icon-alert.svg deleted file mode 100644 index e51ea83f..00000000 --- a/projectsettings/static/admin/img/icon-alert.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/icon-calendar.svg b/projectsettings/static/admin/img/icon-calendar.svg deleted file mode 100644 index 97910a99..00000000 --- a/projectsettings/static/admin/img/icon-calendar.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/projectsettings/static/admin/img/icon-changelink.svg b/projectsettings/static/admin/img/icon-changelink.svg deleted file mode 100644 index bbb137aa..00000000 --- a/projectsettings/static/admin/img/icon-changelink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/icon-clock.svg b/projectsettings/static/admin/img/icon-clock.svg deleted file mode 100644 index bf9985d3..00000000 --- a/projectsettings/static/admin/img/icon-clock.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/projectsettings/static/admin/img/icon-deletelink.svg b/projectsettings/static/admin/img/icon-deletelink.svg deleted file mode 100644 index 4059b155..00000000 --- a/projectsettings/static/admin/img/icon-deletelink.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/icon-no.svg b/projectsettings/static/admin/img/icon-no.svg deleted file mode 100644 index 2e0d3832..00000000 --- a/projectsettings/static/admin/img/icon-no.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/icon-unknown-alt.svg b/projectsettings/static/admin/img/icon-unknown-alt.svg deleted file mode 100644 index 1c6b99fc..00000000 --- a/projectsettings/static/admin/img/icon-unknown-alt.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/icon-unknown.svg b/projectsettings/static/admin/img/icon-unknown.svg deleted file mode 100644 index 50b4f972..00000000 --- a/projectsettings/static/admin/img/icon-unknown.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/icon-yes.svg b/projectsettings/static/admin/img/icon-yes.svg deleted file mode 100644 index 5883d877..00000000 --- a/projectsettings/static/admin/img/icon-yes.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/inline-delete.svg b/projectsettings/static/admin/img/inline-delete.svg deleted file mode 100644 index 17d1ad67..00000000 --- a/projectsettings/static/admin/img/inline-delete.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/search.svg b/projectsettings/static/admin/img/search.svg deleted file mode 100644 index c8c69b2a..00000000 --- a/projectsettings/static/admin/img/search.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/selector-icons.svg b/projectsettings/static/admin/img/selector-icons.svg deleted file mode 100644 index 926b8e21..00000000 --- a/projectsettings/static/admin/img/selector-icons.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/projectsettings/static/admin/img/sorting-icons.svg b/projectsettings/static/admin/img/sorting-icons.svg deleted file mode 100644 index 7c31ec91..00000000 --- a/projectsettings/static/admin/img/sorting-icons.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/projectsettings/static/admin/img/tooltag-add.svg b/projectsettings/static/admin/img/tooltag-add.svg deleted file mode 100644 index 1ca64ae5..00000000 --- a/projectsettings/static/admin/img/tooltag-add.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/img/tooltag-arrowright.svg b/projectsettings/static/admin/img/tooltag-arrowright.svg deleted file mode 100644 index b664d619..00000000 --- a/projectsettings/static/admin/img/tooltag-arrowright.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/projectsettings/static/admin/js/SelectBox.js b/projectsettings/static/admin/js/SelectBox.js deleted file mode 100644 index 3557108c..00000000 --- a/projectsettings/static/admin/js/SelectBox.js +++ /dev/null @@ -1,144 +0,0 @@ -(function($) { - 'use strict'; - var SelectBox = { - cache: {}, - init: function(id) { - var box = document.getElementById(id); - var node; - SelectBox.cache[id] = []; - var cache = SelectBox.cache[id]; - var boxOptions = box.options; - var boxOptionsLength = boxOptions.length; - for (var i = 0, j = boxOptionsLength; i < j; i++) { - node = boxOptions[i]; - cache.push({value: node.value, text: node.text, displayed: 1}); - } - }, - redisplay: function(id) { - // Repopulate HTML select box from cache - var box = document.getElementById(id); - var node; - $(box).empty(); // clear all options - var new_options = box.outerHTML.slice(0, -9); // grab just the opening tag - var cache = SelectBox.cache[id]; - for (var i = 0, j = cache.length; i < j; i++) { - node = cache[i]; - if (node.displayed) { - var new_option = new Option(node.text, node.value, false, false); - // Shows a tooltip when hovering over the option - new_option.setAttribute("title", node.text); - new_options += new_option.outerHTML; - } - } - new_options += ''; - box.outerHTML = new_options; - }, - filter: function(id, text) { - // Redisplay the HTML select box, displaying only the choices containing ALL - // the words in text. (It's an AND search.) - var tokens = text.toLowerCase().split(/\s+/); - var node, token; - var cache = SelectBox.cache[id]; - for (var i = 0, j = cache.length; i < j; i++) { - node = cache[i]; - node.displayed = 1; - var node_text = node.text.toLowerCase(); - var numTokens = tokens.length; - for (var k = 0; k < numTokens; k++) { - token = tokens[k]; - if (node_text.indexOf(token) === -1) { - node.displayed = 0; - break; // Once the first token isn't found we're done - } - } - } - SelectBox.redisplay(id); - }, - delete_from_cache: function(id, value) { - var node, delete_index = null; - var cache = SelectBox.cache[id]; - for (var i = 0, j = cache.length; i < j; i++) { - node = cache[i]; - if (node.value === value) { - delete_index = i; - break; - } - } - cache.splice(delete_index, 1); - }, - add_to_cache: function(id, option) { - SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); - }, - cache_contains: function(id, value) { - // Check if an item is contained in the cache - var node; - var cache = SelectBox.cache[id]; - for (var i = 0, j = cache.length; i < j; i++) { - node = cache[i]; - if (node.value === value) { - return true; - } - } - return false; - }, - move: function(from, to) { - var from_box = document.getElementById(from); - var option; - var boxOptions = from_box.options; - var boxOptionsLength = boxOptions.length; - for (var i = 0, j = boxOptionsLength; i < j; i++) { - option = boxOptions[i]; - var option_value = option.value; - if (option.selected && SelectBox.cache_contains(from, option_value)) { - SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); - SelectBox.delete_from_cache(from, option_value); - } - } - SelectBox.redisplay(from); - SelectBox.redisplay(to); - }, - move_all: function(from, to) { - var from_box = document.getElementById(from); - var option; - var boxOptions = from_box.options; - var boxOptionsLength = boxOptions.length; - for (var i = 0, j = boxOptionsLength; i < j; i++) { - option = boxOptions[i]; - var option_value = option.value; - if (SelectBox.cache_contains(from, option_value)) { - SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1}); - SelectBox.delete_from_cache(from, option_value); - } - } - SelectBox.redisplay(from); - SelectBox.redisplay(to); - }, - sort: function(id) { - SelectBox.cache[id].sort(function(a, b) { - a = a.text.toLowerCase(); - b = b.text.toLowerCase(); - try { - if (a > b) { - return 1; - } - if (a < b) { - return -1; - } - } - catch (e) { - // silently fail on IE 'unknown' exception - } - return 0; - } ); - }, - select_all: function(id) { - var box = document.getElementById(id); - var boxOptions = box.options; - var boxOptionsLength = boxOptions.length; - for (var i = 0; i < boxOptionsLength; i++) { - boxOptions[i].selected = 'selected'; - } - } - }; - window.SelectBox = SelectBox; -})(grp.jQuery); diff --git a/projectsettings/static/admin/js/SelectFilter2.js b/projectsettings/static/admin/js/SelectFilter2.js deleted file mode 100644 index cdb70b25..00000000 --- a/projectsettings/static/admin/js/SelectFilter2.js +++ /dev/null @@ -1,236 +0,0 @@ -/*global SelectBox, addEvent, gettext, interpolate, quickElement, SelectFilter*/ -/* -SelectFilter2 - Turns a multiple-select box into a filter interface. - -Requires jQuery, core.js, and SelectBox.js. -*/ -(function($) { - 'use strict'; - function findForm(node) { - // returns the node of the form containing the given node - if (node.tagName.toLowerCase() !== 'form') { - return findForm(node.parentNode); - } - return node; - } - - window.SelectFilter = { - init: function(field_id, field_name, is_stacked) { - if (field_id.match(/__prefix__/)) { - // Don't initialize on empty forms. - return; - } - var from_box = document.getElementById(field_id); - from_box.id += '_from'; // change its ID - from_box.className = 'filtered'; - - var ps = from_box.parentNode.getElementsByTagName('p'); - for (var i = 0; i < ps.length; i++) { - if (ps[i].className.indexOf("info") !== -1) { - // Remove

, because it just gets in the way. - from_box.parentNode.removeChild(ps[i]); - } else if (ps[i].className.indexOf("help") !== -1) { - // Move help text up to the top so it isn't below the select - // boxes or wrapped off on the side to the right of the add - // button: - from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild); - } - } - - //

or
- var selector_div = quickElement('div', from_box.parentNode); - selector_div.className = is_stacked ? 'selector stacked' : 'selector'; - - //
- var selector_available = quickElement('div', selector_div); - selector_available.className = 'selector-available'; - var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); - quickElement( - 'span', title_available, '', - 'class', 'help help-tooltip help-icon', - 'title', interpolate( - gettext( - 'This is the list of available %s. You may choose some by ' + - 'selecting them in the box below and then clicking the ' + - '"Choose" arrow between the two boxes.' - ), - [field_name] - ) - ); - - var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); - filter_p.className = 'selector-filter'; - - var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + '_input'); - - quickElement( - 'span', search_filter_label, '', - 'class', 'help-tooltip search-label-icon', - 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name]) - ); - - filter_p.appendChild(document.createTextNode(' ')); - - var filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); - filter_input.id = field_id + '_input'; - - selector_available.appendChild(from_box); - var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', '#', 'id', field_id + '_add_all_link'); - choose_all.className = 'selector-chooseall'; - - //