From c17da7eaab3c19931057a00c58eb688e854c7e71 Mon Sep 17 00:00:00 2001 From: SDE Date: Tue, 16 May 2023 17:14:16 +0300 Subject: [PATCH] init --- .gitignore | 415 ++++++ AuthApp/__init__.py | 0 AuthApp/admin.py | 253 ++++ AuthApp/api/__init__.py | 0 AuthApp/api/api_1C_views.py | 88 ++ AuthApp/api/api_permissions.py | 76 + AuthApp/api/api_urls.py | 17 + AuthApp/api/api_views.py | 94 ++ AuthApp/api/import_1C_data.py | 194 +++ AuthApp/api/init_api.py | 26 + AuthApp/api/serializers.py | 49 + .../permissions/personal_api_permissions.py | 116 ++ AuthApp/api/v1/user/user_api_serializars.py | 124 ++ AuthApp/api/v1/user/user_api_views.py | 1180 +++++++++++++++ AuthApp/forms.py | 70 + AuthApp/funcs.py | 392 +++++ AuthApp/migrations/0001_initial.py | 44 + ...cess_count_userprofile_balance_and_more.py | 41 + AuthApp/migrations/__init__.py | 0 AuthApp/models.py | 83 ++ AuthApp/stat_funcs.py | 194 +++ AuthApp/tests.py | 3 + AuthApp/urls.py | 57 + AuthApp/views.py | 292 ++++ BaseModels/SMS_sender.py | 68 + BaseModels/__init__.py | 1 + BaseModels/admin_utils.py | 217 +++ BaseModels/api/__init__.py | 0 BaseModels/api/api_export_xls.py | 43 + BaseModels/api/api_inter.py | 23 + BaseModels/api/api_middlewares.py | 19 + BaseModels/api/base_api_parsers.py | 22 + BaseModels/api/base_api_permissions.py | 36 + BaseModels/api/base_api_serializers.py | 44 + BaseModels/api/base_api_views.py | 356 +++++ BaseModels/base_models.py | 111 ++ BaseModels/colors/generate_colors.py | 150 ++ BaseModels/currency_exchange/__init__.py | 0 .../alfabank_api/alfabank_api_funcs.py | 108 ++ BaseModels/currency_exchange/funcs.py | 51 + BaseModels/currency_exchange/nbrb/__init__.py | 0 .../nbrb/nbrb_currency_exchange.py | 115 ++ BaseModels/decorators.py | 35 + BaseModels/error_processing.py | 67 + BaseModels/functions.py | 537 +++++++ BaseModels/inter.py | 189 +++ BaseModels/json_funcs.py | 31 + BaseModels/log/log_funcs.py | 103 ++ BaseModels/logging_change_data.py | 259 ++++ BaseModels/mailSender.py | 353 +++++ BaseModels/messages.py | 163 +++ .../middlewares/web_requests_middleware.py | 21 + BaseModels/office_documents_utils.py | 211 +++ BaseModels/paging.py | 111 ++ BaseModels/pil_graphic_utils.py | 32 + BaseModels/search_funcs.py | 123 ++ .../search_optimization/OEMBED/OEMBED_data.py | 2 + .../search_optimization/RSS/ya_RSS_chanel.py | 1 + BaseModels/search_optimization/__init__.py | 0 .../search_optimization/google_AMP/AMP.py | 2 + .../google_AMP/web_story_code.py | 1 + BaseModels/search_optimization/google_tips | 1 + .../search_optimization/ld_json/__init__.py | 0 .../ld_json/ld_ speakebale.py | 38 + .../search_optimization/ld_json/ld_FAQ.py | 22 + .../search_optimization/ld_json/ld_QA.py | 36 + .../ld_json/ld_article_news.py | 41 + .../ld_json/ld_breadcrambs.py | 39 + .../search_optimization/ld_json/ld_company.py | 243 +++ .../ld_json/ld_media_video_object.py | 53 + .../search_optimization/ld_json/ld_product.py | 178 +++ .../search_optimization/ld_json/ld_search.py | 22 + .../search_optimization/ld_json/ld_vacancy.py | 140 ++ .../search_optimization/ya_YML/ya_YML.py | 1 + BaseModels/search_optimization/ya_tips | 1 + BaseModels/seo_text_generators.py | 258 ++++ BaseModels/templates/m_show_message.html | 15 + BaseModels/templatetags/__init__.py | 1 + BaseModels/templatetags/base_tags_extra.py | 155 ++ FirePlayProj/__init__.py | 0 FirePlayProj/asgi.py | 16 + FirePlayProj/settings.py | 252 ++++ FirePlayProj/urls.py | 27 + FirePlayProj/wsgi.py | 16 + GameApp/__init__.py | 0 GameApp/admin.py | 16 + GameApp/apps.py | 6 + GameApp/migrations/0001_initial.py | 84 ++ ..._questioningameforuser_options_and_more.py | 21 + GameApp/migrations/__init__.py | 0 GameApp/models.py | 94 ++ GameApp/tests.py | 3 + GameApp/views.py | 3 + QuestionsApp/__init__.py | 0 QuestionsApp/admin.py | 11 + QuestionsApp/apps.py | 6 + QuestionsApp/migrations/0001_initial.py | 58 + QuestionsApp/migrations/__init__.py | 0 QuestionsApp/models.py | 45 + QuestionsApp/tests.py | 3 + QuestionsApp/views.py | 3 + files_widget/__init__.py | 1 + files_widget/admin.py | 21 + files_widget/conf.py | 28 + files_widget/controllers.py | 292 ++++ files_widget/fields.py | 104 ++ files_widget/files.py | 209 +++ files_widget/forms/__init__.py | 2 + files_widget/forms/fields.py | 62 + files_widget/forms/widgets.py | 100 ++ files_widget/locale/ko/LC_MESSAGES/django.po | 64 + .../locale/zh_Hans/LC_MESSAGES/django.po | 65 + files_widget/migrations/0001_initial.py | 54 + .../migrations/0002_auto_20221111_1837.py | 19 + files_widget/migrations/__init__.py | 0 files_widget/models.py | 55 + .../docs/img/admin-images-widget-drop.jpg | Bin 0 -> 78791 bytes .../docs/img/admin-images-widget-drop.png | Bin 0 -> 189127 bytes .../docs/img/admin-images-widget-progress.jpg | Bin 0 -> 74884 bytes .../docs/img/admin-images-widget-progress.png | Bin 0 -> 228415 bytes .../static/files_widget/css/widgets.css | 294 ++++ .../static/files_widget/img/blue_line.jpg | Bin 0 -> 1283 bytes .../files_widget/img/button_template.png | Bin 0 -> 3956 bytes .../static/files_widget/img/close_button.png | Bin 0 -> 4065 bytes files_widget/static/files_widget/img/done.png | Bin 0 -> 3399 bytes .../files_widget/img/enlarge_button.png | Bin 0 -> 4204 bytes .../files_widget/img/file-icons/archive.png | Bin 0 -> 23040 bytes .../files_widget/img/file-icons/audio.png | Bin 0 -> 31618 bytes .../files_widget/img/file-icons/blank.png | Bin 0 -> 13522 bytes .../files_widget/img/file-icons/code.png | Bin 0 -> 46163 bytes .../img/file-icons/executable.png | Bin 0 -> 38785 bytes .../files_widget/img/file-icons/file_icon.png | Bin 0 -> 5164 bytes .../files_widget/img/file-icons/image.png | Bin 0 -> 44168 bytes .../files_widget/img/file-icons/settings.png | Bin 0 -> 47465 bytes .../files_widget/img/file-icons/text.png | Bin 0 -> 55696 bytes .../img/file-icons/typography.png | Bin 0 -> 20379 bytes .../files_widget/img/file-icons/video.png | Bin 0 -> 44229 bytes .../files_widget/img/transparent-bg.gif | Bin 0 -> 58 bytes .../js/jquery.fileupload-angular.js | 348 +++++ .../js/jquery.fileupload-process.js | 158 ++ .../js/jquery.fileupload-resize.js | 212 +++ .../files_widget/js/jquery.fileupload-ui.js | 633 ++++++++ .../js/jquery.fileupload-validate.js | 116 ++ .../files_widget/js/jquery.fileupload.js | 1301 +++++++++++++++++ .../js/jquery.iframe-transport.js | 205 +++ .../static/files_widget/js/widgets.js | 485 ++++++ .../templates/files_widget/files_widget.html | 91 ++ .../templates/files_widget/images_widget.html | 90 ++ .../templates/files_widget/includes/file.html | 10 + .../files_widget/includes/thumbnail.html | 1 + files_widget/templatetags/__init__.py | 0 .../templatetags/files_widget_tags.py | 46 + files_widget/urls.py | 12 + files_widget/utils.py | 5 + files_widget/views.py | 71 + manage.py | 22 + templates/admin/change_form.html | 6 + 157 files changed, 14503 insertions(+) create mode 100644 .gitignore create mode 100644 AuthApp/__init__.py create mode 100644 AuthApp/admin.py create mode 100644 AuthApp/api/__init__.py create mode 100644 AuthApp/api/api_1C_views.py create mode 100644 AuthApp/api/api_permissions.py create mode 100644 AuthApp/api/api_urls.py create mode 100644 AuthApp/api/api_views.py create mode 100644 AuthApp/api/import_1C_data.py create mode 100644 AuthApp/api/init_api.py create mode 100644 AuthApp/api/serializers.py create mode 100644 AuthApp/api/v1/permissions/personal_api_permissions.py create mode 100644 AuthApp/api/v1/user/user_api_serializars.py create mode 100644 AuthApp/api/v1/user/user_api_views.py create mode 100644 AuthApp/forms.py create mode 100644 AuthApp/funcs.py create mode 100644 AuthApp/migrations/0001_initial.py create mode 100644 AuthApp/migrations/0002_userprofile_answer_success_count_userprofile_balance_and_more.py create mode 100644 AuthApp/migrations/__init__.py create mode 100644 AuthApp/models.py create mode 100644 AuthApp/stat_funcs.py create mode 100644 AuthApp/tests.py create mode 100644 AuthApp/urls.py create mode 100644 AuthApp/views.py create mode 100644 BaseModels/SMS_sender.py create mode 100644 BaseModels/__init__.py create mode 100644 BaseModels/admin_utils.py create mode 100644 BaseModels/api/__init__.py create mode 100644 BaseModels/api/api_export_xls.py create mode 100644 BaseModels/api/api_inter.py create mode 100644 BaseModels/api/api_middlewares.py create mode 100644 BaseModels/api/base_api_parsers.py create mode 100644 BaseModels/api/base_api_permissions.py create mode 100644 BaseModels/api/base_api_serializers.py create mode 100644 BaseModels/api/base_api_views.py create mode 100644 BaseModels/base_models.py create mode 100644 BaseModels/colors/generate_colors.py create mode 100644 BaseModels/currency_exchange/__init__.py create mode 100644 BaseModels/currency_exchange/alfabank_api/alfabank_api_funcs.py create mode 100644 BaseModels/currency_exchange/funcs.py create mode 100644 BaseModels/currency_exchange/nbrb/__init__.py create mode 100644 BaseModels/currency_exchange/nbrb/nbrb_currency_exchange.py create mode 100644 BaseModels/decorators.py create mode 100644 BaseModels/error_processing.py create mode 100644 BaseModels/functions.py create mode 100644 BaseModels/inter.py create mode 100644 BaseModels/json_funcs.py create mode 100644 BaseModels/log/log_funcs.py create mode 100644 BaseModels/logging_change_data.py create mode 100644 BaseModels/mailSender.py create mode 100644 BaseModels/messages.py create mode 100644 BaseModels/middlewares/web_requests_middleware.py create mode 100644 BaseModels/office_documents_utils.py create mode 100644 BaseModels/paging.py create mode 100644 BaseModels/pil_graphic_utils.py create mode 100644 BaseModels/search_funcs.py create mode 100644 BaseModels/search_optimization/OEMBED/OEMBED_data.py create mode 100644 BaseModels/search_optimization/RSS/ya_RSS_chanel.py create mode 100644 BaseModels/search_optimization/__init__.py create mode 100644 BaseModels/search_optimization/google_AMP/AMP.py create mode 100644 BaseModels/search_optimization/google_AMP/web_story_code.py create mode 100644 BaseModels/search_optimization/google_tips create mode 100644 BaseModels/search_optimization/ld_json/__init__.py create mode 100644 BaseModels/search_optimization/ld_json/ld_ speakebale.py create mode 100644 BaseModels/search_optimization/ld_json/ld_FAQ.py create mode 100644 BaseModels/search_optimization/ld_json/ld_QA.py create mode 100644 BaseModels/search_optimization/ld_json/ld_article_news.py create mode 100644 BaseModels/search_optimization/ld_json/ld_breadcrambs.py create mode 100644 BaseModels/search_optimization/ld_json/ld_company.py create mode 100644 BaseModels/search_optimization/ld_json/ld_media_video_object.py create mode 100644 BaseModels/search_optimization/ld_json/ld_product.py create mode 100644 BaseModels/search_optimization/ld_json/ld_search.py create mode 100644 BaseModels/search_optimization/ld_json/ld_vacancy.py create mode 100644 BaseModels/search_optimization/ya_YML/ya_YML.py create mode 100644 BaseModels/search_optimization/ya_tips create mode 100644 BaseModels/seo_text_generators.py create mode 100644 BaseModels/templates/m_show_message.html create mode 100644 BaseModels/templatetags/__init__.py create mode 100644 BaseModels/templatetags/base_tags_extra.py create mode 100644 FirePlayProj/__init__.py create mode 100644 FirePlayProj/asgi.py create mode 100644 FirePlayProj/settings.py create mode 100644 FirePlayProj/urls.py create mode 100644 FirePlayProj/wsgi.py create mode 100644 GameApp/__init__.py create mode 100644 GameApp/admin.py create mode 100644 GameApp/apps.py create mode 100644 GameApp/migrations/0001_initial.py create mode 100644 GameApp/migrations/0002_alter_questioningameforuser_options_and_more.py create mode 100644 GameApp/migrations/__init__.py create mode 100644 GameApp/models.py create mode 100644 GameApp/tests.py create mode 100644 GameApp/views.py create mode 100644 QuestionsApp/__init__.py create mode 100644 QuestionsApp/admin.py create mode 100644 QuestionsApp/apps.py create mode 100644 QuestionsApp/migrations/0001_initial.py create mode 100644 QuestionsApp/migrations/__init__.py create mode 100644 QuestionsApp/models.py create mode 100644 QuestionsApp/tests.py create mode 100644 QuestionsApp/views.py create mode 100644 files_widget/__init__.py create mode 100644 files_widget/admin.py create mode 100644 files_widget/conf.py create mode 100644 files_widget/controllers.py create mode 100644 files_widget/fields.py create mode 100644 files_widget/files.py create mode 100644 files_widget/forms/__init__.py create mode 100644 files_widget/forms/fields.py create mode 100644 files_widget/forms/widgets.py create mode 100644 files_widget/locale/ko/LC_MESSAGES/django.po create mode 100644 files_widget/locale/zh_Hans/LC_MESSAGES/django.po create mode 100644 files_widget/migrations/0001_initial.py create mode 100644 files_widget/migrations/0002_auto_20221111_1837.py create mode 100644 files_widget/migrations/__init__.py create mode 100644 files_widget/models.py create mode 100644 files_widget/static/docs/img/admin-images-widget-drop.jpg create mode 100644 files_widget/static/docs/img/admin-images-widget-drop.png create mode 100644 files_widget/static/docs/img/admin-images-widget-progress.jpg create mode 100644 files_widget/static/docs/img/admin-images-widget-progress.png create mode 100644 files_widget/static/files_widget/css/widgets.css create mode 100644 files_widget/static/files_widget/img/blue_line.jpg create mode 100644 files_widget/static/files_widget/img/button_template.png create mode 100644 files_widget/static/files_widget/img/close_button.png create mode 100644 files_widget/static/files_widget/img/done.png create mode 100644 files_widget/static/files_widget/img/enlarge_button.png create mode 100644 files_widget/static/files_widget/img/file-icons/archive.png create mode 100644 files_widget/static/files_widget/img/file-icons/audio.png create mode 100644 files_widget/static/files_widget/img/file-icons/blank.png create mode 100644 files_widget/static/files_widget/img/file-icons/code.png create mode 100644 files_widget/static/files_widget/img/file-icons/executable.png create mode 100644 files_widget/static/files_widget/img/file-icons/file_icon.png create mode 100644 files_widget/static/files_widget/img/file-icons/image.png create mode 100644 files_widget/static/files_widget/img/file-icons/settings.png create mode 100644 files_widget/static/files_widget/img/file-icons/text.png create mode 100644 files_widget/static/files_widget/img/file-icons/typography.png create mode 100644 files_widget/static/files_widget/img/file-icons/video.png create mode 100644 files_widget/static/files_widget/img/transparent-bg.gif create mode 100644 files_widget/static/files_widget/js/jquery.fileupload-angular.js create mode 100644 files_widget/static/files_widget/js/jquery.fileupload-process.js create mode 100644 files_widget/static/files_widget/js/jquery.fileupload-resize.js create mode 100644 files_widget/static/files_widget/js/jquery.fileupload-ui.js create mode 100644 files_widget/static/files_widget/js/jquery.fileupload-validate.js create mode 100644 files_widget/static/files_widget/js/jquery.fileupload.js create mode 100644 files_widget/static/files_widget/js/jquery.iframe-transport.js create mode 100644 files_widget/static/files_widget/js/widgets.js create mode 100644 files_widget/templates/files_widget/files_widget.html create mode 100644 files_widget/templates/files_widget/images_widget.html create mode 100644 files_widget/templates/files_widget/includes/file.html create mode 100644 files_widget/templates/files_widget/includes/thumbnail.html create mode 100644 files_widget/templatetags/__init__.py create mode 100644 files_widget/templatetags/files_widget_tags.py create mode 100644 files_widget/urls.py create mode 100644 files_widget/utils.py create mode 100644 files_widget/views.py create mode 100644 manage.py create mode 100644 templates/admin/change_form.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6887489 --- /dev/null +++ b/.gitignore @@ -0,0 +1,415 @@ +### JetBrains+all template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +.idea/ + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Django template +*.log +*.pot +*.pyc +__pycache__/ +local_settings.py +db.sqlite3 +db.sqlite3-journal +media + +# If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ +# in your Git repository. Update and uncomment the following line accordingly. +# /staticfiles/ + +### JetBrains+iml template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + diff --git a/AuthApp/__init__.py b/AuthApp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AuthApp/admin.py b/AuthApp/admin.py new file mode 100644 index 0000000..6570857 --- /dev/null +++ b/AuthApp/admin.py @@ -0,0 +1,253 @@ +# coding=utf-8 +from django.contrib import admin +from django.contrib.auth.admin import UserAdmin +from BaseModels.admin_utils import * +from django.contrib.auth.models import User +from django.utils.translation import gettext_lazy as _ + +from AuthApp.models import * + +from django.contrib.auth.models import Group +from django.db import models +from django.contrib.admin.models import LogEntry + +from django.db.models import F, Value as V +from django.db.models.functions import Concat + +from django.contrib.auth.admin import GroupAdmin as BaseGroupAdmin +from django.contrib.auth.models import Group +from django.contrib.admin import SimpleListFilter + + +class LogEntryAdmin(admin.ModelAdmin): + # pass + list_display = ( + '__str__', 'action_time', 'user', 'content_type', 'object_id', 'object_repr', 'action_flag', 'change_message') + list_filter = ('content_type', 'action_flag') + search_fields = ['user__username', 'change_message', 'object_id', 'object_repr'] + date_hierarchy = 'action_time' + + def has_delete_permission(self, request, obj=None): + return False + + +admin.site.register(LogEntry, LogEntryAdmin) + +# class Admin_ProfileInline(admin.StackedInline): + # fieldsets = ( + # (None, { + # 'classes': ['wide'], + # 'fields': ( + # ('enable',), + # ('regions',), + # ('company_obj', 'office', 'company_position', 'departament'), + # ('delivery_address'), + # ('discount',), + # ('work_start_D', 'work_finish_D'), + # ('days_to_order_cancellation_default', 'days_to_pay_default', 'pay_terms'), + # ('authMailCode', 'document_sign_person'), + # ('birthdate'), + # 'comment', 'creator' + # ) + # }), + # ('Дополнительно', { + # 'classes': ['wide'], + # 'fields': ( + # ('connected_mailings',), + # ('mailing_sets', 'json_data', 'sync_data') + # ) + # }), + # ('1С', { + # 'classes': ['wide'], + # 'fields': ( + # ('id_1s', 'name',), + # ) + # }), + # ) + # + # model = UserProfile + # can_delete = False + # extra = 1 + # fk_name = 'user' + # + # filter_horizontal = ['regions', 'connected_mailings'] + # raw_id_fields = ("company_obj", 'office') + # verbose_name_plural = _(u'Профиль пользователя') + # + # list_display = ['company_obj', 'office', 'company_position', 'departament', 'creator'] + # readonly_fields = ['creator', ] + + + + + +# Define a new User admin +class Admin_User(UserAdmin): + pass + # def user_groups(self, obj): + # return ' \ '.join(obj.groups.all().values_list('name', flat=True)) + # + # user_groups.short_description = u'Группы' + # + # def last_web_request(self, obj): + # return obj.user_profile.last_web_request + # + # last_web_request.short_description = u'Последний запрос' + + # def profile_enable(self, obj): + # if obj.user_profile.enable: + # return '+' + # else: + # return '-' + # + # profile_enable.short_description = u'Включен' + + # fieldsets = ( + # (None, { + # 'classes': ['wide'], + # 'fields': ( + # ('username', 'password'), + # ('first_name', 'last_name', 'email'), + # ('is_active', 'is_staff', 'is_superuser'), + # ('groups', 'user_permissions'), + # ('last_login', 'date_joined'), + # # ('username', 'first_name', 'last_name'), + # # ('password'), + # # ('email', 'is_active'), + # # ('is_staff') + # ) + # }), + # + # ) + + save_on_top = True + + # list_display = ['id', 'profile_enable', 'last_name', 'first_name', 'email', 'last_web_request', 'is_staff', + # 'is_active', 'user_groups'] + # list_editable = ['is_staff', 'is_active'] + # list_display_links = ['first_name', 'last_name', 'email'] + # search_fields = ['first_name', 'last_name', 'email'] + # + # inlines = (Admin_ProfileInline,) + # actions = ['del_all_temp_users', ] + # + # ordering = ['is_staff', 'last_name', 'first_name'] + # + # def del_all_temp_users(modeladmin, request, queryset): + # queryset.filter(mipp_user__temporary_user=True).delete() + # + # del_all_temp_users.short_description = _(u'Удалить всех временных пользователей') + + +# Re-register UserAdmin +admin.site.unregister(User) +admin.site.register(User, Admin_User) + + +class Admin_UserProfile(Admin_BaseIconModel): + pass + # def get_list_filter(self, request): + # res = super(Admin_UserProfile, self).get_list_filter(request) + # user_groups = request.user.groups.all().values_list('name', flat=True) + # if request.user.is_superuser or 'Отдел продаж: Начальник отдела продаж' in user_groups or 'Маркетинг: Маркетолог' in user_groups: + # return res + # + # return [] + # + # def get_queryset(self, request): + # user_groups = request.user.groups.all().values_list('name', flat=True) + # if request.user.is_superuser or 'Отдел продаж: Начальник отдела продаж' in user_groups or 'Маркетинг: Маркетолог' in user_groups: + # return UserProfile.objects.all() + # + # companies_ids = request.user.companies_for_manager.all().values_list('id', flat=True) + # queryset = UserProfile.objects.filter( + # company_obj__id__in=companies_ids + # # ).annotate( + # # lead_source = F('company_obj__lead_source') + # ) + # return queryset + # + # def get_list_display_links(self, request, list_display): + # res = super(Admin_UserProfile, self).get_list_display_links(request, list_display) + # if not request.user.is_superuser: # and not request.user.has_perm('AuthApp.change_userprofile'): + # return None + # return res + # + # def get_changelist_instance(self, request): + # if not request.user.is_superuser: # and not request.user.has_perm('AuthApp.change_userprofile'): + # self.list_editable = ['birthdate'] + # return super(Admin_UserProfile, self).get_changelist_instance(request) + # + # def user_name(self, obj): + # return '{0} {1}'.format(obj.user.last_name, obj.user.first_name) + # + # user_name.short_description = u'Имя' + # + # def lead_source(self, obj): + # res = None + # if obj.company_obj: + # res = obj.company_obj.lead_source + # if not res: + # res = '-' + # else: + # res = obj.company_obj.get_lead_source_display() + # return res + # + # lead_source.short_description = 'Источник' + # lead_source.admin_order_field = 'company_obj__lead_source' + # + # def manager(self, obj): + # if not obj.company_obj or not obj.company_obj.manager_obj: + # return '-' + # + # return '{0}'.format(obj.company_obj.manager_obj.get_full_name()) + # + # manager.short_description = u'Менеджер' + # + # fieldsets = ( + # (None, { + # 'classes': ['wide'], + # 'fields': ( + # 'user', 'enable', 'account_type', + # ('discount',), + # ('work_start_D', 'work_finish_D'), + # ('company_obj', 'company', 'office', 'company_position', 'departament'), + # ('delivery_address'), + # ('days_to_order_cancellation_default', 'days_to_pay_default', 'pay_terms'), + # ('authMailCode', 'document_sign_person'), + # ('birthdate'), + # ('connected_mailings',), + # 'creator' + # ) + # }), + # ('1С', { + # 'classes': ['wide'], + # 'fields': ( + # ('id_1s', 'name',), + # ) + # }), + # ) + # + # save_on_top = True + # + # list_display = [ + # # 'user__last_name', 'user__first_name', 'user__email', 'user__is_staff', 'user__is_active', + # 'id', 'user_name', 'user', 'enable', 'birthdate', 'lead_source', 'manager', + # 'company_obj', 'office', 'company_position', 'departament', 'account_type', 'modifiedDT', 'createDT' + # ] + # list_editable = ['enable', 'birthdate'] + # list_display_links = ['id', ] # 'user__last_name', 'user__first_name'] + # search_fields = [ + # 'id', 'user__last_name', 'user__first_name', 'user__email', 'company_obj__name', 'company_position', + # 'departament', + # 'company_obj', 'company_obj__manager_obj' + # ] # 'user__last_name', 'user__first_name', 'user__email'] + # + # list_filter = ['company_obj__lead_source', ManagersFilter, 'account_type'] + # + # filter_horizontal = ['connected_mailings'] + # # raw_id_fields = ("favourites",) + # verbose_name_plural = _(u'Профиль пользователя') + + +admin.site.register(UserProfile, Admin_UserProfile) diff --git a/AuthApp/api/__init__.py b/AuthApp/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AuthApp/api/api_1C_views.py b/AuthApp/api/api_1C_views.py new file mode 100644 index 0000000..5892f21 --- /dev/null +++ b/AuthApp/api/api_1C_views.py @@ -0,0 +1,88 @@ +# coding=utf-8 +from BaseModels.api.base_api_views import * +from ..models import * +from rest_framework.response import Response +from BaseModels.mailSender import techSendMail +import json +from BaseModels.api.base_api_permissions import * +from datetime import datetime +import re +from rest_framework import status +from BaseModels.api.base_api_serializers import Import_Pocket_Srializer + + + +class Managers_1C_get_timestamp(APIBaseSimplaClass): + + permission_classes = (api_1C_perm,) + serializer_class = Import_Pocket_Srializer + + def get(self, request): + from GeneralApp.views import get_timestamp_by_property_item_name + + property_item_name = u'1S_managers' + + last_timestamp = get_timestamp_by_property_item_name(property_item_name) + + return Response({ + 'property_item_name' : property_item_name, + 'timestamp' : last_timestamp + }) + + +class Managers_1C_import(APIBaseSimplaClass): + + # authentication_classes = (authentication.TokenAuthentication,) + permission_classes = (api_1C_perm,) + serializer_class = Import_Pocket_Srializer + + def post(self, request, format=None): + """ + import 1C companies data + """ + + log = '' + res = '' + + try: + + data = request.data + + if not data: + msg = 'нет данных в пакете' + res_Dict = { + 'status': 'error', + 'error': msg + } + return Response(res_Dict, status=status.HTTP_400_BAD_REQUEST) + + + from .import_1C_data import import_1C_pocket + res = import_1C_pocket(data) + + res_Dict = { + 'status': 'finished', + 'log': log + } + res_Dict.update(res) + + return Response(res_Dict) + + except Exception as e: + len_data = 0 + if request.data: + len_data = len(request.data) + title = 'ОШИБКА tE Managers_1C_import' + msg = 'Managers_1C_import Error = {0}({1})
lenght data = {2}
log...
{3}'.format( + str(e), str(e.args), str(len_data), str(res) + ) + from BaseModels.mailSender import techSendMail_for_specified_email_list + from tEDataProj.inter import problem_solvers_personal_1S + techSendMail_for_specified_email_list(msg, problem_solvers_personal_1S, title=title) + + res_Dict = { + 'status': 'error', + 'error': str(e) + } + + return Response(res_Dict, status=status.HTTP_400_BAD_REQUEST) \ No newline at end of file diff --git a/AuthApp/api/api_permissions.py b/AuthApp/api/api_permissions.py new file mode 100644 index 0000000..5c000e9 --- /dev/null +++ b/AuthApp/api/api_permissions.py @@ -0,0 +1,76 @@ +# coding=utf-8 +from rest_framework.permissions import BasePermission +from rest_framework.exceptions import PermissionDenied +from tEDataProj.inter import check_user_key_inter + + +class Auth_API_perms(BasePermission): + """ + Allows access only users w full access. + """ + + def has_permission(self, request, view): + + if not request.user or request.user.is_anonymous or not request.user.is_active: + return False + + # auth_data = request.query_params + # if not check_user_key_inter(auth_data): + # raise PermissionDenied(code=403) + + user = request.user + groups = user.groups.all() + + groups_name_list = groups.values_list('name', flat=True) + + if u'API 1С импорт' in groups_name_list: + return False + + if view.basename == u'user': + # if view.action in ('get_subordinate_staff',): + # return True + + if view.action in ( + 'get_sales_department_staff',) and u'Отдел продаж: Начальник отдела продаж' in groups_name_list: + return True + + if view.action in ('create',): + perm = user.has_perm('AuthApp.UI_managers_create') + return perm + + if view.action in ('update', 'partial_update', 'add_communication_item'): + perm = user.has_perm('AuthApp.UI_managers_modify') + return perm + + if view.action in ('destroy',): + perm = user.has_perm('AuthApp.UI_managers_delete') + return perm + + if view.action in ( + 'retrieve', 'list', 'list_by_company_id', 'list_by_office_id', 'get_subordinate_staff', + 'get_all_staff'): + perm = user.has_perm('AuthApp.UI_managers_retrieve') + return perm + + if view.action in ('get_sales_stat_by_productid', 'stat_list'): + perm = user.has_perm('AuthApp.UI_managers_all_stat') or user.has_perm('AuthApp.UI_managers_self_stat') + return perm + + # if view.basename == u'userprofile': + # + # if view.action in ('create',): + # perm = user.has_perm('AuthApp.add_userprofile') + # return perm + # + # if view.action in ('update', 'partial_update'): + # perm = user.has_perm('AuthApp.change_userprofile') + # return perm + # + # if view.action in ('destroy',): + # perm = user.has_perm('AuthApp.delete_userprofile') + # return perm + # + # if view.action in ('retrieve', 'list'): + # return True + + return False diff --git a/AuthApp/api/api_urls.py b/AuthApp/api/api_urls.py new file mode 100644 index 0000000..dde2c0a --- /dev/null +++ b/AuthApp/api/api_urls.py @@ -0,0 +1,17 @@ +from django.conf.urls import url, include +# from .api_views import * +from rest_framework import routers +from .api_1C_views import * +from .v1.user.user_api_views import * + +router = routers.SimpleRouter() +# router.register(r'user', UserProfile_ViewSet) +# router.register(r'client_person', Client_Person_ViewSet) +router.register(r'v1/managers', v1_Managers_ViewSet) +router.register(r'v1/personal', v1_Personal_ViewSet) + +urlpatterns = router.urls + [ + url(r'^1c/import_managers_data$', Managers_1C_import.as_view()), + # url(r'^1c/managers_import_1C_pocket_from_file$', ), + url(r'^1c/import_managers/get_last_timestamp$', Managers_1C_get_timestamp.as_view()), +] \ No newline at end of file diff --git a/AuthApp/api/api_views.py b/AuthApp/api/api_views.py new file mode 100644 index 0000000..06e606d --- /dev/null +++ b/AuthApp/api/api_views.py @@ -0,0 +1,94 @@ +# coding=utf-8 +from BaseModels.api.base_api_views import * +from AuthApp.models import * +from .serializers import * +from .api_permissions import * +from rest_framework.decorators import action + + + +def get_buttons_states_Dict(user): + + Dict = { + 'managers_menu': user.has_perm('AuthApp.UI_managers_show'), + 'managers_add_but': user.has_perm('AuthApp.UI_managers_create'), + 'managers_change_but': user.has_perm('AuthApp.UI_managers_modify'), + 'managers_delete_but': user.has_perm('AuthApp.UI_managers_delete'), + + 'admin_group_menu': user.has_perm('AuthApp.UI_adminGroup_show'), #показываем в меню группу Администрирование + 'personal_show': user.has_perm('AuthApp.UI_personal_show'), #показываем в группе Администрирование пункт Персонал + } + + return Dict + + + +class Client_Person_ViewSet(APIViewSet_ModelClass): + queryset = UserProfile.objects.filter(user__is_staff=False) + serializer_class = UserProfile_Serializer + permission_classes = (Auth_API_perms,) + + def get_serializer_class(self): + + try: + if self.action == 'retrieve': + return UserProfile_Serializer + + except (KeyError, AttributeError): + pass + + return super(Client_Person_ViewSet, self).get_serializer_class() + + + + +class Staff_Person_ViewSet(APIViewSet_ModelClass): + queryset = UserProfile.objects.filter(user__is_staff=True) + serializer_class = UserProfile_Serializer + permission_classes = (Auth_API_perms,) + + def get_serializer_class(self): + + try: + if self.action == 'retrieve': + return UserProfile_Serializer + + except (KeyError, AttributeError): + pass + + return super(Staff_Person_ViewSet, self).get_serializer_class() + + + +class UserProfile_ViewSet(APIViewSet_ModelClass): + queryset = UserProfile.objects.all() + serializer_class = UserProfile_Serializer + permission_classes = (Auth_API_perms,) + + def get_serializer_class(self): + + try: + if self.action == 'retrieve': + return UserProfile_Serializer + + except (KeyError, AttributeError): + pass + + return super(UserProfile_ViewSet, self).get_serializer_class() + + # @action(methods=['GET'], detail=True) + # def get_current_order(self, request, pk): + # from B2BApp.models import Order + # from B2BApp.api.serializers import B2B_Order_serializer + # + # try: + # from B2BApp.views import get_waiting_order_or_create_new + # order = get_waiting_order_or_create_new(request, pk) + # except Order.DoesNotExist: + # raise serializers.ValidationError( + # u'Ошибка, функция недоступна' + # ) + # + # order_data = B2B_Order_serializer(order) + # + # return Response(order_data.data) \ No newline at end of file diff --git a/AuthApp/api/import_1C_data.py b/AuthApp/api/import_1C_data.py new file mode 100644 index 0000000..d4ca1ec --- /dev/null +++ b/AuthApp/api/import_1C_data.py @@ -0,0 +1,194 @@ +# coding=utf-8 +from BaseModels.mailSender import techSendMail + +from ..models import * +from datetime import date, datetime +from GeneralApp.views import get_timestamp_by_property_item_name, set_timestamp_by_propertiy_item_name +from BaseModels.error_processing import * +from uuid import uuid1 +from GeneralApp.temp_data_funcs import add_tmp_data, del_tmp_data_by_obj + +def avg(val): + """uses floating-point division.""" + return sum(val) / float(len(val)) + + +from django.http import HttpResponse +import json + +def import_1C_pocket_from_file(request): + + if not request.user.is_superuser: + return HttpResponse(u'import_1C_pocket_from_file PERMISSION FAIL') + + try: + f = open('companies_1s.txt') + data = f.read() + except: + return HttpResponse(u'import_1C_pocket_from_file READ FILE FAIL') + + import re + data = re.sub(r'[\r\n\t]', ' ', data) + data = re.sub(r'\s+', ' ', data) + + request_data = data + + data = json.loads(request_data) + + import_1C_pocket(data) + + return HttpResponse(u'import_1C_pocket_from_file Accept') + + +def import_1C_pocket(json_data): + + + log = '' + log_begin_DT = datetime.now() + msg = 'import_1C_pocket MANAGERS start - {0}
---------------

'.format(str(log_begin_DT)) + log = '{0}
{1}'.format(log, msg) + + try: + data = json_data['data_list'] + timestamp = json_data['timestamp'] + msg = str(timestamp) + log = '{0}
{1}'.format(log, msg) + + # dt = datetime.fromtimestamp(timestamp) + + saved_timestamp = get_timestamp_by_property_item_name('1S_managers') + + if saved_timestamp and saved_timestamp >= timestamp: + # generate_error(f, u'import_1S_companies', u'1S_companies пакет устарел, импорт не был произведен', u'') + msg = '!!!!! --- 1S_managers пакет устарел, импорт не был произведен' + print(msg) + return {u'result': u'1S_managers пакет устарел, импорт не был произведен', 'error': 304} + set_timestamp_by_propertiy_item_name('1S_managers', timestamp) + except: + data = json_data + + # сохраняем данные для импорта временно в БД + tmp_data = add_tmp_data(data_type='import_proc', data_target='managers_1s_import', data=data) + + + for item in data: + # print(str(item)) + # break + + json_item = json.dumps(item, ensure_ascii=False) + + try: + if not u'id' in item: + # generate_error(f, u'import_1S_companies', u'1S_companies ID отсутствует в экзепляре данных', json_item) + msg = '!!!!! --- 1S_managers ID отсутствует в экзепляре данных' + log = '{0}
{1}'.format(log, msg) + return { + u'result': msg, + u'error': 400, + + } + + msg = '{0} - {1}'.format(item[u'id'], item[u'name']) + log = '{0}
{1}'.format(log, msg) + + user_profiles = UserProfile.objects.filter(id_1s=item[u'id']) + + + kwargs = { + 'name' : item[u'name'].replace(u"'", '"'), + 'id_1s' : item[u'id'], + 'company_position' : item[u'position'], + 'departament': str(item[u'subdiv']), + } + + work_start_D = item[u'datein'].replace(u" ", '') + if len(work_start_D) > 9: + work_start_D = datetime.strptime(work_start_D, "%d.%m.%Y") + kwargs.update({'work_start_D' : work_start_D}) + + work_finish_D = item[u'dateout'].replace(u" ", '') + if len(work_finish_D) > 9: + work_finish_D = datetime.strptime(work_finish_D, "%d.%m.%Y") + kwargs.update({'work_finish_D': work_finish_D}) + + birthday = item[u'birthday'].replace(u" ", '') + if len(birthday) > 9: + birthday = datetime.strptime(birthday, "%d.%m.%Y") + kwargs.update({'birthdate': birthday}) + + + + user = None + u_profile = None + if user_profiles: + user_profiles.update(**kwargs) + u_profile = user_profiles[0] + msg = ' - ОБНОВЛЕНИЕ данных МЕНЕДЖЕРА - {0}'.format(str(u_profile.__dict__)) + user = u_profile.user + + if not user: + username = str(item[u'id']) + mail = '{0}@truenergy.by'.format(str(item[u'id'])) + password = user_id = str(uuid1().hex)[:10] + user = User.objects.create_user(username=username, email=mail, password=password) + user.is_staff = True + user.is_active = True + user.is_superuser = False + user.set_password(password) + user.save() + + kwargs.update({'user': user}) + + user_profiles = UserProfile.objects.filter(user=user) + user_profiles.update(**kwargs) + u_profile = user_profiles[0] + + msg = ' - СОЗДАНИЕ МЕНЕДЖЕРА - {0}'.format(str(u_profile.__dict__)) + + log = '{0}
{1}'.format(log, msg) + + msg = '' + if 'work_finish_D' in kwargs and user.is_active: + user.is_active = False + msg = ' - отключен доступ
' + name_list = item[u'name'].split(' ') + if len(name_list) > 1 and user.first_name != ' '.join(name_list[1:]): + user.first_name = ' '.join(name_list[1:]) + msg = ' - изменено имя
' + if len(name_list) > 0 and user.last_name != name_list[0]: + user.last_name = name_list[0] + msg = ' - изменена фамилия' + + if msg: + user.save() + log = '{0}
{1}'.format(log, msg) + + + + except Exception as e: + # generate_error(f, u'import_1S_companies', str(e), json_item) + msg = '!!!!! --- import_1C_pocket MANAGERS error={0}'.format(str(e)) + print(msg) + log = '{0}
{1}'.format(log, msg) + + # close_log_file(f, u'END import_1S_companies') + + # удаляем временные данные для импорта из БД + if tmp_data: + del_tmp_data_by_obj(tmp_data) + + msg = 'import_1C_package MANAGERS finish - {0} (processing time = {1}
---------------

'.format( + str(datetime.now()), + str(datetime.now() - log_begin_DT) + ) + log = '{0}
{1}'.format(log, msg) + + title = 'import_1C_pocket MANAGERS' + techSendMail(log, title) + + return { + u'result': log + } + + + diff --git a/AuthApp/api/init_api.py b/AuthApp/api/init_api.py new file mode 100644 index 0000000..b1cc1f2 --- /dev/null +++ b/AuthApp/api/init_api.py @@ -0,0 +1,26 @@ +from ..models import mail_list_types +from django.http import JsonResponse, Http404 + + +def init_API(request, get_Dict=False): + + # auth_data = request.GET + # if not check_user_key_inter(auth_data): + # raise exceptions.PermissionDenied() + + Dict = { + + } + + mail_list_types_Dict = {} + for item in mail_list_types: + mail_list_types_Dict.update({ + item[0] : item[1] + }) + Dict.update({'mail_list_types' : mail_list_types_Dict}) + + if get_Dict: + return Dict + + + return JsonResponse({'data': Dict}) \ No newline at end of file diff --git a/AuthApp/api/serializers.py b/AuthApp/api/serializers.py new file mode 100644 index 0000000..6fc9429 --- /dev/null +++ b/AuthApp/api/serializers.py @@ -0,0 +1,49 @@ +from rest_framework import serializers +from AuthApp.models import * + + +# Person + + +class client_UserProfile_Serializer(serializers.ModelSerializer): + + class Meta: + model = UserProfile + fields = ( + 'id', + # 'name', 'company', 'departament', 'company_position', 'phone', 'email', 'document_sign_person', + # 'days_to_order_cancellation_default', 'days_to_pay_default', 'pay_terms', 'discount', 'birthdate', + + ) + + +class staff_UserProfile_Serializer(serializers.ModelSerializer): + class Meta: + model = UserProfile + fields = ( + 'id', + # 'name', 'company', 'departament', 'company_position', 'phone', 'email', + # 'birthdate', + ) + + +class UserProfile_Serializer(serializers.ModelSerializer): + + class Meta: + model = UserProfile + fields = ( + 'id', + # 'name', 'company', 'departament', 'company_position', 'phone', 'email', 'document_sign_person', + # 'days_to_order_cancellation_default', 'days_to_pay_default', 'pay_terms', 'discount', 'birthdate', + ) + +class UserProfile_list_Serializer(serializers.ModelSerializer): + class Meta: + model = UserProfile + fields = ( + 'id', + # 'name' + ) + + +# ---------------------------------------- \ No newline at end of file diff --git a/AuthApp/api/v1/permissions/personal_api_permissions.py b/AuthApp/api/v1/permissions/personal_api_permissions.py new file mode 100644 index 0000000..efa44ea --- /dev/null +++ b/AuthApp/api/v1/permissions/personal_api_permissions.py @@ -0,0 +1,116 @@ +# coding=utf-8 +from rest_framework.permissions import BasePermission +from rest_framework.exceptions import PermissionDenied +from tEDataProj.inter import check_user_key_inter +from AuthApp.models import User + + +def check_of_user_is_manager_of_company(user, view): + if not 'pk' in view.kwargs: + return False + + try: + objs = User.objects.get( + user_profile__company_obj__manager_obj=user, + id=view.kwargs['pk'] + ) + except: + return False + + return objs + + +def check_of_user_is_company_staff(user, view): + if not 'pk' in view.kwargs: + return False + + try: + objs = User.objects.get( + user_profile__company_obj=user.user_profile.company_obj, + id=view.kwargs['pk'] + ) + except: + return False + + return objs + + +class Personal_API_perms(BasePermission): + """ + Allows access only users w full access. + """ + + def has_permission(self, request, view): + + if not request.user or request.user.is_anonymous or not request.user.is_active: + return False + + # auth_data = request.query_params + # if not check_user_key_inter(auth_data): + # raise PermissionDenied(code=403) + + user = request.user + groups = user.groups.all() + + groups_name_list = groups.values_list('name', flat=True) + + if u'API 1С импорт' in groups_name_list: + return False + + if view.basename == u'user': + + if view.action in ('create',): + perm = user.has_perm('AuthApp.UI_company_staff_create') + return perm + + if view.action in ( + 'update', 'partial_update', 'add_communication_item', 'get_connected_mailings', 'possible_mailings', + 'change_mailing_status'): + # perm = user.has_perm('AuthApp.UI_managers_modify') + # return perm + if not user.is_staff: + # персонал компании + if user.has_perm('AuthApp.UI_company_staff_modify_if_staff_company'): + return check_of_user_is_company_staff(user, view) + + return False + + # если персонал + else: + if check_of_user_is_manager_of_company(user, view) and user.has_perm( + 'AuthApp.UI_company_staff_modify_if_manager'): + return True + elif user.has_perm('AuthApp.UI_company_staff_modify_any'): + return True + + if view.action in ('destroy',): + perm = user.has_perm('AuthApp.UI_company_staff_delete') + return perm + + if view.action in ( + 'retrieve', 'list', 'list_by_company_id', 'list_by_office_id', + 'possible_departaments_list', 'possible_company_positions_list' + ): + perm = user.has_perm('AuthApp.UI_company_staff_retrieve_any_no_staff') + if not perm: + perm = user.has_perm('AuthApp.UI_company_staff_retrieve') + return perm + + # if view.basename == u'userprofile': + # + # if view.action in ('create',): + # perm = user.has_perm('AuthApp.add_userprofile') + # return perm + # + # if view.action in ('update', 'partial_update'): + # perm = user.has_perm('AuthApp.change_userprofile') + # return perm + # + # if view.action in ('destroy',): + # perm = user.has_perm('AuthApp.delete_userprofile') + # return perm + # + # if view.action in ('retrieve', 'list'): + # return True + + return False diff --git a/AuthApp/api/v1/user/user_api_serializars.py b/AuthApp/api/v1/user/user_api_serializars.py new file mode 100644 index 0000000..0d7d99d --- /dev/null +++ b/AuthApp/api/v1/user/user_api_serializars.py @@ -0,0 +1,124 @@ +from rest_framework import serializers +from ....models import * +from ....funcs import fullname_for_user + + +class Personal_change_mailing_status_Serializer(serializers.Serializer): + mailing_ID = serializers.IntegerField() + mailing_status = serializers.BooleanField() + + +class User_sync_Serializer(serializers.ModelSerializer): + id_1s = serializers.SerializerMethodField() + + def get_id_1s(self, obj): + return obj.user_profile.id_1s + + class Meta: + model = User + fields = ( + 'id_1s', + ) + + +class Profile_list_Serializer(serializers.ModelSerializer): + from GeneralApp.api.v1.communications.communications_api_serializers import Communications_create_Serializer + + office_name = serializers.SerializerMethodField(required=False) + company_name = serializers.SerializerMethodField(required=False) + manager_name = serializers.SerializerMethodField(required=False) + company_client_type = serializers.SerializerMethodField(required=False) + + communications = Communications_create_Serializer(many=True) + + def get_company_client_type(self, obj): + try: + if obj and obj.company_obj: + return obj.company_obj.client_type + else: + return None + except: + return None + + def get_office_name(self, obj): + try: + if obj and obj.office: + return obj.office.name + except: + return None + + return None + + def get_company_name(self, obj): + try: + if obj and obj.company_obj: + return obj.company_obj.name + except: + return None + + return None + + def get_manager_name(self, obj): + try: + if obj and obj.company_obj and obj.company_obj.manager_obj: + return '{0} {1}'.format(obj.company_obj.manager_obj.last_name, obj.company_obj.manager_obj.first_name) + except: + return None + + return None + + class Meta: + model = UserProfile + fields = ( + 'id', + 'enable', + 'company_obj', 'company_name', + 'company_position', 'company_client_type', + 'phone', + 'delivery_address', + 'office', 'office_name', + 'departament', + 'document_sign_person', + 'work_start_D', + 'work_finish_D', + 'birthdate', + 'comment', + 'communications', + 'priority_connect_type', + 'modifiedDT', + 'mailing_sets', + 'manager_name' + ) + + +class User_list_Serializer(serializers.ModelSerializer): + full_name = serializers.SerializerMethodField('get_full_name_user', required=False) + + # user_profile = Profile_list_Serializer() + + def get_full_name_user(self, obj): + name = fullname_for_user(obj) + if not name: + name = obj.email + return name + + class Meta: + model = User + fields = ( + 'id', 'full_name' + ) + + +class Personal_list_Serializer(User_list_Serializer): + user_profile = Profile_list_Serializer() + + class Meta: + model = User + fields = ( + 'id', 'full_name', 'first_name', 'last_name', 'is_active', 'is_staff', 'user_profile', 'email' + ) + extra_kwargs = { + 'email': {'required': 'False'}, + 'first_name': {'required': 'False'}, + 'last_name': {'required': 'False'}, + } diff --git a/AuthApp/api/v1/user/user_api_views.py b/AuthApp/api/v1/user/user_api_views.py new file mode 100644 index 0000000..f15e014 --- /dev/null +++ b/AuthApp/api/v1/user/user_api_views.py @@ -0,0 +1,1180 @@ +from BaseModels.api.base_api_views import * +from .user_api_serializars import * +from ...api_permissions import Auth_API_perms +from datetime import datetime +from rest_framework.decorators import action +from django.db.models import Sum, FloatField, F, Value as V, Q, Count +from django.db.models.functions import Concat +import json +from BaseModels.mailSender import techSendMail +from operator import itemgetter +from rest_framework import status +from CompaniesApp.models import Company, DeliveryData +from BaseModels.api.api_inter import check_and_get_specific_output_format +from django.contrib.contenttypes.models import ContentType +from ..permissions.personal_api_permissions import Personal_API_perms + +from B2BApp.funcs import pay_terms_for_report_list + + +def get_kwargs_by_get_query_params(request): + kwargs = {} + stat_kwargs = {} + + if not request.user.has_perm('AuthApp.UI_managers_all_stat'): + kwargs.update({'id': request.user.id}) + + if not request.query_params: + return kwargs, stat_kwargs + else: + + try: + + params = request.query_params + + for param_key, param_val in params.items(): + + if 'for_managers_stat_DT_from' == param_key: + # param_key = 'orders_for_manager__delivery_DT__gte' + param_key = 'delivery_DT__gte' + kwargs.update({ + param_key: datetime.strptime(param_val, '%Y-%m-%d %H:%M') + }) + elif 'for_managers_stat_DT_to' == param_key: + # param_key = 'orders_for_manager__delivery_DT__lte' + param_key = 'delivery_DT__lte' + kwargs.update({ + param_key: datetime.strptime(param_val, '%Y-%m-%d %H:%M') + }) + + elif '_D_from' in param_key: + param_key = param_key.replace('_from', '__gte') + kwargs.update({ + param_key: datetime.strptime(param_val, '%Y-%m-%d') + }) + elif '_D_to' in param_key: + param_key = param_key.replace('_to', '__lte') + kwargs.update({ + param_key: datetime.strptime(param_val, '%Y-%m-%d') + }) + + elif param_key == 'regions': + param_val = json.loads(param_val) + kwargs.update({ + 'company__region__in'.format(param_key): param_val + }) + + + elif 'rel_products_in_order_for_product__order__delivery_DT_from' in param_key: + + # param_key = 'orders_for_manager__delivery_DT__gte' + param_key = 'delivery_DT__gte' + + kwargs.update({ + + param_key: datetime.strptime(param_val, '%Y-%m-%d %H:%M') + + }) + + elif 'rel_products_in_order_for_product__order__delivery_DT_to' in param_key: + + param_key = 'orders_for_manager__delivery_DT__lte' + # param_key = 'delivery_DT__lte' + + kwargs.update({ + + param_key: datetime.strptime(param_val, '%Y-%m-%d %H:%M') + + }) + + # only_stat_kwargs + elif '_from' in param_key: + param_key = param_key.replace('_from', '__gte') + stat_kwargs.update({ + param_key: param_val + }) + elif '_to' in param_key: + param_key = param_key.replace('_to', '__lte') + stat_kwargs.update({ + param_key: param_val + }) + # --------------------- + + elif param_key in ('pay_terms', 'status'): + param_val = json.loads(param_val) + kwargs.update({ + '{0}__in'.format(param_key): param_val + }) + + elif param_key in ['manager_obj', '']: + kwargs.update({ + '{0}__id'.format(param_key): param_val + }) + + elif param_key in ['series_name']: + param_val = json.loads(param_val) + kwargs.update({ + # 'orders_for_manager__rel_products_in_order_for_order__product__product_series__id__in': param_val + 'rel_products_in_order_for_order__product__product_series__id__in': param_val + }) + + elif param_key in ['brand_name']: + param_val = json.loads(param_val) + kwargs.update({ + # 'orders_for_manager__rel_products_in_order_for_order__product__brand__id__in': param_val + 'rel_products_in_order_for_order__product__brand__id__in': param_val + }) + elif param_key == 'enable': + param_val = json.loads(param_val) + kwargs.update({ + # 'orders_for_manager__rel_products_in_order_for_order__product__enable': param_val + 'rel_products_in_order_for_order__product__enable': param_val + }) + + except Exception as e: + msg = 'Ошибка разбора параметров фильтра
{0}({1})
{2}'.format( + str(e), + str(e.args), + str(request.query_params) + ) + print(msg) + title = 'ОШИБКА tE AuthApp get_kwargs_by_get_query_params' + techSendMail(msg, title) + + return kwargs, stat_kwargs + + +def get_sales_for_managers_by_goods(user, objs, ord_kwargs, receipts_kwargs, stat_kwargs=None): + objs_ids = objs.values_list('id', flat=True) + objs_ids = list(objs_ids) + + from B2BApp.models import ProductInReceipt, ProductInOrder + from django.db.models import Sum, FloatField, F + + prod_in_orders = ProductInOrder.objects.filter( + order__status_shipment='shipped', + order__defective_goods=False, + order__manager_obj__id__in=objs_ids, + **ord_kwargs + # ).exclude( + # order__pay_terms='no_pay' + ) + + allow_values_in_orders = [ + 'id', 'sales_count', + # 'paid_sum', + 'order__manager_obj__id' + ] + + allow_values_in_receipts = [ + 'id', 'receipts_count', + 'receipt__company__manager_obj__id' + ] + + if user.has_perm('B2BApp.UI_show_summ_for_sales'): + allow_values_in_orders.append('sales_sum') + allow_values_in_receipts.append('receipts_sum') + + prod_in_orders = prod_in_orders.annotate( + sales_count=F('count'), + sales_sum=F('product_sum_byn'), + # paid_sum=F('order__paid_sum_byn') + ).values( + *allow_values_in_orders + ).order_by('order__manager_obj__id') + + prod_in_orders = list(prod_in_orders) + + prod_in_receipts = ProductInReceipt.objects.filter( + receipt__receipt_type='return', + receipt__company__manager_obj__id__in=objs_ids, + **receipts_kwargs + ) + + prod_in_receipts = prod_in_receipts.annotate( + receipts_count=Sum('count', + output_field=FloatField()), + receipts_sum=Sum('product_sum_byn'), + ).values( + *allow_values_in_receipts + ).order_by('receipt__company__manager_obj__id') + + prod_in_receipts = list(prod_in_receipts) + + objs = list(objs) + objs.sort(key=itemgetter('full_name'), reverse=False) + + objs_i = 0 + while objs_i < len(objs): + obj = objs[objs_i] + obj['sales_count'] = 0 + obj['sales_sum'] = 0 + # obj['paid_sum'] = 0 + i = 0 + while i < len(prod_in_orders): + if obj['id'] == prod_in_orders[i]['order__manager_obj__id']: + obj['sales_count'] += prod_in_orders[i]['sales_count'] + if 'sales_sum' in prod_in_orders[i]: + obj['sales_sum'] += prod_in_orders[i]['sales_sum'] + # obj['paid_sum'] += prod_in_orders[i]['paid_sum'] + del prod_in_orders[i] + # break + else: + i += 1 + + i = 0 + while i < len(prod_in_receipts): + if obj['id'] == prod_in_receipts[i]['receipt__company__manager_obj__id']: + obj['sales_count'] -= prod_in_receipts[i]['receipts_count'] + if 'receipts_sum' in prod_in_receipts[i]: + obj['sales_sum'] -= prod_in_receipts[i]['receipts_sum'] + + del prod_in_receipts[i] + # break + else: + i += 1 + + if stat_kwargs: + if stat_kwargs and 'sales_count__gte' in stat_kwargs and stat_kwargs['sales_count__gte'] and objs[objs_i][ + 'sales_count'] < float(stat_kwargs['sales_count__gte']): + del objs[objs_i] + elif stat_kwargs and 'sales_count__lte' in stat_kwargs and stat_kwargs['sales_count__lte'] and objs[objs_i][ + 'sales_count'] > float(stat_kwargs['sales_count__lte']): + del objs[objs_i] + elif stat_kwargs and 'sales_sum__gte' in stat_kwargs and stat_kwargs['sales_sum__gte'] and objs[objs_i][ + 'sales_sum'] < float(stat_kwargs['sales_sum__gte']): + del objs[objs_i] + elif stat_kwargs and 'sales_sum__lte' in stat_kwargs and stat_kwargs['sales_sum__lte'] and objs[objs_i][ + 'sales_sum'] > float(stat_kwargs['sales_sum__lte']): + del objs[objs_i] + + else: + objs[objs_i]['sales_count'] = round(objs[objs_i]['sales_count'], 2) + objs[objs_i]['sales_sum'] = round(objs[objs_i]['sales_sum'], 2) + + objs_i += 1 + else: + objs_i += 1 + + return objs + + +def get_sales_for_managers_by_orders(objs, ord_kwargs, receipts_kwargs, pay_kwargs, stat_kwargs=None): + from datetime import date, timedelta + from collections import OrderedDict + + chart_data_Dict = {} + + try: + + from_date = None + to_date = None + + objs_ids = objs.values_list('id', flat=True) + objs_ids = list(objs_ids) + + from B2BApp.models import Order, ReceiptDocument, Pay + orders = Order.objects.filter( + status_shipment='shipped', + defective_goods=False, + manager_obj__id__in=objs_ids, + **ord_kwargs + ) + + if orders: + from_date = orders.order_by('delivery_DT')[0].delivery_DT.date() + to_date = orders.order_by('-delivery_DT')[0].delivery_DT.date() + + orders = orders.annotate( + sales_count=Sum('rel_products_in_order_for_order__count', + output_field=FloatField()), + sales_sum=F('order_sum_byn'), + paid_sum=F('paid_sum_byn') + ).values( + 'id', 'sales_count', 'sales_sum', 'delivery_DT', + 'paid_sum', 'pay_type', + 'manager_obj__id', 'company__name' + ).order_by('manager_obj__id') + + orders = list(orders) + + receipts = ReceiptDocument.objects.filter( + receipt_type='return', + manager_obj__id__in=objs_ids, + **receipts_kwargs + ) + + if receipts: + from_date_tmp = receipts.order_by('receipt_D')[0].receipt_D + if not from_date or from_date_tmp < from_date: + from_date = from_date_tmp + to_date_tmp = receipts.order_by('-receipt_D')[0].receipt_D + if not to_date or to_date_tmp > to_date: + to_date = to_date_tmp + + receipts = receipts.annotate( + receipts_count=Sum('rel_products_in_receipt_for_receipt__count', + output_field=FloatField()), + receipts_sum=Sum('rel_products_in_receipt_for_receipt__product_sum_byn'), + ).values( + 'id', 'receipts_count', 'receipts_sum', 'manager_obj__id', 'pay_type', 'receipt_D' # , 'company__name' + ).order_by('manager_obj__id') + + receipts = list(receipts) + + pays = Pay.objects.filter( + manager__id__in=objs_ids, + **pay_kwargs + ) + + if pays: + from_date_tmp = pays.order_by('oper_D')[0].oper_D + if not from_date or from_date_tmp < from_date: + from_date = from_date_tmp + to_date_tmp = pays.order_by('-oper_D')[0].oper_D + if not to_date or to_date_tmp > to_date: + to_date = to_date_tmp + + pay_objs = pays.values( + 'id', 'oper_D', 'sum_pay_byn', 'manager__id', + 'shipment_doc__id', 'shipment_doc__rel_orders_for_documents', + 'shipment_doc__rel_orders_for_documents__manager_obj__id', + 'company__id', 'bank_doc_D' + ).order_by('oper_D', 'company__name') + # ).order_by('company__manager_obj__id', 'oper_D') + + pays = list(pay_objs) + + # from CompaniesApp.models import Document + # its = Pay.objects.filter(documents__id=30069) + + objs = list(objs) + objs.sort(key=itemgetter('full_name'), reverse=False) + + if from_date: + from_DT = from_date + else: + from_DT = date(year=2000, month=1, day=1) + + if to_date: + to_DT = to_date + timedelta(days=1) + else: + to_DT = datetime.now().date() + timedelta(days=1) + + chart_data_Dict = OrderedDict({ + str(from_DT + timedelta(n)): { + 'sales_count': 0, + 'sales_sum': 0, + 'paid_sum': 0, + 'paid_cash': 0, + 'paid_invoice': 0 + } for n in range(int((to_DT - from_DT).days) + 1) + }) + + total_pays_cash = 0 + total_pays_invoice = 0 + + objs_i = 0 + while objs_i < len(objs): + obj = objs[objs_i] + # if obj['id'] == 31: + # print('!') + + orders_items = [] + receipts_items = [] + pays_items = [] + obj['sales_count'] = 0 + obj['sales_sum'] = 0 + obj['paid_sum'] = 0 + obj['paid_cash'] = 0 + i = 0 + while i < len(orders): + if obj['id'] == orders[i]['manager_obj__id']: + if orders[i]['sales_count']: + obj['sales_count'] += orders[i]['sales_count'] + if orders[i]['sales_sum']: + obj['sales_sum'] += orders[i]['sales_sum'] + chart_data_Dict[str(orders[i]['delivery_DT'].date())]['sales_sum'] += round( + orders[i]['sales_sum'], 2) + if orders[i]['pay_type'] == 'cash' and orders[i]['paid_sum']: + obj['paid_cash'] += orders[i]['paid_sum'] + chart_data_Dict[str(orders[i]['delivery_DT'].date())]['paid_cash'] += round( + orders[i]['paid_sum'], 2) + chart_data_Dict[str(orders[i]['delivery_DT'].date())]['paid_sum'] += round( + orders[i]['paid_sum'], 2) + + orders_items.append(orders[i]) + + del orders[i] + + # break + else: + i += 1 + + i = 0 + while i < len(receipts): + if obj['id'] == receipts[i]['manager_obj__id']: + if receipts[i]['receipts_count']: + obj['sales_count'] -= receipts[i]['receipts_count'] + if receipts[i]['receipts_sum']: + obj['sales_sum'] -= receipts[i]['receipts_sum'] + chart_data_Dict[str(receipts[i]['receipt_D'])]['sales_sum'] -= round( + receipts[i]['receipts_sum'], 2) + receipts_items.append(receipts[i]) + + if receipts[i]['pay_type'] == 'cash': + if receipts[i]['receipts_sum']: + obj['paid_cash'] -= receipts[i]['receipts_sum'] + chart_data_Dict[str(receipts[i]['receipt_D'])]['paid_cash'] -= round( + receipts[i]['receipts_sum'], 2) + + chart_data_Dict[str(receipts[i]['receipt_D'])]['paid_sum'] -= round( + receipts[i]['receipts_sum'], 2) + + del receipts[i] + + # break + else: + i += 1 + + i = 0 + obj['paid_invoice'] = 0 + while i < len(pays): + + if obj['id'] == pays[i]['manager__id'] and pays[i]['sum_pay_byn']: + + # if pays[i]['id'] == 2879: + # print('!') + + obj['paid_invoice'] += pays[i]['sum_pay_byn'] + pays_items.append(pays[i]) + + chart_data_Dict[str(pays[i]['oper_D'])]['paid_invoice'] += round(pays[i]['sum_pay_byn'], 2) + chart_data_Dict[str(pays[i]['oper_D'])]['paid_sum'] += round(pays[i]['sum_pay_byn'], 2) + + del pays[i] + # elif obj['id'] == pays[i]['shipment_doc__rel_orders_for_documents__manager_obj__id']: + # obj['paid_sum'] += pays[i]['sum_pay_byn'] + # pays_items.append(pays[i]) + # del pays[i] + # break + else: + i += 1 + + if stat_kwargs: + if stat_kwargs and 'sales_count__gte' in stat_kwargs and stat_kwargs['sales_count__gte'] and \ + objs[objs_i][ + 'sales_count'] < float(stat_kwargs['sales_count__gte']): + del objs[objs_i] + elif stat_kwargs and 'sales_count__lte' in stat_kwargs and stat_kwargs['sales_count__lte'] and \ + objs[objs_i][ + 'sales_count'] > float(stat_kwargs['sales_count__lte']): + del objs[objs_i] + elif stat_kwargs and 'sales_sum__gte' in stat_kwargs and stat_kwargs['sales_sum__gte'] and objs[objs_i][ + 'sales_sum'] < float(stat_kwargs['sales_sum__gte']): + del objs[objs_i] + elif stat_kwargs and 'sales_sum__lte' in stat_kwargs and stat_kwargs['sales_sum__lte'] and objs[objs_i][ + 'sales_sum'] > float(stat_kwargs['sales_sum__lte']): + del objs[objs_i] + + else: + objs[objs_i]['sales_count'] = round(objs[objs_i]['sales_count'], 2) + objs[objs_i]['sales_sum'] = round(objs[objs_i]['sales_sum'], 2) + + objs_i += 1 + else: + objs_i += 1 + + obj['paid_sum'] = obj['paid_cash'] + obj['paid_invoice'] + + # obj['sales_count'] = round(obj['sales_count'], 2) + # obj['sales_sum'] = round(obj['sales_sum'], 2) + obj['paid_sum'] = round(obj['paid_sum'], 2) + + total_pays_cash += obj['paid_cash'] + total_pays_invoice += obj['paid_invoice'] + + # print('{0}. ord_count={1}, recepts_count={2}'.format(obj['full_name'], len(orders_items), len(receipts_items))) + + except Exception as e: + msg = 'Ошибка сбора статистики
{0}({1})'.format( + str(e), + str(e.args), + ) + print(msg) + title = 'ОШИБКА tE AuthApp get_sales_for_managers_by_orders' + techSendMail(msg, title) + + return objs, chart_data_Dict + + +class v1_Personal_ViewSet(APIViewSet_ModelClass): + queryset = User.objects.filter().order_by('last_name', 'first_name') + serializer_class = Personal_list_Serializer + permission_classes = (Personal_API_perms,) + + def get_serializer_class(self): + + try: + if self.action == 'list': + return Personal_list_Serializer + if self.action == 'add_communication_item': + from GeneralApp.api.v1.communications.communications_api_serializers import \ + Communications_create_Serializer + return Communications_create_Serializer + if self.action == 'retrieve': + return Personal_list_Serializer + if self.action == 'change_mailing_status': + return Personal_change_mailing_status_Serializer + + except (KeyError, AttributeError): + pass + + return super(v1_Personal_ViewSet, self).get_serializer_class() + + def get_queryset(self, *args, **kwargs): + + user = self.request.user + if not user or user.is_anonymous or not user.is_active: + return [] + + persons = super(v1_Personal_ViewSet, self).get_queryset() + persons = persons.exclude(is_superuser=True) + + if user.has_perm('AuthApp.UI_company_staff_modify_any') or user.has_perm( + 'AuthApp.UI_company_staff_retrieve_any_no_staff'): + return persons.filter(user_profile__enable=True) + elif user.has_perm('AuthApp.UI_company_staff_modify_if_manager'): + persons = persons.filter( + # user_profile__company_obj__manager_obj=user, + user_profile__enable=True + ) + return persons + elif user.has_perm('AuthApp.UI_company_staff_modify_if_staff_company'): + persons = persons.filter( + user_profile__company_obj=user.user_profile.company_obj, + user_profile__enable=True + ) + return persons + + return [] + + @action(methods=['GET'], detail=False) + def possible_departaments_list(self, request, *args, **kwargs): + + data_list = UserProfile.objects.exclude( + departament=None + ).exclude( + company_position='' + ).values_list('departament', flat=True).order_by('departament').distinct() + return Response(data_list) + + @action(methods=['PATCH'], detail=True) + def change_mailing_status(self, request, *args, **kwargs): + from MailingApp.models import Mailing + + obj = self.get_object() + + data = request.data + + res = obj.user_profile.change_mailing_status(data['mailing_ID'], data['mailing_status']) + + return Response(res) + + @action(methods=['GET'], detail=True) + def possible_mailings(self, request, *args, **kwargs): + from MailingApp.models import Mailing + + person = self.get_object() + + if not person or not person.user_profile or not person.user_profile.company_obj or \ + not person.user_profile.company_obj.manager_obj: + raise serializers.ValidationError( + u'user is not connected w company' + ) + + manager_of_person = person.user_profile.company_obj.manager_obj + + if manager_of_person != request.user: + from AuthApp.funcs import get_subordinate_staff + subordinate_users_for_cur_user = get_subordinate_staff(request.user) + if not manager_of_person in subordinate_users_for_cur_user: + raise serializers.ValidationError( + u'нет прав для доступа к управлению рассылкой' + ) + + mailings = request.user.user_profile.get_allow_mailings(for_user=person) + if mailings: + mailings = list( + mailings.values('id', 'name', 'enable', 'pass_weekends', 'last_send_DT', 'next_send_DT', 'creator__id', + 'creator_name')) + + connected_mailings_ids = person.user_profile.connected_mailings.all().values_list('id', flat=True) + + for mailing in mailings: + if mailing['id'] in connected_mailings_ids: + mailing['connected'] = True + else: + mailing['connected'] = False + + if mailing['next_send_DT']: + mailing['next_send_DT'] = str(mailing['next_send_DT']) + if mailing['last_send_DT']: + mailing['last_send_DT'] = str(mailing['last_send_DT']) + + return Response(mailings) + + @action(methods=['GET'], detail=False) + def possible_company_positions_list(self, request, *args, **kwargs): + + data_list = UserProfile.objects.exclude( + company_position=None + ).exclude( + company_position='' + ).values_list('company_position', flat=True).order_by('company_position').distinct() + return Response(data_list) + + @action(methods=['GET'], detail=True) + def get_connected_mailings(self, request, *args, **kwargs): + + obj = self.get_object() + data_list = obj.user_profile.get_connected_mailings().values('id', 'name', 'enable') + return Response(data_list) + + @action(methods=['POST'], detail=True) + def add_communication_item(self, request, *args, **kwargs): + + data = request.data + if not 'connection_name' in data or not 'connection_value' in data: + raise serializers.ValidationError( + u'Ошибка, недостаточно данных' + ) + + obj = self.get_object() + + from GeneralApp.views import create_communication_item + + ct = ContentType.objects.get_for_model(obj.user_profile) + res = create_communication_item(ct, obj.user_profile.id, data) + if 'error' in res: + raise serializers.ValidationError(res['error']) + + serializer = Personal_list_Serializer(obj) + + return Response(serializer.data) + + def list(self, request, *args, **kwargs): + + filter_kwargs, stat_kwargs = get_kwargs_by_get_query_params(request) + + res = check_and_get_specific_output_format(self, data=None, filename='personal_list.xlsx') + if res: + return res + + return super(v1_Personal_ViewSet, self).list(request, *args, **kwargs) + + @action(methods=['GET'], detail=True) + def list_by_company_id(self, request, *args, **kwargs): + if not kwargs or not 'pk' in kwargs: + raise serializers.ValidationError( + u'Ошибка, не указан id компании' + ) + + try: + company = Company.objects.get(id=kwargs['pk']) + except Company.DoesNotExist: + raise serializers.ValidationError( + u'Ошибка, неверный id компании' + ) + + personal_objs = self.get_queryset().filter(user_profile__company_obj=company) + serializer = Personal_list_Serializer(personal_objs, many=True) + + res = check_and_get_specific_output_format(self, serializer.data, '{0}_personal.xlsx'.format(str(company.name))) + if res: + return res + + data = serializer.data + + return Response(data) + + @action(methods=['GET'], detail=True) + def list_by_office_id(self, request, *args, **kwargs): + if not kwargs or not 'pk' in kwargs: + raise serializers.ValidationError( + u'Ошибка, не указан id подразделения' + ) + + try: + office = DeliveryData.objects.get(id=kwargs['pk']) + except DeliveryData.DoesNotExist: + raise serializers.ValidationError( + u'Ошибка, неверный id компании' + ) + + personal_objs = self.queryset.filter(user_profile__office=office) + serializer = Personal_list_Serializer(personal_objs, many=True) + + res = check_and_get_specific_output_format(self, data=serializer.data, + filename='{0}_personal.xlsx'.format(str(office.name))) + if res: + return res + + return Response(serializer.data) + + def partial_update(self, request, *args, **kwargs): + user = self.get_object() + + data = request.data + + if 'id' in data and not data['id']: + return Response({'error': 'Изменение невозможно. Нет идентификатора пользователя'}, + status=status.HTTP_400_BAD_REQUEST) + + if 'email' in data and not data['email']: + return Response({'error': 'Изменение невозможно. Нет email идентификатора пользователя'}, + status=status.HTTP_400_BAD_REQUEST) + + users = User.objects.filter( + id=user.id + ) + + if not users: + return Response({'error': 'Изменение невозможно. Пользователь не найден'}, + status=status.HTTP_400_BAD_REQUEST) + + company = None + profile_data = None + if 'user_profile' in data: + profile_data = data['user_profile'] + if 'company_obj' in profile_data and profile_data['company_obj']: + try: + company = Company.objects.get(id=profile_data['company_obj']) + profile_data['company_obj'] = company + + except Company.DoesNotExist: + return Response({'error': u'Компания не существует'}, + status=status.HTTP_400_BAD_REQUEST) + + office = None + if 'office' in profile_data and profile_data['office']: + try: + office = DeliveryData.objects.get(id=profile_data['office']) + profile_data['office'] = office + except Company.DoesNotExist: + return Response({'error': u'Подразделение не существует'}, + status=status.HTTP_400_BAD_REQUEST) + + if 'id' in profile_data: + del profile_data['id'] + if 'office__name' in profile_data: + del profile_data['office__name'] + + user_data = data + + if profile_data: + del user_data['user_profile'] + if 'id' in user_data: + del user_data['id'] + if 'full_name' in user_data: + del user_data['full_name'] + if 'email' in user_data: + user_data['username'] = user_data['email'] + + if users.count() > 1: + return Response({'error': u'Ошибка, найдено более одного пользователя, соответствующего id'}, + status=status.HTTP_400_BAD_REQUEST) + + users.update(**user_data) + user = users.first() + + if profile_data: + UserProfile.objects.filter(user=user).update(**profile_data) + + if 'mailing_sets' in profile_data: + if not company and user.user_profile: + company = user.user_profile.company_obj + if company: + company.update_mailing_on() + + serializer = Personal_list_Serializer(user) + data = serializer.data + + # data.update(get_editable_fields_list_Dict(request.user, self.action, serializer.Meta.fields)) + + return Response(data) + + def create(self, request, *args, **kwargs): + + data = request.data + + serializer = self.get_serializer_class()(data=data) + if not serializer.is_valid(): + raise serializers.ValidationError(serializer.errors) + + errors_Dict = {} + + if not 'email' in data or not data['email']: + errors_Dict.update({'email': 'обязательное поле'}) + # return Response( + # { + # 'errors': { + # 'Создание невозможно. Не не введен email' + # } + # }, + # status=status.HTTP_400_BAD_REQUEST + # ) + else: + + try: + user = User.objects.get( + email=data['email'] + ) + + errors_Dict.update({'email': 'Создание невозможно. Пользователь с указанным email уже существует'}) + + # return Response({'error': u'Создание невозможно. Пользователь с указанным email уже существует'}, + # status=status.HTTP_400_BAD_REQUEST) + + except User.DoesNotExist: + pass + + company = None + office = None + if 'office' in data['user_profile'] and data['user_profile']['office']: + try: + office = DeliveryData.objects.get(id=data['user_profile']['office']) + data['user_profile']['office'] = office + company = office.company + except Company.DoesNotExist: + return Response({'error': u'Подразделение не существует'}, + status=status.HTTP_400_BAD_REQUEST) + + if not company and ('company_obj' in data['user_profile'] and data['user_profile']['company_obj']): + try: + company = Company.objects.get(id=data['user_profile']['company_obj']) + data['user_profile']['company_obj'] = company + except Company.DoesNotExist: + return Response({'error': u'Компания не существует'}, + status=status.HTTP_400_BAD_REQUEST) + + if 'creator' in data['user_profile'] and data['user_profile']['creator']: + try: + creator = User.objects.get(id=data['user_profile']['creator']) + data['user_profile']['creator'] = company + except Company.DoesNotExist: + pass + # return Response({'error': u'Пользователь не существует'}, + # status=status.HTTP_400_BAD_REQUEST) + + if errors_Dict: + raise serializers.ValidationError(errors_Dict) + # return Response({ + # 'errors': errors_Dict + # }) + + from ....views import create_personal_user + res = create_personal_user(data, request.user) + if 'error' in res: + raise serializers.ValidationError(res['error']) + # return Response({'error': res['error']}, + # status=status.HTTP_400_BAD_REQUEST) + + serializer = Personal_list_Serializer(res['user']) + data = serializer.data + + # data.update(get_editable_fields_list_Dict(request.user, self.action, serializer.Meta.fields)) + + return Response(data) + + +class v1_Managers_ViewSet(APIViewSet_ModelClass): + queryset = User.objects.filter(is_staff=True).order_by('last_name', 'first_name') + serializer_class = User_list_Serializer + permission_classes = (Auth_API_perms,) + + def get_serializer_class(self): + + try: + if self.action == 'list': + return User_list_Serializer + if self.action == 'retrieve': + return User_list_Serializer + + except (KeyError, AttributeError): + pass + + return super(v1_Managers_ViewSet, self).get_serializer_class() + + def get_queryset(self, *args, **kwargs): + + user = self.request.user + if user.has_perm('AuthApp.UI_managers_all_stat'): + managers = User.objects.filter( + is_staff=True, + ) + else: + managers = User.objects.filter( + id=user.id, + is_staff=True, + ) + + managers = managers.order_by('-is_active', 'last_name', 'first_name') + + # if self.action in ('stat_list', ): + # + # filter_kwargs, stat_kwargs = get_kwargs_by_get_query_params(self.request) + # if kwargs: + # filter_kwargs.update(kwargs) + # + # managers = managers.filter( + # + # orders_for_manager__status_shipment='shipped', + # orders_for_manager__defective_goods=False, + # **filter_kwargs + # ).annotate( + # # sales_count=Sum('orders_for_manager__rel_products_in_order_for_order__count', + # # output_field=FloatField()), + # # sales_sum=Sum('orders_for_manager__rel_products_in_order_for_order__product_sum_byn', + # # output_field=FloatField()), + # # paid_sum=Sum('orders_for_manager__paid_sum_byn', + # # output_field=FloatField()), + # full_name=Concat(F('last_name'), V(' '), F('first_name')) + # ).filter( + # **stat_kwargs + # ).order_by( + # 'full_name' + # ).distinct() + # # return managers + # + # + # if self.action in ('get_sales_stat_by_productid', ): + # + # filter_kwargs, stat_kwargs = get_kwargs_by_get_query_params(self.request) + # if kwargs: + # filter_kwargs.update(kwargs) + # + # managers = managers.filter( + # is_staff=True, + # orders_for_manager__status_shipment='shipped', + # orders_for_manager__defective_goods=False, + # **filter_kwargs + # ).annotate( + # # sales_count=Sum('orders_for_manager__rel_products_in_order_for_order__count', + # # output_field=FloatField()), + # # sales_sum=Sum('orders_for_manager__rel_products_in_order_for_order__product_sum_byn', + # # output_field=FloatField()), + # # paid_sum=Sum('orders_for_manager__paid_sum_byn', + # # output_field=FloatField()), + # full_name=Concat(F('last_name'), V(' '), F('first_name')) + # ).filter( + # **stat_kwargs + # ).order_by( + # 'full_name' + # ).distinct() + # return managers + # else: + # if self.request.user: + # user = self.request.user + # if user.active and not self.request.user.is_anonymus: + # managers = User.objects.filter(id=user.id) + # return managers + + # return super(v1_Managers_ViewSet, self).get_queryset() + return managers + + def list(self, request, *args, **kwargs): + res = check_and_get_specific_output_format(self, data=None, filename='managers_list.xlsx') + if res: + return res + + res = super(v1_Managers_ViewSet, self).list(request, *args, **kwargs) + return res + + @action(methods=['GET'], detail=False) + def get_all_staff(self, request, *args, **kwargs): + + from ....funcs import get_all_staff + objs = get_all_staff() + serializer = self.get_serializer_class()(objs, many=True) + return Response(serializer.data) + + @action(methods=['GET'], detail=False) + def get_sales_managers_only(self, request, *args, **kwargs): + + from ....funcs import get_sales_managers + objs = get_sales_managers() + serializer = self.get_serializer_class()(objs, many=True) + return Response(serializer.data) + + @action(methods=['GET'], detail=False) + def get_sales_department_staff(self, request, *args, **kwargs): + + from ....funcs import get_sales_department_staff + objs = get_sales_department_staff() + serializer = self.get_serializer_class()(objs, many=True) + return Response(serializer.data) + + @action(methods=['GET'], detail=False) + def get_sales_department_staff(self, request, *args, **kwargs): + + from ....funcs import get_sales_department_staff + objs = get_sales_department_staff() + serializer = self.get_serializer_class()(objs, many=True) + return Response(serializer.data) + + @action(methods=['GET'], detail=False) + def get_subordinate_staff(self, request, *args, **kwargs): + objs = None + + if request.user.is_superuser: + objs = self.get_queryset() + else: + from ....funcs import get_subordinate_staff + objs = get_subordinate_staff(request.user, include_cur_user=True) + + if not objs: + objs = self.get_queryset().filter(id=request.user.id) + + serializer = self.get_serializer_class()(objs, many=True) + return Response(serializer.data) + + @action(methods=['GET'], detail=False) + def stat_list(self, request, *args, **kwargs): + + filter_kwargs, stat_kwargs = get_kwargs_by_get_query_params(request) + + period_from = None + period_to = None + region_ids = None + if 'delivery_DT__gte' in filter_kwargs: + period_from = filter_kwargs['delivery_DT__gte'] + if 'delivery_DT__lte' in filter_kwargs: + period_to = filter_kwargs['delivery_DT__lte'] + if 'company__region__in' in filter_kwargs: + region_ids = filter_kwargs['company__region__in'] + + from ....stat_funcs import managers_sales_by_period_n_regions + managers, chart_Data = managers_sales_by_period_n_regions( + period_from=period_from, period_to=period_to, + region_ids=region_ids + ) + + if request.query_params and 'chart' in request.query_params and request.query_params[ + 'chart'] == 'line': + return Response(chart_Data) + else: + return Response(managers) + + res = check_and_get_specific_output_format(self, data=managers, filename='managers_stat.xlsx') + if res: + return res + + return Response(managers) + + @action(methods=['GET'], detail=True) + def get_sales_stat_by_productid(self, request, *args, **kwargs): + from django.db.models import Sum, FloatField, F, Value as V + + filter_kwargs, stat_kwargs = get_kwargs_by_get_query_params(request) + + ords_kwargs = {} + + ords_kwargs.update({ + 'enable': True, + 'status_shipment': 'shipped', + 'defective_goods': False, + 'rel_products_in_order_for_order__product__id': kwargs['pk'] + }) + + rec_kwargs = { + 'receipt_type': 'return', + 'enable': True, + } + + for key, val in filter_kwargs.items(): + if 'delivery_DT__gte' in key: + ords_kwargs.update({'delivery_DT__gte': val}) + rec_kwargs.update({'receipt_D__gte': val}) + + elif 'delivery_DT__lte' in key: + ords_kwargs.update({'delivery_DT__lte': val}) + rec_kwargs.update({'receipt_D__lte': val}) + elif 'company__region__in' in key: + ords_kwargs.update({key: val}) + rec_kwargs.update({'company__region__in': val}) + else: + ords_kwargs.update({key: val}) + + if kwargs and 'pk' in kwargs: + rec_kwargs.update({ + 'rel_products_in_receipt_for_receipt__product__id': kwargs['pk'] + }) + + # print(str(ords_kwargs)) + from B2BApp.models import Order, ReceiptDocument + ords_ids = Order.objects.filter( + **ords_kwargs + ).exclude( + pay_terms='no_pay' + ).values_list('id', flat=True) + + receipts_ids = ReceiptDocument.objects.filter( + **rec_kwargs + ).values_list('id', flat=True) + + managers = self.get_queryset().annotate( + full_name=Concat(F('last_name'), V(' '), F('first_name')) + # ).filter( + # **stat_kwargs + ).order_by( + 'full_name' + ).distinct( + ).values( + 'id', 'full_name', + ) + + ord_managers = managers.filter(orders_for_manager__in=ords_ids) + + recipt_managers = managers.filter(receipts_for_manager__in=receipts_ids) + + managers = ord_managers.union(recipt_managers) + + receipt_kwargs = { + 'enable': True, + } + ord_kwargs = { + 'order__enable': True, + 'order__pay_terms__in': pay_terms_for_report_list, + } + for key, val in filter_kwargs.items(): + if 'delivery_DT__gte' in key: + ord_kwargs.update({'order__delivery_DT__gte': val}) + receipt_kwargs.update({'receipt__receipt_D__gte': val}) + + elif 'delivery_DT__lte' in key: + ord_kwargs.update({'order__delivery_DT__lte': val}) + receipt_kwargs.update({'receipt__receipt_D__lte': val}) + + elif 'company__region__in' in key: + ord_kwargs.update({'order__company__region__in': val}) + receipt_kwargs.update({'receipt__company__region__in': val}) + + ord_kwargs.update({ + 'product__id': kwargs['pk'], + }) + + receipt_kwargs.update({ + 'product__id': kwargs['pk'], + # 'receipt__receipt_type': 'return' + }) + + if managers: + managers = get_sales_for_managers_by_goods(request.user, managers, ord_kwargs, receipt_kwargs) + + filename = 'managers_sales_by_product_{0}.xlsx'.format(str(kwargs['pk'])) + res = check_and_get_specific_output_format(self, data=managers, filename=filename) + if res: + return res + + return Response(managers) diff --git a/AuthApp/forms.py b/AuthApp/forms.py new file mode 100644 index 0000000..a956ff4 --- /dev/null +++ b/AuthApp/forms.py @@ -0,0 +1,70 @@ +# coding=utf-8 +from django import forms +from django.contrib.auth.forms import AuthenticationForm +from django.utils.translation import ugettext_lazy as _ +from django.core.exceptions import ValidationError +from .models import * +# from djng.styling.bootstrap3.forms import Bootstrap3ModelForm +# from djng.forms import fields, NgModelFormMixin, NgFormValidationMixin, NgModelForm +# from datetimepicker.widgets import DateTimePicker +# from datetimepicker.helpers import js_loader_url + + + +# class PersonForm(NgModelFormMixin, NgFormValidationMixin, NgModelForm, Bootstrap3ModelForm): +# +# form_name = 'person_form' +# scope_prefix = 'person_data' +# +# class Meta: +# model = UserProfile +# fields = ['name', 'departament', 'company', 'company_position', +# 'days_to_order_cancellation_default', 'days_to_pay_default', +# 'pay_terms', 'birthdate', +# 'phone', 'email', 'discount', 'document_sign_person'] + + + +def emailValid(value): + if User.objects.filter(username=value, is_active=True): + raise ValidationError(_(u'пользователь с таким e-mail уже существует, воспользуйтесь восстановлением пароля')) + +def check_authorizationBy_cleaned_data(cleaned_data): + from django.contrib.auth import authenticate + print('check_authorizationBy_cleaned_data') + username = cleaned_data.get('username') + password = cleaned_data.get('password') + + user = authenticate(username=username, password=password) + # print(user) + if user: + # if user.is_active: + return user + +def check_activate_by_user(reg_user): + print('check_activate_by_user') + if reg_user: + if reg_user.is_active: + return True + + return False + +class LoginForm(AuthenticationForm): + username = forms.EmailField(label=_('Email'), widget=forms.TextInput()) + password = forms.CharField(min_length=8, label=_('Пароль'), widget=forms.PasswordInput(render_value=False)) + + def clean(self): + # print('check') + cleaned_data = super(LoginForm, self).clean() + reg_user = check_authorizationBy_cleaned_data(cleaned_data) + # print(reg_user) + if not reg_user: + raise ValidationError(_(u'Пользователь с введенными регистрационными данными не зарегистрирован. Проверьте правильность ввода e-mail и пароля.')) + else: + if not check_activate_by_user(reg_user): + raise ValidationError(_(u'Указанная учетная запись не была Активирована')) + return cleaned_data + + +class ResetPassword_byEmail_Form(AuthenticationForm): + email = forms.EmailField(label=_('Email'), widget=forms.TextInput()) \ No newline at end of file diff --git a/AuthApp/funcs.py b/AuthApp/funcs.py new file mode 100644 index 0000000..ab9aa8c --- /dev/null +++ b/AuthApp/funcs.py @@ -0,0 +1,392 @@ +# -*- coding: utf-8 -*- +from .models import * +from datetime import datetime, timedelta, date +from django.db.models import Q, F, Value as V +from django.db.models.functions import ExtractYear, Concat, Coalesce +from functools import reduce +from operator import or_ + +sales_department_groups = [ + 'Отдел продаж: Начальник отдела продаж', + 'Отдел продаж: Менеджер отдела продаж', + 'Отдел продаж: Региональный руководитель отдела продаж', + 'Отдел продаж: Стажер отдела продаж' +] + +heads_of_sales_groups = [ + 'Отдел продаж: Начальник отдела продаж', + 'Отдел продаж: Региональный руководитель отдела продаж', +] + + +def get_personal_companies_by_managers_list(managers_list, filter_kwargs={}, exclude_kwargs={}, only_emails=False): + try: + users = User.objects.filter( + user_profile__company_obj__manager_obj__in=managers_list, + **filter_kwargs + ).exclude( + **exclude_kwargs + ).order_by('-is_active', 'last_name', 'first_name') + + if only_emails: + users = list(users.values_list('email', flat=True)) + + except Exception as e: + msg = f'get_personal_companies_by_managers_list Error = {str(e)}' + users = [] + + return users + + +def get_head_staffs_by_user_email(user_email, only_emails=False): + try: + user = User.objects.get(email=user_email) + heads = get_head_staffs(user.user_profile, only_emails=True) + except User.DoesNotExist as e: + heads = None + return heads + + +def get_head_staffs(user_profile_or_user_ID, only_emails=False): + if type(user_profile_or_user_ID) == str: + user = User.objects.get(id=int(user_profile_or_user_ID)) + user_profile = user.user_profile + else: + user_profile = user_profile_or_user_ID + user = user_profile.user + + groups = user.groups.all() + groups_name_list = groups.values_list('name', flat=True) + + Q_list = [] + + if user_profile.is_sales_department_staff(): + if 'Отдел продаж: Менеджер отдела продаж' in groups_name_list: + groups_list = ['Отдел продаж: Региональный руководитель отдела продаж'] + kwargs = { + 'groups__name__in': groups_list, + 'user_profile__regions__in': user.user_profile.regions.all(), + } + Q_list.append(Q(**kwargs)) + + if not 'Отдел продаж: Начальник отдела продаж' in groups_name_list: + groups_list = ['Отдел продаж: Начальник отдела продаж'] + kwargs = {'groups__name__in': groups_list} + Q_list.append(Q(**kwargs)) + + # groups_list = ['Управляющий'] + # kwargs.update({'groups__name__in': groups_list}) + if not 'Управляющий' in groups_name_list: + kwargs = {'is_superuser': True} + Q_list.append(Q(**kwargs)) + + Q_obj = reduce(lambda p1, p2: (p1 | p2), Q_list) + heads = User.objects.filter( + Q_obj, + is_active=True, + is_staff=True + ) + + heads = heads.distinct().order_by('-is_active', 'last_name', 'first_name') + + if only_emails: + heads = list(heads.values_list('email', flat=True)) + + return heads + + +def get_bosses_and_subordinate_staff_ids(user, only_active=False, include_cur_user=False, only_emails=False): + users = [] + + kwargs = { + 'is_staff': True, + } + + if only_active: + kwargs.update({'is_active': True}) + + groups = user.groups.all() + groups_name_list = groups.values_list('name', flat=True) + + Q_obj = Q() + + if 'Отдел продаж: Начальник отдела продаж' in groups_name_list: + Q_obj.add(Q(is_superuser=True), Q.OR) + + elif 'Отдел продаж: Региональный руководитель отдела продаж' in groups_name_list: + Q_obj.add(Q(is_superuser=True), Q.OR) + Q_obj.add(Q(groups__name='Отдел продаж: Начальник отдела продаж'), Q.OR) + + elif 'Отдел продаж: Менеджер отдела продаж' in groups_name_list: + Q_obj.add(Q(is_superuser=True), Q.OR) + Q_obj.add(Q(groups__name='Отдел продаж: Начальник отдела продаж'), Q.OR) + Q_obj.add(Q( + groups__name='Отдел продаж: Региональный руководитель отдела продаж', + user_profile__regions__in=user.user_profile.regions.all()), Q.OR) + + subordinate_users = get_subordinate_staff( + user, only_active=only_active, include_cur_user=include_cur_user, only_emails=only_emails + ) + res_val = 'id' + if only_emails: + res_val = 'user_profile__email' + + subordinate_users = subordinate_users.values_list(res_val, flat=True) + + if user.is_superuser: + users = subordinate_users + else: + bosses = User.objects.filter(Q_obj, **kwargs).values_list(res_val, flat=True) + users = set(subordinate_users) | set(bosses) + + return users + + +def get_subordinate_sales_staff(user, groups, only_active=False, only_emails=False, include_cur_user=False): + kwargs = { + 'is_staff': True, + } + + if only_active: + kwargs.update({'is_active': True}) + + Q_obj = Q() + + if 'Отдел продаж: Начальник отдела продаж' in groups: + kwargs_groups = [ + 'Отдел продаж: Менеджер отдела продаж', + 'Отдел продаж: Региональный руководитель отдела продаж', + 'Отдел продаж: Стажер отдела продаж' + ] + Q_obj.add(Q(groups__name__in=kwargs_groups), Q.OR) + + + elif u'Отдел продаж: Региональный руководитель отдела продаж' in groups: + kwargs_groups = [ + 'Отдел продаж: Менеджер отдела продаж', + 'Отдел продаж: Стажер отдела продаж' + ] + Q_obj.add(Q(groups__name__in=kwargs_groups, user_profile__regions__in=user.user_profile.regions.all()), Q.OR) + + elif u'Отдел продаж: Менеджер отдела продаж' in groups: + kwargs_groups = [ + 'Отдел продаж: Стажер отдела продаж' + ] + Q_obj.add(Q(groups__name__in=kwargs_groups, user_profile__regions__in=user.user_profile.regions.all()), Q.OR) + + elif 'Отдел закупок: Начальник отдела закупок' in groups: + kwargs_groups = [ + 'Отдел закупок: Менеджер отдела закупок', + ] + Q_obj.add(Q(groups__name__in=kwargs_groups), Q.OR) + + if include_cur_user: + Q_obj.add(Q(id=user.id), Q.OR) + + users = User.objects.filter(Q_obj, **kwargs).exclude(is_superuser=True) + users = users.distinct().order_by('-is_active', 'last_name', 'first_name') + + # if kwargs: + # other_users = User.objects.filter( + # **kwargs + # ).exclude( + # is_superuser=True + # ) + # users = users.union(other_users) + # users = users.distinct().order_by('-is_active', 'last_name', 'first_name') + + if only_emails: + users = list(users.values_list('email', flat=True)) + + return users + + +def get_subordinate_staff(user, only_active=False, include_cur_user=False, only_emails=False): + users = [] + + groups = user.groups.all() + groups_name_list = groups.values_list('name', flat=True) + + # отдел продаж + if set(groups_name_list): + users = get_subordinate_sales_staff(user, groups_name_list, include_cur_user=include_cur_user) + + if not users and user.is_superuser: + users = get_all_staff() + + if not users and include_cur_user: + users = User.objects.filter(id=user.id) + + if users and only_active: + users = users.filter(is_active=True) + + if only_emails: + users = list(users.values_list('email', flat=True)) + + return users + + +def get_all_staff(only_active=False, only_emails=False): + kwargs = { + 'is_staff': True, + } + if only_active: + kwargs.update({'is_active': True}) + + users = User.objects.filter(**kwargs).order_by('-is_active', 'last_name', 'first_name') + + if only_emails: + users = list(users.values_list('email', flat=True)) + return users + + +def get_managers_wo_work(): + managers = get_sales_managers() + managers = managers.filter( + user_profile__last_web_request__lt=datetime.now() - timedelta(minutes=20), + user_profile__last_web_request__contains=date.today() + ) + + return managers + + +def get_birthdays(manager=None, for_next_count_days=None, only_first=False): + from_D = datetime.now() + Q_obj = Q() + Q_obj.add(Q(Q(birthdate__day=from_D.day) & Q(birthdate__month=from_D.month)), Q.OR) + + # в for_next_count_days количество будущих дней для которых собираем дни рождения + if for_next_count_days: + for i in range(1, for_next_count_days): + Q_obj.add(Q(Q(birthdate__day=(from_D + timedelta(days=i)).day) & Q( + birthdate__month=(from_D + timedelta(days=i)).month)), Q.OR) + + kwargs = {} + if manager: + kwargs.update({ + 'company_obj__manager_obj': manager, + + }) + + from .models import UserProfile + user_profiles = UserProfile.objects.filter( + Q_obj, + # birthdate__lte=(datetime.now() + timedelta(days=3)).date(), + # birthdate__gte=datetime.now().date() + **kwargs + ).annotate( + age=datetime.now().year - ExtractYear('birthdate') + ).order_by('company_obj__manager_obj', 'birthdate') + + if user_profiles and only_first: + return user_profiles[0] + + return user_profiles + + +def get_sales_managers(only_active=False, only_emails=False): + from CompaniesApp.models import Company + + kwargs = { + 'is_staff': True, + 'companies_for_manager__company_type': 'client', + } + if only_active: + kwargs.update({'is_active': True}) + + managers = User.objects.filter(**kwargs).exclude(companies_for_manager=None).distinct().order_by('-is_active', + 'last_name', + 'first_name') + + # managers = Company.objects.filter( + # company_type='client' + # ).values_list('manager_obj', flat=True).distinct() + + if only_emails: + managers = list(managers.values_list('email', flat=True)) + return managers + + +def get_full_names_by_id(ids): + names = User.objects.filter( + id__in=ids + ).annotate( + fullname=Concat(F('last_name'), V(' '), F('first_name')) + ).values('id', 'fullname') + names = {item['id']: item['fullname'] for item in names} + + return names + + +def fullname_for_user(user): + full_name = '%s %s' % (user.last_name, user.first_name) + return full_name.strip() + + +def get_heads_of_sales(only_active=False, only_emails=False): + kwargs = { + 'is_staff': True, + } + + Q_obj = Q(groups__name__in=heads_of_sales_groups) | Q(is_superuser=True) + + if only_active: + kwargs.update({'is_active': True}) + + users = User.objects.filter( + Q_obj, + **kwargs + ).order_by('-is_active', 'last_name', 'first_name') + + if only_emails: + users = list(users.values_list('email', flat=True)) + return users + + +def get_sales_department_staff(regions=None, only_active=False, only_emails=False): + kwargs = { + 'is_staff': True, + } + + if not regions: + sales_department_groups = [ + 'Отдел продаж: Менеджер отдела продаж', 'Отдел продаж: Начальник отдела продаж', + 'Отдел продаж: Региональный руководитель отдела продаж', + 'Отдел продаж: Стажер отдела продаж' + ] + kwargs.update({ + 'groups__name__in': sales_department_groups, + }) + + else: + sales_department_groups = [ + 'Отдел продаж: Менеджер отдела продаж', + 'Отдел продаж: Региональный руководитель отдела продаж', + 'Отдел продаж: Стажер отдела продаж' + ] + kwargs.update({ + 'groups__name__in': sales_department_groups, + }) + + if only_active: + kwargs.update({'is_active': True}) + + users = User.objects.filter(**kwargs).exclude(is_superuser=True).order_by('-is_active', 'last_name', 'first_name') + if only_emails: + users = list(users.values_list('email', flat=True)) + return users + + +def get_marketing_departament_persons(only_active=False, only_emails=False): + kwargs = { + 'is_staff': True, + 'groups__name': 'Маркетинг: Маркетолог', + } + if only_active: + kwargs.update({'is_active': True}) + + users = User.objects.filter(**kwargs).order_by('-is_active', 'last_name', 'first_name') + + if only_emails: + users = list(users.values_list('email', flat=True)) + return users diff --git a/AuthApp/migrations/0001_initial.py b/AuthApp/migrations/0001_initial.py new file mode 100644 index 0000000..22ae6a7 --- /dev/null +++ b/AuthApp/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 4.2.1 on 2023-05-16 09:47 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')), + ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')), + ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')), + ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')), + ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')), + ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')), + ('UI_lang', models.CharField(choices=[('ru', 'Russian'), ('en', 'English')], max_length=2, verbose_name='Язык интерфейса')), + ('nick_name', models.CharField(blank=True, max_length=250, null=True, verbose_name='Псевдоним')), + ('authCode', models.CharField(blank=True, max_length=32, null=True)), + ('phone', models.CharField(blank=True, max_length=100, null=True, verbose_name='Телефон')), + ('birthdate', models.DateField(blank=True, null=True, verbose_name='Дата рождения')), + ('comment', models.TextField(blank=True, null=True, verbose_name='Дополнительные сведения')), + ('referal_link', models.TextField(verbose_name='Реферальная ссылка')), + ('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_profile', to=settings.AUTH_USER_MODEL, verbose_name='id пользователя')), + ], + options={ + 'verbose_name': 'Профиль', + 'verbose_name_plural': 'Профили', + 'ordering': ('user__last_name', 'user__first_name'), + 'permissions': (), + }, + ), + ] diff --git a/AuthApp/migrations/0002_userprofile_answer_success_count_userprofile_balance_and_more.py b/AuthApp/migrations/0002_userprofile_answer_success_count_userprofile_balance_and_more.py new file mode 100644 index 0000000..34cc063 --- /dev/null +++ b/AuthApp/migrations/0002_userprofile_answer_success_count_userprofile_balance_and_more.py @@ -0,0 +1,41 @@ +# Generated by Django 4.2.1 on 2023-05-16 14:01 + +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), + ('AuthApp', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='userprofile', + name='answer_success_count', + field=models.IntegerField(default=0, verbose_name='Успешных ответов'), + ), + migrations.AddField( + model_name='userprofile', + name='balance', + field=models.FloatField(default=0, verbose_name='Баланс'), + ), + migrations.AddField( + model_name='userprofile', + name='questions_count', + field=models.IntegerField(default=0, verbose_name='Задано вопросов'), + ), + migrations.AlterField( + model_name='userprofile', + name='comment', + field=models.TextField(blank=True, null=True, verbose_name='Комментарий'), + ), + migrations.AlterField( + model_name='userprofile', + name='user', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_profile', to=settings.AUTH_USER_MODEL, verbose_name='Пользователь'), + ), + ] diff --git a/AuthApp/migrations/__init__.py b/AuthApp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/AuthApp/models.py b/AuthApp/models.py new file mode 100644 index 0000000..718d6e3 --- /dev/null +++ b/AuthApp/models.py @@ -0,0 +1,83 @@ +# coding=utf-8 +from __future__ import unicode_literals +from django.contrib.auth.models import User +from django.db import models +from django.utils.translation import gettext_lazy as _ +from django.db.models.signals import post_save, pre_save +from django.contrib.contenttypes.fields import GenericRelation +from BaseModels.base_models import BaseModel +from datetime import datetime +from django.conf import settings + + + + +def user_name_str(self): + return f'{self.last_name} {self.first_name}' + + +User.add_to_class("__str__", user_name_str) + + +class UserProfile(BaseModel): + + user = models.OneToOneField(User, verbose_name=_('Пользователь'), related_name=u'user_profile', + null=True, blank=True, on_delete=models.CASCADE) + + UI_lang = models.CharField(max_length=2, verbose_name=_('Язык интерфейса'), choices=settings.LANGUAGES) + + nick_name = models.CharField(max_length=250, verbose_name=_('Псевдоним'), null=True, blank=True) + + authCode = models.CharField(max_length=32, null=True, blank=True) + + phone = models.CharField(max_length=100, verbose_name=_('Телефон'), null=True, blank=True) + + birthdate = models.DateField(verbose_name=_(u'Дата рождения'), null=True, blank=True) + + comment = models.TextField(verbose_name=_('Комментарий'), null=True, blank=True) + + referal_link = models.TextField(verbose_name=_('Реферальная ссылка')) + balance = models.FloatField(verbose_name=_('Баланс'), default=0) + questions_count = models.IntegerField(verbose_name=_('Задано вопросов'), default=0) + answer_success_count = models.IntegerField(verbose_name=_('Успешных ответов'), default=0) + + + def __str__(self): + if self.user: + return '{0} {1}'.format(self.user.last_name, self.user.first_name) + else: + return str(self.id) + + + class Meta: + permissions = ( + + ) + + verbose_name = _('Профиль') + verbose_name_plural = _('Профили') + ordering = ('user__last_name', 'user__first_name') + + + +# @receiver(post_save, sender=User) +def create_user_profile(sender, instance, created, **kwargs): + if created: + UserProfile.objects.create(user=instance) + + +post_save.connect(create_user_profile, sender=User, dispatch_uid='post_save_connect') + + +# @receiver(pre_save, sender=User) +def preSaveUser(sender, instance, **kwargs): + if not instance.email: + instance.email = str(instance.username).lower() + + try: + instance.user_profile.modifiedDT = datetime.now() + except: + pass + + +pre_save.connect(preSaveUser, sender=User, dispatch_uid='pre_save_connect') diff --git a/AuthApp/stat_funcs.py b/AuthApp/stat_funcs.py new file mode 100644 index 0000000..f073b6c --- /dev/null +++ b/AuthApp/stat_funcs.py @@ -0,0 +1,194 @@ +from BaseModels.mailSender import techSendMail +from django.db.models import Sum, FloatField, F, Value as V, Count, OuterRef, Subquery, Q, Max, Exists +from django.db.models.functions import Concat, Length +from operator import itemgetter +from datetime import datetime +import copy +from .models import User +from datetime import datetime, date, timedelta +from collections import OrderedDict + + +def managers_sales_by_period_n_regions(period_from=None, period_to=None, region_ids=None, kwargs=None, sum_w_prev_data=None): + from CompaniesApp.models import Company + + log_begin_DT = datetime.now() + msg = 'managers_sales_by_period_n_regions start - {0}
---------------

'.format(str(log_begin_DT)) + print(msg) + + + stat_kwargs = {} + queryset_kwargs = {} + all_managers = False + separate_managers_sales_by_link_in_order = False + if kwargs: + if 'stat_kwargs' in kwargs: + stat_kwargs.update(kwargs['stat_kwargs']) + + + if 'all_managers' in kwargs: + all_managers = kwargs['all_managers'] + + + if 'queryset_kwargs' in kwargs: + queryset_kwargs.update(kwargs['queryset_kwargs']) + + + if 'separate_managers_sales_by_link_in_order' in kwargs: + separate_managers_sales_by_link_in_order = kwargs['separate_managers_sales_by_link_in_order'] + + + from B2BApp.stat_funcs import get_sales_by_period_n_regions + orders, receipts, pays = get_sales_by_period_n_regions(period_from=period_from, period_to=period_to, region_ids=region_ids, kwargs=kwargs) + + + ids = [] + if not all_managers: + + ord_manager_ids = set(item['manager_obj__id'] for item in orders) + receipt_manager_ids = set(item['manager_obj__id'] for item in receipts) + pay_manager_ids = set(item['manager__id'] for item in pays) + + ids = set.union(ord_manager_ids, receipt_manager_ids, pay_manager_ids) + + queryset_kwargs.update({'id__in': ids}) + + if not sum_w_prev_data: + managers = User.objects.filter( + **queryset_kwargs + ).annotate( + full_name=Concat(F('last_name'), V(' '), F('first_name')), + ).order_by('full_name').values( + 'id', 'full_name' + ) + + objs = list(managers) + objs.sort(key=itemgetter('full_name'), reverse=False) + if None in ids: + objs.append({'id': None, 'full_name': 'не назначен менеджер'}) + else: + objs = copy.deepcopy(sum_w_prev_data) + + from_date = None + to_date = None + if orders: + orders.sort(key=itemgetter('delivery_DT'), reverse=False) + from_date = orders[0]['delivery_DT'].date() + to_date = orders[-1]['delivery_DT'].date() + + if from_date: + from_DT = from_date + else: + from_DT = date(year=2000, month=1, day=1) + + if to_date: + to_DT = to_date + timedelta(days=1) + else: + to_DT = datetime.now().date() + timedelta(days=1) + + chart_data_Dict = OrderedDict({ + str(from_DT + timedelta(n)): { + 'sales_count': 0, + 'sales_sum': 0, + 'paid_sum': 0, + 'paid_cash': 0, + 'paid_invoice': 0 + } for n in range(int((to_DT - from_DT).days) + 1) + }) + + + objs_i = 0 + while objs_i < len(objs): + obj_i = objs[objs_i] + + # if separate_managers_sales_by_link_in_order: + + + if not 'sales_count' in obj_i: + obj_i['sales_count'] = 0 + if not 'sales_sum' in obj_i: + obj_i['sales_sum'] = 0 + if not 'paid_sum' in obj_i: + obj_i['paid_sum'] = 0 + if not 'receipts_sum' in obj_i: + obj_i['receipts_sum'] = 0 + if not 'receipts_count' in obj_i: + obj_i['receipts_count'] = 0 + # # if not 'top_sales_80' in obj_i: + # # обнуляем все при каждой итерации + # obj_i['top_sales_80'] = '' + # obj_i['manager_top_sales_80'] = '' + + # if obj_i['id'] == 657: + # print('!') + + obj_orders = list(filter(lambda item: item['manager_obj__id'] == obj_i['id'], orders)) + cash_orders = list(filter(lambda item: item['pay_type'] == 'cash', obj_orders)) + + obj_pays = list(filter(lambda item: item['manager__id'] == obj_i['id'], pays)) + + obj_receipts = list(filter(lambda item: item['manager_obj__id'] == obj_i['id'], receipts)) + cash_receipts = list(filter(lambda item: item['pay_type'] == 'cash' and item['receipts_sum'], obj_receipts)) + + if obj_orders: + obj_i['sales_sum'] += round(sum(item['sales_sum'] for item in obj_orders if item['sales_sum']), 2) + obj_i['sales_count'] += round(sum(item['sales_count'] for item in obj_orders if item['sales_count']), 2) + if cash_orders: + # добавляем в оплаты кэшевые операции потому как они отсутствуют в платежах + obj_i['paid_sum'] += round(sum(item['paid_sum'] for item in cash_orders if item['paid_sum']), 2) + + # if obj_i['id'] == 1199: + # print('!') + + if obj_receipts: + obj_i['receipts_sum'] += round( + sum(item['receipts_sum'] for item in obj_receipts if item['receipts_sum']), 2) + obj_i['receipts_count'] += round( + sum(item['receipts_count'] for item in obj_receipts if item['receipts_count']), 2) + + obj_i['sales_sum'] -= obj_i['receipts_sum'] + obj_i['sales_count'] -= obj_i['receipts_count'] + + if cash_receipts: + # минусуем из оплат кэшевые операции потому как возвраты + obj_i['paid_sum'] -= round(sum(item['receipts_sum'] for item in cash_receipts if item['receipts_sum']), 2) + + if obj_pays: + obj_i['paid_sum'] += round(sum(item['sum_pay_byn'] for item in obj_pays if item['sum_pay_byn']), 2) + + obj_i['indicative_sales'] = round(( obj_i['sales_sum'] + obj_i['paid_sum']) / 2, 2) + + required_del_client = False + if stat_kwargs: + if stat_kwargs and 'sales_count__gte' in stat_kwargs and stat_kwargs['sales_count__gte'] and \ + objs[objs_i][ + 'sales_count'] < float(stat_kwargs['sales_count__gte']): + required_del_client = True + elif stat_kwargs and 'sales_count__lte' in stat_kwargs and stat_kwargs['sales_count__lte'] and \ + objs[objs_i][ + 'sales_count'] > float(stat_kwargs['sales_count__lte']): + required_del_client = True + elif stat_kwargs and 'sales_sum__gte' in stat_kwargs and stat_kwargs['sales_sum__gte'] and objs[objs_i][ + 'sales_sum'] < float(stat_kwargs['sales_sum__gte']): + required_del_client = True + elif stat_kwargs and 'sales_sum__lte' in stat_kwargs and stat_kwargs['sales_sum__lte'] and objs[objs_i][ + 'sales_sum'] > float(stat_kwargs['sales_sum__lte']): + required_del_client = True + + # if 'months_count' in kwargs: + # obj_i['middle_sum_for_month'] = round( obj_i['indicative_sales'] / kwargs['months_count'], 2) + # # else: + # # print('!') + + if required_del_client: + del objs[objs_i] + else: + objs_i += 1 + + msg = 'managers_sales_by_period_n_regions finish - {0} (processing time = {1}
---------------

'.format( + str(datetime.now()), + str(datetime.now() - log_begin_DT) + ) + print(msg) + + return objs, chart_data_Dict \ No newline at end of file diff --git a/AuthApp/tests.py b/AuthApp/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/AuthApp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/AuthApp/urls.py b/AuthApp/urls.py new file mode 100644 index 0000000..a268e24 --- /dev/null +++ b/AuthApp/urls.py @@ -0,0 +1,57 @@ +# coding=utf-8 +from django.conf.urls import url +# from AuthApp.js_views import * +# from AuthApp.import_funcs import * +from AuthApp.views import * +from django.contrib.auth import views + +urlpatterns = [ + + # ajax ---------------- + # url(r'^login$', user_login_View_ajax, name='user_login_View_ajax'), + # url(r'^login_confirm$', user_login_confirm_ajax, name='user_login_confirm_ajax'), + # + # url(r'^logout$', user_logout_ajax, name='user_logout_View_ajax'), + # url(r'^logout_confirm$', user_logout_confirm_ajax, name='user_logout_confirm_ajax'), + # + # url(r'^check_exists_email$', check_exists_email_ajax, name='check_exists_email_ajax'), + # + # url(r'^registration$', user_registration_View_ajax, name='user_registration_View_ajax'), + # url(r'^user_registration_send_confirmation_mail$', + # user_registration_send_confirmation_mail_ajax, name='user_registration_send_confirmation_mail_ajax'), + # + # url(r'^password_recovery$', password_recovery_View_ajax, name='password_recovery_View_ajax'), + # url(r'^password_reset$', password_reset_send_mail_ajax, name='password_reset_send_mail_ajax'), + # + # url(r'^registration_by_order_data_and_send_confirmation_mail$', + # registration_by_order_data_and_send_confirmation_mail_ajax, name='registration_by_order_data_and_send_confirmation_mail_ajax'), + # + # + # # ----------------------- + # + # url(r'^check_user_registration_and_activate/(?P[\d+]*)/(?P[0-9a-z\+\-\_]+)$', + # check_user_registration_and_activate, + # name='check_user_registration_and_activate'), + # + # # url(r'^user/password/reset/$', + # # 'django.contrib.auth.views.password_reset', + # # {'post_reset_redirect' : '/user/password/reset/done/', + # # 'password_reset_form': ResetForm + # # }, + # # name="password_reset"), + # # url(r'^user/password/reset/done/$', views.password_reset_done, name='password_reset_done'), + # url(r'^reset/(?P[0-9A-Za-z_\-]+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', + # views.password_reset_confirm, name='password_reset_confirm'), + # url(r'^reset/done/$', views.password_reset_complete, name='password_reset_complete'), + # + # + # # import + # url(r'^import_one_user/(?P[\d+]*)$', + # import_json_mipp_user_by_id, name='import_one_mipp'), + # url(r'^import_web_users$', + # import_json_mipp_webUsers, name='import_mipp_webUsers'), + # + # url(r'^import_invoices_for_user_by_user_id/(?P[\d+]*)$', + # import_invoices_for_user_by_user_id, name='import_invoices_for_user_by_user_id'), + +] \ No newline at end of file diff --git a/AuthApp/views.py b/AuthApp/views.py new file mode 100644 index 0000000..5fd6218 --- /dev/null +++ b/AuthApp/views.py @@ -0,0 +1,292 @@ +# coding=utf-8 + +from django.shortcuts import render + +from uuid import uuid1 +from AuthApp.models import * +from django.contrib import auth +from django.http import HttpResponse, Http404 +from django.template import loader, RequestContext +from django.contrib.auth.decorators import login_required +from BaseModels.mailSender import techSendMail +from django.utils.translation import ugettext as _ +from datetime import datetime + + +def create_personal_user(data, creator): + + try: + + user_id = str(uuid1().hex)[:10] + user_name = data['email'] + mail = user_name + user = User.objects.create_user(username=user_name, email=mail, password=user_id) + + if 'first_name' in data and data['first_name']: + user.first_name = data['first_name'] + if 'last_name' in data and data['last_name']: + user.last_name = data['last_name'] + user.is_staff = False + user.is_active = False + user.is_superuser = False + # user.set_password(user_id) + user.save() + + user_communications_ads_list = [] + + if 'office__name' in data['user_profile']: + del data['user_profile']['office__name'] + if 'communications' in data['user_profile']: + + user_communications_ads_list.extend(data['user_profile']['communications']) + del data['user_profile']['communications'] + + if not 'creator' in data['user_profile'] and creator: + data['user_profile']['creator'] = creator + + profiles = UserProfile.objects.filter(user=user).update(**data['user_profile']) + + if user_communications_ads_list: + from GeneralApp.funcs import create_communications_items_by_list + comm_objs = create_communications_items_by_list(user.user_profile, user_communications_ads_list) + + user.refresh_from_db() + + return { + 'name' : mail, + 'pass' : user_id, + 'user' : user + } + except Exception as e: + return { + 'error': 'Ошибка добавление нового пользователя = {0}'.format(str(e)), + } + + + +def decode_get_param(data): + import base64 + import json + + d = data['data'].encode() + token_data = base64.b64decode(d) + + try: + request_data = token_data.decode('utf8') + except: + request_data = token_data + + data = json.loads(request_data) + + return data + +def check_user_key(data): + # print(u'check_user_key') + + + # try: + # user_id = int(data[0]) + # except: + # user_id = None + # try: + # user1S_id = int(data[1]) + # + # company_id = data[2] + # user_key = data[3] + + res = u'Key Broken' + # user_id = data[u'userId'] + # user_key = data[u'userKey'] + # user1S_id = data['user1S_id'] + # company_id = data[u'companyId'] + + data = decode_get_param(data) + + try: + token = UserTokens.objects.get( + user_id=data['pk'], + user_key=data['code'], + user1S_id=data['1S_pk'], + company_id = data['comp_pk'] + ) + res = u'Accept' + # print(u'try1 ok') + except UserTokens.DoesNotExist: + # если не найден id и ключ + try: + token = UserTokens.objects.get( + user_id=data['pk'] + ) + # techSendMail( + # u'user try access by id={0}, key={1}, c_id={2}'.format( + # str(user_id), + # str(user_key), + # str(company_id) + # ) + # ) + + res = u'Key Broken' + # print(u'try2 ok') + except UserTokens.DoesNotExist: + # если не найден id + token = UserTokens.objects.create( + user_id=data['pk'], + user_key=data['code'], + company_id=data['comp_pk'] + ) + res = u'Accept' + # print(u'except ok') + + return res + + + +def recovery_password_user(request, uidb64=None, token=None): + from django.contrib.auth.views import PasswordResetConfirmView + + return PasswordResetConfirmView(request=request, uidb64=uidb64, token=token + ) + + +# def recovery_password_user_complete(request, user_id, authCode): +# from django.contrib.auth.forms import SetPasswordForm +# from AuthApp.funcs import sendActivationMail +# +# try: +# user = User.objects.get(id=user_id, mipp_user__authMailCode=authCode) +# +# except: +# user = None +# +# if user: +# +# user.set_password() +# +# if reg_user.is_active: +# activated_early = True +# else: +# reg_user.backend = 'AuthApp.backends.BaldeniniAuthBackend' +# login(request, reg_user) +# +# reg_user.is_active = True +# reg_user.save() +# sendActivationMail(reg_user) +# +# else: +# raise Http404 +# # print(reg_user) +# +# context = { +# 'user': user, +# 'activated_early' : activated_early, +# } +# +# t = loader.get_template('pages/profile.html') +# +# rContext = RequestContext(request, context) +# return HttpResponse(t.render(rContext)) + + + +# def check_user_registration_and_activate(request, user_id, authCode): +# from django.contrib.auth import authenticate, login +# from AuthApp.funcs import sendActivationMail +# +# try: +# reg_user = User.objects.get(id=user_id, mipp_user__authMailCode=authCode) +# +# except: +# reg_user = None +# +# activated_early = False +# +# if reg_user: +# +# if reg_user.is_active: +# activated_early = True +# else: +# reg_user.backend = 'AuthApp.backends.BaldeniniAuthBackend' +# login(request, reg_user) +# +# reg_user.is_active = True +# reg_user.save() +# sendActivationMail(reg_user) +# +# else: +# raise Http404 +# # print(reg_user) +# +# context = { +# 'reg_user': reg_user, +# 'activated_early' : activated_early, +# } +# +# +# +# t = loader.get_template('admin_pages/pages/Profile/profile.html') +# +# # rContext = RequestContext(request, context) +# # return HttpResponse(t.render(rContext)) +# return HttpResponse(t.render(context, request)) + + + +def create_temporary_user(): + from django.utils.translation import ugettext as _ + user_id = str(uuid1().hex)[:10] + user_name = u'user'+user_id + mail = user_id+u'@truenergy.by' + user = User.objects.create_user(mail, mail,user_id) + user.first_name = _(u'незарег. пользователь') + user.last_name = u'' + user.is_staff = False + user.is_active = True + user.is_superuser = False + user.set_password(user_id) + # print(u'user_create_pass', user.password) + # p = user.get_profile() + # p.address = '' + # p.phone = '' + # p.group = None + # p.discount = 0 + # p.pay_balance = 0 + # p.authMailCode = uuid1().hex + # p.save() + + user.save() + user.mipp_user.temporary_user = True + user.mipp_user.save() + # print('user',user) + # print('created profile',p) + # print('user created', user) + return { + 'name' : mail, + 'pass' : user_id, + 'user' : user + } + + +def get_active_user(request): + if request.user.is_anonymous: + return None + else: + user = request.user + # try: + # bd = user.mipp_user.birthdate + # except MIPPUser.DoesNotExist: + # MIPPUser.objects.create(user=user) + + return user + + +def get_active_user_if_anonymous_create_temporary(request): + + user = get_active_user(request) + + if not user: + new_user_Dict = create_temporary_user() + user = auth.authenticate(username=new_user_Dict['name'], password=new_user_Dict['pass']) + if user: + auth.login(request, user) + + return user \ No newline at end of file diff --git a/BaseModels/SMS_sender.py b/BaseModels/SMS_sender.py new file mode 100644 index 0000000..7fb107c --- /dev/null +++ b/BaseModels/SMS_sender.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +__author__ = 'SDE' + +import urllib3 +import json + +def send_SMS(phone, text, urgent=False, staff=False): + import re + from BaseModels.mailSender import techSendMail + print('send_SMS') + + # change all + for GET request + text = text.replace(' ', '+') + text = text.encode('utf-8') + + if not staff: + phone = phone.replace(' ', '') + p = re.compile('\d{7,12}') + phone_list = p.findall(phone) + + if not phone_list: + return u'phone DoesNotExist' + + phone = phone_list[0] + + phone.encode('utf-8') + + http_request = 'http://cp.websms.by/?r=api/msg_send' \ + '&user=administrator@baldenini.by' \ + '&apikey=zTwevODOYl' \ + '&sender=Baldenini' + # '&test=1' + + if urgent: + http_request = http_request + '&urgent=1' + http_request = http_request + '&recipients=' + phone + + http_request = http_request.encode('utf-8') + + http_request = http_request + '&message=' + text + + http = urllib3.PoolManager() + + r = http.request('GET', http_request) + + r_status = json.loads(r.data) + + if r_status['status'] == 'error': + message = r_status['message'] + try: + req = http_request.decode('utf-8') + message = req + u'
' + message + # message = message.decode('utf-8') + techSendMail(message) + except: + pass + else: + message = None + + stat = { + 'status' : r_status, + 'message' : message, + } + + print('sms_status', phone, stat) + + return r_status + # return u'Accept' \ No newline at end of file diff --git a/BaseModels/__init__.py b/BaseModels/__init__.py new file mode 100644 index 0000000..14c7ff2 --- /dev/null +++ b/BaseModels/__init__.py @@ -0,0 +1 @@ +__author__ = 'SDE' diff --git a/BaseModels/admin_utils.py b/BaseModels/admin_utils.py new file mode 100644 index 0000000..16cf175 --- /dev/null +++ b/BaseModels/admin_utils.py @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- + +__author__ = 'SDE' + +from django.contrib.admin.widgets import AdminFileWidget, AdminTextareaWidget +from django.contrib.postgres.fields import JSONField +from django.utils.safestring import mark_safe +from django.db import models +from django.contrib import admin +from django.forms import widgets +import re +import json + + +# from modeltranslation.admin import TranslationAdmin + +# from filebrowser.admin import + + +class AdminImageWidget(AdminFileWidget): + + def render(self, name, value, attrs=None, renderer=None): + output = [] + if value and getattr(value, "url", None): + output.append( + u' '.format( + url=value.url)) + output.append(super(AdminFileWidget, self).render(name, value, attrs)) + + return mark_safe(u''.join(output)) + + +class Admin_BaseIconTabularModel(admin.TabularInline): + + def formfield_for_dbfield(self, db_field, **kwargs): + formfield = super(Admin_BaseIconTabularModel, self).formfield_for_dbfield(db_field, **kwargs) + if db_field.name == 'url' or db_field.name == 'name' or db_field.name == 'title' or db_field.name == 'comment': + formfield.widget = admin.widgets.AdminTextInputWidget(attrs={'style': 'width: 500px'}) + if db_field.name == 'workListForServicePage': + formfield.widget = admin.widgets.AdminTextInputWidget(attrs={'style': 'width: 800px'}) + if db_field.name == 'seo_title': + formfield.widget = admin.widgets.AdminTextInputWidget(attrs={'style': 'width: 800px'}) + if db_field.name == 'seo_description' or db_field.name == 'seo_keywords': + formfield.widget = admin.widgets.AdminTextareaWidget(attrs={'style': 'width: 800px'}) + if db_field.name in ('text', 'description', 'seo_text'): + formfield.widget = admin.widgets.AdminTextareaWidget(attrs={'style': 'width: 800px'}) + return formfield + + def image_thumb(self, obj): + + try: + image_url = obj.picture.url + except: + image_url = None + + if not image_url: + try: + image_url = obj.icon.url + except: + image_url = None + + if not image_url: + try: + image_url = obj.logo.url + except: + image_url = None + + if not image_url: + try: + image_url = obj.photo.url + except: + image_url = None + + if not image_url: + try: + image_url = obj.banner.photo.url + except: + image_url = None + + if image_url: + s = str('') + return mark_safe(s) + else: + return '(none)' + + image_thumb.short_description = u'Миниатюра' + image_thumb.allow_tags = True + + +class PrettyJSONWidget(widgets.Textarea): + + def format_value(self, value): + try: + value = json.dumps(json.loads(value), indent=2, sort_keys=True, ensure_ascii=False) + # these lines will try to adjust size of TextArea to fit to content + row_lengths = [len(r) for r in value.split('\n')] + self.attrs['rows'] = min(max(len(row_lengths) + 2, 10), 30) + self.attrs['cols'] = min(max(max(row_lengths) + 2, 40), 120) + return value + except Exception as e: + print("Error while formatting JSON: {}".format(e)) + # logger.warning("Error while formatting JSON: {}".format(e)) + return super(PrettyJSONWidget, self).format_value(value) + + +class Admin_BaseIconModel(admin.ModelAdmin): + # from codemirror import CodeMirrorTextarea + # codemirror_widget = CodeMirrorTextarea( + # mode="python", + # theme="cobalt", + # config={ + # 'fixedGutter': True + # }, + # ) + + def formfield_for_dbfield(self, db_field, **kwargs): + + formfield = super(Admin_BaseIconModel, self).formfield_for_dbfield(db_field, **kwargs) + if db_field.name == 'url' or db_field.name == 'name' or db_field.name == 'title': + formfield.widget = admin.widgets.AdminTextInputWidget(attrs={'style': 'width: 500px'}) + if db_field.name == 'workListForServicePage': + formfield.widget = admin.widgets.AdminTextInputWidget(attrs={'style': 'width: 800px'}) + if db_field.name == 'seo_title': + formfield.widget = admin.widgets.AdminTextInputWidget(attrs={'style': 'width: 800px'}) + if db_field.name == 'seo_description' or db_field.name == 'seo_keywords': + formfield.widget = admin.widgets.AdminTextareaWidget(attrs={'style': 'width: 800px'}) + if db_field.name in ('lexems',): + formfield.widget = admin.widgets.AdminTextareaWidget(attrs={'style': 'width: 80%'}) + if db_field.name in ('type_full_name', 'properties_title_name', 'where_buy_title_name'): + formfield.widget = admin.widgets.AdminTextInputWidget(attrs={'style': 'width: 80%'}) + + return formfield + + formfield_overrides = { + models.ImageField: {'widget': AdminImageWidget}, + JSONField: {'widget': PrettyJSONWidget} + } + + def image_thumb(self, obj): + + try: + image_url = obj.avatar.url + except: + image_url = None + + if not image_url: + try: + image_url = obj.picture.url + except: + image_url = None + + if not image_url: + try: + image_url = obj.icon.url + except: + image_url = None + + if not image_url: + try: + image_url = obj.main_photo().url + except: + image_url = None + + if not image_url: + try: + image_url = obj.offer.main_photo().url + except: + image_url = None + + if not image_url: + try: + image_url = obj.rel_product.main_photo().url + except: + image_url = None + + if not image_url: + try: + image_url = obj.logo.url + except: + image_url = None + + if not image_url: + try: + image_url = obj.photo.url + except: + image_url = None + + if not image_url: + try: + image_url = obj.picture.url + except: + image_url = None + + if image_url: + s = str('') + return mark_safe(s) + else: + return '(none)' + + image_thumb.short_description = u'Миниатюра' + image_thumb.allow_tags = True + + +from modeltranslation.admin import TranslationAdmin + + +class AdminTranslation_BaseIconModel(Admin_BaseIconModel, TranslationAdmin): + class Media: + js = ( + 'https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', + 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js', + 'modeltranslation/js/tabbed_translation_fields.js', + # 'cked/ckeditor/ckeditor.js' + ) + css = { + 'screen': ('modeltranslation/css/tabbed_translation_fields.css',), + } diff --git a/BaseModels/api/__init__.py b/BaseModels/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/BaseModels/api/api_export_xls.py b/BaseModels/api/api_export_xls.py new file mode 100644 index 0000000..984c50e --- /dev/null +++ b/BaseModels/api/api_export_xls.py @@ -0,0 +1,43 @@ +from openpyxl import Workbook +from django.http import HttpResponse +from openpyxl.writer.excel import save_virtual_workbook + +def xls_export(data, filename): + print('xls_export') + + # wb = Workbook() + # ws = wb.active + # + # r = 1 + # for row in data: + # c = 1 + # for val in row.values(): + # try: + # ws.cell(row=r, column=c).value = val + # except: + # ws.cell(row=r, column=c).value = str(val) + # c += 1 + # + # r += 1 + # + # dims = {} + # for row in ws.rows: + # for cell in row: + # if cell.value: + # dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value)))) + # for col, value in dims.items(): + # ws.column_dimensions[col].width = value + + # filepath = "/demo.xlsx" + # wb.save(filepath) + + # output = BytesIO() + # wb.save(output) + + from ..office_documents_utils import get_xls_file_by_data_list + xls_file = get_xls_file_by_data_list(data) + + response = HttpResponse(xls_file, content_type='application/ms-excel') + response['Content-Disposition'] = 'attachment; filename="{0}"'.format(filename) + + return response \ No newline at end of file diff --git a/BaseModels/api/api_inter.py b/BaseModels/api/api_inter.py new file mode 100644 index 0000000..66e8d9a --- /dev/null +++ b/BaseModels/api/api_inter.py @@ -0,0 +1,23 @@ + + +def check_and_get_specific_output_format(obj, data=None, filename=None): + + if obj.request.query_params and 'output_format' in obj.request.query_params and obj.request.query_params['output_format'] == 'xlsx': + + if not data: + serializer = obj.get_serializer(obj.get_queryset(), many=True) + data = serializer.data + + from .api_export_xls import xls_export + return xls_export(data, filename) + + return None + +def fix_txt_for_use_in_interlinks(txt): + txt = txt.replace('/', ' ') + txt = txt.replace('?', ' ') + txt = txt.replace(';', ' ') + txt = txt.replace(',', ' ') + txt = txt.replace('+', ' ') + txt = txt.replace(':', ' ') + return txt \ No newline at end of file diff --git a/BaseModels/api/api_middlewares.py b/BaseModels/api/api_middlewares.py new file mode 100644 index 0000000..e35d137 --- /dev/null +++ b/BaseModels/api/api_middlewares.py @@ -0,0 +1,19 @@ +# from rest_framework import viewsets +# +# class APILogMiddleware(viewsets.ModelViewSet): +# # def __init__(self, get_response): +# # self.get_response = get_response +# # One-time configuration and initialization. +# +# def __call__(self, request): +# # Code to be executed for each request before +# # the view (and later middleware) are called. +# +# response = self.get_response(request) +# +# self +# +# # Code to be executed for each request/response after +# # the view is called. +# +# return response \ No newline at end of file diff --git a/BaseModels/api/base_api_parsers.py b/BaseModels/api/base_api_parsers.py new file mode 100644 index 0000000..cb2f38a --- /dev/null +++ b/BaseModels/api/base_api_parsers.py @@ -0,0 +1,22 @@ +import codecs + +from django.conf import settings +from rest_framework.exceptions import ParseError +from rest_framework.parsers import BaseParser + +class PlainTextParser(BaseParser): + media_type = "text/plain" + + def parse(self, stream, media_type=None, parser_context=None): + """ + Parses the incoming bytestream as Plain Text and returns the resulting data. + """ + parser_context = parser_context or {} + encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) + + try: + decoded_stream = codecs.getreader(encoding)(stream) + text_content = decoded_stream.read() + return text_content + except ValueError as exc: + raise ParseError('Plain text parse error - %s' % str(exc)) \ No newline at end of file diff --git a/BaseModels/api/base_api_permissions.py b/BaseModels/api/base_api_permissions.py new file mode 100644 index 0000000..0b4bc40 --- /dev/null +++ b/BaseModels/api/base_api_permissions.py @@ -0,0 +1,36 @@ +from rest_framework.permissions import BasePermission + +class StaffOnly_perm(BasePermission): + """ + Allows access only to staff users. + """ + def has_permission(self, request, view): + return request.user and request.user.is_staff + + +class api_1C_perm(BasePermission): + """ + Allows access only 1C users. + """ + + # def has_object_permission(self, request, view, obj): + def has_permission(self, request, view): + if request.user.id == 8751: + try: + if request.req_type == 'warehouse_import': + return True + else: + return False + except: + return False + perm = request.user.has_perm('AuthApp.1c_api') + return perm + + +class full_api_perm(BasePermission): + """ + Allows access only users w full access. + """ + def has_permission(self, request, view): + return request.user.has_perm('AuthApp.full_api') + diff --git a/BaseModels/api/base_api_serializers.py b/BaseModels/api/base_api_serializers.py new file mode 100644 index 0000000..2b4412d --- /dev/null +++ b/BaseModels/api/base_api_serializers.py @@ -0,0 +1,44 @@ +from rest_framework import serializers +from django.contrib.contenttypes.models import ContentType +from BaseModels.mailSender import techSendMail + + +class Import_Element_Srializer(serializers.Serializer): + element = serializers.JSONField() + class Meta: + fields = ( + 'element', + ) + + +class Import_Pocket_Srializer(serializers.Serializer): + timestamp = serializers.IntegerField() + warehouse = serializers.CharField() + data_list = Import_Element_Srializer(many=True) + + class Meta: + fields = ( + 'timestamp', 'warehouse', 'data_list' + ) + + + +class Generic_base_Serializer(serializers.ModelSerializer): + linked_object_type = serializers.CharField(required=False) + + def create(self, validated_data): + if 'linked_object_type' in validated_data: + try: + validated_data['content_type'] = ContentType.objects.get(model=validated_data['linked_object_type']) + del validated_data['linked_object_type'] + except Exception as e: + msg = 'Ошибка создания generic объекта
{0}({1})
{2}'.format( + str(e), + str(e.args), + str(validated_data) + ) + print(msg) + title = 'ОШИБКА tE Generic_base_Serializer create' + techSendMail(msg, title) + + return super(Generic_base_Serializer, self).create(validated_data) \ No newline at end of file diff --git a/BaseModels/api/base_api_views.py b/BaseModels/api/base_api_views.py new file mode 100644 index 0000000..c0463a6 --- /dev/null +++ b/BaseModels/api/base_api_views.py @@ -0,0 +1,356 @@ +# coding=utf-8 +from rest_framework import generics +from rest_framework.authentication import BasicAuthentication, SessionAuthentication +from rest_framework.permissions import IsAuthenticated, DjangoObjectPermissions +from rest_framework.views import APIView +from rest_framework import viewsets +from rest_framework.renderers import JSONRenderer +from rest_framework.permissions import AllowAny +from rest_framework.response import Response +from rest_framework.schemas import SchemaGenerator +from rest_framework_swagger import renderers +from BaseModels.api.base_api_permissions import * +from datetime import datetime +from GeneralApp.temp_data_funcs import add_element_in_tmp_data_list, check_exists_element_in_tmp_data_list, add_element_list_to_tmp_data +from rest_framework.utils.serializer_helpers import ReturnList +from rest_framework.decorators import action +from rest_framework import status +from django.contrib.contenttypes.models import ContentType + +from BaseModels.mailSender import techSendMail +# from BaseModels.api.api_middlewares import APILogMiddleware + + +class SwaggerSchemaView(APIView): + permission_classes = [AllowAny] + renderer_classes = [ + renderers.OpenAPIRenderer, + renderers.SwaggerUIRenderer + ] + + def get(self, request): + generator = SchemaGenerator() + schema = generator.get_schema(request=request) + + return Response(schema) + + + + +JSONCustomRenderer = JSONRenderer +JSONCustomRenderer.charset = 'utf-8' + + +class APIBasePublicClass(APIView): + # authentication_classes = (SessionAuthentication, BasicAuthentication) + permission_classes = (AllowAny,) + # renderer_classes = [JSONCustomRenderer] + pagination_class = None + + # def finalize_response(self, request, response, *args, **kwargs): + # + # res = super(APIBasePublicClass, self).finalize_response(request, response, *args, **kwargs) + # + # from CompaniesApp.models import Region + # regions = Region.objects.filter().values_list( + # 'id', 'domain' + # ).order_by('id') + # res.data.update({'regions': tuple(regions)}) + # + # return res + + + # def get(self, request, *args, **kwargs): + # + # if not 'region_id' in request.headers: + # request.headers['region_id'] = '1' + # + # return super(APIBasePublicClass, self).get(request, *args, **kwargs) + + +class APIListBaseClass(generics.ListAPIView): + # authentication_classes = (SessionAuthentication, BasicAuthentication, )# + permission_classes = (IsAuthenticated,) + pagination_class = None + +class APIBaseClass(generics.RetrieveAPIView): + # authentication_classes = (SessionAuthentication, BasicAuthentication, )# + permission_classes = (IsAuthenticated, ) + # renderer_classes = [JSONCustomRenderer] + pagination_class = None + + +class APIBaseSimplaClass(generics.GenericAPIView): + # authentication_classes = (SessionAuthentication, BasicAuthentication) + permission_classes = (IsAuthenticated,) + # renderer_classes = [JSONCustomRenderer] + pagination_class = None + +# ---------------------------- + +class APIViewSet_ModelReadOnlyClass(viewsets.ReadOnlyModelViewSet): + pass + # authentication_classes = (SessionAuthentication, BasicAuthentication, )# + permission_classes = (IsAuthenticated, ) + # renderer_classes = [JSONCustomRenderer] + pagination_class = None + + + +exclude_actions_for_logging = [] + +create_kwargs = [ + 'create', 'create_short', 'create_item', + 'copy_item', 'create_short', 'create_reminder' +] + +exclude_actions_for_logging.extend(create_kwargs) +exclude_actions_for_logging.extend([ + 'update', 'partial_update', 'destroy', 'update_items', 'update_item' +]) + +def log_save_cur_state_obj(query_data, response=None, init=False): + + if query_data.basename == 'alert' or not query_data.action in exclude_actions_for_logging: + return None + + if response and response.status_code > 299: + return None + + data_Dict = {} + data_target = 'log_{0}'.format(str(query_data.basename)) + obj_id = None + + try: + + if type(query_data.request.data) == list and query_data.request.data and len(query_data.request.data) > 0 and \ + 'id' in query_data.request.data[0]: + objs_list_ids = [obj['id'] for obj in query_data.request.data] + elif response and response.data and type(response.data) == dict and 'id' in response.data: + objs_list_ids = [response.data['id']] + elif response and response.data and getattr(response.data.serializer, 'instance', None): + objs_list_ids = [response.data.serializer.instance.id] + elif response and response.data and 'id' in response.data and response.data['id']: + objs_list_ids = [response.data['id']] + elif query_data.request.data and 'id' in query_data.request.data: + objs_list_ids = [query_data.request.data['id']] + elif 'pk' in query_data.kwargs: + objs_list_ids = [query_data.kwargs['pk']] + elif query_data.queryset: + objs_list_ids = query_data.queryset.values_list('id') + else: + return None + + # if not objs_list_ids: + # + # serializer = query_data.serializer_class() + # data = serializer(data=query_data.request.data) + # + # data_Dict = { + # 'data': data, + # 'DT': str(datetime.now()), + # 'user': str(query_data.request.user), + # 'oper_type': query_data.action, + # 'init': init + # } + # + # add_element_in_tmp_data_list('log', data_target, obj_id, data_Dict) + + objs_list = query_data.queryset.filter(id__in=objs_list_ids) + + cur_action = query_data.action + query_data.action = 'retrieve' + serializer = query_data.get_serializer_class() + query_data.action = cur_action + obj_data_list = serializer(objs_list, many=True) + + elements_list_for_add_to_tmp_data = [] + for obj_data in obj_data_list.data: + obj_id = obj_data['id'] + + # фиксим json-неподходящие поля + for item_data in obj_data.keys(): + if type(obj_data[item_data]) not in (str, int, float, dict, list, bool): + obj_data[item_data] = str(obj_data[item_data]) + + + # if init: + # if check_exists_element_in_tmp_data_list('log', data_target, obj_id): + # continue + + data_Dict = { + 'id': obj_id, + 'data': obj_data, + 'DT': str(datetime.now()), + 'user': str(query_data.request.user), + 'oper_type': query_data.action, + 'init': init + } + + # add_element_in_tmp_data_list('log', data_target, obj_id, data_Dict) + elements_list_for_add_to_tmp_data.append(data_Dict) + + add_element_list_to_tmp_data('log', data_target, init, elements_list_for_add_to_tmp_data) + + except Exception as e: + response_data = '' + if response and response.data: + response_data = str(response.data) + + msg = 'log_save_cur_state_obj fail save to log w data = {0}
{1}
{2}
response_data={3}'.format( + str(e), + 'log - ' + str(data_target) + ' - ' + str(obj_id), + str(data_Dict), + response_data + ) + techSendMail(msg) + + return 'OK' + + + +class APIViewSet_ModelClass(viewsets.ModelViewSet): + # pass + # # authentication_classes = (SessionAuthentication, BasicAuthentication, )# + # permission_classes = (IsAuthenticated, ) + # # renderer_classes = [JSONCustomRenderer] + # pagination_class = None + + + + + def initial(self, request, *args, **kwargs): + + res = super(APIViewSet_ModelClass, self).initial(request, *args, **kwargs) + if self.basename == 'alert' or not self.action in exclude_actions_for_logging: + return res + + if not self.action in create_kwargs: + log_save_cur_state_obj(self, init=True) + + return res + + + def finalize_response(self, request, response, *args, **kwargs): + + res = super(APIViewSet_ModelClass, self).finalize_response(request, response, *args, **kwargs) + if self.basename == 'alert' or not self.action in exclude_actions_for_logging: + return res + + log_save_cur_state_obj(self, response=response) + + return res + + + def create(self, request, *args, **kwargs): + obj = super(APIViewSet_ModelClass, self).create(request, *args, **kwargs) + + # data_Dict = {} + # try: + # data_Dict = { + # 'data': prepare_data_for_json(vars(obj)), + # 'DT': str(datetime.now()), + # 'user': str(request.user), + # 'oper_type': 'create' + # } + # + # add_element_in_tmp_data_list('log', 'properties_log', obj.id, data_Dict) + # except Exception as e: + # msg = 'fail save to log w data = {0}
{1}'.format( + # 'log - properties_log - ' + str(obj.id), + # str(data_Dict) + # ) + # techSendMail(msg) + + return obj + + + + def partial_update(self, request, *args, **kwargs): + if request.data: + request.data['modifiedDT'] = datetime.now() + obj = super(APIViewSet_ModelClass, self).partial_update(request, *args, **kwargs) + + # data_Dict = {} + # try: + # data_Dict = { + # 'data': prepare_data_for_json(vars(obj)), + # 'DT': str(datetime.now()), + # 'user': str(request.user), + # 'oper_type': 'create' + # } + # + # add_element_in_tmp_data_list('log', 'properties_log', obj.id, data_Dict) + # except Exception as e: + # msg = 'fail save to log w data = {0}
{1}'.format( + # 'log - properties_log - ' + str(obj.id), + # str(data_Dict) + # ) + # techSendMail(msg) + + return obj + + +class APIViewSet_ModelClass_w_Expenses(APIViewSet_ModelClass): + + @action(methods=['GET'], detail=True) + def expenses_rates(self, request, *args, **kwargs): + from ExpensesApp.api.v1.expenses_rate.expenses_rate_api_serializers import ExpensesRate_get_Serializer + model = self.serializer_class.Meta.model + + try: + obj = model.objects.get(id=kwargs['pk']) + + except model.DoesNotExist: + return Response({'error': u'ошибка получения expenses_rates'}, + status=status.HTTP_400_BAD_REQUEST) + + expenses_rates = obj.expenses_rates.all() + serializer = ExpensesRate_get_Serializer(expenses_rates, many=True) + + # if serializer.data: + # return Response(serializer.data) + + return Response(serializer.data) + + @action(methods=['GET'], detail=True) + def expenses_data(self, request, *args, **kwargs): + from ExpensesApp.api.v1.expenses_data.expenses_data_api_serializers import ExpensesData_get_Serializer + model = self.serializer_class.Meta.model + + try: + obj = model.objects.get(id=kwargs['pk']) + + except model.DoesNotExist: + return Response({'error': u'ошибка получения expenses_rates'}, + status=status.HTTP_400_BAD_REQUEST) + + expenses_data = obj.expenses_data.all() + serializer = ExpensesData_get_Serializer(expenses_data, many=True) + + # if serializer.data: + # return Response(serializer.data) + + return Response(serializer.data) + + +class APIViewSet_BaseClass(viewsets.ViewSet): + pass + # authentication_classes = (SessionAuthentication, BasicAuthentication,) # + permission_classes = (IsAuthenticated, ) + # renderer_classes = [JSONCustomRenderer] + pagination_class = None + + +# class APIBaseClass(generics.RetrieveAPIView): +# authentication_classes = (SessionAuthentication, BasicAuthentication, )# +# permission_classes = (IsAuthenticated,) +# # renderer_classes = [JSONCustomRenderer] +# pagination_class = None +# +# +# class APIBaseSimplaClass(APIView): +# authentication_classes = (SessionAuthentication, BasicAuthentication) +# permission_classes = (IsAuthenticated,) +# # renderer_classes = [JSONCustomRenderer] +# pagination_class = None \ No newline at end of file diff --git a/BaseModels/base_models.py b/BaseModels/base_models.py new file mode 100644 index 0000000..23bdef7 --- /dev/null +++ b/BaseModels/base_models.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- + +__author__ = 'SDE' + +from django.db import models +from datetime import datetime +# from ckeditor.fields import RichTextField +# from BaseModels.pil_graphic_utils import * +from django.utils.translation import gettext_lazy as _ +from django.db.models.signals import post_save, pre_save +from django.utils.text import slugify +from django.contrib.postgres.fields import JSONField +from ckeditor.fields import RichTextField + + +# add_introspection_rules([], ["^tinymce\.models\.HTMLField"]) + +class BaseModel(models.Model): + name = models.TextField(verbose_name=_('Название'), + help_text=_('Название'), null=True, blank=True) + name_plural = models.TextField(verbose_name=_('Название (множественное число)'), + null=True, blank=True) + order = models.IntegerField(verbose_name=_('Очередность отображения'), null=True, blank=True) + createDT = models.DateTimeField(auto_now_add=True, verbose_name=_('Дата и время создания')) + modifiedDT = models.DateTimeField(verbose_name=_('Дата и время последнего изменения'), null=True, blank=True) + enable = models.BooleanField(verbose_name=_('Включено'), default=True, db_index=True) + + json_data = models.JSONField(verbose_name=_('Дополнительные данные'), default=dict, blank=True) + + def __str__(self): + return self.name + + def get_node_by_name(self, node_name): + if not self.json_data or not node_name in self.json_data: + return None + + return self.json_data[node_name] + + def add_node_to_json_data(self, node_data, save=False): + if not self.json_data: + self.json_data = {} + if type(self.json_data) == dict: + self.json_data.update(node_data) + elif type(self.json_data) == list: + self.json_data.append(node_data) + + if save: + self.save(update_fields=['json_data']) + + return self.json_data + + def save(self, *args, **kwargs): + self.modifiedDT = datetime.now() + super().save(*args, **kwargs) + + class Meta: + abstract = True + + +def preSave_BaseModel(sender, instance, **kwargs): + if instance and instance.user_profile: + instance.modifiedDT = datetime.now() + + +pre_save.connect(preSave_BaseModel, sender=BaseModel, dispatch_uid='pre_save_connect') + + +class BaseModelViewPage(BaseModel): + url = models.TextField(verbose_name=_('URL привязанной страницы'), unique=True, + help_text=_( + 'можно изменить адрес страницы (!!! ВНИМАНИЕ !!! поисковые системы потеряют страницу и найдут лишь спустя неделю...месяц)')) + description = RichTextField(verbose_name=_('Краткое описание'), null=True, blank=True, # max_length=240, + help_text=_('краткое описание страницы (до 240 символов)')) + text = RichTextField(verbose_name=_('Полное описание'), null=True, blank=True, ) + # help_text=_(u'краткое описание страницы (до 240 символов)')) + picture = models.ImageField(upload_to='uploads/', verbose_name=_('Миниатюра'), null=True, blank=True, + help_text=u'') + # icon = FileBrowseField("Image", max_length=200, directory="files/", extensions=[".jpg"], blank=True, null=True) + visible = models.BooleanField(verbose_name=_('Отображать'), default=True) + background_image_left = models.ImageField(verbose_name=_('Левая подложка'), blank=True, null=True) + background_image_right = models.ImageField(verbose_name=_('Правая подложка'), blank=True, null=True) + + + seo_title = models.CharField(max_length=250, verbose_name=_('Title (80 знаков)'), null=True, blank=True) + seo_description = models.CharField(max_length=250, verbose_name=_('Description (150 знаков)'), null=True, + blank=True) + seo_keywords = models.CharField(max_length=250, verbose_name=_('Keywords (200 знаков)'), null=True, blank=True) + seo_text = RichTextField(verbose_name=_(u'Текст SEO статьи'), null=True, blank=True) + + + class Meta: + abstract = True + + def get_description_exists(self): + if self.description: + return True + return False + + def get_text_exists(self): + if self.text: + return True + return False + + +# @receiver(pre_save, sender=User) +def preSaveBaseModelViewPage(sender, instance, **kwargs): + if not sender.url: + sender.url = slugify(sender.name) + + +pre_save.connect(preSaveBaseModelViewPage, sender=BaseModelViewPage, dispatch_uid='pre_save_connect') diff --git a/BaseModels/colors/generate_colors.py b/BaseModels/colors/generate_colors.py new file mode 100644 index 0000000..4235e0c --- /dev/null +++ b/BaseModels/colors/generate_colors.py @@ -0,0 +1,150 @@ +from colorsys import hls_to_rgb, rgb_to_hls, rgb_to_hsv, hsv_to_rgb +from random import uniform, randint + +DEFAULT_LIGHTNESS = 0.5 +DEFAULT_SATURATION = 1 +DEFAULT_VARIANCE = 0.2 + + +def get_next_HSV_color(cur_color, offset_hue=0, offset_value=0, offset_saturation=0): + red = int(cur_color[0:2], base=16) + green = int(cur_color[2:4], base=16) + blue = int(cur_color[4:6], base=16) + + hue, saturation, value = rgb_to_hsv(red, green, blue) + new_hue = hue + offset_hue + new_value = value + offset_value + new_saturation = saturation - offset_saturation + + # new_hue = hue + offset_hue + # new_lightness = lightness + offset_lightness + # new_saturation = saturation + offset_saturation + + # red, green, blue = map( + # lambda v: int(v * 255), + # hls_to_rgb( + # new_hue, + # new_lightness, + # new_saturation, + # ), + # ) + + red, green, blue = hsv_to_rgb(new_hue, new_saturation, new_value) + + # red, green, blue = hls_to_rgb(hue_variant, lightness, saturation) + res = f"{int(red):02x}{int(green):02x}{int(blue):02x}" + + return res + + +def get_next_color(cur_color, offset_hue=0, offset_lightness=0, offset_saturation=0): + red = int(cur_color[0:2], base=16) + green = int(cur_color[2:4], base=16) + blue = int(cur_color[4:6], base=16) + + hue, lightness, saturation = rgb_to_hls(red, green, blue) + lightness = lightness / 255 + if saturation < 0.1: + saturation = 1 + + new_hue = hue + offset_hue + new_lightness = lightness + offset_lightness + new_saturation = saturation + offset_saturation + + if new_hue > 1: new_hue = offset_hue + if new_hue < 0: new_hue = 1 + if new_lightness > 1: new_lightness = offset_lightness + if new_lightness < 0: new_lightness = 1 + if new_saturation > 1: new_saturation = offset_saturation + if new_saturation < 0: new_saturation = 1 + + red, green, blue = map( + lambda v: int(v * 255), + hls_to_rgb( + new_hue, + new_lightness, + new_saturation, + ), + ) + + res = f"{red:02x}{green:02x}{blue:02x}" + + return res + + +class Huetify(object): + lightness: float + saturation: float + variance: float + half_variance: float + + def __init__( + self, + lightness=DEFAULT_LIGHTNESS, + saturation=DEFAULT_SATURATION, + variance=DEFAULT_VARIANCE, + ) -> None: + self.lightness = lightness + self.saturation = saturation + self.variance = variance + self.half_variance = variance / 2.0 + + def huetify_to_rgb_hex(self, hue) -> str: + hue_variant = uniform( + hue - self.half_variance, + hue + self.half_variance, + ) + red, green, blue = map( + lambda v: int(v * 255), + hls_to_rgb( + hue_variant, + self.lightness, + self.saturation, + ), + ) + return f"{red:02x}{green:02x}{blue:02x}" + + def huetify_next_variant_to_rgb_hex(self, cur_variant): + hue_variant = cur_variant + self.half_variance + red, green, blue = map( + lambda v: int(v * 255), + hls_to_rgb( + hue_variant, + self.lightness, + self.saturation, + ), + ) + return red, green, blue + + @property + def reddish(self): + return self.huetify_to_rgb_hex(0) + + @property + def greenish(self): + return self.huetify_to_rgb_hex(0.333) + + @property + def blueish(self): + return self.huetify_to_rgb_hex(0.666) + + def blue_colors(self, cur_variant=None): + if not cur_variant: + cur_variant = 0.666 - self.half_variance + return self.huetify_next_variant_to_rgb_hex(cur_variant=cur_variant) + + @property + def yellowish(self): + return self.huetify_to_rgb_hex(0.166) + + @property + def random_color(self): + ch = randint(1, 4) + if ch == 1: + return self.reddish + elif ch == 2: + return self.greenish + elif ch == 3: + return self.greenish + else: + return self.yellowish diff --git a/BaseModels/currency_exchange/__init__.py b/BaseModels/currency_exchange/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/BaseModels/currency_exchange/alfabank_api/alfabank_api_funcs.py b/BaseModels/currency_exchange/alfabank_api/alfabank_api_funcs.py new file mode 100644 index 0000000..52909fc --- /dev/null +++ b/BaseModels/currency_exchange/alfabank_api/alfabank_api_funcs.py @@ -0,0 +1,108 @@ +import requests +import json +from datetime import datetime, timedelta +from BaseModels.mailSender import techSendMail +from GeneralApp.temp_data_funcs import * + + +def get_alfabank_nb_rate_by_currency_code(code, date=None): + rate = None + res = None + req_str = None + + try: + + msg = f'get_alfabank_nb_rate_by_currency_code' + print(msg) + + int_code = None + if code == 'USD': + int_code = 840 + elif code == 'EUR': + int_code = 978 + elif code == 'RUB': + int_code = 643 + + code_str = '' + if int_code: + code_str = f'?currencyCode={int_code}' + + date_str = '' + if date: + date_str = f'date={datetime.now().strftime("%d.%m.%Y")}' + if int_code: + date_str = f'&{date_str}' + else: + date_str = f'?{date_str}' + + req_str = f'https://developerhub.alfabank.by:8273/partner/1.0.1/public/nationalRates{code_str}{date_str}' + + try: + msg = f'GET {req_str}' + print(msg) + res = requests.get(req_str) + msg = f'answer received = {str(res)}' + print(msg) + except Exception as e: + msg = f'Exception GET {req_str} = {str(e)} ({str(res)})' + print(msg) + res = None + + if res: + + # if not res and res != 200: + # if tmp_rec: + # rate = tmp_rec.json_data['rate'] + # else: + # rate_Dict = { + # 'rate': 1, + # 'DT': datetime.now().strftime('%d.%m.%Y %H:%M') + # } + # create_or_update_tmp_data('currency_rate', code, rate_Dict) + # rate = 1 + # + # msg = '!!!!! --- get_alfabank_nbrb_rate_by_currency_code requests GET error={0}
{1}
{2}
rate set = {3}'.format( + # str(e), + # str(res), + # str(req_str), + # str(rate) + # ) + # print(msg) + # techSendMail(msg, 'tE get_alfabank_nbrb_rate_by_currency_code error') + + data = json.loads(res.content) + + for item in data['rates']: + if item['iso'].upper() == code.upper(): + rate = item['rate'] / item['quantity'] + + rate_Dict = { + 'rate': rate, + 'DT': datetime.now().strftime('%d.%m.%Y %H:%M') + } + + create_or_update_tmp_data('currency_rate', code, rate_Dict) + break + + except Exception as e: + msg = '!!!!! --- get_alfabank_nb_rate_by_currency_code error={0}
{1}
{2}'.format( + str(e), + str(res), + str(req_str) + ) + print(msg) + techSendMail(msg, 'tE get_alfabank_nb_rate_by_currency_code error') + + # if not res: + # rate_Dict = { + # 'rate': 1, + # 'DT': datetime.now().strftime('%d.%m.%Y %H:%M') + # } + # create_or_update_tmp_data('currency_rate', code, rate_Dict) + # return 1 + + # if rate: + msg = f'get alfabank nb {code} rate = {str(rate)}' + print(msg) + + return rate diff --git a/BaseModels/currency_exchange/funcs.py b/BaseModels/currency_exchange/funcs.py new file mode 100644 index 0000000..5c71f36 --- /dev/null +++ b/BaseModels/currency_exchange/funcs.py @@ -0,0 +1,51 @@ +import requests +import json +from datetime import datetime, timedelta +from BaseModels.mailSender import techSendMail +from GeneralApp.temp_data_funcs import * + + +def get_rate_nb_by_currency_code(code, date=None): + from .nbrb.nbrb_currency_exchange import get_nbrb_rate_by_currency_code + from .alfabank_api.alfabank_api_funcs import get_alfabank_nb_rate_by_currency_code + + if code == 'BYN': + return 1 + + rate = None + request_required = True + + try: + + tmp_rec = get_tmp_data('currency_rate', code) + if tmp_rec and tmp_rec.json_data: + if 'rate' in tmp_rec.json_data: + # если с момента последнего импорта прошло меньше 30 минут - забираем курс из базы + if datetime.strptime(tmp_rec.json_data['DT'], '%d.%m.%Y %H:%M') + timedelta( + minutes=30) > datetime.now(): + rate = tmp_rec.json_data['rate'] + + if not rate: + # если с последней попытки меньше минуты - отдаем старый курс или None + if tmp_rec.modifiedDT + timedelta(minutes=5) > datetime.now(): + if 'rate' in tmp_rec.json_data: + rate = tmp_rec.json_data['rate'] + else: + request_required = False + + if request_required: + if not rate: + rate = get_alfabank_nb_rate_by_currency_code(code) + + # if not rate: + # rate = get_nbrb_rate_by_currency_code(code) + + tmp_rec.modifiedDT = datetime.now() + tmp_rec.save() + + except Exception as e: + msg = f'!!!!! --- get_rate_nb_by_currency_code error={str(e)}' + print(msg) + techSendMail(msg, 'tE get_rate_nb_by_currency_code error') + + return rate diff --git a/BaseModels/currency_exchange/nbrb/__init__.py b/BaseModels/currency_exchange/nbrb/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/BaseModels/currency_exchange/nbrb/nbrb_currency_exchange.py b/BaseModels/currency_exchange/nbrb/nbrb_currency_exchange.py new file mode 100644 index 0000000..5d5b95a --- /dev/null +++ b/BaseModels/currency_exchange/nbrb/nbrb_currency_exchange.py @@ -0,0 +1,115 @@ +import requests +import json +from datetime import datetime, timedelta +from BaseModels.mailSender import techSendMail +from GeneralApp.temp_data_funcs import * + + +def get_nbrb_currency_id_by_currency_code(code): + data = requests.get('https://www.nbrb.by/api/exrates/currencies') + + json_data = json.loads(data.content) + + for item in json_data: + if 'Cur_Abbreviation' in item and item['Cur_Abbreviation'] == code: + return item['Cur_Code'] + + return None + + +def get_nbrb_rate_by_currency_code(code, date=None): + # if code == 'BYN': + # return 1 + # + # tmp_rec = get_tmp_data('currency_rate', code) + # if tmp_rec and tmp_rec.json_data: + # # если с момента последнего импорта прошло меньше 30 минут - забираем курс из базы + # if datetime.strptime(tmp_rec.json_data['DT'], '%d.%m.%Y %H:%M') + timedelta(minutes=30) > datetime.now(): + # return tmp_rec.json_data['rate'] + + # currency_id = get_nbrb_currency_id_by_currency_code('USD') + rate = None + res = None + req_str = None + + try: + + msg = f'get_nbrb_rate_by_currency_code' + print(msg) + + if not date: + # data = requests.get('https://www.nbrb.by/API/ExRates/Rates/{0}?Periodicity=0'.format(str(currency_id))) + req_str = 'https://www.nbrb.by/api/exrates/rates/{0}?parammode=2'.format(str(code)) + else: + date_str = datetime.now().strftime('%Y-%m-%d') + date_str = date_str.replace('-0', '-') + req_str = 'https://www.nbrb.by/api/exrates/rates/{0}?parammode=2&ondate={1}'.format( + str(code), + date_str + ) + e = None + try: + msg = f'GET {req_str}' + print(msg) + res = requests.get(req_str, timeout=3) + msg = f'answer received = {str(res)}' + print(msg) + except Exception as e: + msg = f'Exception GET {req_str} = {str(e)} ({str(res)})' + print(msg) + res = None + + if not res and res != 200: + # if tmp_rec: + # rate = tmp_rec.json_data['rate'] + # else: + # rate_Dict = { + # 'rate': 1, + # 'DT': datetime.now().strftime('%d.%m.%Y %H:%M') + # } + # create_or_update_tmp_data('currency_rate', code, rate_Dict) + # rate = 1 + + msg = '!!!!! --- get_nbrb_rate_by_currency_code requests GET error={0}
{1}
{2}
rate set = {3}'.format( + str(e), + str(res), + str(req_str), + str(rate) + ) + print(msg) + techSendMail(msg, 'tE get_nbrb_rate_by_currency_code error') + + data = json.loads(res.content) + + if data and 'Cur_OfficialRate' in data and 'Cur_Scale' in data: + rate = data['Cur_OfficialRate'] / data['Cur_Scale'] + + rate_Dict = { + 'rate': rate, + 'DT': datetime.now().strftime('%d.%m.%Y %H:%M') + } + + create_or_update_tmp_data('currency_rate', code, rate_Dict) + + except Exception as e: + msg = '!!!!! --- get_nbrb_rate_by_currency_code error={0}
{1}
{2}'.format( + str(e), + str(res), + str(req_str) + ) + print(msg) + techSendMail(msg, 'tE get_nbrb_rate_by_currency_code error') + + # if not res: + # rate_Dict = { + # 'rate': 1, + # 'DT': datetime.now().strftime('%d.%m.%Y %H:%M') + # } + # create_or_update_tmp_data('currency_rate', code, rate_Dict) + # return 1 + + if rate: + msg = f'get nbrb nb rate = {rate}' + print(msg) + + return rate diff --git a/BaseModels/decorators.py b/BaseModels/decorators.py new file mode 100644 index 0000000..0d2411a --- /dev/null +++ b/BaseModels/decorators.py @@ -0,0 +1,35 @@ +from django.http import HttpResponse, JsonResponse +import json + +# _make_result = lambda result: HttpResponse(json.dumps(result), mimetype='application/json') +_make_result = lambda result: JsonResponse(result) + + +def jsonifydata(): + def decorator(func): + def wrapper(request, *args, **kwargs): + result = func(request, *args, **kwargs) + return HttpResponse(json.dumps(result), mimetype='application/json') + return wrapper + return decorator + + +def jsonify(validation_form=None): + + def decorator(func): + + def wrapper(request, *args, **kwargs): + + if not validation_form is None: + form = validation_form(data=request.POST, files=request.FILES) + + if form.is_valid(): + request.form_data = form.cleaned_data + else: + return _make_result({'result': False, 'errors': form.errors}) + + # return _make_result({'result': func(request, *args, **kwargs)}) + return _make_result(func(request, *args, **kwargs)) + + return wrapper + return decorator \ No newline at end of file diff --git a/BaseModels/error_processing.py b/BaseModels/error_processing.py new file mode 100644 index 0000000..817501d --- /dev/null +++ b/BaseModels/error_processing.py @@ -0,0 +1,67 @@ +from tEDataProj.settings import EXCEPTION_IMPORT_LOG_PATH, EXCEPTION_LOG_PATH +import codecs +from datetime import datetime + +def open_log_file(message, filename=None, import_exc=False): + + if not filename: + if import_exc: + filename = u'import_errors.log' + else: + filename = u'errors.log' + + if import_exc: + path = EXCEPTION_IMPORT_LOG_PATH + else: + path = EXCEPTION_LOG_PATH + + f = codecs.open(path + filename, 'a', "utf-8") + + msg = u'{0} - {1}\n---------------------------\n\n'.format( + str(datetime.now()), + message + ) + f.write(msg) + + return f + + +def close_log_file(f, message): + + msg = u'---------------------------\n{0} - {1}\n\n'.format( + str(datetime.now()), + message + ) + f.write(msg) + + f.close() + + return True + + +def save_log_string(f, exc_data): + + msg = u'- {0} - {1} ({2})\n{3}\n'.format( + str(datetime.now()), + exc_data['err_code'], + exc_data['err_text'], + exc_data['err_data'], + ) + + + f.write(msg) + + return True + + +def generate_error(f, err_code, err_text, err_data): + + exc_data = { + 'err_code' : err_code, + 'err_text' : err_text, + 'err_data' : err_data + } + + save_log_string(f, exc_data) + + return exc_data \ No newline at end of file diff --git a/BaseModels/functions.py b/BaseModels/functions.py new file mode 100644 index 0000000..f19bb49 --- /dev/null +++ b/BaseModels/functions.py @@ -0,0 +1,537 @@ +## -*- coding: utf-8 -*- +__author__ = 'SDE' + +from django.utils.html import strip_tags +# from uuslug import slugify +import json +import os.path +from PIL import Image +from django.core.files.uploadedfile import InMemoryUploadedFile +from BaseModels.mailSender import techSendMail +from datetime import datetime, timedelta + + +def get_near_work_day(DT): + if DT.isoweekday() < 6: + return DT + + return DT + timedelta(days=8 - DT.isoweekday()) + + +def get_next_DT_for_monthes_delta_great(monthes_delta, fromDT=datetime.now()): + DT = fromDT + i = 0 + + cur_month = DT.month + + while cur_month == DT.month: + DT = DT + timedelta(days=1) + + # подбираем ближайший день, существующий в месяце + fail = True + i = 0 + while fail: + try: + DT = DT.replace(day=fromDT.day - i) + fail = False + except: + i += 1 + # DT = DT - timedelta(days=1) + # DT = DT.replace(hour=23, minute=59, second=59) + + return DT + + +def get_prev_DT_for_monthes_delta_less(monthes_delta, fromDT=datetime.now()): + DT = fromDT + i = 0 + + while i < monthes_delta: + DT = DT.replace(day=1) + DT = DT - timedelta(days=1) + i += 1 + + # подбираем ближайший день, существующий в месяце + fail = True + i = 0 + while fail: + try: + DT = DT.replace(day=fromDT.day - i) + fail = False + except: + i += 1 + # DT = DT - timedelta(days=1) + # DT = DT.replace(hour=23, minute=59, second=59) + + return DT + + +def correct_filter_name_for_filter_and_create(filter_kwargs): + filter_Dict = {} + create_Dict = {} + + filter_Dict.update(filter_kwargs) + create_Dict.update(filter_kwargs) + + if 'name' in filter_kwargs: + filter_Dict['name__iexact'] = filter_kwargs['name'] + del filter_Dict['name'] + + if 'id' in filter_kwargs: + del filter_Dict['id'] + del create_Dict['id'] + + return filter_Dict, create_Dict + + +def date_range_as_Dict(start_date, end_date): + import datetime + # for ordinal in range(start_date.toordinal(), end_date.toordinal()): + # yield datetime.date.fromordinal(ordinal) + + return [{start_date + datetime.timedelta(n): {}} for n in range(int((end_date - start_date).days) + 1)] + + +def sortByLength(inputStr): + return len(inputStr) + + +def add_domain(request, url, add_lang=False): + domain = get_domain_by_request(request) + if add_lang: + cur_lang = get_cur_lang_by_request(request) + return '{0}/{1}/{2}'.format(domain, cur_lang, url) + else: + return '{0}{1}'.format(domain, url) + + +def get_domain_by_request(request): + from project_sets import domain + if request.query_params and 'domain' in request.query_params: + return request.query_params['domain'] + return domain + + +def get_cur_lang_by_request(request): + from project_sets import lang + if request.query_params and 'cur_lang' in request.query_params: + return request.query_params['cur_lang'] + return lang + + +def get_img_type_by_request(request): + if request.query_params and 'img_type' in request.query_params: + return request.query_params['img_type'] + + return 'webp' + + +def image_convert_to_png(photo_file, save_file_path=None): + from io import BytesIO + from PIL import Image as Img + print('image_convert_to_png') + + try: + + fn_list = photo_file.name.split('.') + if len(fn_list) > 1: + fp = fn_list[0] + '.png' + else: + fp = photo_file.name + '.png' + + image = Img.open(photo_file) + + print('photo was uploaded') + + try: + image.convert("RGB") + print('photo was converted to RGB') + except: + print('!!! fail convert photo to RGB') + + if save_file_path: + image.save(save_file_path, format="PNG") + + print('photo was saved') + + fileBytes = BytesIO() + image.save(fileBytes, format="PNG") + print('photo was preparing for streaming') + + memoryFile = InMemoryUploadedFile(fileBytes, None, fp, 'image/png', 1, None) + + return memoryFile + + except Exception as e: + msg = 'image_convert_to_png error={0}'.format(str(e)) + print(msg) + techSendMail(msg, 'image_convert_to_png error') + return {'error': msg} + + +def image_convert_to_webP(photo_file, save_file_path=None): + from io import BytesIO + from PIL import Image as Img + + fn_list = photo_file.name.split('.') + if len(fn_list) > 1: + webP_fp = fn_list[0] + '.webp' + else: + webP_fp = photo_file.name + '.webp' + + image = Img.open(photo_file) + + image.convert("RGB") + + if save_file_path: + image.save(save_file_path, format="WEBP") + + fileBytes = BytesIO() + image.save(fileBytes, format="WEBP") + memoryFile = InMemoryUploadedFile(fileBytes, None, webP_fp, 'image/webp', 1, None) + + return memoryFile + + +def get_thumb_path(full_filepath, img_type): + if img_type == 'webp': + convert_to_webP = True + else: + convert_to_webP = False + + icon_path = None + + full_filepath = full_filepath.replace('\\', '/') + + if not os.path.exists(full_filepath): + return None + + path_list = full_filepath.split('/') + filename = path_list[-1] + filepath = '/'.join(path_list[:-1]) + + if convert_to_webP: + fn_list = filename.split('.') + if len(fn_list) > 1: + filename = fn_list[0] + '.webp' + else: + filename = filename + '.webp' + + icon_path = '{0}/icon-{1}'.format(filepath, filename) + + if not os.path.exists(icon_path): + size = (300, 300) + img = Image.open(full_filepath) + if convert_to_webP: + img.convert("RGB") + img.thumbnail(size) + if convert_to_webP: + img.save(icon_path, 'WEBP') + else: + img.save(icon_path) + + return icon_path + + +def get_filename_from_path(filepath, wo_ext=False): + f_list = filepath.split('/') + if len(f_list) > 1: + filename = f_list[-1] + else: + filename = f_list[0] + + f_list = filename.split('\\') + if len(f_list) > 1: + filename = f_list[-1] + else: + filename = f_list[0] + + if filename and wo_ext: + f_list = filename.split('.') + filename = f_list[0] + + return filename + + +def get_free_filename(filename, filepath): + from os import path, access, R_OK # W_OK for write permission. + + full_path = filepath + filename + + i = 0 + while path.exists(full_path) and path.isfile(full_path) and access(full_path, R_OK): + i += 1 + full_path = filepath + filename + '-{0}'.format(str(i)) + + return full_path + + +def url_translit(value): + value = translit(value).lower() + # value = slugify_text(value).lower() + # value = value.replace(u',', u'-') + # value = value.replace(u'.', u'-') + # value = value.replace(u'_', u'-') + # value = value.replace(u'"', u'') + # value = value.replace(u'“', u'') + # value = value.replace(u'”', u'') + # value = value.replace(u"'", u'') + # value = value.replace(u'/', u'-') + # value = value.replace(u'\\', u'-') + # value = value.replace(u'(', u'') + # value = value.replace(u')', u'') + # value = value.replace(u'&', u'-and-') + # value = value.replace(u' ', u'-') + # value = value.replace(u'%', u'') + # value = value.replace(u'*', u'-') + # value = value.replace(u'±', u'-') + + allow_symbols = '0123456789abcdefghijklmnopqrstuvwxyz-' + i = 0 + while i < len(value): + if not value[i] in allow_symbols: + value = value.replace(value[i], '-') + + i += 1 + + while '--' in value: + value = value.replace(u'--', u'-') + + if value[len(value) - 1] == '-': + value = value[:-1] + + return value + + +def translit(locallangstring): + conversion = { + u'\u0410': 'A', u'\u0430': 'a', + u'\u0411': 'B', u'\u0431': 'b', + u'\u0412': 'V', u'\u0432': 'v', + u'\u0413': 'G', u'\u0433': 'g', + u'\u0414': 'D', u'\u0434': 'd', + u'\u0415': 'E', u'\u0435': 'e', + u'\u0401': 'Yo', u'\u0451': 'yo', + u'\u0416': 'Zh', u'\u0436': 'zh', + u'\u0417': 'Z', u'\u0437': 'z', + u'\u0418': 'I', u'\u0438': 'i', + u'\u0419': 'Y', u'\u0439': 'y', + u'\u041a': 'K', u'\u043a': 'k', + u'\u041b': 'L', u'\u043b': 'l', + u'\u041c': 'M', u'\u043c': 'm', + u'\u041d': 'N', u'\u043d': 'n', + u'\u041e': 'O', u'\u043e': 'o', + u'\u041f': 'P', u'\u043f': 'p', + u'\u0420': 'R', u'\u0440': 'r', + u'\u0421': 'S', u'\u0441': 's', + u'\u0422': 'T', u'\u0442': 't', + u'\u0423': 'U', u'\u0443': 'u', + u'\u0424': 'F', u'\u0444': 'f', + u'\u0425': 'H', u'\u0445': 'h', + u'\u0426': 'Ts', u'\u0446': 'ts', + u'\u0427': 'Ch', u'\u0447': 'ch', + u'\u0428': 'Sh', u'\u0448': 'sh', + u'\u0429': 'Sch', u'\u0449': 'sch', + u'\u042a': '', u'\u044a': '', + u'\u042b': 'Y', u'\u044b': 'y', + u'\u042c': '', u'\u044c': '', + u'\u042d': 'E', u'\u044d': 'e', + u'\u042e': 'Yu', u'\u044e': 'yu', + u'\u042f': 'Ya', u'\u044f': 'ya', + u'№': 'no', + } + translitstring = [] + for c in locallangstring: + translitstring.append(conversion.setdefault(c, c)) + return ''.join(translitstring) + + +def slugify_text(str_text): + utf8_code = False + try: + str_text = str_text.encode('utf-8').decode('utf-8') + utf8_code = True + except: + pass + + if utf8_code == False: + try: + str_text = str_text.decode('utf-8') + except: + pass + + str_text = del_bad_symbols(str_text) + + str_text = str_text.replace(u'"', u'') + str_text = str_text.replace(u"'", u'') + str_text = str_text.replace(u".", u'') + str_text = str_text.replace(u",", u'') + str_text = str_text.replace(u" -", u'-') + str_text = str_text.replace(u"- ", u'-') + str_text = str_text.replace(u"„", u'') + str_text = str_text.replace(u"(", u'') + str_text = str_text.replace(u")", u'') + str_text = str_text.replace(u"{", u'') + str_text = str_text.replace(u"}", u'') + str_text = str_text.replace(u"<", u'') + str_text = str_text.replace(u">", u'') + + str = translit(str_text) + str = translit(str) + if len(str) < 2 or len(str) + 3 < len(str_text): + str = translit(str_text) + str = translit(str) + + str = str.replace(u"'", u'') + str = str.replace(u'"', u'') + + if len(str) < 2: + str = u'' + return str + + +def get_price_from_string_w_del_tails(string): + string = del_bad_symbols(string) + + while string.find(' ') > -1: + string = string.replace(' ', '') + string = string.replace(u'$', '') + string = string.replace(u'USD', '') + string = string.replace(u'Br', '') + string = string.replace(u'руб.', '') + string = string.replace(u',', '.') + + return string + + +def kill_pretexts(txt): + pretexts = [ + 'в', 'без', 'до', 'из', 'к', 'на', 'по', 'о', 'от', 'перед', 'при', 'через', 'с', 'у', 'за', 'над', + 'об', 'под', 'про', 'для' + ] + + words = txt.split(' ') + words = [item for item in words if not item in pretexts] + + return ' '.join(words) + + +def stay_only_text_and_numbers(txt): + bad_symbols = '"~`{}[]|!@#$%^&*()_+№;:?= ' + nums = '0123456789' + + for symbol in bad_symbols: + txt = txt.replace(symbol, ' ') + + symbols_for_check = ',.' + i = 0 + while i < len(txt): + if txt[i] in ['.', ',']: + if i < 1 or not txt[i - 1] in nums or i == len(txt) - 1 or not txt[i + 1] in nums: + txt_list = list(txt) + txt_list[i] = ' ' + txt = ''.join(txt_list) + # if txt[i] in ['"']: + # if i < 1 or not txt[i - 1] in nums: + # txt_list = list(txt) + # txt_list[i] = ' ' + # txt = ''.join(txt_list) + + i += 1 + + txt = txt.strip() + while ' ' in txt: + txt = txt.replace(' ', ' ') + + return txt + + +def del_bad_symbols_and_enters_and_tags(string): + # from string import maketrans + + try: + + string = strip_tags(string) + string = string.replace('\r\n', '') + del_bad_symbols(string) + except: + pass + + return string + + +def del_bad_symbols(string): + # from string import maketrans + + try: + + # string = strip_tags(string) + # string = string.replace('\r\n','') + string = string.strip() + + while string.find(' ') > -1: + string = string.replace(' ', ' ') + # table = maketrans(' ', ' ') + # string = string.translate(table) + + while string.find(' ') > -1: + string = string.replace(' ', ' ') + except: + pass + + return string + + +# def get_offers_from_cookie(request): +# if 'oknaplast_right_offers' in request.COOKIES: +# order_list = json.loads(request.COOKIES['oknaplast_right_offers'], encoding='utf8') +# return WindowOfferModel.objects.filter(id__in=order_list) +# else: +# return [] + + +def del_nbsp(string): + mapping = [ + (""", u'"'), + ('&', u'&'), + ('<', u'<'), + ('>', u'>'), + (' ', u' '), + ('¡', u'¡'), + ('¢', u'¢'), + ('£', u'£'), + ('¤', u'¤'), + ('¥', u'¥'), + ('¦', u'¦'), + ('§', u'§'), + ('¨', u'¨'), + ('©', u'©'), + ('ª', u'ª'), + ('«', u'«'), + ('¬', u'¬'), + ('®', u'®'), + ('¯', u'¯'), + ('°', u'°'), + ('±', u'±'), + ('²', u'²'), + ('³', u'³'), + ('´', u'´'), + ('µ', u'µ'), + ('¶', u'¶'), + ('·', u'•'), + ('¸', u'¸'), + ('¹', u'¹'), + ('º', u'º'), + ('»', u'»'), + ('¼', u'¼'), + ('½', u'½'), + ('¾', u'¾'), + ('€', u'€'), + ('\n', ''), + ('\r', ''), + ('\t', ' '), + ('—', '-'), + ] + for pair in mapping: + string = string.replace(pair[0], pair[1]) + return string diff --git a/BaseModels/inter.py b/BaseModels/inter.py new file mode 100644 index 0000000..b72fe62 --- /dev/null +++ b/BaseModels/inter.py @@ -0,0 +1,189 @@ +# -*- coding: utf-8 -*- + +from django.http import HttpResponse +import json +import csv +from .mailSender import techSendMail + +import re + +numbers = '0123456789.,' + + +def get_unique_url(model, name, url=None): + from .functions import url_translit + + if not url: + url = url_translit(name) + + try: + obj = model.objects.get(url=url) + except model.DoesNotExist: + return url + + urls = model.objects.all().values_list('url', flat=True) + + i = 1 + while url in urls: + url = f'{url}-{i}' + i += 1 + + return url + + +def dicts_join(dict1, dict2, inplace=False): + result = dict1 if inplace else dict1.copy() + result.update(dict2) + return result + + +def set_ru_locale(): + import locale + + try: + locale.setlocale(locale.LC_ALL, 'ru_RU.utf8') + except Exception as e: + msg = '!!!!! --- set_ru_locale exception error={0}
{1}
'.format( + str(e), + str(e.args) + ) + print(msg) + techSendMail(msg, 'set_ru_locale') + return False + + return True + + +def get_all_videos_from_html_content(html): + if not html: + return None + + res = re.findall('iframe.*src=\"(.+?)\"', html) + + return res + + +def get_all_photos_from_html_content(html): + res = re.findall('src=\"(.+?)\"', html) + return res + + +def get_choices_value_by_choices_id(choices, id): + for ch_id, ch_val in choices: + if ch_id == id: + return ch_val + + return None + + +def sortByLength(inputStr): + return len(inputStr) + + +def get_current_language(request): + return request.LANGUAGE_CODE + + +def cut_to_number_w_point(string): + import re + + if not string: + return string + + string = string.replace(',', '.') + # str_list = string.split(',') + # + # if len(str_list) > 1: + # string = str_list[0] + # else: + # str_list = string.split('.') + # if len(str_list) > 2: + # string = u'{0}.{1}'.format(str_list[0], str_list[1]) + + try: + # шаблон для обрезки до цифр + p = '[0-9]+.[0-9]+' + number = u''.join(re.findall(p, string)) + if number == u'': + p = '[0-9]+' + number = u''.join(re.findall(p, string)) + except: + number = None + return number + + +def cut_to_number(string): + import re + + if not string: + return string + + # шаблон для обрезки до цифр + p = '[\d]+' + number = ''.join(re.findall(p, string)) + return number + + +def range_dates(start, end): + """ Returns the date range """ + from datetime import timedelta + + list = [start + timedelta(days=days) for days in range(0, (end - start).days + 1)] + return list + + # assert start <= end + # current = start.year * 12 + start.month - 1 + # end = end.year * 12 + end.month - 1 + # list = [] + # while current <= end: + # yield date(current // 12, current % 12 + 1, 1) + # current += 1 + + +# разбираем csv строку, получаем Dict +def get_Dict_from_csv_data(csv_data): + data = {} + for item in csv_data.split(';'): + try: + if item: + data.update(dict([item.split(':')[0:2]])) + except ValueError: + continue + + return data + # return dict([item.split(':')[0:2] for item in csv_data.split(';') if item]) + + +def cut_url_toPageName(url): + pageName = url.split('/')[-1] # получаем урл страницы + return pageName + + +def jsonify(): + def decorator(func): + def wrapper(request, *args, **kwargs): + result = func(request, *args, **kwargs) + return HttpResponse(json.dumps(result), mimetype='application/json') + + return wrapper + + return decorator + + +def check_perms_for_view_order(request, order): + def decorator(func): + def wrapper(request, *args, **kwargs): + c_user = request.user + if order: + if c_user == order.user or c_user == order.forUser: + return True + else: + if c_user.has_perm('OrdersApp.can_see_orders_all_companys'): + return True + else: + if order.group == c_user.group and c_user.has_perm('OrdersApp.can_see_orders_self_company'): + return True + + return wrapper + + return decorator diff --git a/BaseModels/json_funcs.py b/BaseModels/json_funcs.py new file mode 100644 index 0000000..8e5f6dc --- /dev/null +++ b/BaseModels/json_funcs.py @@ -0,0 +1,31 @@ +import json + + +def del_from_txt_bad_json_symbols(txt): + + log = '' + error = True + while error and len(txt) > 0: + try: + json.loads(txt) + error = None + except json.JSONDecodeError as e: + msg = '- длина контента = {2} - {1} - удален символ {0}'.format( + txt[e.pos], + str(e), + str(len(txt)-1) + ) + log = '{0}
{1}'.format(log, msg) + print(msg) + txt = txt[:e.pos] + txt[e.pos+1:] + error = e + + # import re + # r_str = r'[{\[]([,:{}\[\]0-9.\-+A-zr-u \n\r\t]|".*:?")+[}\]]' + # pattern = re.compile(r_str) + # txt = re.sub(r_str, '',txt) + # res = pattern.search(txt) + # if res: + # txt = res.string + + return txt, log \ No newline at end of file diff --git a/BaseModels/log/log_funcs.py b/BaseModels/log/log_funcs.py new file mode 100644 index 0000000..5599a7a --- /dev/null +++ b/BaseModels/log/log_funcs.py @@ -0,0 +1,103 @@ +from datetime import datetime, date +from django.db.models.fields.files import ImageFieldFile +from collections import OrderedDict + + +def send_mail_alert_w_data(obj, data, user=None): + + # try: + # + # article = getattr(obj, 'article', None) + # if article and article in ('10751', '10752', '10753', '10754', '10801', '10802', '10803', '10804'): + # from BaseModels.mailSender import techSendMail + # msg = f'change product {article}
' \ + # f'{datetime.now()}
' \ + # f'{str(user)}
' \ + # f'obj = {str(obj.__dict__)}
' \ + # f'data = {str(data)}
' + # techSendMail(msg, 'tE checkpoint alert') + # + # except Exception as e: + # print(f'send_mail_alert_w_data ERROR = {str(e)}') + + return True + + + +def get_normalized_data(data): + + if type(data) == OrderedDict: + data = dict(data) + + if '_state' in data: + del data['_state'] + + if type(data) == dict: + for key, val in data.items(): + if type(data[key]) in (dict, list, OrderedDict): + data[key] = get_normalized_data(val) + if type(data[key]) in (datetime, date, ImageFieldFile): + data[key] = str(val) + + if type(data) == list: + i = 0 + while i < len(data): + # if type(item) == OrderedDict: + # item = dict(item) + item = data[i] + + if type(item) in (dict, list, OrderedDict): + data[i] = get_normalized_data(item) + + if type(item) == dict: + for key, val in item.items(): + if type(item[key]) in (datetime, date, ImageFieldFile): + item[key] = str(val) + + elif type(item) == list: + ei = 0 + while ei < len(item): + if type(item[ei]) in (datetime, date, ImageFieldFile): + item[ei] = str(item[ei]) + + ei += 1 + + i += 1 + + return data + + + +def prepare_data_for_json(data): + + data = get_normalized_data(data) + + # if type(data) == OrderedDict: + # data = dict(data) + # + # if '_state' in data: + # del data['_state'] + # + # if type(data) == dict: + # for key, val in data.items(): + # if type(data[key]) in (datetime, date, ImageFieldFile): + # data[key] = str(val) + # + # if type(data) == list: + # for item in data: + # if type(item) == OrderedDict: + # item = dict(item) + # + # if type(item) == dict: + # for key, val in item.items(): + # if type(data[key]) in (datetime, date, ImageFieldFile): + # item[key] = str(val) + # + # elif type(item) == list: + # for el in item: + # if type(el) in (datetime, date, ImageFieldFile): + # el = str(el) + + + + return data \ No newline at end of file diff --git a/BaseModels/logging_change_data.py b/BaseModels/logging_change_data.py new file mode 100644 index 0000000..8743540 --- /dev/null +++ b/BaseModels/logging_change_data.py @@ -0,0 +1,259 @@ +from .mailSender import techSendMail + + + +# def get_order_changes_list_for_template(order): +# +# if order.json_data and 'data_log' in order.json_data: +# +# i = 0 +# changes_log = [] +# +# if len(order.json_data['data_log']) > 0: +# first_log_record = order.json_data['data_log'][0] +# +# while i ' + str(new_d1)) + # for val, key in new_d1.items(): + # added.update({key: (None, val)}) + elif not new_d1 and old_d2: + # modified = (old_d2) + # removed = {} + # for val, key in old_d2.items(): + # removed.update({key: (None, val)}) + removed.append(str(old_d2) + ' > None') + else: + d1_keys = set(new_d1.keys()) + d2_keys = set(old_d2.keys()) + intersect_keys = d1_keys.intersection(d2_keys) + added = d1_keys - d2_keys + removed = d2_keys - d1_keys + modified = {} + for o in intersect_keys: + if new_d1[o] != old_d2[o]: + if type(new_d1[o]) == dict: + modified.update({ + o: dict_compare(old_d2[o], new_d1[o]) + }) + elif type(new_d1[o]) in [list, tuple]: + modified.update({ + o: list_compare(old_d2[o], new_d1[o]) + }) + else: + modified.update({ + o: (old_d2[o], new_d1[o]) + }) + # modified = {o : (new_d1[o], old_d2[o]) for o in intersect_keys if new_d1[o] != old_d2[o]} + same = set(o for o in intersect_keys if new_d1[o] == old_d2[o]) + + # if not added: + # added = [] + # if not removed: + # removed = [] + # if not modified: + # modified = [] + + + if added or removed or modified: + return { + 'added': added, + 'removed': removed, + 'modified': modified, + # 'added' : list(added), + # 'removed' : list(removed), + # 'modified' : list(modified), + # 'same' : same + } + + except Exception as e: + + msg = 'dict_compare Error = {0}
{1}
{2}
{3}'.format( + str(e), + str(e.args), + old_d2, + new_d1 + ) + print(msg) + techSendMail(msg) + + return {} diff --git a/BaseModels/mailSender.py b/BaseModels/mailSender.py new file mode 100644 index 0000000..49f9c67 --- /dev/null +++ b/BaseModels/mailSender.py @@ -0,0 +1,353 @@ +## -*- coding: utf-8 -*- + +__author__ = 'SDE' + +from django.core.mail import EmailMultiAlternatives +# from AuthApp.models import UserProfileModel +import smtplib +from tEDataProj.settings import prod_server +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.mime.application import MIMEApplication +from email.mime.multipart import MIMEMultipart +from os.path import basename +from email.mime.base import MIMEBase +from email import encoders +import ssl +import time +import random +from tEDataProj import settings + + +# tech@truenergy.by +# k7n2d3ZFZo4@CU5$4YDk + +# administrator@truenergy.by +# 6&#WfW8$qR2w8uv69e5$ + + +def fix_mailing_links_in_mail(html): + from GeneralApp.views import get_cur_domain + serv_domain, client_domain = get_cur_domain() + + while 'src="/media/' in html: + html = html.replace('src="/media/', f'src="{serv_domain}media/') + + return html + + +def mailing_direct_by_maillist(subject, from_email, to, html_content, attachments=None): + log = '' + for email in to: + res = admin_send_mail_by_SMTPlib(subject, from_email, email, html_content, attachments) + # print(str(res)) + log = '{0}
{1}'.format(log, str(res)) + time.sleep(random.randint(1, 5)) + + return log + + +def prepare_attach_file(filepath, filename=None): + try: + + if not filename: + filename = basename(filepath) + + if not settings.MEDIA_ROOT in filepath: + filepath = f'{settings.MEDIA_ROOT}{filepath}' + + with open(filepath, "rb") as fil: + part = MIMEApplication( + fil.read(), + Name=filename + ) + # After the file is closed + part['Content-Disposition'] = 'attachment; filename="%s"' % filename + except Exception as e: + msg = f'prepare_attach_file Error = {str(e)}' + techSendMail(msg, title='prepare_attach_file') + return msg + + return part + + +def prepare_xls_attach_by_xls_virtual_file(virtual_file, filename): + ctype = 'application/octet-stream' + maintype, subtype = ctype.split('/', 1) + # with open(filepath, 'rb') as fp: + file = MIMEBase(maintype, subtype) # Используем общий MIME-тип + file.set_payload(virtual_file) # Добавляем содержимое общего типа (полезную нагрузку) + # fp.close() + encoders.encode_base64(file) # Содержимое должно кодироваться как Base64 + + file.add_header('Content-Disposition', 'attachment', filename=filename) + + return file + + +def admin_send_mail_by_SMTPlib(subject, from_email, to, html_content, attachments=None): + res = None + + try: + # smtp_server = 'mail.cln.by' # 'mail.truenergy.by' + # smtp_port = 2525 # 587 + # smtp_password = 'clNdt6a8a' # u'98q3$IjxH%RUIxySw8R2' + # smtp_login = 'support@cln.by' # 'support@truenergy.by' + # from_email = smtp_login + + try: + smtp_server = 'mail.truenergy.by' + smtp_port = 587 + smtp_password = 'eg4$#95Xp0T*V%ig5BbR' + smtp_login = 'support@truenergy.by' + res = send_mail_by_SMTPlib(subject, from_email, to, html_content, smtp_server, smtp_port, smtp_login, + smtp_password, attachments) + except: + smtp_server = 'mail.truenergy.by' + smtp_port = 25 + smtp_password = 'PowH@aL0a4%$iz0Uo5V$' + smtp_login = 'tech@truenergy.by' + res = send_mail_by_SMTPlib(subject, smtp_login, to, html_content, smtp_server, smtp_port, smtp_login, + smtp_password, attachments) + + except Exception as e: + # from Baldenini_site.SMS_sender import send_SMS + # send_SMS(u'375296177827', u'send_mail_by_SMTPlib error = {0}'.format(str(e)), urgent=True) + msg = 'admin_send_mail_by_SMTPlib error = {0}'.format(str(e)) + print(msg) + # techSendMail(msg) + + return str(res) + + +def send_mail_by_SMTPlib(subject, from_email, to_init, html_content, smtp_server, smtp_port, smtp_login, smtp_password, + attachments=None): + to = to_init + if not prod_server: + to = 'web@syncsystems.net' + else: + to = to_init + try: + from settings_local import DEBUG + except: + print('get settings_local fail') + + res = None + mail_lib = None + + time.sleep(1) + + try: + # context = ssl.create_default_context() + + mail_lib = smtplib.SMTP(smtp_server, smtp_port) + + res = mail_lib.ehlo() + + res = mail_lib.starttls() # context=context) + # print('mail_lib.starttls = {0}'.format(str(res))) + + res = mail_lib.ehlo() + # print('mail_lib.ehlo = {0}'.format(str(res))) + + res = mail_lib.set_debuglevel = 2 + # print('mail_lib.set_debuglevel = {0}'.format(str(res))) + + res = mail_lib.esmtp_features['auth'] = 'LOGIN PLAIN' + # print('mail_lib.esmtp_features = {0}'.format(str(res))) + + res = mail_lib.login(smtp_login, smtp_password) + # print('mail_lib.login = {0}'.format(str(res))) + + res = None + + if type(to) in (list, tuple): + if 'support@truenergy.by' in to: + to.remove('support@truenergy.by') + + if len(to) > 1: + to_str = u', '.join(to) + else: + to_str = to[0] + else: + if to == 'support@truenergy.by': + return None + to_str = to + to = [] + to.append(to_str) + + if type(subject) != str: + try: + subject = subject.decode('utf-8') + except: + try: + subject = subject.encode('utf-8') + except: + pass + + msg = MIMEMultipart() + from email.headerregistry import Address + msg['From'] = from_email + msg['Reply-To'] = from_email + # msg['In-Reply-To'] = "email2@example.com" + msg['To'] = to_str + msg['Subject'] = subject + msg.attach(MIMEText(html_content, 'html', 'utf-8')) + + # print('attach message complete') + + if attachments: + if type(attachments) in (list, tuple): + try: + for item in attachments: + res = msg.attach(item) + # print('attach file complete = {0}'.format(str(res))) + except: + res = msg.attach(attachments) + # print('except attach file complete = {0}'.format(str(res))) + else: + res = msg.attach(attachments) + # print('else attach file complete = {0}'.format(str(res))) + + res = mail_lib.sendmail(from_email, to, msg.as_string()) + + msg = mail_lib.quit() + # print('mail_lib.quit = {0}'.format(str(msg))) + + except Exception as e: + # from Baldenini_site.SMS_sender import send_SMS + # send_SMS(u'375296177827', u'send_mail_by_SMTPlib error = {0}'.format(str(e)), urgent=True) + msg = 'send_mail_by_SMTPlib error = {0}'.format(str(e)) + print(msg) + try: + mail_lib.quit() + # print('mail_lib.quit = {0}'.format(str(msg))) + except: + pass + + try: + print(str(mail_lib.__dict__)) + except: + pass + + return msg + # techSendMail(msg) + + msg = 'send_mail_by_SMTPlib subj={3} init_to={2} to={0} res={1}'.format(str(to), str(res), str(to_init), + str(subject)) + print(msg) + + return msg + + +def sendMail(subject, text_content, from_email, to, html_content): + print('sendMail to {0}'.format(str(to))) + + admin_send_mail_by_SMTPlib(subject, from_email, [to], html_content) + + # msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) + # msg.attach_alternative(html_content, "text/html") + # msg.send() + print(u'Accept') + return u'Accept' + + +def techSendMail_for_top_management(html_content, title=None): + try: + + # if not prod_server: + # msg = '{0}. Not sended because is local'.format(html_content) + # print(msg) + # return msg + from AuthApp.models import User + from django.db.models import Q + + # to = ['web@syncsystems.net'] + to = User.objects.filter( + Q(is_superuser=True) | Q(groups__name__in=[ + 'Отдел продаж: Начальник отдела продаж', 'Управляющий', + 'Бухгалтерия: Главный бухгалтер' + ]), + is_active=True, + is_staff=True + ).values_list('email', flat=True) + to = list(to) + to.append('office@truenergy.by') + + print('techSendMail_for_top_management') + if title: + subject = title + else: + subject = u'truEnergy Data техническое оповещение' + from_email = 'support@truenergy.by' + + res = admin_send_mail_by_SMTPlib(subject, from_email, to, html_content) + + # msg = EmailMultiAlternatives(subject, text_content, from_email, to) + # msg.attach_alternative(html_content, "text/html") + # msg.send() + print(res) + return u'Accept' + + except Exception as e: + msg = 'techSendMail_for_top_management error={0}'.format(str(e)) + techSendMail(msg) + print(msg) + + return 'Fail' + + +def techSendMail_for_specified_email_list(html_content, email_list, title=None): + try: + + print('techSendMail_for_specified_email_list') + if title: + subject = title + else: + subject = u'truEnergy Data техническое оповещение' + from_email = 'support@truenergy.by' + + res = admin_send_mail_by_SMTPlib(subject, from_email, email_list, html_content) + + print(res) + return u'Accept' + + except Exception as e: + msg = 'techSendMail_for_specified_email_list error={0}'.format(str(e)) + techSendMail(msg) + print(msg) + + return 'Fail' + + +def techSendMail(html_content, title=None, add_emails=None): + # if not prod_server: + # msg = '{0}. Not sended because is local'.format(html_content) + # print(msg) + # return msg + + print('techSendMail') + + try: + # subject = u'truEnergy Data техническое оповещение' + from_email = 'support@truenergy.by' + to = ['web@syncsystems.net'] + if add_emails: + to.extend(add_emails) + text_content = 'Technical message from truEnergy.' + + if title: + subject = title + else: + subject = u'truEnergy Data техническое оповещение' + + res = admin_send_mail_by_SMTPlib(subject, from_email, to, html_content) + + print(res) + + except Exception as e: + msg = 'techSendMail error={0}'.format(str(e)) + # techSendMail(msg) + print(msg) + + return u'Accept' diff --git a/BaseModels/messages.py b/BaseModels/messages.py new file mode 100644 index 0000000..c196666 --- /dev/null +++ b/BaseModels/messages.py @@ -0,0 +1,163 @@ +## -*- coding: utf-8 -*- +__author__ = 'SDE' +# from Baldenini_site.inter import jsonify + +def get_error_message_Dict(show_icon=None): + print('get_error_message_Dict') + Dict = { + 'form_style' : u'border-color: #FFBBBB; background-color: #FFEAEA;', + } + if show_icon: + Dict.update({ + 'form_icon' : 'canceled.png', + }) + + return Dict + + +def get_good_message_Dict(show_icon=None): + Dict = { + 'form_style' : u'border-color: #BBFFBB; background-color: #EAFFEA;', + } + + if show_icon: + Dict.update({ + 'form_icon' : 'accepted.png', + }) + + return Dict + + +def get_return_to_ready_but(): + return { + 'buttons' : u'
ГОТОВО
' + } + + +def get_return_to_choice_buts(but_ok_name, but_cancel_name): + return { + 'buttons' : u'
{0}
' + u'
{1}
'.format(but_ok_name, but_cancel_name) + } + + +def get_error_message(caption, text, show_icon=None): + + Dict = { + 'message' : text, + 'caption' : caption + } + Dict.update(get_error_message_Dict(show_icon)) + Dict.update(get_return_to_ready_but()) + + return Dict + + +# @jsonify() +def show_error_message(caption, text, show_icon=None): + from django.template.loader import render_to_string + + return {'error':'error', + 'html': render_to_string( + 'm_show_message.html', + get_error_message(caption, text, show_icon) + ) + } + +# @jsonify() +def show_good_message(caption, text): + from django.template.loader import render_to_string + + return {'html': render_to_string( + 'm_show_message.html', + get_good_message(caption, text) + ) + } + + +def show_good_message_ok_go_to_blank_page(caption, text, button_caption, url): + from django.template.loader import render_to_string + + return {'html': render_to_string( + 'm_show_message.html', + get_good_message_ok_go_to_blank_page(caption, text, button_caption, url) + ) + } + + +# def show_choice_message_w_input(caption, text, but_ok_name, but_cancel_name, form): +# from django.template.loader import render_to_string +# +# return {'html': render_to_string( +# 'Messages/m_show_message.html', +# get_choice_message(caption, text, but_ok_name, but_cancel_name) +# ) +# } + + +def show_choice_message_green(caption, text, but_ok_name, but_cancel_name, form=None): + from django.template.loader import render_to_string + + return {'html': render_to_string( + 'm_show_message.html', + get_choice_message(caption, text, but_ok_name, but_cancel_name, form, u'green') + ) + } + + +def show_choice_message_red(caption, text, but_ok_name, but_cancel_name, form=None): + from django.template.loader import render_to_string + + return {'html': render_to_string( + 'm_show_message.html', + get_choice_message(caption, text, but_ok_name, but_cancel_name, form, u'red') + ) + } + + +def get_choice_message(caption, text, but_ok_name, but_cancel_name, form=None, color=u'red', show_icon=None): + + Dict = { + 'message' : text, + 'caption' : caption, + 'form' : form + } + + if color == u'red': + Dict.update(get_error_message_Dict(show_icon)) + elif color == u'green': + Dict.update(get_good_message_Dict(show_icon)) + + Dict.update(get_return_to_choice_buts(but_ok_name, but_cancel_name)) + + return Dict + + +def get_but_ok_go_to_blank_page(button_caption, url): + return { + 'buttons' : u'

{1}

'.format(url,button_caption) + } + + +def get_good_message_ok_go_to_blank_page(caption, text, button_caption, url, show_icon=None): + + Dict = { + 'message' : text, + 'caption' : caption + } + Dict.update(get_good_message_Dict(show_icon)) + Dict.update(get_but_ok_go_to_blank_page(button_caption, url)) + + return Dict + + +def get_good_message(caption, text, show_icon=None): + + Dict = { + 'message' : text, + 'caption' : caption + } + Dict.update(get_good_message_Dict(show_icon)) + Dict.update(get_return_to_ready_but()) + + return Dict \ No newline at end of file diff --git a/BaseModels/middlewares/web_requests_middleware.py b/BaseModels/middlewares/web_requests_middleware.py new file mode 100644 index 0000000..82d55da --- /dev/null +++ b/BaseModels/middlewares/web_requests_middleware.py @@ -0,0 +1,21 @@ +from datetime import datetime + + +class WebRequestMiddleware: + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + + response = self.get_response(request) + + if not '/v1/alert/' in request.path: + user = getattr(request, 'user', None) + if user and not user.is_anonymous and user.user_profile: + user.user_profile.last_web_request = datetime.now() + user.user_profile.save(update_fields=['last_web_request']) + + # from GeneralApp.temp_data_funcs import add_element_in_tmp_data_list + # add_element_in_tmp_data_list('user_activity', user.email, 'activities_DT', str(user.user_profile.last_web_request)) + + return response diff --git a/BaseModels/office_documents_utils.py b/BaseModels/office_documents_utils.py new file mode 100644 index 0000000..d97a2cd --- /dev/null +++ b/BaseModels/office_documents_utils.py @@ -0,0 +1,211 @@ +import copy + +from openpyxl import Workbook +from django.http import HttpResponse +from openpyxl.writer.excel import save_virtual_workbook +from openpyxl.utils import get_column_letter +from BaseModels.mailSender import techSendMail +from openpyxl.styles import PatternFill, Font, Alignment +from openpyxl.styles.borders import Border, Side +from openpyxl.styles.numbers import BUILTIN_FORMATS +from colorsys import rgb_to_hls + + +def pairwise(iterable): + a = iter(iterable) + return zip(a, a) + + +options_params_splitter = '<|>' + + +def set_col_options(ws, row, col, rows_len, options): + if type(options) == str: + options = dict(item.split("=")[::1] for item in options.split('&')) + + cols_set = 1 + if options: + + exists_group_option_for_column = False + for key in options.keys(): + if key.startswith('g_col_'): + exists_group_option_for_column = True + break + + if 'cols_merge' in options and options['cols_merge']: + cols_set = int(options['cols_merge']) + if cols_set > 1: + ws.merge_cells(start_row=row, start_column=col, end_row=row, end_column=col + cols_set - 1) + + if exists_group_option_for_column: + g_col_back_color = None + if 'g_col_back_color' in options and options['g_col_back_color']: + g_col_back_color = options['g_col_back_color'] + g_col_num_w_sep = None + if 'g_col_num_w_sep' in options and options['g_col_num_w_sep']: + g_col_num_w_sep = options['g_col_num_w_sep'] + + cur_col = col + while cur_col < col + cols_set: + cur_row = row + while cur_row < rows_len: + if g_col_back_color: + ws.cell(row=cur_row, column=cur_col).fill = PatternFill('solid', fgColor=g_col_back_color) + if g_col_num_w_sep: + ws.cell(row=cur_row, column=cur_col).number_format = '#,##0.00' + cur_row += 1 + cur_col += 1 + + if 'col_show_total' in options and options['col_show_total']: + ws.cell(row=rows_len, column=col).font = Font(bold=True) + ws.cell(row=rows_len, column=col).value = "=SUM({0}{1}:{0}{2})".format( + get_column_letter(col), + row + 1, + rows_len - 1 + ) + ws.cell(row=rows_len, column=col).number_format = '#,##0.00' + + if 'back_color' in options and options['back_color']: + ws.cell(row=row, column=col).fill = PatternFill('solid', fgColor=options['back_color']) + + if 'bold' in options and options['bold']: + ws.cell(row=row, column=col).font = Font(bold=True) + + if 'col_bold' in options and options['col_bold']: + cur_col = col + while cur_col < col + cols_set: + cur_row = row + while cur_row < rows_len: + ws.cell(row=cur_row, column=cur_col).font = Font(bold=True) + cur_row += 1 + cur_col += 1 + + return cols_set + + +def add_table_in_workbook(work_sheet, data, convert_minus_to_null=False, headers_rows_count=0): + thin_border = Border(left=Side(style='thin'), + right=Side(style='thin'), + top=Side(style='thin'), + bottom=Side(style='thin')) + + r = 1 + + for row in data: + + try: + + c = 1 + cols = row + if type(data) == dict: + cols = row.values() + for val in cols: + options = None + + inc_c = 1 + + work_sheet.cell(row=r, column=c).border = thin_border + + # получаем опции + if type(val) == str: + val_w_options = val.split(options_params_splitter) + if len(val_w_options) > 1: + val = val_w_options[0] + # применяем опции + inc_c = set_col_options(work_sheet, row=r, col=c, rows_len=len(data) + 1, + options=val_w_options[1]) + elif type(val) == dict: + inc_c = set_col_options(work_sheet, row=r, col=c, rows_len=len(data) + 1, options=val) + val = val['val'] + + # если стоит опция "минусовые значения преобразовывать в нулевые" + if convert_minus_to_null: + try: + if val < 0: + val = 0 + except: + pass + + try: + work_sheet.cell(row=r, column=c).value = val + except: + work_sheet.cell(row=r, column=c).value = str(val) + + c += inc_c + + except Exception as e: + msg = f'add_table_in_workbook in row {str(r)} ERROR = {str(e)}' + print(msg) + + r += 1 + + try: + + dims = {} + row_c = 0 + for row in work_sheet.rows: + # не подгоняем данные под надписи в хэдере + if row_c < headers_rows_count: + row_c += 1 + continue + + for cell in row: + if cell.value: + dims[cell.column] = max((dims.get(cell.column, 0), len(str(cell.value)))) + + row_c += 1 + + for col, value in dims.items(): + if value > 150: + value = 150 + if value < 3: + value = 3 + work_sheet.column_dimensions[get_column_letter(col)].width = value + + except Exception as e: + msg = f'add_table_in_workbook in sets width ERROR = {str(e)}' + print(msg) + + return + + +def get_xls_file_by_data_list(data, convert_minus_to_null=False): + try: + + wb = Workbook() + ws = wb.active + + if type(data) == list and len(data) and type(data[0]) == dict: + + i = 0 + for page in data: + + title = None + if 'title' in page: + title = page['title'] + + # если первая страница - она уже создана, просто переименовываем + if i == 0: + if title: + ws.title = title + else: + ws = wb.create_sheet(title) + + headers_rows_count = 0 + if 'headers_rows_count' in page: + headers_rows_count = page['headers_rows_count'] + + add_table_in_workbook(ws, page['table'], convert_minus_to_null, headers_rows_count) + + i += 1 + else: + add_table_in_workbook(ws, data, convert_minus_to_null) + + xls_file = save_virtual_workbook(wb) + + return xls_file + + except Exception as e: + msg = str(e) + print(msg) + return msg diff --git a/BaseModels/paging.py b/BaseModels/paging.py new file mode 100644 index 0000000..d1f8168 --- /dev/null +++ b/BaseModels/paging.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +__author__ = 'SDE' + +def get_paging_Dict(request, elements_count, elements_on_page, from_page, to_page=None): + + + + pages_count = elements_count / elements_on_page + if elements_count % elements_on_page > 0: + pages_count = pages_count + 1 + + pages = [] + + if to_page: + cur_page = to_page + else: + cur_page = from_page + + # количство страниц, которое отображается в ряд (без разделенного пэйджинга) + pages_wo_separated_paging = 20 + + if pages_countpages_count+1-pages_count_wo_separate_for_side: + mid_left_page = (pages_count+1-pages_count_for_begin_end_paging-pages_count_wo_separate_for_side) / 2 #считаем сколько страниц внутри точек + mid_left_page = pages_count_for_begin_end_paging + mid_left_page # это и есть средняя страница в левой части + pages.append((u'...',mid_left_page)) + for p in range(pages_count+1-pages_count_wo_separate_for_side,pages_count-pages_count_for_begin_end_paging+1): + pages.append((p,p)) + # elif num_current_page>pages_count-6: + # mid_left_page = (pages_count -2 -7) / 2 #считаем сколько страниц внутри точек + # mid_left_page = 3 + mid_left_page # это и есть средняя страница в левой части + # pages.append((u'...',mid_left_page)) + # pages.append((pages_count-6,pages_count-6)) + # pages.append((pages_count-5,pages_count-5)) + # pages.append((pages_count-4,pages_count-4)) + # pages.append((pages_count-3,pages_count-3)) + else: + mid_page = cur_page + + mid_left_page = (mid_page-1 -pages_count_for_begin_end_paging)/2 + pages_count_for_begin_end_paging + mid_rigth_page = (pages_count - (mid_page+pages_count_for_begin_end_paging))/2 + mid_page+1 + + # количество страниц, которые добавляются слева и и справа от текущей центральной + pages_count_for_add_to_left_and_right_from_current_central_page = center_pages_count / 2 + + pages.append((u'...',mid_left_page)) + for p in range(mid_page-pages_count_for_add_to_left_and_right_from_current_central_page,mid_page+pages_count_for_add_to_left_and_right_from_current_central_page+1): + pages.append((p,p)) + pages.append((u'...',mid_rigth_page)) + # mid_left_page = (mid_page-1 -3)/2 + 3 + # mid_rigth_page = (pages_count - (mid_page+1 +2))/2 + mid_page+1 + # + # pages.append((u'...',mid_left_page)) + # pages.append((mid_page-1,mid_page-1)) + # pages.append((mid_page,mid_page)) + # pages.append((mid_page+1,mid_page+1)) + # pages.append((u'...',mid_rigth_page)) + + + for p in range(pages_count+1-pages_count_for_begin_end_paging,pages_count+1): + pages.append((p,p)) + # pages.append((pages_count-2,pages_count-2)) + # pages.append((pages_count-1,pages_count-1)) + # pages.append((pages_count,pages_count)) + if not to_page: + to_page = from_page + + return { + 'paging' : pages, + 'from_page' : from_page, + 'to_page' : to_page, + 'max_page' : pages_count, + } diff --git a/BaseModels/pil_graphic_utils.py b/BaseModels/pil_graphic_utils.py new file mode 100644 index 0000000..9b6df0d --- /dev/null +++ b/BaseModels/pil_graphic_utils.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- + +__author__ = 'SDE' + + +import os +from PIL import Image + +def get_thumbnail_url(image_url, size=150): + thumbs_part = 'thumbs_' + str(size) + image_url_parts = image_url.rsplit('/', 1) + return image_url_parts[0] + '/' + thumbs_part + '/' + image_url_parts[1] + +def get_thumbnail_path(image_path, size=150): + thumbs_dir = 'thumbs_' + str(size) + dirname, filename = os.path.split(image_path) + dirname = os.path.join(dirname, thumbs_dir) + if not os.path.exists(dirname): + os.mkdir(dirname, mode=0o755) + return os.path.join(dirname, filename) + +def create_thumbnail(image_path, size=150): + thumb_path = get_thumbnail_path(image_path, size) + delete_thumbnail(image_path, size) + img = Image.open(image_path) + img.thumbnail((size, size), Image.ANTIALIAS) + img.save(thumb_path) + +def delete_thumbnail(image_path, size=150): + thumb_path = get_thumbnail_path(image_path, size) + if os.path.exists(thumb_path): + os.remove(thumb_path) \ No newline at end of file diff --git a/BaseModels/search_funcs.py b/BaseModels/search_funcs.py new file mode 100644 index 0000000..d0a30e9 --- /dev/null +++ b/BaseModels/search_funcs.py @@ -0,0 +1,123 @@ +try: + import settings_local + + pg_fts_config = 'pg_catalog.russian' # 'public.mipp_fulltext' +except: + pg_fts_config = 'pg_catalog.russian' + +from django.db import models +from django.contrib.postgres.search import Value, Func +import copy + + +# получаем из списка только слова содержащие цифры +def get_list_words_contains_nums(txt): + from .inter import numbers + + if type(txt) == str: + words = txt.split(' ') + else: + words = txt + + words_w_nums = [] + + # получаем слова с цифрами + res_words = [] + + for word in words: + i = 0 + + while i < len(word): + if word[i] in numbers: + res_words.append(word) + break + i += 1 + + return res_words + + +# получаем список слов с разделенными цифрами и текстом +def get_list_split_words_w_nums(txt): + from .inter import numbers + + if type(txt) == str: + words = txt.split(' ') + else: + words = txt + + # words_w_nums = [] + + # получаем слова с цифрами + words_w_devided_nums = [] + for word in copy.copy(words): + + i = 0 + is_number = False + cut_piece_compete = False + + while i < len(word): + if i == 0: + if word[i] in numbers: + is_number = True + else: + is_number = False + else: + if word[i] in numbers: + if not is_number: + cut_piece_compete = True + else: + if is_number: + cut_piece_compete = True + + if cut_piece_compete: + cut_piece_compete = False + words_w_devided_nums.append(word[0:i]) + + # if is_number: + # words_w_nums.append(word[0:i]) + + word = word[i:] + i = 0 + else: + i += 1 + + if i > 0: + words_w_devided_nums.append(word[0:i]) + # if is_number: + # words_w_nums.append(word[0:i]) + + return words_w_devided_nums + + +class Headline(Func): + function = 'ts_headline' + + def __init__(self, field, query, config=None, options=None, **extra): + expressions = [field, query] + if config: + expressions.insert(0, Value(config)) + if options: + expressions.append(Value(options)) + extra.setdefault('output_field', models.TextField()) + super(Headline, self).__init__(*expressions, **extra) + + +def get_search_lexems_list(search_phrase): + from django.db import connection + search_lexems_list = None + + cursor = connection.cursor() + cursor.execute("SET NAMES 'UTF8';") + # cursor.execute(u"SET CHARACTER SET 'utf8';") + # cursor.execute(u"SET character_set_connection='utf8';") + cursor.execute("SELECT plainto_tsquery('{1}', '{0}');".format(search_phrase, pg_fts_config)) + search_lexems = cursor.fetchone() + s = search_lexems[0] # .decode('utf8') + + if search_lexems: + search_lexems = s.replace('\\', '') + search_lexems = search_lexems.replace("'", '') + search_lexems = search_lexems.replace(" ", '') + search_lexems_list = search_lexems.split('&') + + return search_lexems_list diff --git a/BaseModels/search_optimization/OEMBED/OEMBED_data.py b/BaseModels/search_optimization/OEMBED/OEMBED_data.py new file mode 100644 index 0000000..e5cdedd --- /dev/null +++ b/BaseModels/search_optimization/OEMBED/OEMBED_data.py @@ -0,0 +1,2 @@ +# https://oembed.com/ +# https://habr.com/ru/post/141303/ \ No newline at end of file diff --git a/BaseModels/search_optimization/RSS/ya_RSS_chanel.py b/BaseModels/search_optimization/RSS/ya_RSS_chanel.py new file mode 100644 index 0000000..18a0e2e --- /dev/null +++ b/BaseModels/search_optimization/RSS/ya_RSS_chanel.py @@ -0,0 +1 @@ +# https://yandex.ru/dev/turbo/doc/quick-start/articles.html \ No newline at end of file diff --git a/BaseModels/search_optimization/__init__.py b/BaseModels/search_optimization/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/BaseModels/search_optimization/google_AMP/AMP.py b/BaseModels/search_optimization/google_AMP/AMP.py new file mode 100644 index 0000000..d97aee9 --- /dev/null +++ b/BaseModels/search_optimization/google_AMP/AMP.py @@ -0,0 +1,2 @@ +# https://amp.dev/ru/ +# https://www.seonews.ru/analytics/optimization-2020-vnedrenie-amp-dlya-internet-magazina-bez-poteri-konversii-v-google/ \ No newline at end of file diff --git a/BaseModels/search_optimization/google_AMP/web_story_code.py b/BaseModels/search_optimization/google_AMP/web_story_code.py new file mode 100644 index 0000000..3c36a01 --- /dev/null +++ b/BaseModels/search_optimization/google_AMP/web_story_code.py @@ -0,0 +1 @@ +# https://developers.google.com/search/docs/advanced/appearance/enable-web-stories?hl=ru#google-discover \ No newline at end of file diff --git a/BaseModels/search_optimization/google_tips b/BaseModels/search_optimization/google_tips new file mode 100644 index 0000000..dd308ca --- /dev/null +++ b/BaseModels/search_optimization/google_tips @@ -0,0 +1 @@ + https://developers.google.com/search/docs/beginner/seo-starter-guide?hl=ru#understand_your_content \ No newline at end of file diff --git a/BaseModels/search_optimization/ld_json/__init__.py b/BaseModels/search_optimization/ld_json/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/BaseModels/search_optimization/ld_json/ld_ speakebale.py b/BaseModels/search_optimization/ld_json/ld_ speakebale.py new file mode 100644 index 0000000..2eec250 --- /dev/null +++ b/BaseModels/search_optimization/ld_json/ld_ speakebale.py @@ -0,0 +1,38 @@ + + +def get_ld_speakebale(name, theme_xpath, info_xpath, url): + + data = { + "@context": "https://schema.org/", + "@type": "WebPage", + "name": name, + "speakable": { + "@type": "SpeakableSpecification", + "xPath": [ + theme_xpath, + info_xpath + ] + }, + "url": url + } + + return data + + # Speakable markup example + # + # \ No newline at end of file diff --git a/BaseModels/search_optimization/ld_json/ld_FAQ.py b/BaseModels/search_optimization/ld_json/ld_FAQ.py new file mode 100644 index 0000000..1254fa3 --- /dev/null +++ b/BaseModels/search_optimization/ld_json/ld_FAQ.py @@ -0,0 +1,22 @@ + + +def get_ld_FAQ(data_Dict): + + FAQ_list = [] + for key, val in data_Dict.items(): + FAQ_list.append({ + "@type": "Question", + "name": key, + "acceptedAnswer": { + "@type": "Answer", + "text": val + } + }) + + data = { + "@context": "https://schema.org", + "@type": "FAQPage", + "mainEntity": FAQ_list + } + + return data \ No newline at end of file diff --git a/BaseModels/search_optimization/ld_json/ld_QA.py b/BaseModels/search_optimization/ld_json/ld_QA.py new file mode 100644 index 0000000..5201c9d --- /dev/null +++ b/BaseModels/search_optimization/ld_json/ld_QA.py @@ -0,0 +1,36 @@ + + +def get_ld_QA(data_Dict): + + data = { + "@context": "https://schema.org", + "@type": "QAPage", + "mainEntity": { + "@type": "Question", + "name": "How many ounces are there in a pound?", + "text": "I have taken up a new interest in baking and keep running across directions in ounces and pounds. I have to translate between them and was wondering how many ounces are in a pound?", + "answerCount": 3, + "upvoteCount": 26, + "acceptedAnswer": { + "@type": "Answer", + "text": "1 pound (lb) is equal to 16 ounces (oz).", + "upvoteCount": 1337, + "url": "https://example.com/question1#acceptedAnswer" + }, + "suggestedAnswer": [ + { + "@type": "Answer", + "text": "Are you looking for ounces or fluid ounces? If you are looking for fluid ounces there are 15.34 fluid ounces in a pound of water.", + "upvoteCount": 42, + "url": "https://example.com/question1#suggestedAnswer1" + }, { + "@type": "Answer", + "text": " I can't remember exactly, but I think 18 ounces in a lb. You might want to double check that.", + "upvoteCount": 0, + "url": "https://example.com/question1#suggestedAnswer2" + } + ] + } + } + + return data \ No newline at end of file diff --git a/BaseModels/search_optimization/ld_json/ld_article_news.py b/BaseModels/search_optimization/ld_json/ld_article_news.py new file mode 100644 index 0000000..f40c472 --- /dev/null +++ b/BaseModels/search_optimization/ld_json/ld_article_news.py @@ -0,0 +1,41 @@ + +import json + +import project_sets +from project_sets import * +from django.urls import reverse +from django.utils.html import strip_tags + +def get_ld_article_news(art_name, art_txt, art_DT, url_data): + from BaseModels.inter import get_all_photos_from_html_content + + img_list = get_all_photos_from_html_content(art_txt) + if img_list: + img_list = list(map(lambda img: "{0}{1}".format(project_sets.domain, img), img_list)) + + data = { + "@context": "https://schema.org", + "@type": "NewsArticle", + "url": "{0}{1}".format(project_sets.domain, reverse(**url_data)), + "publisher":{ + "@type":"Organization", + "name": project_sets.company_name, + "logo": project_sets.logo + }, + "author": { + "@type": "Organization", + "name": project_sets.company_name, + "logo": project_sets.logo, + "url": project_sets.domain, + }, + "headline": art_name, + # "mainEntityOfPage": "http://www.bbc.com/news/world-us-canada-39324587", # ссылка на источник + "articleBody": strip_tags(art_txt), + "datePublished": art_DT.isoformat() + } + if img_list: + data.update({ + 'image': img_list + }) + + return json.dumps(data) \ No newline at end of file diff --git a/BaseModels/search_optimization/ld_json/ld_breadcrambs.py b/BaseModels/search_optimization/ld_json/ld_breadcrambs.py new file mode 100644 index 0000000..6e30779 --- /dev/null +++ b/BaseModels/search_optimization/ld_json/ld_breadcrambs.py @@ -0,0 +1,39 @@ +import json + +def get_ld_breadcrambs(items_list): + + elements_list = [] + i = 1 + while i <= len(items_list): + item = items_list[i-1] + url = None + if type(item) == str: + name = item + elif type(item) == dict: + name = item['name'] + url = item['url'] + else: + name = item.name + url = item.url + + Dict = { + "@type": "ListItem", + "position": i, + "name": name, + } + if i < len(items_list): + Dict.update({ + "item": url + }) + + elements_list.append(Dict) + + i += 1 + + data = { + "@context": "https://schema.org", + "@type": "BreadcrumbList", + "itemListElement": elements_list + } + + return json.dumps(data) \ No newline at end of file diff --git a/BaseModels/search_optimization/ld_json/ld_company.py b/BaseModels/search_optimization/ld_json/ld_company.py new file mode 100644 index 0000000..2dee7af --- /dev/null +++ b/BaseModels/search_optimization/ld_json/ld_company.py @@ -0,0 +1,243 @@ +import json + +import project_sets +from collections import OrderedDict + +def get_ld_logo(): + data = { + "@context": "https://schema.org", + "@type": "Organization", + "url": project_sets.domain, + "logo": project_sets.logo + } + return data + + +def get_ld_company(offices): + try: + main_office = offices.get(main_office=True) + except: + main_office = offices[0] + + + data = { + "@context": "https://schema.org", + "@type": "LocalBusiness", + "logo": project_sets.logo, + } + + ld_for_main_office = get_ld_office(main_office) + data.update(ld_for_main_office) + + + departments = [] + for office in offices: + if office == main_office: + continue + + departments.append(get_ld_office(office)) + + # if departments: + # data.update({ + # 'department': departments + # }) + + return json.dumps(data) + + +def get_ld_office(office): + + try: + phones = office.phones() + except: + phones = [] + + if not phones: + try: + phones = office.rel_contacts_for_office + except: + phones = [] + + data = { + "name": office.name, + } + + # На каждой странице (с разметкой или без нее) должно присутствовать хотя бы одно изображение. Робот Google выберет лучшее изображение для показа в результатах поиска с учетом соотношения сторон и разрешения. + # URL изображений должны быть доступны для сканирования и индексирования. Проверить, есть ли у поискового робота Google доступ к URL вашего контента, можно с помощью инструмента, описанного в этой статье. + # Изображения должны соответствовать размеченному контенту. + # Допускаются только графические файлы форматов, совместимых с Google Картинками. + # Предоставьте несколько изображений в высоком разрешении (не менее 50 000 пикселей по произведению ширины и высоты) со следующими соотношениями сторон: 16 × 9, 4 × 3 и 1 × 1. + data.update({ + "image": [ + project_sets.logo, + ] + }) + + # data.update({ + # "@type": "Store", + # }) + # не обязательно! + + # AnimalShelter + # ArchiveOrganization + # AutomotiveBusiness + # ChildCare + # Dentist + # DryCleaningOrLaundry + # EmergencyService + # EmploymentAgency + # EntertainmentBusiness + # FinancialService + # FoodEstablishment + # GovernmentOffice + # HealthAndBeautyBusiness + # HomeAndConstructionBusiness + # InternetCafe + # LegalService + # Library + # LodgingBusiness + # MedicalBusiness + # ProfessionalService + # RadioStation + # RealEstateAgent + # RecyclingCenter + # SelfStorage + # ShoppingCenter + # SportsActivityLocation + # Store + # TelevisionStation + # TouristInformationCenter + # TravelAgency + + i_Dict = { + "address": { + "@type": "PostalAddress", + "streetAddress": office.address, + "addressLocality": office.city, + # "addressRegion": "CA", + # "postalCode": "95129", + # "addressCountry": "US" + }, + } + if phones: + i_Dict["address"].update({ + "telephone": '{0}{1}'.format(phones[0].prefix, phones[0].nomber_phone), + }) + + data.update(i_Dict) + + gps_longitude = getattr(office, 'gps_longitude', None) + gps_latitude = getattr(office, 'gps_latitude', None) + if not gps_longitude: + gps_longitude = getattr(project_sets, 'gps_longitude', None) + if not gps_latitude: + gps_latitude = getattr(project_sets, 'gps_latitude', None) + if gps_longitude and gps_latitude: + i_Dict = { + "geo": { + "@type": "GeoCoordinates", + "latitude": gps_latitude, + "longitude": gps_longitude + }, + } + data.update(i_Dict) + + data.update({ + "url": project_sets.domain + }) + + # "foundingDate": "2005-02-07", # дата основания + + company_reference_links = getattr(project_sets, 'company_reference_links') + if company_reference_links: + data.update({ + "sameAs": company_reference_links + }) + + priceRange = getattr(office, 'priceRange', '$') + if priceRange: + data.update({ + "priceRange": priceRange + }) + + work_time_from = getattr(office, 'work_time_from', None) + if not work_time_from: + work_time_from = getattr(project_sets, 'work_time_from', '9:00') + work_time_to = getattr(office, 'work_time_to', None) + if not work_time_to: + work_time_to = getattr(project_sets, 'work_time_to', '18:00') + + i_Dict = { + "openingHoursSpecification": [ + { + "@type": "OpeningHoursSpecification", + "dayOfWeek": [ + "https://schema.org/Monday", + "https://schema.org/Tuesday", + "https://schema.org/Wednesday", + "https://schema.org/Thursday", + "https://schema.org/Friday", + # "https://schema.org/Saturday" + ], + "opens": work_time_from, + "closes": work_time_to + }, + # { + # "@type": "OpeningHoursSpecification", + # "dayOfWeek": "Sunday", + # "opens": "08:00", + # "closes": "23:00" + # } + ], + } + # i_Dict = { + # "openingHoursSpecification": [ + # { + # "@type": "OpeningHoursSpecification", + # "dayOfWeek": "https://schema.org/Monday", + # "opens": work_time_from, + # "closes": work_time_to + # }, + # { + # "@type": "OpeningHoursSpecification", + # "dayOfWeek": "https://schema.org/Tuesday", + # "opens": work_time_from, + # "closes": work_time_to + # }, + # { + # "@type": "OpeningHoursSpecification", + # "dayOfWeek": "https://schema.org/Wednesday", + # "opens": work_time_from, + # "closes": work_time_to + # }, + # { + # "@type": "OpeningHoursSpecification", + # "dayOfWeek": "https://schema.org/Thursday", + # "opens": work_time_from, + # "closes": work_time_to + # }, + # { + # "@type": "OpeningHoursSpecification", + # "dayOfWeek": "https://schema.org/Friday", + # "opens": work_time_from, + # "closes": work_time_to + # }, + # { + # "@type": "OpeningHoursSpecification", + # "dayOfWeek": "https://schema.org/Saturday", + # "opens": work_time_from, + # "closes": work_time_to + # }, + # { + # "@type": "OpeningHoursSpecification", + # "dayOfWeek": "https://schema.org/Sunday", + # "opens": work_time_from, + # "closes": work_time_to + # }, + # ], + # } + data.update(i_Dict) + + return data + + diff --git a/BaseModels/search_optimization/ld_json/ld_media_video_object.py b/BaseModels/search_optimization/ld_json/ld_media_video_object.py new file mode 100644 index 0000000..0b3cf12 --- /dev/null +++ b/BaseModels/search_optimization/ld_json/ld_media_video_object.py @@ -0,0 +1,53 @@ +import json +import re + +import project_sets +from django.urls import reverse +from django.utils.html import strip_tags + + +def create_videoobject(video_path, name, description, DT): + video_id = video_path.split('/')[-1] + thumbs = list(map(lambda s: "https://img.youtube.com/vi/{0}/{1}.jpg".format(video_id, str(s)), range(1, 5))) + + data = { + "@context": "https://schema.org", + "@type": "VideoObject", + "name": name, + "description": description, + "thumbnailUrl": thumbs, + "uploadDate": DT.isoformat(), + # "duration": "PT1M54S", # продолжительность видео + # "contentUrl": "https://www.example.com/video/123/file.mp4", # адрес к видеофайлу + "embedUrl": video_path, + # "interactionStatistic": { # количество просмотров + # "@type": "InteractionCounter", + # "interactionType": { "@type": "WatchAction" }, + # "userInteractionCount": 5647018 + # }, + # "regionsAllowed": "US,NL" # разрешенные регионы + } + return data + + +def get_ld_videoobjects_for_page_html(obj, name, description, DT, content): + from BaseModels.inter import get_all_videos_from_html_content + res_list = [] + + if obj.video: + data = create_videoobject(obj.video, name, description, DT) + res_list.append(json.dumps(data)) + + if not content: + return res_list + + videos_list = get_all_videos_from_html_content(content) + # if videos_list: + # img_list = list(map(lambda img: "{0}{1}".format(project_sets.domain, img), videos_list)) + + for video_path in videos_list: + if not video_path in obj.video and not obj.video in video_path: + data = create_videoobject(video_path, name, description, DT) + res_list.append(json.dumps(data)) + + return res_list diff --git a/BaseModels/search_optimization/ld_json/ld_product.py b/BaseModels/search_optimization/ld_json/ld_product.py new file mode 100644 index 0000000..d2e67a1 --- /dev/null +++ b/BaseModels/search_optimization/ld_json/ld_product.py @@ -0,0 +1,178 @@ +# import json +# +# import project_sets +# from BaseModels.functions import add_domain +# +# +# def get_ld_shipping_data_for_product(shipping_terms): +# shipping_terms_list = [] +# for item in shipping_terms: +# data = { +# "@type": "OfferShippingDetails", +# "shippingRate": { +# "@type": "MonetaryAmount", +# "value": item.price, +# "currency": project_sets.base_currency +# }, +# "shippingDestination": { +# "@type": "DefinedRegion", +# "addressCountry": project_sets.shipping_region, # обязательно +# # "postalCodeRange": { +# # "postalCodeBegin": "98100", +# # "postalCodeEnd": "98199" +# # } +# }, +# "deliveryTime": { +# "@type": "ShippingDeliveryTime", +# "cutOffTime": project_sets.cutOffTime, # "19:30-08:00", +# +# # Стандартное время от получения оплаты до отправки товаров со склада (или подготовки к самовывозу, если используется такой вариант) +# "handlingTime": { +# "@type": "QuantitativeValue", +# "minValue": "0", # дней +# "maxValue": "1" # дней +# }, +# # Стандартное время от отправки заказа до его прибытия к конечному покупателю. +# "transitTime": { +# "@type": "QuantitativeValue", +# "minValue": "1", # дней +# "maxValue": "5" # дней +# }, +# # Время, после которого новые заказы не обрабатываются в тот же день +# +# # Дни недели, по которым вы обрабатываете заказы +# "businessDays": { +# "@type": "OpeningHoursSpecification", +# "dayOfWeek": ["https://schema.org/Monday", "https://schema.org/Tuesday", +# "https://schema.org/Wednesday", "https://schema.org/Thursday"] +# } +# } +# } +# +# shipping_terms_list.append(data) +# +# data = { +# "shippingDetails": shipping_terms_list +# } +# +# return data +# +# +# def get_ld_offers_for_product(product, domain, shipping_terms): +# data = { +# "offers": { +# "@type": "Offer", +# "url": '{0}{1}'.format(domain, product.get_site_url()), +# "itemCondition": "https://schema.org/NewCondition", +# # "https://schema.org/NewCondition" +# # "https://schema.org/UsedCondition" +# "availability": "https://schema.org/InStock", +# # https://schema.org/BackOrder +# # https://schema.org/Discontinued +# # https://schema.org/InStock +# # https://schema.org/InStoreOnly +# # https://schema.org/LimitedAvailability +# # https://schema.org/OnlineOnly +# # https://schema.org/OutOfStock +# # https://schema.org/PreOrder +# # https://schema.org/PreSale +# # https://schema.org/SoldOut +# "price": str(product.price), +# "priceCurrency": project_sets.base_currency, +# # "priceValidUntil": "2020-11-20", #дата окончания действия цены +# # "shippingSettingsLink": '{0}{1}'.format(project_sets.domain, 'delivery/'), +# +# }, +# } +# +# if shipping_terms: +# data["offers"].update(get_ld_shipping_data_for_product(shipping_terms)) +# +# return data +# +# +# def get_aggregate_rating(product): +# data = { +# # "review": { +# # "@type": "Review", +# # "reviewRating": { +# # "@type": "Rating", +# # "ratingValue": "4", +# # "bestRating": "5" +# # }, +# # "author": { +# # "@type": "Person", +# # "name": "Fred Benson" +# # } +# # }, +# "aggregateRating": { +# "@type": "AggregateRating", +# "ratingValue": product.ratingValue, +# "reviewCount": product.reviewCount +# } +# } +# +# return data +# +# +# def get_ld_product(product, domain, shipping_terms): +# from GeneralApp.views import get_cur_domain +# serv_domain, local_domain = get_cur_domain() +# +# data = { +# "@context": "https://schema.org/", +# "@type": "Product", +# "name": product.name, +# "sku": '{0}-{1}'.format(str(product.brand), str(product.article)), +# "url": '{0}{1}'.format(domain, product.get_site_url()), +# } +# +# if product.description: +# data.update({ +# "description": product.description, +# }) +# +# barcode = getattr(product, 'barcode', None) +# if barcode: +# data.update({ +# "gtin14": barcode, +# }) +# +# gallery = getattr(product, 'gallery', None) +# if gallery: +# try: +# photos = gallery.get_photos() +# photos = list(map(lambda ph: '{0}{1}'.format(serv_domain, ph), photos)) +# except Exception as e: +# photos = None +# +# if photos: +# data.update({ +# "image": photos, +# }) +# +# brand = getattr(product, 'brand', None) +# if brand: +# if type(brand) not in [str]: +# brand = brand.name +# +# data.update({ +# "brand": { +# "@type": "Brand", +# "name": brand +# }, +# }) +# +# FAQ = {} +# +# from ... +# +# aggregate_rating = getattr(product, 'ratingValue', None) +# if aggregate_rating != None: +# data.update(get_aggregate_rating(product)) +# +# price = getattr(product, 'price', None) +# if price: +# data.update(get_ld_offers_for_product(product, domain, shipping_terms)) +# +# return json.dumps(data) diff --git a/BaseModels/search_optimization/ld_json/ld_search.py b/BaseModels/search_optimization/ld_json/ld_search.py new file mode 100644 index 0000000..9161def --- /dev/null +++ b/BaseModels/search_optimization/ld_json/ld_search.py @@ -0,0 +1,22 @@ +import json +import project_sets + +def get_ld_search(domain): + + # Только для главной страницы + + data = { + "@context": "https://schema.org", + "@type": "WebSite", + "url": domain, #"https://truenergy.by/", + "potentialAction": { + "@type": "SearchAction", + "target": { + "@type": "EntryPoint", + "urlTemplate": "{domain}/{search_term_string}/".format(domain=domain, search_term_string='{search_term_string}') + }, + "query-input": "required name=search_term_string" + } + } + + return json.dumps(data) \ No newline at end of file diff --git a/BaseModels/search_optimization/ld_json/ld_vacancy.py b/BaseModels/search_optimization/ld_json/ld_vacancy.py new file mode 100644 index 0000000..7a5996c --- /dev/null +++ b/BaseModels/search_optimization/ld_json/ld_vacancy.py @@ -0,0 +1,140 @@ +import datetime +import project_sets + + +def get_ld_vacancies(data_Dict): + + # Разметку JobPosting можно размещать только на страницах, которые содержат одно объявление о вакансии. + # Не разрешается добавлять разметку JobPosting на какие-либо другие страницы, в том числе те, на которых нет информации ни об одной вакансии. + + vacancies_list = [] + + for item in data_Dict: + data = { + "@context": "https://schema.org/", + "@type": "JobPosting", + "title": item['title'], + "description": item['description'], + "datePosted": datetime.datetime.now().strftime('%Y-%m-%d'), + "validThrough": item['validThrough'].strftime('%Y-%m-%dT%H:%M'), #"2017-03-18T00:00", # окончание срока действия + "identifier": { + "@type": "PropertyValue", + "name": project_sets.company_name, + "value": str(item['id']) + }, + "hiringOrganization": { + "@type": "Organization", + "name": project_sets.company_name, + "sameAs": project_sets.domain, + "logo": project_sets.logo + }, + } + + if 'office' in item: + # используется для указания места, в котором сотрудник будет выполнять работу. Если определенного места (например, офиса или производственной площадки) нет, использовать это свойство не обязательно. + job_place_Dict = { + "jobLocation": { + "@type": "Place", + "address": { + "@type": "PostalAddress", + "streetAddress": item['office'].address, + "addressLocality": item['office'].city, + "addressCountry": "BY" + }, + }, + } + else: + job_place_Dict = { + "jobLocationType": "TELECOMMUTE" # только удаленка + } + data.update(job_place_Dict) + + if 'required_country_of_residence' in item: + # используется для указания территории, на которой может проживать кандидат на должность. Необходимо, чтобы была задана по меньшей мере одна страна + required_country_of_residence = { + "applicantLocationRequirements": { + "@type": "Country", + "name": item['required_country_of_residence']['country'] + }, + } + data.update(required_country_of_residence) + + if 'salary' in item: + salary_Dict = { + "baseSalary": { + "@type": "MonetaryAmount", + "currency": item['salary']['currency'], + "value": { + "@type": "QuantitativeValue", + "unitText": item['salary']['time_unit'] + # HOUR + # DAY + # WEEK + # MONTH + # YEAR + } + } + } + if 'price' in item['salary']: + salary_Dict['baseSalary']['value']['value'] = item['salary']['price'] + elif 'price_from' in item['salary']: + salary_Dict['baseSalary']['value']['minValue'] = item['salary']['price_from'] + + if 'price_to' in item['salary']: + salary_Dict['baseSalary']['value']['maxValue'] = item['salary']['price_to'] + + data.update(salary_Dict) + + # Указание на то, поддерживается ли на странице с объявлением о вакансии отправка резюме напрямую. + data.update({ + 'directApply': item['directApply'] + }) + + # Вид занятости Укажите одно или несколько значений + if 'employmentType' in item: + # FULL_TIME + # PART_TIME + # CONTRACTOR + # TEMPORARY + # INTERN + # VOLUNTEER + # PER_DIEM + # OTHER + data.update({ + 'employmentType': item['employmentType'] + }) + + if 'educationRequirements' in item: + e_Dict = { + "educationRequirements": { + "@type": "EducationalOccupationalCredential", + "credentialCategory": item['educationRequirements'] + # high school + # associate degree + # bachelor degree + # professional certificate + # postgraduate degree + }, + } + data.update(e_Dict) + + if 'experienceRequirements' in item: + e_Dict = { + "experienceRequirements": { + "@type": "OccupationalExperienceRequirements", + "monthsOfExperience": item['experienceRequirements'] # опыт работы в месяцах + }, + } + data.update(e_Dict) + + # Со значением "истина" это свойство будет указывать на то, что кандидатам достаточно иметь опыт, если у них нет требуемого образования + if 'required_only_experience' in item: + if 'experienceRequirements' in item and 'educationRequirements' in item: + data.update({ + 'experienceInPlaceOfEducation': item['required_only_experience'] + }) + + vacancies_list.append(data) + + return vacancies_list + diff --git a/BaseModels/search_optimization/ya_YML/ya_YML.py b/BaseModels/search_optimization/ya_YML/ya_YML.py new file mode 100644 index 0000000..9d40705 --- /dev/null +++ b/BaseModels/search_optimization/ya_YML/ya_YML.py @@ -0,0 +1 @@ +# https://yandex.ru/dev/turbo-shop/doc/quick-start/markets.html \ No newline at end of file diff --git a/BaseModels/search_optimization/ya_tips b/BaseModels/search_optimization/ya_tips new file mode 100644 index 0000000..0b89985 --- /dev/null +++ b/BaseModels/search_optimization/ya_tips @@ -0,0 +1 @@ +https://yandex.ru/support/webmaster/index.html \ No newline at end of file diff --git a/BaseModels/seo_text_generators.py b/BaseModels/seo_text_generators.py new file mode 100644 index 0000000..c5e36eb --- /dev/null +++ b/BaseModels/seo_text_generators.py @@ -0,0 +1,258 @@ +from BaseModels.inter import cut_to_number_w_point + + +def generate_seotext_by_properties(product_data_Dict): + + power_txt = '' + ip_txt = '' + lm_txt = '' + temp_txt = '' + install_txt = '' + diametr_txt = '' + + try: + + if 'diameter' in product_data_Dict: + val = int(product_data_Dict['diameter']) + else: + val = int(product_data_Dict['width']) + + diametr_txt = '{0} truEnergy {1} серии {2}.
'.format( + product_data_Dict['product_type']['name'].upper(), + product_data_Dict['article'], + product_data_Dict['product_series']['name'].upper() + ) + + # if product_data_Dict['product_type']['name'] == 'Светильник светодиодный': + # + # if val < 100: + # diametr_txt = '{0} truEnergy {1} серии {2} - это хорошее решение для дома.
'.format( + # product_data_Dict['product_type']['name'].upper(), + # product_data_Dict['article'], + # product_data_Dict['product_series']['name'].upper() + # ) + # + # elif val < 150: + # diametr_txt = '{0} truEnergy {1} серии {2} отлично подойдет для освещения вашей квартиры, дома или офиса.
'.format( + # product_data_Dict['product_type']['name'].upper(), + # product_data_Dict['article'], + # product_data_Dict['product_series']['name'].upper() + # ) + # + # else: + # diametr_txt = '{0} truEnergy {1} серии {2} - это энергоэффективное освещение для различных площадей и объектов.
'.format( + # product_data_Dict['product_type']['name'].upper(), + # product_data_Dict['article'], + # product_data_Dict['product_series']['name'].upper() + # ) + # # не светильник + # else: + # diametr_txt = '{0} truEnergy {1} серии {2} - это энергоэффективное решение для освещения различных пространств.
'.format( + # product_data_Dict['product_type']['name'].upper(), + # product_data_Dict['article'], + # product_data_Dict['product_series']['name'].upper() + # ) + except Exception as e: + pass + + # --------- + for property in product_data_Dict['properties_w_values_filtred']: + + # ------ + + try: + + if property['property']['name'] == 'Мощность': + power = int(property['property_value']) + + if power < 7: + power_txt = 'Обладая низким энергопотреблением, этот {0} является заменой лампочки накаливания мощностью до 40 Ватт.
'.format( + product_data_Dict['product_type']['name'].lower(), + ) + + elif power < 13: + power_txt = 'Энергоэффективность этого устройства позволяет использовть его в местах, ' \ + 'где ранее использовались светильники с лампами накаливания мощностью до 75 Ватт.
'.format( + ) + elif power < 19: + power_txt = 'Этот {0} мощностью {1} Ватт легко заменит старые лампы накаливания мощностью до 100 Ватт ' \ + 'или люминесцентные лампы мощностью до 40 Ватт.
'.format( + product_data_Dict['product_type']['name'].lower(), + str(power) + ) + + elif power < 37: + power_txt = 'Данная модель подходит для освещения больших пространств. ' \ + 'Она не только поможет решить вопрос освещения, но и существенно сэкономит бюджет, ' \ + 'выделенный на решение этой задачи.
'.format( + product_data_Dict['product_type']['name'].lower(), + ) + else: + power_txt = '{0} Ватт, в данной модели обеспечивает мощный световой поток. ' \ + 'Это дает возможность установки одного изделия для освещения помещений с большой ' \ + 'площадью или открытых пространств.
'.format( + str(power), + product_data_Dict['product_type']['name'].lower(), + ) + + except Exception as e: + pass + + # ------ + + try: + + if property['property']['name'] == 'Световой поток' and product_data_Dict['article'] != '11043': + val = int(property['property_value']) + + if product_data_Dict['product_type']['name'] == 'Светильник светодиодный': + lm_txt = 'Один {0} данной модели способен осветить до {1} м.кв. площади ' \ + 'для рабочих зон и жилых комнат, и до {2} м.кв. площади для проходных и подсобных помещений ' \ + '(при стандартной высоте потолка и нормальной освещенности помещения).
'.format( + product_data_Dict['product_type']['name'].lower(), + str(round(val / 300,2)), + str(round(val / 120, 2)), + ) + + except Exception as e: + pass + + # ------- + + try: + + if property['property']['name'] == 'IP (пылевлагозащита)': + val = int(property['property_value']) + + if val > 66: + ip_txt = 'Максимальная защита IP{0} способна выдержать самые сильные испытания водой. ' \ + 'Освещение с такой защитой используют для фонтанов и бассейнов.
'.format( + str(val), + ) + + elif val > 64: + ip_txt = 'Данный продукт имеет высокую степень пылевлагозащиты - IP{0}. В связи с этим данная модель прекрасно подходит как ' \ + 'для отапливаемых помещений с нормальным уровнем влажности, так и для помещений неотапливаемых, ' \ + 'а также для эксплуатации на улице. Устройство с данной степенью защиты не боится пыли и влаги' \ + 'а так же имеет защиту от струй воды со всех направлений.
'.format( + str(val), + ) + + elif val > 60: + ip_txt = 'Степень защиты IP{0} обозначает полную защиту от брызг с любых сторон и имеет полную пылинепроницаемость ' \ + '(никакая пыль не может проникнуть внутрь корпуса устройства). ' \ + 'Светильники подходят для установки в помещении и на улице, при рабочих температурах -20 до +40 градусов.
'.format( + str(val), + ) + + elif val > 53: + ip_txt = 'У изделия с степенью защиты IP{0} снижена возможность попадания пыли внутрь корпуса ' \ + 'и обеспечена полная защита расположенной внутри устройстав электроники.' \ + 'Часто используют для рабочих помещений с повышенным содержанием пыли и влаги, а также под навесами.
'.format( + str(val), + product_data_Dict['product_type']['name'].lower(), + product_data_Dict['product_type']['name_plural'].lower(), + ) + + elif val > 40: + ip_txt = 'Могут устанавливаться в помещения с повышенным уровнем пыли.'.format( + product_data_Dict['product_type']['name'].lower(), + ) + else: + ip_txt = 'IP{0} - степень защиты данной модели, в связи с этим могут устанавливаться в' \ + ' отапливаемые помещения с умеренным уровнем влажности.
'.format( + str(val), + ) + + except Exception as e: + pass + + # ------- + + try: + + if property['property']['name'] == 'Цветовая температура': + val = int(property['property_value']) + + if val < 3001: + temp_txt = 'Теплый свет, генерируемый этой моделью способствует отдыху и расслаблению. ' \ + 'Он приятен для глаз. В связи с этим рекомендуется устанавливать {0} ' \ + 'с температурой {1}К в зоны отдыха, жилые комнаты и спальни, кафе, лаундж зоны. ' \ + 'Очень удачное решение для обеденных и гостинных комнат.
'.format( + product_data_Dict['product_type']['name_plural'].lower(), + str(val), + ) + + elif val < 4601: + temp_txt = 'Модель обладает нейтральным цветом свечения, который прекрасно подходит и как для жилых помещений и комнат, ' \ + 'так и для рабочих зон (офисов, кабинетов, производств) . ' \ + 'Данный свет стимулирует к работе не вызывая перенапряжения глаз и не искажая цветопередачу. ' \ + 'Универсальное и наиболее распространенное решение.
'.format( + str(val), + ) + + elif val < 7001: + temp_txt = 'Цветовая температура {0}К - наиболее оптимально использование в помещениях промышленного назначения, ' \ + 'административных зданиях, на производствах, складах, гаражах, паркингах. ' \ + 'Однако могут применяться и в интерьере для создания акцентов в дизайне, ' \ + 'либо если предпочтения потребителя отданы в пользу белого света.
'.format( + str(val), + ) + + + + else: + temp_txt = 'От показателя цветовой температуры зависит то, как Вы будут воспринимать предметы и другие объекты освещенные устройством. ' \ + 'С помощью цветовой температуры можно сделать более приятным отдых и улучшить эффективность работы. ' \ + 'Отниситесь внимательно к выбору устройства по этому параметру.
'.format( + str(val), + ) + except Exception as e: + pass + + # ------- + + try: + + if property['property']['name'] == 'Тип монтажа': + val = property['property_value'] + + if val == 'встраиваемый': + install_txt = 'Устройство устанавливается в предварительно вырезанное в поверхности отверстие. ' \ + 'Этот вариант монтажа используется для подвесных и натяжных потолков, а так же для фальш-стен и ниш.'.format( + str(val), + ) + + elif val == 'накладной': + install_txt = 'Способ крепления - накладной. Значит эта модель может быть закреплена на любую ровную поверхность.'.format( + str(val), + ) + + elif val == 'встраиваемый/накладной': + install_txt = '{0} обладает возможностью монтажа как в отверстия на поверхности плоскостей, так и на любую ровную поверхность.'.format( + product_data_Dict['article'], + ) + + else: + pass + + if 'height_visible_part' in product_data_Dict and product_data_Dict['height_visible_part']: + install_txt = install_txt + ' Высота видимой части устройства после монтажа составит {0}мм.
'.format( + str(round(product_data_Dict['height_visible_part'])) + ) + else: + install_txt = install_txt + '
' + + except Exception as e: + pass + + product_data_Dict['seo_text'] = '{0}{1}{2}{3}{4}{5}'.format( + diametr_txt, + power_txt, + lm_txt, + ip_txt, + temp_txt, + install_txt + ) + + return product_data_Dict \ No newline at end of file diff --git a/BaseModels/templates/m_show_message.html b/BaseModels/templates/m_show_message.html new file mode 100644 index 0000000..cb9ba16 --- /dev/null +++ b/BaseModels/templates/m_show_message.html @@ -0,0 +1,15 @@ + diff --git a/BaseModels/templatetags/__init__.py b/BaseModels/templatetags/__init__.py new file mode 100644 index 0000000..14c7ff2 --- /dev/null +++ b/BaseModels/templatetags/__init__.py @@ -0,0 +1 @@ +__author__ = 'SDE' diff --git a/BaseModels/templatetags/base_tags_extra.py b/BaseModels/templatetags/base_tags_extra.py new file mode 100644 index 0000000..7ff4027 --- /dev/null +++ b/BaseModels/templatetags/base_tags_extra.py @@ -0,0 +1,155 @@ +__author__ = 'SDE' + +from django import template +from django.template.defaultfilters import stringfilter + +register = template.Library() + +from django.core.serializers import serialize +from django.db.models.query import QuerySet +import simplejson +from django.template import Library +from django.utils.html import mark_safe + +@register.filter('get_value_from_dict') +def get_value_from_dict(dict_data, key): + """ + usage example {{ your_dict|get_value_from_dict:your_key }} + """ + + if key in dict_data: + res = dict_data[key] + return res + + return False + + + +@register.filter() +def get_rows_count_by_cols_count(data, cols_count): + rows_count = len(data) // cols_count + if len(data) % cols_count: + rows_count += 1 + return rows_count + +@register.filter() +def get_numbers_list(from_el, to_el): + res = range(from_el, to_el+1) + return res + + +def val_type(value): + res = type(value) + return res.__name__ +register.filter('val_type', val_type) + +@register.filter() +def get_cols_table_data_for_row_when_cols3(value, row): + el_count = 3 + from_el = (row-1) * el_count + to_el = row * el_count + part = list(value)[from_el:to_el] + return part +# register.filter('val_type', val_type) + + +@register.filter +@stringfilter +def correct_for_tables(value): + if value in ['None', '0.0']: + return '-' + return value + + +@register.filter +@stringfilter +def del_bad_symbols(value): + from BaseModels.functions import del_bad_symbols + return del_bad_symbols(value) + + +@register.filter +@stringfilter +def del_amp_symbols(value): + from BaseModels.functions import del_nbsp + return del_nbsp(value) + +@register.filter +@stringfilter +def del_lang_from_path(value): + path_list = value.split('/') + path = u'' + for i in path_list[1:]: + path.join(i + '/') + return path + +@register.filter +@stringfilter +def get_color_by_number(value, arg=None): + + color = None + try: + val = float(value) + + if not color and arg == u'%': + + color = u'black' + if val > 50: + color = u'green' + elif val <= 50 and val >= 25: + color = u'#6c8107' + elif val <= 25 and val >= 10: + color = u'#a89803' + elif val <= 10 and val >= 5: + color = u'#e6a707' + elif val <= 5 and val >= 0: + color = u'#e67307' + elif val <= 0: + color = u'red' + + + # val_range = val_max - val_min + # # val_percent = (val_range * 100 / val) - 100 + # offset = -(val_min + -(val)) + # if val <0: + # val = offset + # if val > val_max: + # val = val_max + # elif val < 0: + # val = 0 + # + # color_range = 16711680 - 1211136 + # val_1unit = float(color_range) / float(val_range) + # dec_color = 16711680 - int(val_1unit * val) + + if not color: + color = u'black' + if val > 1000: + color = u'green' + elif val <= 1000 and val >= 500: + color = u'#6c8107' + elif val <= 500 and val >= 250: + color = u'#a89803' + elif val <= 250 and val >= 125: + color = u'#e6a707' + elif val <= 125 and val >= 50: + color = u'#e67307' + elif val <= 50: + color = u'red' + + # s = u'style="color: #{0}12;"'.format(str(hex(dec_color))[2:6]) + s = u'style="color: {0};"'.format(color) + return s + except: + return u'' + + +@register.filter +@stringfilter +def check_aprox_compare_strings(search_phrase, txt): + from ProductApp.search import get_highlight_string + + s = get_highlight_string(search_phrase, txt) + + return s + diff --git a/FirePlayProj/__init__.py b/FirePlayProj/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/FirePlayProj/asgi.py b/FirePlayProj/asgi.py new file mode 100644 index 0000000..95c0119 --- /dev/null +++ b/FirePlayProj/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for FirePlayProj project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'FirePlayProj.settings') + +application = get_asgi_application() diff --git a/FirePlayProj/settings.py b/FirePlayProj/settings.py new file mode 100644 index 0000000..a853698 --- /dev/null +++ b/FirePlayProj/settings.py @@ -0,0 +1,252 @@ +""" +Django settings for FirePlayProj project. + +Generated by 'django-admin startproject' using Django 4.2.1. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/4.2/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-k=2q3&t1pufsxpu#)0hfd(#!9%horaq$krbbxm=7*w$0x5(h1b' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + + 'ckeditor', + 'ckeditor_uploader', + + 'AuthApp', + 'QuestionsApp', + 'GameApp', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'FirePlayProj.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [BASE_DIR / 'templates'] + , + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'FirePlayProj.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/4.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'fireGameDB', + 'USER': 'test_user', + 'PASSWORD': 'test_db_pass', + 'HOST': '127.0.0.1', + 'PORT': '5432', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/4.2/topics/i18n/ + +LANGUAGE_CODE = 'ru-RU' + +TIME_ZONE = 'Europe/Minsk' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/4.2/howto/static-files/ + +MEDIA_URL = '/media/' +MEDIA_ROOT = 'media/' + +STATIC_URL = '/static/' +STATIC_ROOT = '/' + +# Default primary key field type +# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + + +gettext = lambda s: s +LANGUAGES = ( + (u'ru', gettext(u'Russian')), + (u'en', gettext(u'English')), + # (u'de', gettext(u'Deutsch')), + # (u'fr', gettext(u'Francais')), +) +MODELTRANSLATION_LANGUAGES = ('ru', 'en') +MODELTRANSLATION_ENABLE_FALLBACKS = True +MODELTRANSLATION_FALLBACK_LANGUAGES = { + 'default': ('ru','en'), + 'ru': ('ru','en'), + 'en': ('en', 'ru'), +} + +# Add custom languages not provided by Django +import django.conf.locale +LANG_INFO = dict(django.conf.locale.LANG_INFO.items()) +django.conf.locale.LANG_INFO = LANG_INFO + +CKEDITOR_BASEPATH = "/static/ckeditor/ckeditor/" +CKEDITOR_UPLOAD_PATH = "uploads/" + +CKEDITOR_IMAGE_BACKEND = "pillow" + +# CKEDITOR_BROWSE_SHOW_DIRS = True + +CKEDITOR_JQUERY_URL = 'https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js' + +CKEDITOR_OPTIONS = { + 'height': 291, + 'width': '95%', + 'filebrowserWindowHeight': 600, + 'filebrowserWindowWidth': "100%", + 'toolbar': 'YourCustomToolbarConfig', + + 'allowedContent': True, + + 'enterMode': 2, + 'basicEntities' : False, + 'entities_additional': '', + 'entities' : False, + 'htmlEncodeOutput' : False, + 'toolbar_Basic': [ + ['Source', '-', 'Bold', 'Italic'] + ], + 'toolbar_YourCustomToolbarConfig': [ + {'name': 'document', 'items': ['Source', '-', 'Save', 'NewPage', 'Preview', 'Print', '-', 'Templates']}, + {'name': 'clipboard', 'items': ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo']}, + {'name': 'editing', 'items': ['Find', 'Replace', '-', 'SelectAll']}, + {'name': 'forms', + 'items': ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', + 'HiddenField']}, + '/', + {'name': 'basicstyles', + 'items': ['Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat']}, + {'name': 'paragraph', + 'items': ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', 'CreateDiv', '-', + 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl', + 'Language']}, + {'name': 'links', 'items': ['Link', 'Unlink', 'Anchor']}, + {'name': 'insert', + 'items': ['Image', 'Flash', 'Table', 'HorizontalRule', 'Smiley', 'SpecialChar', 'PageBreak', 'Iframe']}, + '/', + {'name': 'styles', 'items': ['FontSize']}, + {'name': 'colors', 'items': ['TextColor', 'BGColor']}, + {'name': 'tools', 'items': ['Maximize', 'ShowBlocks']}, + # {'name': 'about', 'items': ['About']}, + '/', # put this to force next toolbar on new line + # {'name': 'yourcustomtools', 'items': [ + # # put the name of your editor.ui.addButton here + # 'Preview', + # 'Maximize', + # + # ]}, + ], + + 'tabSpaces': 4, + 'removePlugins': 'stylesheetparser', + # 'extraPlugins': ','.join([ + # 'uploadimage', # the upload image feature + # # your extra plugins here + # 'div', + # 'autolink', + # 'autoembed', + # 'embedsemantic', + # 'autogrow', + # # 'devtools', + # 'widget', + # 'lineutils', + # 'clipboard', + # 'dialog', + # 'dialogui', + # 'elementspath' + # ]), + +} + + +try: + from tEDataProj import db_local_sets + DATABASES = db_local_sets.DATABASES +except ImportError as e: + pass + +# global prod_server +try: + from settings_local import * + prod_server = True +except ImportError: + prod_server = False \ No newline at end of file diff --git a/FirePlayProj/urls.py b/FirePlayProj/urls.py new file mode 100644 index 0000000..8566b3c --- /dev/null +++ b/FirePlayProj/urls.py @@ -0,0 +1,27 @@ +""" +URL configuration for FirePlayProj project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/4.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" + +from django.contrib import admin +from django.urls import path, include +from django.conf.urls.static import static +from django.conf import settings + +urlpatterns = [ + path('admin/', admin.site.urls), + path('ckeditor/', include('ckeditor_uploader.urls')), +] +urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/FirePlayProj/wsgi.py b/FirePlayProj/wsgi.py new file mode 100644 index 0000000..4d7800e --- /dev/null +++ b/FirePlayProj/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for FirePlayProj project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'FirePlayProj.settings') + +application = get_wsgi_application() diff --git a/GameApp/__init__.py b/GameApp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/GameApp/admin.py b/GameApp/admin.py new file mode 100644 index 0000000..c4467cf --- /dev/null +++ b/GameApp/admin.py @@ -0,0 +1,16 @@ +from django.contrib import admin +from BaseModels.admin_utils import Admin_BaseIconModel +from .models import * + +class Admin_Game(Admin_BaseIconModel): + pass +admin.site.register(Game, Admin_Game) + +class Admin_UserInGame(Admin_BaseIconModel): + pass +admin.site.register(UserInGame, Admin_UserInGame) + + +class Admin_QuestionInGameForUser(Admin_BaseIconModel): + pass +admin.site.register(QuestionInGameForUser, Admin_QuestionInGameForUser) \ No newline at end of file diff --git a/GameApp/apps.py b/GameApp/apps.py new file mode 100644 index 0000000..14baafe --- /dev/null +++ b/GameApp/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class GameappConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'GameApp' diff --git a/GameApp/migrations/0001_initial.py b/GameApp/migrations/0001_initial.py new file mode 100644 index 0000000..9499d5b --- /dev/null +++ b/GameApp/migrations/0001_initial.py @@ -0,0 +1,84 @@ +# Generated by Django 4.2.1 on 2023-05-16 14:01 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('QuestionsApp', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Game', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')), + ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')), + ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')), + ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')), + ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')), + ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')), + ('level', models.IntegerField(default=1, verbose_name='Уровень игры')), + ('status', models.CharField(default='waiting_users', max_length=100, verbose_name='Статус')), + ('time_for_waiting_users', models.IntegerField(default=15, verbose_name='Время ожидания пользователей (сек)')), + ('cur_lap', models.IntegerField(default=0, verbose_name='Текущий круг')), + ('comment', models.TextField(blank=True, null=True, verbose_name='Комментарий')), + ('winner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='rel_games_for_user', to=settings.AUTH_USER_MODEL, verbose_name='id пользователя')), + ], + options={ + 'verbose_name': 'Игра', + 'verbose_name_plural': 'Игры', + }, + ), + migrations.CreateModel( + name='UserInGame', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')), + ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')), + ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')), + ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')), + ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')), + ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')), + ('last_lap', models.IntegerField(default=0, verbose_name='Последний круг')), + ('status', models.CharField(default='waiting_users', max_length=100, verbose_name='Статус')), + ('game', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='rel_userInGame_for_game', to='GameApp.game', verbose_name='Игра')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='rel_userInGame_for_user', to=settings.AUTH_USER_MODEL, verbose_name='Игрок')), + ], + options={ + 'verbose_name': 'Игрок', + 'verbose_name_plural': 'Игроки', + }, + ), + migrations.CreateModel( + name='QuestionInGameForUser', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')), + ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')), + ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')), + ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')), + ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')), + ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')), + ('status', models.CharField(default='wait', max_length=100, verbose_name='Статус')), + ('answer_right', models.BooleanField(default=False, verbose_name='Верный ответ')), + ('use_time_for_answer', models.IntegerField(default=0, verbose_name='Потрачено времени на ответ (сек)')), + ('question', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='rel_questionInGame_for_question', to='QuestionsApp.question', verbose_name='Вопрос')), + ('user_in_game', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='rel_questionInGame_for_userInGame', to='GameApp.useringame', verbose_name='Игра')), + ], + options={ + 'verbose_name': 'Игрок', + 'verbose_name_plural': 'Игроки', + }, + ), + ] diff --git a/GameApp/migrations/0002_alter_questioningameforuser_options_and_more.py b/GameApp/migrations/0002_alter_questioningameforuser_options_and_more.py new file mode 100644 index 0000000..9d7645c --- /dev/null +++ b/GameApp/migrations/0002_alter_questioningameforuser_options_and_more.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.1 on 2023-05-16 14:07 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('GameApp', '0001_initial'), + ] + + operations = [ + migrations.AlterModelOptions( + name='questioningameforuser', + options={'verbose_name': 'Вопрос в игре', 'verbose_name_plural': 'Вопросы в игре'}, + ), + migrations.AlterModelOptions( + name='useringame', + options={'verbose_name': 'Пользователь в игре', 'verbose_name_plural': 'Пользователи в игре'}, + ), + ] diff --git a/GameApp/migrations/__init__.py b/GameApp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/GameApp/models.py b/GameApp/models.py new file mode 100644 index 0000000..4191233 --- /dev/null +++ b/GameApp/models.py @@ -0,0 +1,94 @@ +from django.db import models +from BaseModels.base_models import BaseModel +from django.utils.translation import gettext_lazy as _ +from AuthApp.models import User + +game_status_choices = ( + ('waiting_users', 'Ожидание пользователей'), + ('game', 'В процессе'), + ('finished', 'Завершена') +) + + +class Game(BaseModel): + level = models.IntegerField(verbose_name=_('Уровень игры'), default=1) + status = models.CharField(max_length=100, verbose_name=_('Статус'), default='waiting_users') + time_for_waiting_users = models.IntegerField(verbose_name=_('Время ожидания пользователей (сек)'), default=15) + cur_lap = models.IntegerField(verbose_name=_('Текущий круг'), default=0) + + winner = models.OneToOneField(User, verbose_name=_(u'id пользователя'), related_name='rel_games_for_user', + null=True, blank=True, on_delete=models.CASCADE) + + comment = models.TextField(verbose_name=_('Комментарий'), null=True, blank=True) + + def __str__(self): + if self.name: + return f'{self.name}' + else: + return str(self.id) + + + class Meta: + + verbose_name = _('Игра') + verbose_name_plural = _('Игры') + # ordering = ('user__last_name', 'user__first_name') + + +user_in_game_status_choices = ( + ('waiting_users', 'Ожидание пользователей'), + ('in_game', 'В игре'), + ('lose', 'Выбыл'), + ('finish', 'Завершил игру') +) + +class UserInGame(BaseModel): + game = models.OneToOneField( + Game, verbose_name=_('Игра'), related_name='rel_userInGame_for_game', on_delete=models.CASCADE) + user = models.OneToOneField( + User, verbose_name=_('Игрок'), related_name='rel_userInGame_for_user', on_delete=models.CASCADE) + + last_lap = models.IntegerField(verbose_name=_('Последний круг'), default=0) + + status = models.CharField(max_length=100, verbose_name=_('Статус'), default='waiting_users') + + def __str__(self): + if self.name: + return f'{self.name}' + else: + return str(self.id) + + + class Meta: + verbose_name = _('Пользователь в игре') + verbose_name_plural = _('Пользователи в игре') + # ordering = ('question') + + +question_in_game_status_choices = ( + ('wait', 'Ожидание ответа'), + ('answered', 'Ответил'), +) + +class QuestionInGameForUser(BaseModel): + from QuestionsApp.models import Question + user_in_game = models.OneToOneField( + UserInGame, verbose_name=_('Игра'), related_name='rel_questionInGame_for_userInGame', on_delete=models.CASCADE) + question = models.OneToOneField( + Question, verbose_name=_('Вопрос'), related_name='rel_questionInGame_for_question', on_delete=models.CASCADE) + + status = models.CharField(max_length=100, verbose_name=_('Статус'), default='wait') + answer_right = models.BooleanField(verbose_name=_('Верный ответ'), default=False) + use_time_for_answer = models.IntegerField(verbose_name=_('Потрачено времени на ответ (сек)'), default=0) + + def __str__(self): + if self.name: + return f'{self.name}' + else: + return str(self.id) + + + class Meta: + verbose_name = _('Вопрос в игре') + verbose_name_plural = _('Вопросы в игре') + # ordering = ('question') \ No newline at end of file diff --git a/GameApp/tests.py b/GameApp/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/GameApp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/GameApp/views.py b/GameApp/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/GameApp/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/QuestionsApp/__init__.py b/QuestionsApp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/QuestionsApp/admin.py b/QuestionsApp/admin.py new file mode 100644 index 0000000..1f124ec --- /dev/null +++ b/QuestionsApp/admin.py @@ -0,0 +1,11 @@ +from django.contrib import admin +from BaseModels.admin_utils import Admin_BaseIconModel +from .models import * + +class Admin_Question(Admin_BaseIconModel): + pass +admin.site.register(Question, Admin_Question) + +class Admin_Answer(Admin_BaseIconModel): + pass +admin.site.register(Answer, Admin_Answer) \ No newline at end of file diff --git a/QuestionsApp/apps.py b/QuestionsApp/apps.py new file mode 100644 index 0000000..56c7dfd --- /dev/null +++ b/QuestionsApp/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class QuestionsappConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'QuestionsApp' diff --git a/QuestionsApp/migrations/0001_initial.py b/QuestionsApp/migrations/0001_initial.py new file mode 100644 index 0000000..dfaa6f8 --- /dev/null +++ b/QuestionsApp/migrations/0001_initial.py @@ -0,0 +1,58 @@ +# Generated by Django 4.2.1 on 2023-05-16 14:01 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Question', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')), + ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')), + ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')), + ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')), + ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')), + ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')), + ('game_level', models.IntegerField(default=1, verbose_name='Уровень игры')), + ('time_for_answer', models.IntegerField(default=7, verbose_name='Время на ответ (сек)')), + ('used_count', models.IntegerField(default=0, verbose_name='Количество использования')), + ('comment', models.TextField(blank=True, null=True, verbose_name='Комментарий')), + ], + options={ + 'verbose_name': 'Вопрос', + 'verbose_name_plural': 'Вопросы', + 'permissions': (), + }, + ), + migrations.CreateModel( + name='Answer', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')), + ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')), + ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')), + ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')), + ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')), + ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')), + ('right_answer', models.BooleanField(default=False, verbose_name='Правильный')), + ('comment', models.TextField(blank=True, null=True, verbose_name='Комментарий')), + ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rel_answers_for_question', to='QuestionsApp.question', verbose_name='Вопрос')), + ], + options={ + 'verbose_name': 'Ответ', + 'verbose_name_plural': 'Ответы', + 'ordering': ('question',), + }, + ), + ] diff --git a/QuestionsApp/migrations/__init__.py b/QuestionsApp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/QuestionsApp/models.py b/QuestionsApp/models.py new file mode 100644 index 0000000..8a326a6 --- /dev/null +++ b/QuestionsApp/models.py @@ -0,0 +1,45 @@ +from django.db import models +from BaseModels.base_models import BaseModel +from django.utils.translation import gettext_lazy as _ + +class Question(BaseModel): + + game_level = models.IntegerField(verbose_name=_('Уровень игры'), default=1) + time_for_answer = models.IntegerField(verbose_name=_('Время на ответ (сек)'), default=7) + used_count = models.IntegerField(verbose_name=_('Количество использования'), default=0) + comment = models.TextField(verbose_name=_('Комментарий'), null=True, blank=True) + + def __str__(self): + if self.name: + return f'{self.name}' + else: + return str(self.id) + + + class Meta: + permissions = ( + + ) + + verbose_name = _('Вопрос') + verbose_name_plural = _('Вопросы') + # ordering = ('user__last_name', 'user__first_name') + + +class Answer(BaseModel): + question = models.ForeignKey( + Question, verbose_name=_('Вопрос'), related_name='rel_answers_for_question', on_delete=models.CASCADE) + right_answer = models.BooleanField(verbose_name=_('Правильный'), default=False) + comment = models.TextField(verbose_name=_('Комментарий'), null=True, blank=True) + + def __str__(self): + if self.name: + return f'{self.name}' + else: + return str(self.id) + + + class Meta: + verbose_name = _('Ответ') + verbose_name_plural = _('Ответы') + ordering = ('question',) \ No newline at end of file diff --git a/QuestionsApp/tests.py b/QuestionsApp/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/QuestionsApp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/QuestionsApp/views.py b/QuestionsApp/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/QuestionsApp/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/files_widget/__init__.py b/files_widget/__init__.py new file mode 100644 index 0000000..93c01d9 --- /dev/null +++ b/files_widget/__init__.py @@ -0,0 +1 @@ +from .fields import FileField, FilesField, ImageField, ImagesField diff --git a/files_widget/admin.py b/files_widget/admin.py new file mode 100644 index 0000000..f15ff8e --- /dev/null +++ b/files_widget/admin.py @@ -0,0 +1,21 @@ +from django.contrib import admin + +from .models import IconSet, FileIcon +from .conf import * + +# currently not used +class MyModelAdmin(admin.ModelAdmin): + def get_urls(self): + urls = super(MyModelAdmin, self).get_urls() + my_urls = patterns('', + (r'^my_view/$', self.my_view) + ) + return my_urls + urls + + def my_view(self, request): + # custom view which should return an HttpResponse + pass + + +#admin.site.register(IconSet) +#admin.site.register(FileIcon) diff --git a/files_widget/conf.py b/files_widget/conf.py new file mode 100644 index 0000000..5ed1310 --- /dev/null +++ b/files_widget/conf.py @@ -0,0 +1,28 @@ +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured + +MEDIA_URL = getattr(settings, 'MEDIA_URL') +MEDIA_ROOT = getattr(settings, 'MEDIA_ROOT') +TEMP_DIR = getattr(settings, 'FILES_WIDGET_TEMP_DIR', 'temp/uploads/') +TEMP_DIR_FORMAT = getattr(settings, 'FILES_WIDGET_TEMP_DIR_FORMAT', '%4d-%02d-%02d-%02d-%02d') +FILES_DIR = getattr(settings, 'FILES_WIDGET_FILES_DIR', 'uploads/from_admin/') +OLD_VALUE_STR = getattr(settings, 'FILES_WIDGET_OLD_VALUE_STR', 'old_%s_value') +DELETED_VALUE_STR = getattr(settings, 'FILES_WIDGET_DELETED_VALUE_STR', 'deleted_%s_value') +MOVED_VALUE_STR = getattr(settings, 'FILES_WIDGET_MOVED_VALUE_STR', 'moved_%s_value') +JQUERY_PATH = getattr(settings, 'FILES_WIDGET_JQUERY_PATH', '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js') +JQUERY_UI_PATH = getattr(settings, 'FILES_WIDGET_JQUERY_UI_PATH', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js') +USE_FILEBROWSER = getattr(settings, 'FILES_WIDGET_USE_FILEBROWSER', False) +FILEBROWSER_JS_PATH = getattr(settings, 'FILES_WIDGET_FILEBROWSER_JS_PATH', 'filebrowser/js/AddFileBrowser.js') +ADD_IMAGE_BY_URL = getattr(settings, 'FILES_WIDGET_ADD_IMAGE_BY_URL', True) +MAX_FILESIZE = getattr(settings, 'FILES_WIDGET_MAX_FILESIZE', 0) +FILE_TYPES = getattr(settings, 'FILES_WIDGET_FILE_TYPES', None) +USE_TRASH = getattr(settings, 'FILES_WIDGET_USE_TRASH', False) +TRASH_DIR = getattr(settings, 'FILES_WIDGET_TRASH_DIR', 'uploads/trash/files_widget/') + +if not len(MEDIA_URL) or not len(MEDIA_ROOT) or not len(TEMP_DIR) or not len(FILES_DIR): + raise ImproperlyConfigured('MEDIA_URL, MEDIA_ROOT, FILES_WIDGET_TEMP_DIR and FILES_WIDGET_FILES_DIR must not be empty') +if TEMP_DIR == FILES_DIR: + raise ImproperlyConfigured('FILES_WIDGET_TEMP_DIR and FILES_WIDGET_FILES_DIR must be different') + +if not MEDIA_ROOT.endswith('/'): + MEDIA_ROOT += '/' diff --git a/files_widget/controllers.py b/files_widget/controllers.py new file mode 100644 index 0000000..503779d --- /dev/null +++ b/files_widget/controllers.py @@ -0,0 +1,292 @@ +import re +from six.moves import urllib +import os, os.path +from datetime import datetime + +from django.conf import settings +import six +from django.utils.safestring import mark_safe + +from .utils import curry + +from django.core.files.images import ImageFile +from django.core.files.storage import get_storage_class +from django.contrib.staticfiles import finders + +from sorl.thumbnail import get_thumbnail + +from .conf import * + + +class FilePath(six.text_type): + def __new__(cls, str, instance=None, field=None, settings={}): + self = super(FilePath, cls).__new__(cls, str.strip()) + self._instance = instance + self._field = field + self._exists = None + self._size = None + self._accessed_time = None + self._created_time = None + self._modified_time = None + self._thumbnails = {} + self.settings = { + 'img_attrs': {}, + 'thumbnail_size': None, + 'thumbnail_attrs': {}, + } + self.settings.update(settings) + return self + + def _html_attrs(self, **kwargs): + attrs = {} + attrs.update(kwargs) + if 'css_class' in attrs: + attrs['class'] = attrs['css_class'] + del attrs['css_class'] + return attrs + + @property + def unescaped(self): + return urllib.parse.unquote(self) + + @property + def escaped(self): + return urllib.parse.quote(self.unescaped) + + @property + def url(self): + if not self.startswith('/') and self.find('//') == -1: + return os.path.join(MEDIA_URL, self.escaped) + return self.escaped + + @property + def local_path(self): + if not self.startswith('/') and self.find('//') == -1: + return os.path.join(MEDIA_ROOT, urllib.parse.unquote(self)) + return self + + def _get_local_path_or_file(self): + # if file is in static instead of media directory, sorl raises + # a suspicious operation error. So we open it safely without errors. + + if self.startswith('/'): + if self.startswith('/static/'): + path = self.replace('/static/', '') + elif self.startswith(settings.STATIC_URL): + path = self.replace(settings.STATIC_URL, '') + else: + return self.local_path + else: + return self.local_path + + path = finders.find(urllib.parse.unquote(path)) + image = ImageFile(open(path, 'r')) + return image + + @property + def filename(self): + return urllib.parse.unquote(re.sub(r'^.+\/', '', self)) + + @property + def display_name(self): + without_extension = re.sub(r'\.[\w\d]+$', '', self.filename) + with_spaces = re.sub(r'_', ' ', without_extension) + return with_spaces + + @property + def ext(self): + return re.sub(r'^.+\.', '', self.filename) + + def exists(self): + if self._exists == None: + self._exists = os.path.exists(self.local_path) + return self._exists + + def get_size(self): + if self._size == None: + self._size = os.path.getsize(self.local_path) + return self._size + + def get_accessed_time(self): + if self._accessed_time == None: + self._accessed_time = datetime.fromtimestamp(os.path.getatime(self.local_path)) + return self._accessed_time + + def get_created_time(self): + if self._created_time == None: + self._created_time = datetime.fromtimestamp(os.path.getctime(self.local_path)) + return self._created_time + + def get_modified_time(self): + if self._modified_time == None: + self._modified_time = datetime.fromtimestamp(os.path.getmtime(self.local_path)) + return self._modified_time + + +class ImagePath(FilePath): + def img_tag(self, **kwargs): + attrs = {} + attrs.update(self.settings['img_attrs']) + attrs.update(kwargs) + attrs = self._html_attrs(**attrs) + attrs_str = ''.join([ + u'%s="%s" ' % (key, value) + for key, value in attrs.items() + ]) + return mark_safe(u'' % (self.url, attrs_str)) + + def _thumbnail_file_format(self): + if self.ext.lower() in ['gif', 'png']: + return 'PNG' + return 'JPEG' + + def thumbnail(self, size=None, **kwargs): + size = size or self.settings['thumbnail_size'] + if not size: + raise Exception('No thumbnail size supplied') + + attrs = { + 'format': self._thumbnail_file_format(), + 'upscale': False, + } + attrs.update(self.settings['thumbnail_attrs']) + attrs.update(kwargs) + + all_attrs = { 'size': size } + all_attrs.update(attrs) + key = hash(frozenset(all_attrs)) + + if not key in self._thumbnails: + #self._thumbnails[key] = get_thumbnail(self._get_local_path_or_file(), size, **attrs) + self._thumbnails[key] = get_thumbnail(self.local_path, size, **attrs) + + return self._thumbnails[key] + + def thumbnail_tag(self, size, opts={}, **kwargs): + try: + thumbnail = self.thumbnail(size, **opts) + except EnvironmentError as e: + if settings.THUMBNAIL_DEBUG: + raise e + return '' + + src = ImagePath(thumbnail.url, self._instance, self._field) + attrs = { 'width': thumbnail.width, 'height': thumbnail.height } + attrs.update(self.settings['img_attrs']) + attrs.update(kwargs) + return src.img_tag(**attrs) + + def __getattr__(self, attr): + thumbnail_mxn = re.match(r'^thumbnail_(tag_)?(\d*x?\d+)$', attr) + if thumbnail_mxn: + tag = thumbnail_mxn.group(1) == 'tag_' + size = thumbnail_mxn.group(2) + if tag: + return curry(self.thumbnail_tag, size) + else: + return curry(self.thumbnail, size) + + raise AttributeError + + +class FilePaths(six.text_type): + item_class = FilePath + + def __new__(cls, str, instance=None, field=None, settings={}): + self = super(FilePaths, cls).__new__(cls, str) + self._instance = instance + self._field = field + self._all = None + self._length = None + self._current = 0 + self.settings = { + 'img_attrs': {}, + 'thumbnail_size': None, + 'thumbnail_attrs': {}, + } + self.settings.update(settings) + return self + + def all(self): + if self._all == None: + self._all = [] + for f in self.splitlines(): + self._all.append(self._field.attr_class.item_class(f, self._instance, self._field, self.settings)) + + self._length = len(self._all) + + return self._all + + def count(self): + self.all() + return self._length + + def first(self): + return self.all() and self.all()[0] or None + + def last(self): + return self.all() and self.all()[-1] or None + + def next(self): + f = self.all()[self._current] + self._current += 1 + return f + + def next_n(self, n): + files = self.all()[self._current:self._current+n] + self._current += n + return files + + def next_all(self): + files = self.all()[self._current:] + self._current = self._length - 1 + return files + + def has_next(self): + self.all() + return max(0, self._length - self._current - 1) + + def reset(self): + self._current = 0 + + def __getattr__(self, attr): + next_n = re.match(r'^next_(\d+)$', attr) + if next_n: + n = int(next_n.group(1)) + return curry(self.next_n, n) + + raise AttributeError + + +class ImagePaths(FilePaths): + item_class = ImagePath + + def as_gallery(self): + raise NotImplementedError + + def as_carousel(self): + raise NotImplementedError + + +class FilesDescriptor(object): + """ + Used django.db.models.fields.files.FileDescriptor as an example. + This descriptor returns an unicode object, with special methods + for formatting like filename(), absolute(), relative() and img_tag(). + """ + def __init__(self, field): + self.field = field + + def __get__(self, instance=None, owner=None): + if instance is None: + return self + + files = instance.__dict__[self.field.name] + if isinstance(files, six.string_types) and not isinstance(files, (FilePath, FilePaths)): + attr = self.field.attr_class(files, instance, self.field) + instance.__dict__[self.field.name] = attr + + return instance.__dict__[self.field.name] + + def __set__(self, instance, value): + instance.__dict__[self.field.name] = value diff --git a/files_widget/fields.py b/files_widget/fields.py new file mode 100644 index 0000000..d8cca0a --- /dev/null +++ b/files_widget/fields.py @@ -0,0 +1,104 @@ +import os + +from django.db import models +from django import forms +from django.core import exceptions, validators +from django.utils.translation import ugettext_lazy as _ +from django.db.models.signals import post_save +from django.dispatch import receiver + +from .forms import FilesFormField, BaseFilesWidget, FileWidget, FilesWidget, ImageWidget, ImagesWidget +from .files import manage_files_on_disk +from . import controllers +from .conf import * + + +def formfield_defaults(self, default_widget=None, widget=None, form_class=FilesFormField, required=True, **kwargs): + if not isinstance(widget, BaseFilesWidget): + widget = default_widget + + defaults = { + 'form_class': FilesFormField, + 'fields': (forms.CharField(required=required), forms.CharField(required=False), forms.CharField(required=False), ), + 'widget': widget, + } + defaults.update(kwargs) + + return defaults + +def save_all_data(self, instance, data): + # Save old data to know which images are deleted. + # We don't know yet if the form will really be saved. + old_data = getattr(instance, self.name) + setattr(instance, OLD_VALUE_STR % self.name, old_data) + setattr(instance, DELETED_VALUE_STR % self.name, data.deleted_files) + setattr(instance, MOVED_VALUE_STR % self.name, data.moved_files) + + +class FileField(models.CharField): + description = _("File") + attr_class = controllers.FilePath + + def __init__(self, *args, **kwargs): + if 'max_length' not in kwargs: + kwargs['max_length'] = 200 + super(FileField, self).__init__(*args, **kwargs) + + def contribute_to_class(self, cls, name): + super(FileField, self).contribute_to_class(cls, name) + receiver(post_save, sender=cls)(manage_files_on_disk) + setattr(cls, self.name, controllers.FilesDescriptor(self)) + + def save_form_data(self, instance, data): + save_all_data(self, instance, data) + super(FileField, self).save_form_data(instance, data) + + def formfield(self, default_widget=FileWidget(), **kwargs): + defaults = formfield_defaults(self, default_widget, **kwargs) + return super(FileField, self).formfield(**defaults) + + +class FilesField(models.TextField): + description = _("Files") + attr_class = controllers.FilePaths + + def contribute_to_class(self, cls, name): + super(FilesField, self).contribute_to_class(cls, name) + receiver(post_save, sender=cls)(manage_files_on_disk) + setattr(cls, self.name, controllers.FilesDescriptor(self)) + + def save_form_data(self, instance, data): + save_all_data(self, instance, data) + super(FilesField, self).save_form_data(instance, data) + + def formfield(self, default_widget=FilesWidget(), **kwargs): + defaults = formfield_defaults(self, default_widget, **kwargs) + return super(FilesField, self).formfield(**defaults) + + +class ImageField(FileField): + description = _("Image") + attr_class = controllers.ImagePath + + def formfield(self, default_widget=ImageWidget(), **kwargs): + defaults = formfield_defaults(self, default_widget, **kwargs) + return super(ImageField, self).formfield(**defaults) + + +class ImagesField(FilesField): + description = _("Images") + attr_class = controllers.ImagePaths + + def formfield(self, default_widget=ImagesWidget(), **kwargs): + defaults = formfield_defaults(self, default_widget, **kwargs) + return super(ImagesField, self).formfield(**defaults) + + +try: + from south.modelsinspector import add_introspection_rules + add_introspection_rules([], ["^topnotchdev\.files_widget\.fields\.FileField"]) + add_introspection_rules([], ["^topnotchdev\.files_widget\.fields\.FilesField"]) + add_introspection_rules([], ["^topnotchdev\.files_widget\.fields\.ImageField"]) + add_introspection_rules([], ["^topnotchdev\.files_widget\.fields\.ImagesField"]) +except ImportError: + pass diff --git a/files_widget/files.py b/files_widget/files.py new file mode 100644 index 0000000..d3452ec --- /dev/null +++ b/files_widget/files.py @@ -0,0 +1,209 @@ +import os, os.path +from io import FileIO, BufferedWriter +import re +import time + +from django.conf import settings +from django.core.files.storage import default_storage +from django.utils.translation import ugettext_lazy as _ +from django.template.defaultfilters import slugify + +from .conf import * + + +def is_file_image(path): + + try: + from PIL import Image + im = Image.open(path) + im.verify() + return True + except Exception as e: + return False + +def filename_from_path(path): + return re.sub(r'^.+/', '', path) + +def model_slug(model): + return slugify(model._meta.verbose_name_plural) + +def construct_temp_path(user): + now = time.localtime()[0:5] + dir_name = TEMP_DIR_FORMAT % now + return os.path.join(TEMP_DIR, dir_name, str(user.pk)) + +def construct_permanent_path(instance): + model_dir = model_slug(type(instance)) + return os.path.join(FILES_DIR, model_dir, str(instance.pk)) + +def in_directory(path, directory): + # don't try to manipulate with ../../ + full_path = os.path.join(MEDIA_ROOT, path) + return path.startswith(directory) and full_path == os.path.realpath(full_path) + +def in_permanent_directory(path, instance): + full_path = os.path.join(MEDIA_ROOT, path) + return path.startswith(construct_permanent_path(instance)) and full_path == os.path.realpath(full_path) + +def make_temp_directory(filename, user, short=False): + if not short: + public_dir = construct_temp_path(user) + else: + public_dir = f'{TEMP_DIR}' + full_dir = os.path.join(settings.MEDIA_ROOT, public_dir) + + try: + if not os.path.exists(full_dir): + os.makedirs(full_dir) + except EnvironmentError: + # deepest dir already exists + pass + + full_path = os.path.join(full_dir, filename) + available_full_path = default_storage.get_available_name(full_path) + return available_full_path + +def make_permanent_directory(temp_path, instance): + public_dir = construct_permanent_path(instance) + filename = filename_from_path(temp_path) + full_dir = os.path.join(MEDIA_ROOT, public_dir) + + if not os.path.exists(full_dir): + os.makedirs(full_dir) + + full_path = os.path.join(full_dir, filename) + available_full_path = default_storage.get_available_name(full_path) + return available_full_path + +def save_upload(uploaded, filename, raw_data, user): + ''' + raw_data: if True, uploaded is an HttpRequest object with the file being + the raw post data + if False, uploaded has been submitted via the basic form + submission and is a regular Django UploadedFile in request.FILES + ''' + + path = make_temp_directory(filename, user, short=True) + public_path = path.replace(MEDIA_ROOT, '', 1) + + #try: + with BufferedWriter(FileIO(path, "wb")) as dest: + # if the "advanced" upload, read directly from the HTTP request + # with the Django 1.3 functionality + if raw_data: + foo = uploaded.read(1024) + while foo: + dest.write(foo) + foo = uploaded.read(1024) + # if not raw, it was a form upload so read in the normal Django chunks fashion + else: + for c in uploaded.chunks(): + dest.write(c) + # got through saving the upload, report success + return public_path + #except IOError: + # could not open the file most likely + # pass + return False + +def try_to_recover_path(temp_path, instance): + filename = filename_from_path(temp_path) + permanent_directory = construct_permanent_path(instance) + permanent_path = os.path.join(permanent_directory, filename) + full_path = os.path.join(MEDIA_ROOT, permanent_path) + if os.path.exists(full_path): + return permanent_path, True + else: + return temp_path, False + +def move_to_permanent_directory(temp_path, instance): + if temp_path.startswith('/') or temp_path.find('//') != -1 \ + or in_permanent_directory(temp_path, instance): + return temp_path, False + + full_path = make_permanent_directory(temp_path, instance) + public_path = full_path.replace(MEDIA_ROOT, '', 1) + full_temp_path = os.path.join(MEDIA_ROOT, temp_path) + try: + os.link(full_temp_path, full_path) + except EnvironmentError: + return try_to_recover_path(temp_path, instance) + + if in_directory(temp_path, TEMP_DIR): + try: + os.remove(full_temp_path) + except EnvironmentError: + return try_to_recover_path(temp_path, instance) + + return public_path, True + +def manage_files_on_disk(sender, instance, **kwargs): + # Receiver of Django post_save signal. + # At this point we know that the model instance has been saved into the db. + from .fields import ImagesField, ImageField, FilesField, FileField + fields = [field for field in sender._meta.fields if type(field) in [ImagesField, ImageField, FilesField, FileField]] + + for field in fields: + old_value_attr = OLD_VALUE_STR % field.name + deleted_value_attr = DELETED_VALUE_STR % field.name + moved_value_attr = MOVED_VALUE_STR % field.name + if not hasattr(instance, old_value_attr): + continue + + old_images = (getattr(instance, old_value_attr) or '').splitlines() + current_images = (getattr(instance, field.name) or '').splitlines() + deleted_images = (getattr(instance, deleted_value_attr) or '').splitlines() + moved_images = (getattr(instance, moved_value_attr) or '').splitlines() + new_images = [] + changed = False + + # Delete removed images from disk if they are in our FILES_DIR. + # we implement redundant checks to be absolutely sure that + # files must be deleted. For example, if a JS error leads to + # incorrect file lists in the hidden inputs, we reconstruct the old value. + # + # O = old_images, C = current_images, D = deleted_images + # + # what do we do with files that appear in: + # + # --- (OK) do nothing, we don't even know it's name :) + # --D (OK) if in temp dir or permanent dir of inst: delete from disk + # -C- (OK) if not in permanent dir of inst, create hard link if possible; + # if in temp dir, delete + # -CD (ERROR) show warning message after save + # O-- (ERROR) put back in current, show warning message after save + # O-D (OK) if in temp dir or permanent dir of inst: delete from disk + # OC- (OK) if not in permanent dir of inst, create hard link if possible; + # if in temp dir, delete + # OCD (ERROR) show warning message after save + + for img in current_images: + # OC-, -C-, OCD & -CD + new_path = img + if in_directory(img, TEMP_DIR) or in_directory(img, FILES_DIR): + new_path, path_changed = move_to_permanent_directory(img, instance) + if path_changed: + changed = True + new_images.append(new_path) + + for img in deleted_images: + if img not in current_images: + # --D & O-D + if in_permanent_directory(img, instance) or in_directory(img, TEMP_DIR): + try: + os.remove(os.path.join(MEDIA_ROOT, img)) + except EnvironmentError as e: + pass + + for img in old_images: + if img not in current_images and img not in deleted_images and img not in moved_images: + # O-- + changed = True + new_images.append(img) + + delattr(instance, old_value_attr) + delattr(instance, deleted_value_attr) + delattr(instance, moved_value_attr) + if changed: + setattr(instance, field.name, '\n'.join(new_images)) + instance.save() diff --git a/files_widget/forms/__init__.py b/files_widget/forms/__init__.py new file mode 100644 index 0000000..2f76c29 --- /dev/null +++ b/files_widget/forms/__init__.py @@ -0,0 +1,2 @@ +from .fields import * +from .widgets import * diff --git a/files_widget/forms/fields.py b/files_widget/forms/fields.py new file mode 100644 index 0000000..f7a4aba --- /dev/null +++ b/files_widget/forms/fields.py @@ -0,0 +1,62 @@ +from django import forms +from django.core import exceptions, validators +from django.utils.translation import ugettext_lazy as _ +import six + +from files_widget.conf import * + + +class UnicodeWithAttr(six.text_type): + deleted_files = None + moved_files = None + +class FilesFormField(forms.MultiValueField): + def __init__(self, max_length=None, **kwargs): + super(FilesFormField, self).__init__(**kwargs) + + def compress(self, data_list): + files = UnicodeWithAttr(data_list[0]) + files.deleted_files = data_list[1] + files.moved_files = data_list[2] + return files + + def clean(self, value): + """ + This is a copy of MultiValueField.clean() with a BUGFIX: + - if self.required and field_value in validators.EMPTY_VALUES: + + if field.required and field_value in validators.EMPTY_VALUES: + """ + from django.forms.utils import ErrorList + from django.core.exceptions import ValidationError + + clean_data = [] + errors = ErrorList() + if not value or isinstance(value, (list, tuple)): + if not value or not [v for v in value if v not in validators.EMPTY_VALUES]: + if self.required: + raise ValidationError(self.error_messages['required']) + else: + return self.compress(value) + else: + raise ValidationError(self.error_messages['invalid']) + for i, field in enumerate(self.fields): + try: + field_value = value[i] + except IndexError: + field_value = None + if field.required and field_value in validators.EMPTY_VALUES: + raise ValidationError(self.error_messages['required']) + try: + clean_data.append(field.clean(field_value)) + except ValidationError as e: + # Collect all validation errors in a single list, which we'll + # raise at the end of clean(), rather than raising a single + # exception for the first error we encounter. + errors.extend(e.messages) + if errors: + raise ValidationError(errors) + + out = self.compress(clean_data) + self.validate(out) + self.run_validators(out) + return out diff --git a/files_widget/forms/widgets.py b/files_widget/forms/widgets.py new file mode 100644 index 0000000..c12527f --- /dev/null +++ b/files_widget/forms/widgets.py @@ -0,0 +1,100 @@ +from django import forms +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ + +from files_widget.conf import * + + +def use_filebrowser(): + if USE_FILEBROWSER: + try: + import filebrowser + return True + except: + try: + import filebrowser_safe + return True + except: + pass + pass + return False + +TO_HIDE_ATTRS = {'class': 'hidden'} +class BaseFilesWidget(forms.MultiWidget): + def __init__(self, + multiple=False, + preview_size=150, + template="files_widget/files_widget.html", + widgets=(forms.HiddenInput, + forms.HiddenInput, + forms.HiddenInput), + **kwargs): + super(BaseFilesWidget, self).__init__(widgets, **kwargs) + self.multiple = multiple + self.preview_size = preview_size + self.template = template + + class Media: + js = [ + JQUERY_PATH, + JQUERY_UI_PATH, + 'files_widget/js/jquery.iframe-transport.js', + 'files_widget/js/jquery.fileupload.js', + 'files_widget/js/widgets.js', + ] + if use_filebrowser(): + js.append(FILEBROWSER_JS_PATH) + + css = { + 'all': ( + 'files_widget/css/widgets.css', + ), + } + + @property + def is_hidden(self): + return False + + def decompress(self, value): + if value: + return [value, '', '', ] + return ['', '', '', ] + + def render(self, name, value, attrs=None, renderer=None): + if not isinstance(value, list): + value = self.decompress(value) + files, deleted_files, moved_files = value + + context = { + 'MEDIA_URL': settings.MEDIA_URL, + 'STATIC_URL': settings.STATIC_URL, + 'use_filebrowser': use_filebrowser(), + 'add_image_by_url': ADD_IMAGE_BY_URL, + 'input_string': super(BaseFilesWidget, self).render(name, value, attrs, renderer), + 'name': name, + 'files': files, + 'deleted_files': deleted_files, + 'multiple': self.multiple and 1 or 0, + 'preview_size': str(self.preview_size), + } + return renderer.render(self.template, context) + + +class FileWidget(BaseFilesWidget): + def __init__(self, multiple=False, preview_size=128, **kwargs): + super(FileWidget, self).__init__(multiple, preview_size, template="files_widget/files_widget.html", **kwargs) + + +class FilesWidget(BaseFilesWidget): + def __init__(self, multiple=True, preview_size=64, **kwargs): + super(FilesWidget, self).__init__(multiple, preview_size, template="files_widget/files_widget.html", **kwargs) + + +class ImageWidget(BaseFilesWidget): + def __init__(self, multiple=False, preview_size=250, **kwargs): + super(ImageWidget, self).__init__(multiple, preview_size, template="files_widget/images_widget.html", **kwargs) + + +class ImagesWidget(BaseFilesWidget): + def __init__(self, multiple=True, preview_size=150, **kwargs): + super(ImagesWidget, self).__init__(multiple, preview_size, template="files_widget/images_widget.html", **kwargs) diff --git a/files_widget/locale/ko/LC_MESSAGES/django.po b/files_widget/locale/ko/LC_MESSAGES/django.po new file mode 100644 index 0000000..b913fac --- /dev/null +++ b/files_widget/locale/ko/LC_MESSAGES/django.po @@ -0,0 +1,64 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-10-10 08:53+0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: files_widget/fields.py:39 +msgid "File" +msgstr "" + +#: files_widget/fields.py:60 +msgid "Files" +msgstr "" + +#: files_widget/fields.py:78 +msgid "Image" +msgstr "" + +#: files_widget/fields.py:87 +msgid "Images" +msgstr "" + +#: files_widget/templates/files_widget/files_widget.html:3 +msgid "undo" +msgstr "" + +#: files_widget/templates/files_widget/files_widget.html:6 +msgid "Drop multiple images here to upload" +msgstr "" + +#: files_widget/templates/files_widget/files_widget.html:8 +msgid "Drop an image here to upload" +msgstr "" + +#: files_widget/templates/files_widget/files_widget.html:32 +msgid "Upload" +msgstr "" + +#: files_widget/templates/files_widget/files_widget.html:37 +msgid "Library" +msgstr "" + +#: files_widget/templates/files_widget/files_widget.html:41 +#: files_widget/templates/files_widget/files_widget.html:43 +msgid "Add by url..." +msgstr "" + +#: files_widget/templates/files_widget/files_widget.html:60 +msgid "Images to be removed" +msgstr "" diff --git a/files_widget/locale/zh_Hans/LC_MESSAGES/django.po b/files_widget/locale/zh_Hans/LC_MESSAGES/django.po new file mode 100644 index 0000000..5a25dbf --- /dev/null +++ b/files_widget/locale/zh_Hans/LC_MESSAGES/django.po @@ -0,0 +1,65 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-10-10 08:51+0800\n" +"PO-Revision-Date: 2018-10-10 08:58+0806\n" +"Last-Translator: b' '\n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Translated-Using: django-rosetta 0.9.0\n" + +#: files_widget/fields.py:39 +msgid "File" +msgstr "文件" + +#: files_widget/fields.py:60 +msgid "Files" +msgstr "文件" + +#: files_widget/fields.py:78 +msgid "Image" +msgstr "图片" + +#: files_widget/fields.py:87 +msgid "Images" +msgstr "图片" + +#: files_widget/templates/files_widget/files_widget.html:3 +msgid "undo" +msgstr "撤销" + +#: files_widget/templates/files_widget/files_widget.html:6 +msgid "Drop multiple images here to upload" +msgstr "拖动多个图片文件来上传" + +#: files_widget/templates/files_widget/files_widget.html:8 +msgid "Drop an image here to upload" +msgstr "拖动一个图片文件来上传" + +#: files_widget/templates/files_widget/files_widget.html:32 +msgid "Upload" +msgstr "上传" + +#: files_widget/templates/files_widget/files_widget.html:37 +msgid "Library" +msgstr "库" + +#: files_widget/templates/files_widget/files_widget.html:41 +#: files_widget/templates/files_widget/files_widget.html:43 +msgid "Add by url..." +msgstr "添加URL" + +#: files_widget/templates/files_widget/files_widget.html:60 +msgid "Images to be removed" +msgstr "待删除的图片" diff --git a/files_widget/migrations/0001_initial.py b/files_widget/migrations/0001_initial.py new file mode 100644 index 0000000..c32cfdd --- /dev/null +++ b/files_widget/migrations/0001_initial.py @@ -0,0 +1,54 @@ +# Generated by Django 2.1.2 on 2018-10-09 23:37 + +from django.db import migrations, models +import django.db.models.deletion +import files_widget.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0009_alter_user_last_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='FileIcon', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('extension', models.CharField(blank=True, max_length=100, null=True)), + ('image', files_widget.fields.ImageField(max_length=200)), + ('display_text_overlay', models.BooleanField(default=True)), + ('overlay_text', models.CharField(blank=True, help_text='Leave blank to display file extension', max_length=7, null=True)), + ('base_color', models.CharField(blank=True, max_length=12, null=True)), + ], + ), + migrations.CreateModel( + name='IconSet', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, unique=True)), + ('css_path', models.CharField(blank=True, help_text='Optional css file for icon styling', max_length=200, null=True)), + ('active', models.BooleanField(default=True)), + ('priority', models.IntegerField(default=1)), + ('default_icon', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='files_widget.FileIcon')), + ], + ), + migrations.CreateModel( + name='GlobalPermission', + fields=[ + ], + options={ + 'proxy': True, + 'indexes': [], + }, + bases=('auth.permission',), + ), + migrations.AddField( + model_name='fileicon', + name='icon_set', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='files_widget.IconSet'), + ), + ] diff --git a/files_widget/migrations/0002_auto_20221111_1837.py b/files_widget/migrations/0002_auto_20221111_1837.py new file mode 100644 index 0000000..d3453ed --- /dev/null +++ b/files_widget/migrations/0002_auto_20221111_1837.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.16 on 2022-11-11 18:37 + +from django.db import migrations +import files_widget.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('files_widget', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='fileicon', + name='image', + field=files_widget.fields.ImageField(max_length=200), + ), + ] diff --git a/files_widget/migrations/__init__.py b/files_widget/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/files_widget/models.py b/files_widget/models.py new file mode 100644 index 0000000..e9b276c --- /dev/null +++ b/files_widget/models.py @@ -0,0 +1,55 @@ +from django.db import models +from django.contrib.contenttypes.models import ContentType +from django.contrib.auth.models import Group, Permission + +from .fields import ImageField + + +class GlobalPermissionManager(models.Manager): + def get_query_set(self): + return super(GlobalPermissionManager, self).\ + get_query_set().filter(content_type__name='global_permission') + + +class GlobalPermission(Permission): + """A global permission, not attached to a model""" + + objects = GlobalPermissionManager() + + class Meta: + proxy = True + + def save(self, *args, **kwargs): + ct, created = ContentType.objects.get_or_create( + name="global_permission", app_label=self._meta.app_label + ) + self.content_type = ct + super(GlobalPermission, self).save(*args, **kwargs) + + +try: + permission = GlobalPermission.objects.get_or_create( + codename='can_upload_files', + name='Can Upload Files', + ) +except: + # "Table 'fileswidgettest16.auth_permission' doesn't exist" + # it should exist the next time that this file is loaded + pass + + +class IconSet(models.Model): + name = models.CharField(max_length=50, unique=True) + css_path = models.CharField(max_length=200, blank=True, null=True, help_text='Optional css file for icon styling') + active = models.BooleanField(default=True) + priority = models.IntegerField(default=1) + default_icon = models.ForeignKey('files_widget.FileIcon', null=True, blank=True, on_delete=models.SET_NULL) + + +class FileIcon(models.Model): + icon_set = models.ForeignKey('files_widget.IconSet', on_delete=models.CASCADE) + extension = models.CharField(max_length=100, blank=True, null=True) + image = ImageField() + display_text_overlay = models.BooleanField(default=True) + overlay_text = models.CharField(max_length=7, blank=True, null=True, help_text='Leave blank to display file extension') + base_color = models.CharField(max_length=12, blank=True, null=True) diff --git a/files_widget/static/docs/img/admin-images-widget-drop.jpg b/files_widget/static/docs/img/admin-images-widget-drop.jpg new file mode 100644 index 0000000000000000000000000000000000000000..74c160e62d15caf1f1f1ad3da880a9a691932bc2 GIT binary patch literal 78791 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 literal 0 HcmV?d00001 diff --git a/files_widget/static/docs/img/admin-images-widget-drop.png b/files_widget/static/docs/img/admin-images-widget-drop.png new file mode 100644 index 0000000000000000000000000000000000000000..0f0b3a503bb22851ecd1413bf23599ba53c5c3b7 GIT binary patch literal 189127 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 literal 0 HcmV?d00001 diff --git a/files_widget/static/docs/img/admin-images-widget-progress.jpg b/files_widget/static/docs/img/admin-images-widget-progress.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a6ab201254552e3887909a45f2e1a86ccb96eb20 GIT binary patch literal 74884 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

    MyWGeNv~bZRR)3^KF{{{`ynnbGA2; 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 literal 0 HcmV?d00001 diff --git a/files_widget/static/docs/img/admin-images-widget-progress.png b/files_widget/static/docs/img/admin-images-widget-progress.png new file mode 100644 index 0000000000000000000000000000000000000000..2f139b0a97bde05edfc1d5c59a11d3caa4171a38 GIT binary patch literal 228415 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 SF1)Y6FL7ZRp(+7A|NjI2)y)C` literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/css/widgets.css b/files_widget/static/files_widget/css/widgets.css new file mode 100644 index 0000000..6666baa --- /dev/null +++ b/files_widget/static/files_widget/css/widgets.css @@ -0,0 +1,294 @@ +.files-widget { + display: inline-block; + width: 100%; +} + +.files-widget-dropbox { + width: 100%; + min-height: 100px; + border: 1px solid transparent; + margin: 0 -3px; + display: inline-block; +} + +.files-widget-dropbox.dragging-files { + background: rgba(0, 0, 0, .05); + border: 1px dashed rgba(0, 0, 0, .2); +} + +.files-widget-dropbox.dragging-files.dragover { + background: rgba(0, 0, 0, .1); + border: 1px dashed rgba(0, 0, 0, .4); +} + +.files-widget-dropbox .message { + display: block; + color: #a0a2a4; + margin: 30px; + text-align: center; +} + +/*для файлов*/ +.files-widget-dropbox .preview.filetype, .files-widget-dropbox .sortable-placeholder { + padding: 5px; + display: flex; + vertical-align: middle; + position: relative; + text-align: center; + width: 400px; + float: left; + margin-right: 10px; +} + + +/*для картинок*/ +.files-widget-dropbox .preview, .files-widget-dropbox .sortable-placeholder { + padding: 5px; + display: inline-block; + vertical-align: middle; + position: relative; + text-align: center; +} + +.files-widget-dropbox .sortable-placeholder { + background: rgba(0, 0, 0, .1); +} + +.files-widget .image-holder { + display: inline-block; + position: relative; + border: 3px solid white; + box-shadow: 0 1px 4px rgba(0, 0, 0, .8); + border-radius: 3px; + background: white; + text-align: center; +} + +.files-widget-dropbox .image-holder { + min-height: 50px; + /*min-width: 50px;*/ + line-height: 50px; +} + +.files-widget-dropbox .image-holder.icon100 { + min-height: 100px; + /*min-width: 100px;*/ + line-height: 100px; +} + +.files-widget-dropbox .image-holder.icon30 { + min-height: 30px; + /*min-width: 30px;*/ + line-height: 30px; + margin-right: 10px; +} + +.files-widget-dropbox .preview .thumbnail { + vertical-align: middle; + background: url(/static/files_widget/img/file-icons/file_icon.png) left top; + height: 50px; + /*width: 50px;*/ +} + +.files-widget-dropbox .preview .thumbnail.icon100 { + vertical-align: middle; + background: url(/static/files_widget/img/file-icons/file_icon.png) left top; + height: 100px; + /*width: 100px;*/ +} + +.files-widget-dropbox .preview .thumbnail.icon30 { + vertical-align: middle; + background: url(/static/files_widget/img/file-icons/file_icon.png) left top; + height: 30px; + /*width: 100px;*/ +} + + +.file-name-for-icon100 { + overflow: hidden; + width: 100px; + text-overflow: ellipsis; + white-space: nowrap; + height: 10px; + margin-top: 5px; + font-size: 10px; + +} + + +.file-name-for-icon30 { + overflow: hidden; + width: 100%; + /*text-overflow: ellipsis;*/ + /*white-space: nowrap;*/ + height: 100%; + margin-top: 5px; + font-size: 10px; + text-align: left; +} + + +.files-widget-dropbox .preview.new .thumbnail { + opacity: .5; +} + +.files-widget-dropbox .buttons { + position: absolute; + top: -10px; + right: -10px; + opacity: 0; + white-space: nowrap; + display: block; +} + +.files-widget-dropbox .buttons img { + vertical-align: top; +} + +.files-widget-dropbox .preview:hover .buttons { + opacity: 1; +} + +.files-widget-dropbox .preview.ui-sortable-helper .buttons, + .files-widget-dropbox .preview.new .buttons { + display: none; +} + +.files-widget-dropbox .preview:hover .buttons a { + margin: -2px; +} + +.files-widget-dropbox .uploaded { + position: absolute; + top:0; + left:0; + height:100%; + width:100%; + background: url('../img/done.png') no-repeat center center rgba(255,255,255,0.5); + display: none; +} + +.files-widget-dropbox .preview.done .uploaded { + display: block; +} + +.files-widget-dropbox .filename { + display: block; + position: absolute; + left: 0; + right: 0; + top: 20px; + overflow: hidden; +} + +.files-widget-dropbox .progress-holder { + position: absolute; + background-color: #252f38; + height: 10px; + right: 8px; + left: 8px; + bottom: 8px; + box-shadow: 0 0 2px #000; +} + +.files-widget-dropbox .progress { + background-color: #2586d0; + position: absolute; + height: 100%; + left: 0; + width: 0; + box-shadow: 0 0 1px rgba(255, 255, 255, 0.4) inset; + -moz-transition: 0.25s; + -webkit-transition: 0.25s; + -o-transition: 0.25s; + transition: 0.25s; +} + +.files-widget-dropbox .preview.done .progress { + width:100% !important; +} + +.files-widget .controls { + padding: 8px 0 0; + text-align: left; +} + +.files-widget .controls .fake-files-input { + margin-left: 2px; + position: relative; + display: inline-block; + overflow: hidden; +} + +.files-widget .controls .files-input { + padding: 4px; + opacity: .0001; + position: absolute; + top: 0; + bottom: 0; + right: 0; + cursor: pointer; +} + +.files-widget .controls input[type=text].add-by-url { + width: 300px; +} + +.files-widget .controls .upload-progress-stats { + float: right; + display: block; + padding-top: 5px; + color: #888; +} + +.files-widget-deleted { + +} + +.files-widget-deleted p { + color: #bf3030; + border-bottom: 1px solid #e0e0e0; + padding: 0 1px !important; + margin-top: 10px; + margin-left: 0 !important; +} + +.files-widget-deleted .deleted-list { + border-top: 1px solid white; + padding-top: 5px; +} + +.files-widget-deleted .deleted-file { + height: 38px; + line-height: 38px; + margin-bottom: 5px; +} + +.files-widget-deleted .deleted-file > span { + display: inline-block; + vertical-align: middle; +} + +.files-widget-deleted .deleted-file .image-holder { + min-height: 32px; + min-width: 32px; + line-height: 32px; + margin: 0 5px 0 3px; +} + +.files-widget-deleted .deleted-file .icon { + max-height: 32px; + max-width: 32px; + vertical-align: middle; +} + +.files-widget-deleted .deleted-file .name { + white-space: nowrap; + text-decoration: line-through; + margin: 0 10px; +} + +.files-widget-deleted .deleted-file .undo { + font-weight: bold; +} diff --git a/files_widget/static/files_widget/img/blue_line.jpg b/files_widget/static/files_widget/img/blue_line.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2af2c9f745accf14acd7da239470efb9914ec91e GIT binary patch literal 1283 zcmbVMy>HV%6hFuLXlP68Rz--(a$!NlJ|{7$4WVl6L}Un5Z4rpgv9H8x?Xzr`xD^v( zV1WU_(hU~=0hmw)0|R1WLQn=&i2;dk35gAJPMfq9Rgrj-?f0I4@AKZf=uNZ%4p&2K z9)NoNIOqf06nzGawqz_U0}3RGdK!RegT}2Oa1}vtd|o$k6Y&PNg-~||k%s~}JsG;X zv48@$iLO{qnfvzSDaTr7nY$=8V8c~W%R0N_q1lylbH>VoA)DOf8TNFjgtlv=KxadH z(eahA%ypbAgpbt%$95pWLYbS2qq3J8)2xa;#7aEO8StdYo-FcW5z0mR1e=E<6vVs$ zOF0oLQb~a#yG0y{=9%-#j8@xkxVyBu-!(Z=XlR<*>+r42ki$lXgiHP(f-`Bi-Z~E z<0a2P1U}w1CcWD~Pz)s5DCa$k9E!fEVPnZgPEgm%9QnhWmZ?-qnktqGQa)dms!$Xw zg{k6{1~s*&77KD=qU&QXTS*dOwNjd@O8JT?R^dbe%Bm`>Ql(asU`^`U)*V049Rqda zS|qMitjZIr2KTj9R1fI^_U15N>`uUR3kTS5VV6~BC0=ANT8@d^etbNe)oRGIt|GJM zVVmvrSF!epU#a}7?oC_se|jd6WQ2G)b_`2bMJ6z2d!tW;-tr)aY>Y=%Bl-#sb_O1p z&&Uc=(K~PhBzi;>j!u#{olGTTN~KdBN~bfKzDy>a%^oTy(?{-v8Jc21f}v=Jik^cexhLrD>m%k;=?wLkl1^oY zL4rzx%ntDVW6Vg?NQ}>>#?ptF*ofNk7jV=_ax_{814Nx*Xa-Dz)!VOctzLS}tiQT* z^GmC)U43-)!Kuq5vzcF$qd(VPesVs%zWed}*xC_%@8Ox>;f0MK+VJX&Ytz?vKJTNq Fe*ix~S*rj5 literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/button_template.png b/files_widget/static/files_widget/img/button_template.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9882e9597125e60a8a52bf972a12fb8beea281 GIT binary patch literal 3956 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 O0000CVuSz literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/close_button.png b/files_widget/static/files_widget/img/close_button.png new file mode 100644 index 0000000000000000000000000000000000000000..a7c7005fc283de964ae1c46056b45c7cd300bf62 GIT binary patch literal 4065 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%0D{J?J^&~K z@IHWMlCqY2atH(hOeT}ejYJ~B`uh4c*H%?kJ&z-ReE@a=C@sos)Gn9H1&_yr*Bx%R z`&qLU5l0Oc6*<;WDP@TW>gwtW41_`<^!N9pw6qk-WD<*uizqKIM}L1mnwpvl)(3+@ z0Dw|z#mNDauDbvH0uUr;oWn~;28>7}*hK7cI%TJnZCS~hSpFVxYwr$I{ZHB|)S1$a{&Q2<&xV*gl z^u&o1?EvbWW#KV}{~>_=4<0-i77>}7oBLmVG>7KqW-cx+Qbc5Ucz6InYkuKBZ*2gA zCr_UIA)C!Ek>uFe7z2U8hRH&q5T~Z5NRp{kD&E%C_6>jr<4%9BwXJI206x2N<;pKg zDW$dM)YKHuo;^#y-~U1)pU=mxt}dohDQc~m$z+x~J3G4pd}2;l;cVWkt|#N~gWcWT zKgZ+onAVy~DaK+k-n@B}M~)n!-|wf-=i`9`2YCJZbtV!CYON_E5|77cJ32ag0PF`) zYht(RdMdbp0qg~E@Yu0qKaGrx{9{?xiimJM*tTsA4Gj%8G&Fo`$m)zM%knSa9O-6< z#Mo(m_!PkB$B!THxO?~RokSuLw{6=tJy&eowigx_;)8>O1FfyCKLR)kpv9bQhdIC& zr^ImO>6)A@^q9DA1Mr5Kx0;{bxmXw}XaUFqcnV<2fee6UBOP_F%WTeTJ1S4y=8P?w zO_b!RFmY(ntOLt=`ji_H!kf&7+zv5Z>`>pYB!pe-XjJ4${Fh06<#>Lf)cO$d# Td!;+W00000NkvXXu0mjfS-zsb literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/done.png b/files_widget/static/files_widget/img/done.png new file mode 100644 index 0000000000000000000000000000000000000000..22a14109ab18aaf8452e2acadfba1ab43e8624c9 GIT binary patch literal 3399 zcmbVPdpy(o{~r>`?YNw#bSy@0yV_iq5xX#D49$|AW42*!wq=tkl1sTojv|+?bU1NJ zsU(WI(>HRDLe^ zaDqLWfJV9_5Cph88ijXsL=p%@cSSvLxNlq%UnFMmne1$f)*Sz*S-y!B9k{mryY&@^zlVp-S4>QlVl>v#aT@@D4KXCVTY%)r zRInCLf7(bs*W)s=;@Xn{G9u~E<8ah<2I);Tw*np~4H8c*deE=bT|Gyo-pV`Jk3nT| zxacdz1wkm(qKBb7dp4yaYtNQE+FplfTV?lUExyqP5(s>Q+3{h8H}N|D`J)iy9pHB( z4Xl$3X`N@^e8Mg@yiwfo69{mEZsJv`xfCPYbkyRaJ}qB7s@}U%Q>6;vs-~@cIPp^4 zCtr(>>5irZqhVqpemlNK^@()-ex z;Kt7G=b;gXjmk&TXSQ@pqot>ICO`=sWqDBe98y0c@wIrfN%t|!%ET(=NEX8lFs^n_ z-MHV+z+fs*`4MzP>Ir%AiI?&$Y!(T`Nvf|m_5V?~O1>uEPO(mGR0`^vJeo+>z3|W= z?(UAWGIWUH-e4*4rrz>4-@;1Er-`q+CQ~xWz%S=BEnod=nQ7E5Ce{@}moJNo+n}D+ z4!|&`)zhO}*VYzw57ltO|EKVKF2hmEX?d*_oZ#P0lUI^(5|j@EgTvmP~sPxCrh1 zpu*i!NHmowZ_~@Py2HIxc%wDiljc=SR&6Q{TbX;x&9BrtA=63(Ss!2%;Nu z*^}3vOfeulUii4n_w@dAs?_)TRabv|Z)8r@AWW7vv}^(AZJJVZ+JI?}M)9#xp<41=%I?w$N@y=-|D(LYg3KXoARY5ZvZJ2AokvJ% z;%O(_sd=>@C*;_2wfnz=P2!CED$eC_DZrpA_yXD5&Uia-WX$h%)-j+H&X@r_PFrVI zQ1h$tc%Os#W9K4cnbzOyrJH|c$}+XBxb}}9!vD=|NsqK5vS_0liGN-67DVTM-8Sj4MOB$0Py>Ojx?_5BMB zlC0U4SXG7)4TXe4UhjBiO^k24#c!$Byiu&$tc9E(7s$(DQ<;)0!2R0%vZRs}l%DxB z>&cHD+?zqnvg%Er~wfv_zGt=o#y zUQ#c|`&_6s&~CTrbf)S(R7y;-4BGumSp{+5foWJ#<;tNRakmMm+Th$~v#`?a`gIM_ z{;_-C{QSx<_qMRc@6`QRZn_9){gb)*Gbu3CaCgdV_*DGUIvBAf1Ew~Yt6`!Y=DaTu zQFync>dSAxyz6p}yYb_-j6$Nbl3u=>ZqOM^ncfeL_$M)g)L!ZN2#t4JVJO>0Li0OW zQNRFvo$9mn83cY@{-J9ZD9u$T2}GovPUP9Lyr*+BOiZ2*``sRyGoD}WWO<%H*zuiS zS}TN|RcRlXe`;Ap@O@cG`0HeX{imK=)Pk;^#?@9IhH6gD9rgGyHO$UM94*ldV{;vv ze}4AOzdeieqJ5zi z+)oIkw-vayf=#%n>z7A4<_Ym5*crJvj@ELSSL4{(S1=DOOnAP@%%gROt!iEU@q2sN zRL02uRFDVr)@Y!>X5mH_?Qw)5ggnlRM9#a-4iz}%o40A(IW5g~4!bTbEuC7n_CTLZ zlF>d02T=zoO83pYvr2NSzVw;LzO%gq&;Icl$0Lca!<)%AVEXXei^SxyC847i zSQotc?qjauHj6@YmxIFTkw+0_6$TgOFU?6?@04yn4@|Y%CI5B0yPSMhXA!RqP4%ob zDq<4Vd)uftKg!>SU)xzzbTSyMpKXyjSvIIgc?cPg{V>>e<7BejFU^oPSN?%^qs*#$ z!_;7L3sdEO!d1s2qxjry-wS-k3dgVxlV5xkZ0xeSQ&Al^Kz@{nvtxvP%% zsO`Ll(mkVEV=CE@Q0BCYs}04NYp#>+jNkS1ef5{1v(=f#%1(C$GwsJ3Pih;2Oi1k} ziC?^+Q+{9U&X#U`&eMx~(`LtCxmge}m((0r(AhCw7nL`j<9=5w`;N`+I`4MLOQp?b zW%xZ`>K`oxPj1)je|BMseyOa|VA!kOzjBm=Wyp4b@0@heBqbK~Y z*!@^HrKBUlcDPz-B&9?cQ#MAJSC#KlLSEI!xyIxyS3hXWzzs(CAAE>p2(8Td$Z-Nlo!kghhCLGZ@`lc5`-xUH`X+L- zoK$0EKBNcklPejy>i251S%@-r_yv0$G!tdAD}Du9txH>q}&Fm3JEhD0FauepaL{SS#;#;yPW literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/enlarge_button.png b/files_widget/static/files_widget/img/enlarge_button.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f0769b439385a13193387c996d1df029dac8af GIT binary patch literal 4204 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 literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/file-icons/audio.png b/files_widget/static/files_widget/img/file-icons/audio.png new file mode 100644 index 0000000000000000000000000000000000000000..0f855659b7e497b0e86c904d680ae0e8e5fbdfe6 GIT binary patch literal 31618 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 literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/file-icons/executable.png b/files_widget/static/files_widget/img/file-icons/executable.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c174e4af4c402dc75d990ecbc3bb1f19a973af GIT binary patch literal 38785 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 E4-25f0{{R3 literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/file-icons/image.png b/files_widget/static/files_widget/img/file-icons/image.png new file mode 100644 index 0000000000000000000000000000000000000000..9239a2d75b91d8968dc1167c633b49f56565b61e GIT binary patch literal 44168 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 literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/file-icons/settings.png b/files_widget/static/files_widget/img/file-icons/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..42ce76eec06621c98226d03c0556d8dc7f4dcda1 GIT binary patch literal 47465 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 KmMWJp3iuxv)`++O literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/file-icons/text.png b/files_widget/static/files_widget/img/file-icons/text.png new file mode 100644 index 0000000000000000000000000000000000000000..39385654d6242acf14b0ba93fe36920a07424d82 GIT binary patch literal 55696 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 z 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 literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/file-icons/typography.png b/files_widget/static/files_widget/img/file-icons/typography.png new file mode 100644 index 0000000000000000000000000000000000000000..56a7704b3914d73702999d0fada7260eed46082c GIT binary patch literal 20379 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 Jc)~O8{{ZP!k*)v$ literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/file-icons/video.png b/files_widget/static/files_widget/img/file-icons/video.png new file mode 100644 index 0000000000000000000000000000000000000000..058f0b7bd1c7deaba64dd287884081d3e3b27502 GIT binary patch literal 44229 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

    Uo-VMS{}17L)w9%FjJ3QVZ>JhX=Rc`f`g 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

    0s8}!e}(GDW~@aFOv1Wt{o&>^ zSIXaD@1Q=E$CP-JMILKhZjYePF;Ea{PkcgnUDUtFm*Iq|n}mX}y>Jx7G(2n7h-eeG27%c zLC)^95{JSQ*%BeIY+@5;CbHfaTU>q<4kk2T&ixJ+t7|2A@Hz6lCm$Crg6%cZNlQU1 zL7{2#Y~UQWz%{Z6iBxlm{gP5>F?`Mcuja5-QiF zg0JW?{v}K-OkyZwA*^4SaUZeG!*MhB%=+13ktU0~Bbihh1Kr{5wGE18T2+qPrHNQ) zp3J2xyQJ1XtN7vz_EuL~k{GKzXUTRHq<<47r5x8sBHV+7%KE^(cOs&*yE&dMYft{t zzCC>dN~@iecyf#sMUZ9abN&5R#%o*pr-$kAqQ|0nQfg_61y=Ic{$$bBGt=Bn_2tT^(8uOSsO6!_eB{ufva1@_y-X1o8xI<18bV6~lv0Nd zG$Z)|S^mM%)=-Pw=mX_i>jQjp{9|k7lexnpEhZ&oip>*b{(3NbLKvKYJ|St@S)jz~Knh5XT@9O^9N%2$`YasL8)YPrx z(l4L4IY!_+7D;5|)fYe++son=))7R@fh{GC&o|rSDO`{>=5M(yiDpj^$qnx$9SU~S3kI;5?P*|+x=AL#?j;=-Ko@WdN4-n@6?l4G3U7@rbfI6 zkLF!Kpf_)%S7tZufn&yA60~^a_#CS5Q)+vd9Cv(jF}$H-j;*a-d0aPhn!-RzM-Qy$ zINF)hHlO}tmuuX0y~+5#)oFiW9P0+^PNWDNR|t3s98)m&5#Z(AMwsvF3mel-K#iMU z$fCuB{lbKLxrX0p5qh>5zt#^<(TgnB_kC<})(k$<@c4j>))1akzDpU?w}$JHM>2J@ zR;W)3&Mq6MhE4Aw*+_JH(soO7#B@yeZ9GmJ=6_ldV>MX?2(~rI*cQcFB=oQxI+}+S zr%Hya1eCTk45?=?JUcwCZB-a%*)J}NZkT80$Eyd>@du?_`2S#h7Mss?c8}_rT)S+-qll-ZR6r?!%R9ZT7S+nH>2_? zjJU!t7eQwb_;m?`U?oCgR!{3vvNDhAKHipBH=NG=&|i)v4(NmT!G-9)gFez$ZphK& zD2Jf<0TD$Uo}wan{unq7paUVWH9$v4fqfU)L#E8^55i+aSSz=2ouqa8(24&EX8ZGf zDK-{m2}{I<3z-c1iQq+mab5t3pQ>%XdP#ippG1F*=}59L>>*YWLS05glEd~R?SI}O znt78Ki(>mvk@Cccuk`dd9sfzRtW7(9NlZ-epF5J`hlan?ZR27ko`f{!aN8o(v5L@% zUN2o$|KIfg<8?l2KtcqV>_112KEyM61ju_@w4rKGO#I)R(WT`L?fDuB*Rl)95h3kU zo!_*H;)S6saRJZ!^VCG>lj(8jaXu%Y#GPgg0?HQNt@mJus*1ZKIiVL{2I#)inWzw_ zg#J@Dq#v?srVTHl1s*_3W|e!%ev~Hu%u{h1A`rpDel^_yxh9{zh4-Tm0jr95*6;jz zy}p6~1ji2k{xTW&osWWHGBT#IadFgh^Dl|9vrLL}KsVazy$b~sqt8#|c>E?VJf$0J z%(T}i^EH`&>u-0>UdFdB%7w0drO+Wd?l5A)+nchnMJD2T8HDdHf%u?*x+f($x{yhY4J+Lo80kxr8f=O4PtNu6oae!(?r4tX`k^;s07B9dRd?8r1Pw@R^jd!r z!AIQKv>}C0(i)T7`Hes}UaSBW7&Mk;zC}v>*hq0`iO)owL z;C%1{%Vy-C(935;CWOa0nnEBz3F$L{qV8jCYof@e@kZt)##MqI=e7sw(v|-C7ACEg zFE8;-cP>dS7;aV%sQo4&z#0ahE7*^88MqwavSqdXC`1SGW@dOrChIK}bBTKW0)!T6 zAVSgosS_|&D3?W^&D~@RCkoe^6N43Sg{=FPUqAq{y+Vek=lqW$$VawqtYslRANKyU z6lKjC2Bbdub^)BP7e{`N5}=1p@RE$||2JmXjeetcBV%&U;`l6eyHNAM1b}^>s%Sr{ IRzigQ4>GeflmGw# literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/img/transparent-bg.gif b/files_widget/static/files_widget/img/transparent-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..c7e98e044f578204f9c1ebdefcb05f4b2baaea32 GIT binary patch literal 58 zcmZ?wbhEHbQxZ@ literal 0 HcmV?d00001 diff --git a/files_widget/static/files_widget/js/jquery.fileupload-angular.js b/files_widget/static/files_widget/js/jquery.fileupload-angular.js new file mode 100644 index 0000000..e7ba784 --- /dev/null +++ b/files_widget/static/files_widget/js/jquery.fileupload-angular.js @@ -0,0 +1,348 @@ +/* + * jQuery File Upload AngularJS Plugin 1.0.1 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint nomen: true, unparam: true */ +/*global angular */ + +(function () { + 'use strict'; + + angular.module('blueimp.fileupload', []) + + .provider('fileUpload', function () { + var scopeApply = function () { + var scope = angular.element(this) + .fileupload('option', 'scope')(); + if (!scope.$$phase) { + scope.$apply(); + } + }, + $config; + $config = this.defaults = { + handleResponse: function (e, data) { + var files = data.result && data.result.files; + if (files) { + data.scope().replace(data.files, files); + } else if (data.errorThrown || + data.textStatus === 'error') { + data.files[0].error = data.errorThrown || + data.textStatus; + } + }, + add: function (e, data) { + var scope = data.scope(); + data.process(function () { + return scope.process(data); + }).always( + function () { + var file = data.files[0], + submit = function () { + return data.submit(); + }; + file.$cancel = function () { + scope.clear(data.files); + return data.abort(); + }; + file.$state = function () { + return data.state(); + }; + file.$progress = function () { + return data.progress(); + }; + file.$response = function () { + return data.response(); + }; + if (file.$state() === 'rejected') { + file._$submit = submit; + } else { + file.$submit = submit; + } + scope.$apply(function () { + var method = scope.option('prependFiles') ? + 'unshift' : 'push'; + Array.prototype[method].apply( + scope.queue, + data.files + ); + if (file.$submit && + (scope.option('autoUpload') || + data.autoUpload) && + data.autoUpload !== false) { + file.$submit(); + } + }); + } + ); + }, + progress: function (e, data) { + data.scope().$apply(); + }, + done: function (e, data) { + var that = this; + data.scope().$apply(function () { + data.handleResponse.call(that, e, data); + }); + }, + fail: function (e, data) { + var that = this; + if (data.errorThrown === 'abort') { + return; + } + if (data.dataType.indexOf('json') === data.dataType.length - 4) { + try { + data.result = angular.fromJson(data.jqXHR.responseText); + } catch (err) {} + } + data.scope().$apply(function () { + data.handleResponse.call(that, e, data); + }); + }, + stop: scopeApply, + processstart: scopeApply, + processstop: scopeApply, + getNumberOfFiles: function () { + return this.scope().queue.length; + }, + dataType: 'json', + prependFiles: true, + autoUpload: false + }; + this.$get = [ + function () { + return { + defaults: $config + }; + } + ]; + }) + + .provider('formatFileSizeFilter', function () { + var $config = this.defaults = { + // Byte units following the IEC format + // http://en.wikipedia.org/wiki/Kilobyte + units: [ + {size: 1000000000, suffix: ' GB'}, + {size: 1000000, suffix: ' MB'}, + {size: 1000, suffix: ' KB'} + ] + }; + this.$get = function () { + return function (bytes) { + if (!angular.isNumber(bytes)) { + return ''; + } + var unit = true, + i = -1; + while (unit) { + unit = $config.units[i += 1]; + if (i === $config.units.length - 1 || bytes >= unit.size) { + return (bytes / unit.size).toFixed(2) + unit.suffix; + } + } + }; + }; + }) + + .controller('FileUploadController', [ + '$scope', '$element', '$attrs', 'fileUpload', + function ($scope, $element, $attrs, fileUpload) { + $scope.disabled = angular.element('') + .prop('disabled'); + $scope.queue = $scope.queue || []; + $scope.clear = function (files) { + var queue = this.queue, + i = queue.length, + file = files, + length = 1; + if (angular.isArray(files)) { + file = files[0]; + length = files.length; + } + while (i) { + if (queue[i -= 1] === file) { + return queue.splice(i, length); + } + } + }; + $scope.replace = function (oldFiles, newFiles) { + var queue = this.queue, + file = oldFiles[0], + i, + j; + for (i = 0; i < queue.length; i += 1) { + if (queue[i] === file) { + for (j = 0; j < newFiles.length; j += 1) { + queue[i + j] = newFiles[j]; + } + return; + } + } + }; + $scope.progress = function () { + return $element.fileupload('progress'); + }; + $scope.active = function () { + return $element.fileupload('active'); + }; + $scope.option = function (option, data) { + return $element.fileupload('option', option, data); + }; + $scope.add = function (data) { + return $element.fileupload('add', data); + }; + $scope.send = function (data) { + return $element.fileupload('send', data); + }; + $scope.process = function (data) { + return $element.fileupload('process', data); + }; + $scope.processing = function (data) { + return $element.fileupload('processing', data); + }; + $scope.applyOnQueue = function (method) { + var list = this.queue.slice(0), + i, + file; + for (i = 0; i < list.length; i += 1) { + file = list[i]; + if (file[method]) { + file[method](); + } + } + }; + $scope.submit = function () { + this.applyOnQueue('$submit'); + }; + $scope.cancel = function () { + this.applyOnQueue('$cancel'); + }; + // The fileupload widget will initialize with + // the options provided via "data-"-parameters, + // as well as those given via options object: + $element.fileupload(angular.extend( + {scope: function () { + return $scope; + }}, + fileUpload.defaults + )).on('fileuploadadd', function (e, data) { + data.scope = $scope.option('scope'); + }).on([ + 'fileuploadadd', + 'fileuploadsubmit', + 'fileuploadsend', + 'fileuploaddone', + 'fileuploadfail', + 'fileuploadalways', + 'fileuploadprogress', + 'fileuploadprogressall', + 'fileuploadstart', + 'fileuploadstop', + 'fileuploadchange', + 'fileuploadpaste', + 'fileuploaddrop', + 'fileuploaddragover', + 'fileuploadchunksend', + 'fileuploadchunkdone', + 'fileuploadchunkfail', + 'fileuploadchunkalways', + 'fileuploadprocessstart', + 'fileuploadprocess', + 'fileuploadprocessdone', + 'fileuploadprocessfail', + 'fileuploadprocessalways', + 'fileuploadprocessstop' + ].join(' '), function (e, data) { + $scope.$emit(e.type, data); + }); + // Observe option changes: + $scope.$watch( + $attrs.fileupload, + function (newOptions, oldOptions) { + if (newOptions) { + $element.fileupload('option', newOptions); + } + } + ); + } + ]) + + .controller('FileUploadProgressController', [ + '$scope', '$attrs', '$parse', + function ($scope, $attrs, $parse) { + var fn = $parse($attrs.progress), + update = function () { + var progress = fn($scope); + if (!progress || !progress.total) { + return; + } + $scope.num = Math.floor( + progress.loaded / progress.total * 100 + ); + }; + update(); + $scope.$watch( + $attrs.progress + '.loaded', + function (newValue, oldValue) { + if (newValue !== oldValue) { + update(); + } + } + ); + } + ]) + + .controller('FileUploadPreviewController', [ + '$scope', '$element', '$attrs', '$parse', + function ($scope, $element, $attrs, $parse) { + var fn = $parse($attrs.preview), + file = fn($scope); + if (file.preview) { + $element.append(file.preview); + } + } + ]) + + .directive('fileupload', function () { + return { + controller: 'FileUploadController' + }; + }) + + .directive('progress', function () { + return { + controller: 'FileUploadProgressController' + }; + }) + + .directive('preview', function () { + return { + controller: 'FileUploadPreviewController' + }; + }) + + .directive('download', function () { + return function (scope, elm, attrs) { + elm.on('dragstart', function (e) { + try { + e.originalEvent.dataTransfer.setData( + 'DownloadURL', + [ + 'application/octet-stream', + elm.prop('download'), + elm.prop('href') + ].join(':') + ); + } catch (err) {} + }); + }; + }); + +}()); diff --git a/files_widget/static/files_widget/js/jquery.fileupload-process.js b/files_widget/static/files_widget/js/jquery.fileupload-process.js new file mode 100644 index 0000000..2f9eeed --- /dev/null +++ b/files_widget/static/files_widget/js/jquery.fileupload-process.js @@ -0,0 +1,158 @@ +/* + * jQuery File Upload Processing Plugin 1.1 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2012, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint nomen: true, unparam: true */ +/*global define, window */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload' + ], factory); + } else { + // Browser globals: + factory( + window.jQuery + ); + } +}(function ($) { + 'use strict'; + + var originalAdd = $.blueimp.fileupload.prototype.options.add; + + // The File Upload Processing plugin extends the fileupload widget + // with file processing functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The list of processing actions: + processQueue: [ + /* + { + action: 'log', + type: 'debug' + } + */ + ], + add: function (e, data) { + var $this = $(this); + data.process(function () { + return $this.fileupload('process', data); + }); + originalAdd.call(this, e, data); + } + }, + + processActions: { + /* + log: function (data, options) { + console[options.type]( + 'Processing "' + data.files[data.index].name + '"' + ); + } + */ + }, + + _processFile: function (data) { + var that = this, + dfd = $.Deferred().resolveWith(that, [data]), + chain = dfd.promise(); + this._trigger('process', null, data); + $.each(data.processQueue, function (i, settings) { + var func = function (data) { + return that.processActions[settings.action].call( + that, + data, + settings + ); + }; + chain = chain.pipe(func, settings.always && func); + }); + chain + .done(function () { + that._trigger('processdone', null, data); + that._trigger('processalways', null, data); + }) + .fail(function () { + that._trigger('processfail', null, data); + that._trigger('processalways', null, data); + }); + return chain; + }, + + // Replaces the settings of each processQueue item that + // are strings starting with an "@", using the remaining + // substring as key for the option map, + // e.g. "@autoUpload" is replaced with options.autoUpload: + _transformProcessQueue: function (options) { + var processQueue = []; + $.each(options.processQueue, function () { + var settings = {}; + $.each(this, function (key, value) { + if ($.type(value) === 'string' && + value.charAt(0) === '@') { + settings[key] = options[value.slice(1)]; + } else { + settings[key] = value; + } + }); + processQueue.push(settings); + }); + options.processQueue = processQueue; + }, + + // Returns the number of files currently in the processsing queue: + processing: function () { + return this._processing; + }, + + // Processes the files given as files property of the data parameter, + // returns a Promise object that allows to bind callbacks: + process: function (data) { + var that = this, + options = $.extend({}, this.options, data); + if (options.processQueue && options.processQueue.length) { + this._transformProcessQueue(options); + if (this._processing === 0) { + this._trigger('processstart'); + } + $.each(data.files, function (index, file) { + var opts = index ? $.extend({}, options) : options, + func = function () { + return that._processFile(opts); + }; + opts.index = index; + that._processing += 1; + that._processingQueue = that._processingQueue.pipe(func, func) + .always(function () { + that._processing -= 1; + if (that._processing === 0) { + that._trigger('processstop'); + } + }); + }); + } + return this._processingQueue; + }, + + _create: function () { + this._super(); + this._processing = 0; + this._processingQueue = $.Deferred().resolveWith(this) + .promise(); + } + + }); + +})); diff --git a/files_widget/static/files_widget/js/jquery.fileupload-resize.js b/files_widget/static/files_widget/js/jquery.fileupload-resize.js new file mode 100644 index 0000000..ae5c5be --- /dev/null +++ b/files_widget/static/files_widget/js/jquery.fileupload-resize.js @@ -0,0 +1,212 @@ +/* + * jQuery File Upload Image Resize Plugin 1.1.2 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint nomen: true, unparam: true, regexp: true */ +/*global define, window */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + 'canvas-to-blob', + './jquery.fileupload-process' + ], factory); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // Prepend to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.unshift( + { + action: 'loadImage', + fileTypes: '@loadImageFileTypes', + maxFileSize: '@loadImageMaxFileSize', + noRevoke: '@loadImageNoRevoke', + disabled: '@disableImageLoad' + }, + { + action: 'resizeImage', + maxWidth: '@imageMaxWidth', + maxHeight: '@imageMaxHeight', + minWidth: '@imageMinWidth', + minHeight: '@imageMinHeight', + crop: '@imageCrop', + disabled: '@disableImageResize' + }, + { + action: 'saveImage', + disabled: '@disableImageResize' + }, + { + action: 'resizeImage', + maxWidth: '@previewMaxWidth', + maxHeight: '@previewMaxHeight', + minWidth: '@previewMinWidth', + minHeight: '@previewMinHeight', + crop: '@previewCrop', + canvas: '@previewAsCanvas', + disabled: '@disableImagePreview' + }, + { + action: 'setImage', + // The name of the property the resized image + // is saved as on the associated file object: + name: 'preview', + disabled: '@disableImagePreview' + } + ); + + // The File Upload Resize plugin extends the fileupload widget + // with image resize functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The regular expression for the types of images to load: + // matched against the file type: + loadImageFileTypes: /^image\/(gif|jpeg|png)$/, + // The maximum file size of images to load: + loadImageMaxFileSize: 5000000, // 5MB + // The maximum width of resized images: + imageMaxWidth: 1920, + // The maximum height of resized images: + imageMaxHeight: 1080, + // Define if resized images should be cropped or only scaled: + imageCrop: false, + // Disable the resize image functionality by default: + disableImageResize: true, + // The maximum width of the preview images: + previewMaxWidth: 80, + // The maximum height of the preview images: + previewMaxHeight: 80, + // Define if preview images should be cropped or only scaled: + previewCrop: false, + // Define if preview images should be resized as canvas elements: + previewAsCanvas: true + }, + + processActions: { + + // Loads the image given via data.files and data.index + // as img element if the browser supports canvas. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + loadImage: function (data, options) { + if (options.disabled) { + return data; + } + var that = this, + file = data.files[data.index], + dfd = $.Deferred(); + if (($.type(options.maxFileSize) === 'number' && + file.size > options.maxFileSize) || + (options.fileTypes && + !options.fileTypes.test(file.type)) || + !loadImage( + file, + function (img) { + if (!img.src) { + return dfd.rejectWith(that, [data]); + } + data.img = img; + dfd.resolveWith(that, [data]); + }, + options + )) { + dfd.rejectWith(that, [data]); + } + return dfd.promise(); + }, + + // Resizes the image given as data.canvas or data.img + // and updates data.canvas or data.img with the resized image. + // Accepts the options maxWidth, maxHeight, minWidth, + // minHeight, canvas and crop: + resizeImage: function (data, options) { + options = $.extend({canvas: true}, options); + var img = (options.canvas && data.canvas) || data.img, + canvas; + if (img && !options.disabled) { + canvas = loadImage.scale(img, options); + if (canvas && (canvas.width !== img.width || + canvas.height !== img.height)) { + data[canvas.getContext ? 'canvas' : 'img'] = canvas; + } + } + return data; + }, + + // Saves the processed image given as data.canvas + // inplace at data.index of data.files: + saveImage: function (data, options) { + if (!data.canvas || options.disabled) { + return data; + } + var that = this, + file = data.files[data.index], + name = file.name, + dfd = $.Deferred(), + callback = function (blob) { + if (!blob.name) { + if (file.type === blob.type) { + blob.name = file.name; + } else if (file.name) { + blob.name = file.name.replace( + /\..+$/, + '.' + blob.type.substr(6) + ); + } + } + // Store the created blob at the position + // of the original file in the files list: + data.files[data.index] = blob; + dfd.resolveWith(that, [data]); + }; + // Use canvas.mozGetAsFile directly, to retain the filename, as + // Gecko doesn't support the filename option for FormData.append: + if (data.canvas.mozGetAsFile) { + callback(data.canvas.mozGetAsFile( + (/^image\/(jpeg|png)$/.test(file.type) && name) || + ((name && name.replace(/\..+$/, '')) || + 'blob') + '.png', + file.type + )); + } else if (data.canvas.toBlob) { + data.canvas.toBlob(callback, file.type); + } else { + return data; + } + return dfd.promise(); + }, + + // Sets the resized version of the image as a property of the + // file object, must be called after "saveImage": + setImage: function (data, options) { + var img = data.canvas || data.img; + if (img && !options.disabled) { + data.files[data.index][options.name] = img; + } + return data; + } + + } + + }); + +})); diff --git a/files_widget/static/files_widget/js/jquery.fileupload-ui.js b/files_widget/static/files_widget/js/jquery.fileupload-ui.js new file mode 100644 index 0000000..5d22346 --- /dev/null +++ b/files_widget/static/files_widget/js/jquery.fileupload-ui.js @@ -0,0 +1,633 @@ +/* + * jQuery File Upload User Interface Plugin 8.2.1 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint nomen: true, unparam: true, regexp: true */ +/*global define, window, URL, webkitURL, FileReader */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'tmpl', + './jquery.fileupload-resize', + './jquery.fileupload-validate' + ], factory); + } else { + // Browser globals: + factory( + window.jQuery, + window.tmpl + ); + } +}(function ($, tmpl, loadImage) { + 'use strict'; + + $.blueimp.fileupload.prototype._specialOptions.push( + 'filesContainer', + 'uploadTemplateId', + 'downloadTemplateId' + ); + + // The UI version extends the file upload widget + // and adds complete user interface interaction: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // By default, files added to the widget are uploaded as soon + // as the user clicks on the start buttons. To enable automatic + // uploads, set the following option to true: + autoUpload: false, + // The ID of the upload template: + uploadTemplateId: 'template-upload', + // The ID of the download template: + downloadTemplateId: 'template-download', + // The container for the list of files. If undefined, it is set to + // an element with class "files" inside of the widget element: + filesContainer: undefined, + // By default, files are appended to the files container. + // Set the following option to true, to prepend files instead: + prependFiles: false, + // The expected data type of the upload response, sets the dataType + // option of the $.ajax upload requests: + dataType: 'json', + + // Function returning the current number of files, + // used by the maxNumberOfFiles validation: + getNumberOfFiles: function () { + return this.filesContainer.children().length; + }, + + // Callback to retrieve the list of files from the server response: + getFilesFromResponse: function (data) { + if (data.result && $.isArray(data.result.files)) { + return data.result.files; + } + return []; + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop or add API call). + // See the basic file upload widget for more information: + add: function (e, data) { + var $this = $(this), + that = $this.data('blueimp-fileupload') || + $this.data('fileupload'), + options = that.options, + files = data.files; + data.process(function () { + return $this.fileupload('process', data); + }).always(function () { + data.context = that._renderUpload(files).data('data', data); + that._renderPreviews(data); + options.filesContainer[ + options.prependFiles ? 'prepend' : 'append' + ](data.context); + that._forceReflow(data.context); + that._transition(data.context).done( + function () { + if ((that._trigger('added', e, data) !== false) && + (options.autoUpload || data.autoUpload) && + data.autoUpload !== false && !data.files.error) { + data.submit(); + } + } + ); + }); + }, + // Callback for the start of each file upload request: + send: function (e, data) { + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'); + if (data.context && data.dataType && + data.dataType.substr(0, 6) === 'iframe') { + // Iframe Transport does not support progress events. + // In lack of an indeterminate progress bar, we set + // the progress to 100%, showing the full animated bar: + data.context + .find('.progress').addClass( + !$.support.transition && 'progress-animated' + ) + .attr('aria-valuenow', 100) + .find('.bar').css( + 'width', + '100%' + ); + } + return that._trigger('sent', e, data); + }, + // Callback for successful uploads: + done: function (e, data) { + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + getFilesFromResponse = data.getFilesFromResponse || + that.options.getFilesFromResponse, + files = getFilesFromResponse(data), + template, + deferred; + if (data.context) { + data.context.each(function (index) { + var file = files[index] || + {error: 'Empty file upload result'}, + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + var node = $(this); + template = that._renderDownload([file]) + .replaceAll(node); + that._forceReflow(template); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('completed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + ); + }); + } else { + template = that._renderDownload(files) + .appendTo(that.options.filesContainer); + that._forceReflow(template); + deferred = that._addFinishedDeferreds(); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('completed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + }, + // Callback for failed (abort or error) uploads: + fail: function (e, data) { + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + template, + deferred; + if (data.context) { + data.context.each(function (index) { + if (data.errorThrown !== 'abort') { + var file = data.files[index]; + file.error = file.error || data.errorThrown || + true; + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + var node = $(this); + template = that._renderDownload([file]) + .replaceAll(node); + that._forceReflow(template); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + ); + } else { + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + $(this).remove(); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + }); + } else if (data.errorThrown !== 'abort') { + data.context = that._renderUpload(data.files) + .appendTo(that.options.filesContainer) + .data('data', data); + that._forceReflow(data.context); + deferred = that._addFinishedDeferreds(); + that._transition(data.context).done( + function () { + data.context = $(this); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } else { + that._trigger('failed', e, data); + that._trigger('finished', e, data); + that._addFinishedDeferreds().resolve(); + } + }, + // Callback for upload progress events: + progress: function (e, data) { + if (data.context) { + var progress = Math.floor(data.loaded / data.total * 100); + data.context.find('.progress') + .attr('aria-valuenow', progress) + .find('.bar').css( + 'width', + progress + '%' + ); + } + }, + // Callback for global upload progress events: + progressall: function (e, data) { + var $this = $(this), + progress = Math.floor(data.loaded / data.total * 100), + globalProgressNode = $this.find('.fileupload-progress'), + extendedProgressNode = globalProgressNode + .find('.progress-extended'); + if (extendedProgressNode.length) { + extendedProgressNode.html( + ($this.data('blueimp-fileupload') || $this.data('fileupload')) + ._renderExtendedProgress(data) + ); + } + globalProgressNode + .find('.progress') + .attr('aria-valuenow', progress) + .find('.bar').css( + 'width', + progress + '%' + ); + }, + // Callback for uploads start, equivalent to the global ajaxStart event: + start: function (e) { + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'); + that._resetFinishedDeferreds(); + that._transition($(this).find('.fileupload-progress')).done( + function () { + that._trigger('started', e); + } + ); + }, + // Callback for uploads stop, equivalent to the global ajaxStop event: + stop: function (e) { + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + deferred = that._addFinishedDeferreds(); + $.when.apply($, that._getFinishedDeferreds()) + .done(function () { + that._trigger('stopped', e); + }); + that._transition($(this).find('.fileupload-progress')).done( + function () { + $(this).find('.progress') + .attr('aria-valuenow', '0') + .find('.bar').css('width', '0%'); + $(this).find('.progress-extended').html(' '); + deferred.resolve(); + } + ); + }, + processstart: function () { + $(this).addClass('fileupload-processing'); + }, + processstop: function () { + $(this).removeClass('fileupload-processing'); + }, + // Callback for file deletion: + destroy: function (e, data) { + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'); + if (data.url) { + $.ajax(data).done(function () { + that._transition(data.context).done( + function () { + $(this).remove(); + that._trigger('destroyed', e, data); + } + ); + }); + } + } + }, + + _resetFinishedDeferreds: function () { + this._finishedUploads = []; + }, + + _addFinishedDeferreds: function (deferred) { + if (!deferred) { + deferred = $.Deferred(); + } + this._finishedUploads.push(deferred); + return deferred; + }, + + _getFinishedDeferreds: function () { + return this._finishedUploads; + }, + + // Link handler, that allows to download files + // by drag & drop of the links to the desktop: + _enableDragToDesktop: function () { + var link = $(this), + url = link.prop('href'), + name = link.prop('download'), + type = 'application/octet-stream'; + link.bind('dragstart', function (e) { + try { + e.originalEvent.dataTransfer.setData( + 'DownloadURL', + [type, name, url].join(':') + ); + } catch (ignore) {} + }); + }, + + _formatFileSize: function (bytes) { + if (typeof bytes !== 'number') { + return ''; + } + if (bytes >= 1000000000) { + return (bytes / 1000000000).toFixed(2) + ' GB'; + } + if (bytes >= 1000000) { + return (bytes / 1000000).toFixed(2) + ' MB'; + } + return (bytes / 1000).toFixed(2) + ' KB'; + }, + + _formatBitrate: function (bits) { + if (typeof bits !== 'number') { + return ''; + } + if (bits >= 1000000000) { + return (bits / 1000000000).toFixed(2) + ' Gbit/s'; + } + if (bits >= 1000000) { + return (bits / 1000000).toFixed(2) + ' Mbit/s'; + } + if (bits >= 1000) { + return (bits / 1000).toFixed(2) + ' kbit/s'; + } + return bits.toFixed(2) + ' bit/s'; + }, + + _formatTime: function (seconds) { + var date = new Date(seconds * 1000), + days = Math.floor(seconds / 86400); + days = days ? days + 'd ' : ''; + return days + + ('0' + date.getUTCHours()).slice(-2) + ':' + + ('0' + date.getUTCMinutes()).slice(-2) + ':' + + ('0' + date.getUTCSeconds()).slice(-2); + }, + + _formatPercentage: function (floatValue) { + return (floatValue * 100).toFixed(2) + ' %'; + }, + + _renderExtendedProgress: function (data) { + return this._formatBitrate(data.bitrate) + ' | ' + + this._formatTime( + (data.total - data.loaded) * 8 / data.bitrate + ) + ' | ' + + this._formatPercentage( + data.loaded / data.total + ) + ' | ' + + this._formatFileSize(data.loaded) + ' / ' + + this._formatFileSize(data.total); + }, + + _renderTemplate: function (func, files) { + if (!func) { + return $(); + } + var result = func({ + files: files, + formatFileSize: this._formatFileSize, + options: this.options + }); + if (result instanceof $) { + return result; + } + return $(this.options.templatesContainer).html(result).children(); + }, + + _renderPreviews: function (data) { + data.context.find('.preview').each(function (index, elm) { + $(elm).append(data.files[index].preview); + }); + }, + + _renderUpload: function (files) { + return this._renderTemplate( + this.options.uploadTemplate, + files + ); + }, + + _renderDownload: function (files) { + return this._renderTemplate( + this.options.downloadTemplate, + files + ).find('a[download]').each(this._enableDragToDesktop).end(); + }, + + _startHandler: function (e) { + e.preventDefault(); + var button = $(e.currentTarget), + template = button.closest('.template-upload'), + data = template.data('data'); + if (data && data.submit && !data.jqXHR && data.submit()) { + button.prop('disabled', true); + } + }, + + _cancelHandler: function (e) { + e.preventDefault(); + var template = $(e.currentTarget).closest('.template-upload'), + data = template.data('data') || {}; + if (!data.jqXHR) { + data.errorThrown = 'abort'; + this._trigger('fail', e, data); + } else { + data.jqXHR.abort(); + } + }, + + _deleteHandler: function (e) { + e.preventDefault(); + var button = $(e.currentTarget); + this._trigger('destroy', e, $.extend({ + context: button.closest('.template-download'), + type: 'DELETE' + }, button.data())); + }, + + _forceReflow: function (node) { + return $.support.transition && node.length && + node[0].offsetWidth; + }, + + _transition: function (node) { + var dfd = $.Deferred(); + if ($.support.transition && node.hasClass('fade') && node.is(':visible')) { + node.bind( + $.support.transition.end, + function (e) { + // Make sure we don't respond to other transitions events + // in the container element, e.g. from button elements: + if (e.target === node[0]) { + node.unbind($.support.transition.end); + dfd.resolveWith(node); + } + } + ).toggleClass('in'); + } else { + node.toggleClass('in'); + dfd.resolveWith(node); + } + return dfd; + }, + + _initButtonBarEventHandlers: function () { + var fileUploadButtonBar = this.element.find('.fileupload-buttonbar'), + filesList = this.options.filesContainer; + this._on(fileUploadButtonBar.find('.start'), { + click: function (e) { + e.preventDefault(); + filesList.find('.start').click(); + } + }); + this._on(fileUploadButtonBar.find('.cancel'), { + click: function (e) { + e.preventDefault(); + filesList.find('.cancel').click(); + } + }); + this._on(fileUploadButtonBar.find('.delete'), { + click: function (e) { + e.preventDefault(); + filesList.find('.toggle:checked') + .closest('.template-download') + .find('.delete').click(); + fileUploadButtonBar.find('.toggle') + .prop('checked', false); + } + }); + this._on(fileUploadButtonBar.find('.toggle'), { + change: function (e) { + filesList.find('.toggle').prop( + 'checked', + $(e.currentTarget).is(':checked') + ); + } + }); + }, + + _destroyButtonBarEventHandlers: function () { + this._off( + this.element.find('.fileupload-buttonbar') + .find('.start, .cancel, .delete'), + 'click' + ); + this._off( + this.element.find('.fileupload-buttonbar .toggle'), + 'change.' + ); + }, + + _initEventHandlers: function () { + this._super(); + this._on(this.options.filesContainer, { + 'click .start': this._startHandler, + 'click .cancel': this._cancelHandler, + 'click .delete': this._deleteHandler + }); + this._initButtonBarEventHandlers(); + }, + + _destroyEventHandlers: function () { + this._destroyButtonBarEventHandlers(); + this._off(this.options.filesContainer, 'click'); + this._super(); + }, + + _enableFileInputButton: function () { + this.element.find('.fileinput-button input') + .prop('disabled', false) + .parent().removeClass('disabled'); + }, + + _disableFileInputButton: function () { + this.element.find('.fileinput-button input') + .prop('disabled', true) + .parent().addClass('disabled'); + }, + + _initTemplates: function () { + var options = this.options; + options.templatesContainer = this.document[0].createElement( + options.filesContainer.prop('nodeName') + ); + if (tmpl) { + if (options.uploadTemplateId) { + options.uploadTemplate = tmpl(options.uploadTemplateId); + } + if (options.downloadTemplateId) { + options.downloadTemplate = tmpl(options.downloadTemplateId); + } + } + }, + + _initFilesContainer: function () { + var options = this.options; + if (options.filesContainer === undefined) { + options.filesContainer = this.element.find('.files'); + } else if (!(options.filesContainer instanceof $)) { + options.filesContainer = $(options.filesContainer); + } + }, + + _initSpecialOptions: function () { + this._super(); + this._initFilesContainer(); + this._initTemplates(); + }, + + _create: function () { + this._super(); + this._resetFinishedDeferreds(); + }, + + enable: function () { + var wasDisabled = false; + if (this.options.disabled) { + wasDisabled = true; + } + this._super(); + if (wasDisabled) { + this.element.find('input, button').prop('disabled', false); + this._enableFileInputButton(); + } + }, + + disable: function () { + if (!this.options.disabled) { + this.element.find('input, button').prop('disabled', true); + this._disableFileInputButton(); + } + this._super(); + } + + }); + +})); diff --git a/files_widget/static/files_widget/js/jquery.fileupload-validate.js b/files_widget/static/files_widget/js/jquery.fileupload-validate.js new file mode 100644 index 0000000..2599da8 --- /dev/null +++ b/files_widget/static/files_widget/js/jquery.fileupload-validate.js @@ -0,0 +1,116 @@ +/* + * jQuery File Upload Validation Plugin 1.0.2 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint nomen: true, unparam: true, regexp: true */ +/*global define, window */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload-process' + ], factory); + } else { + // Browser globals: + factory( + window.jQuery + ); + } +}(function ($) { + 'use strict'; + + // Append to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.push( + { + action: 'validate', + // Always trigger this action, + // even if the previous action was rejected: + always: true, + // Options taken from the global options map: + acceptFileTypes: '@acceptFileTypes', + maxFileSize: '@maxFileSize', + minFileSize: '@minFileSize', + maxNumberOfFiles: '@maxNumberOfFiles', + disabled: '@disableValidation' + } + ); + + // The File Upload Validation plugin extends the fileupload widget + // with file validation functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + /* + // The regular expression for allowed file types, matches + // against either file type or file name: + acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i, + // The maximum allowed file size in bytes: + maxFileSize: 10000000, // 10 MB + // The minimum allowed file size in bytes: + minFileSize: undefined, // No minimal file size + // The limit of files to be uploaded: + maxNumberOfFiles: 10, + */ + + // Function returning the current number of files, + // has to be overriden for maxNumberOfFiles validation: + getNumberOfFiles: $.noop, + + // Error and info messages: + messages: { + maxNumberOfFiles: 'Maximum number of files exceeded', + acceptFileTypes: 'File type not allowed', + maxFileSize: 'File is too large', + minFileSize: 'File is too small' + } + }, + + processActions: { + + validate: function (data, options) { + if (options.disabled) { + return data; + } + var dfd = $.Deferred(), + settings = this.options, + file = data.files[data.index], + numberOfFiles = settings.getNumberOfFiles(); + if (numberOfFiles && $.type(options.maxNumberOfFiles) === 'number' && + numberOfFiles + data.files.length > options.maxNumberOfFiles) { + file.error = settings.i18n('maxNumberOfFiles'); + } else if (options.acceptFileTypes && + !(options.acceptFileTypes.test(file.type) || + options.acceptFileTypes.test(file.name))) { + file.error = settings.i18n('acceptFileTypes'); + } else if (options.maxFileSize && file.size > options.maxFileSize) { + file.error = settings.i18n('maxFileSize'); + } else if ($.type(file.size) === 'number' && + file.size < options.minFileSize) { + file.error = settings.i18n('minFileSize'); + } else { + delete file.error; + } + if (file.error || data.files.error) { + data.files.error = true; + dfd.rejectWith(this, [data]); + } else { + dfd.resolveWith(this, [data]); + } + return dfd.promise(); + } + + } + + }); + +})); diff --git a/files_widget/static/files_widget/js/jquery.fileupload.js b/files_widget/static/files_widget/js/jquery.fileupload.js new file mode 100644 index 0000000..6956da5 --- /dev/null +++ b/files_widget/static/files_widget/js/jquery.fileupload.js @@ -0,0 +1,1301 @@ +/* + * jQuery File Upload Plugin 5.31.2 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint nomen: true, unparam: true, regexp: true */ +/*global define, window, document, File, Blob, FormData, location */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'jquery.ui.widget' + ], factory); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // The FileReader API is not actually used, but works as feature detection, + // as e.g. Safari supports XHR file uploads via the FormData API, + // but not non-multipart XHR file uploads: + $.support.xhrFileUpload = !!(window.XMLHttpRequestUpload && window.FileReader); + $.support.xhrFormDataFileUpload = !!window.FormData; + + // The fileupload widget listens for change events on file input fields defined + // via fileInput setting and paste or drop events of the given dropZone. + // In addition to the default jQuery Widget methods, the fileupload widget + // exposes the "add" and "send" methods, to add or directly send files using + // the fileupload API. + // By default, files added via file input selection, paste, drag & drop or + // "add" method are uploaded immediately, but it is possible to override + // the "add" callback option to queue file uploads. + $.widget('blueimp.fileupload', { + + options: { + // The drop target element(s), by the default the complete document. + // Set to null to disable drag & drop support: + dropZone: $(document), + // The paste target element(s), by the default the complete document. + // Set to null to disable paste support: + pasteZone: $(document), + // The file input field(s), that are listened to for change events. + // If undefined, it is set to the file input fields inside + // of the widget element on plugin initialization. + // Set to null to disable the change listener. + fileInput: undefined, + // By default, the file input field is replaced with a clone after + // each input field change event. This is required for iframe transport + // queues and allows change events to be fired for the same file + // selection, but can be disabled by setting the following option to false: + replaceFileInput: true, + // The parameter name for the file form data (the request argument name). + // If undefined or empty, the name property of the file input field is + // used, or "files[]" if the file input name property is also empty, + // can be a string or an array of strings: + paramName: undefined, + // By default, each file of a selection is uploaded using an individual + // request for XHR type uploads. Set to false to upload file + // selections in one request each: + singleFileUploads: true, + // To limit the number of files uploaded with one XHR request, + // set the following option to an integer greater than 0: + limitMultiFileUploads: undefined, + // Set the following option to true to issue all file upload requests + // in a sequential order: + sequentialUploads: false, + // To limit the number of concurrent uploads, + // set the following option to an integer greater than 0: + limitConcurrentUploads: undefined, + // Set the following option to true to force iframe transport uploads: + forceIframeTransport: false, + // Set the following option to the location of a redirect url on the + // origin server, for cross-domain iframe transport uploads: + redirect: undefined, + // The parameter name for the redirect url, sent as part of the form + // data and set to 'redirect' if this option is empty: + redirectParamName: undefined, + // Set the following option to the location of a postMessage window, + // to enable postMessage transport uploads: + postMessage: undefined, + // By default, XHR file uploads are sent as multipart/form-data. + // The iframe transport is always using multipart/form-data. + // Set to false to enable non-multipart XHR uploads: + multipart: true, + // To upload large files in smaller chunks, set the following option + // to a preferred maximum chunk size. If set to 0, null or undefined, + // or the browser does not support the required Blob API, files will + // be uploaded as a whole. + maxChunkSize: undefined, + // When a non-multipart upload or a chunked multipart upload has been + // aborted, this option can be used to resume the upload by setting + // it to the size of the already uploaded bytes. This option is most + // useful when modifying the options object inside of the "add" or + // "send" callbacks, as the options are cloned for each file upload. + uploadedBytes: undefined, + // By default, failed (abort or error) file uploads are removed from the + // global progress calculation. Set the following option to false to + // prevent recalculating the global progress data: + recalculateProgress: true, + // Interval in milliseconds to calculate and trigger progress events: + progressInterval: 100, + // Interval in milliseconds to calculate progress bitrate: + bitrateInterval: 500, + // By default, uploads are started automatically when adding files: + autoUpload: true, + + // Error and info messages: + messages: { + uploadedBytes: 'Uploaded bytes exceed file size' + }, + + // Translation function, gets the message key to be translated + // and an object with context specific data as arguments: + i18n: function (message, context) { + message = this.messages[message] || message.toString(); + if (context) { + $.each(context, function (key, value) { + message = message.replace('{' + key + '}', value); + }); + } + return message; + }, + + // Additional form data to be sent along with the file uploads can be set + // using this option, which accepts an array of objects with name and + // value properties, a function returning such an array, a FormData + // object (for XHR file uploads), or a simple object. + // The form of the first fileInput is given as parameter to the function: + formData: function (form) { + return form.serializeArray(); + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop, paste or add API call). + // If the singleFileUploads option is enabled, this callback will be + // called once for each file in the selection for XHR file uplaods, else + // once for each file selection. + // The upload starts when the submit method is invoked on the data parameter. + // The data object contains a files property holding the added files + // and allows to override plugin options as well as define ajax settings. + // Listeners for this callback can also be bound the following way: + // .bind('fileuploadadd', func); + // data.submit() returns a Promise object and allows to attach additional + // handlers using jQuery's Deferred callbacks: + // data.submit().done(func).fail(func).always(func); + add: function (e, data) { + if (data.autoUpload || (data.autoUpload !== false && + $(this).fileupload('option', 'autoUpload'))) { + data.process().done(function () { + data.submit(); + }); + } + }, + + // Other callbacks: + + // Callback for the submit event of each file upload: + // submit: function (e, data) {}, // .bind('fileuploadsubmit', func); + + // Callback for the start of each file upload request: + // send: function (e, data) {}, // .bind('fileuploadsend', func); + + // Callback for successful uploads: + // done: function (e, data) {}, // .bind('fileuploaddone', func); + + // Callback for failed (abort or error) uploads: + // fail: function (e, data) {}, // .bind('fileuploadfail', func); + + // Callback for completed (success, abort or error) requests: + // always: function (e, data) {}, // .bind('fileuploadalways', func); + + // Callback for upload progress events: + // progress: function (e, data) {}, // .bind('fileuploadprogress', func); + + // Callback for global upload progress events: + // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func); + + // Callback for uploads start, equivalent to the global ajaxStart event: + // start: function (e) {}, // .bind('fileuploadstart', func); + + // Callback for uploads stop, equivalent to the global ajaxStop event: + // stop: function (e) {}, // .bind('fileuploadstop', func); + + // Callback for change events of the fileInput(s): + // change: function (e, data) {}, // .bind('fileuploadchange', func); + + // Callback for paste events to the pasteZone(s): + // paste: function (e, data) {}, // .bind('fileuploadpaste', func); + + // Callback for drop events of the dropZone(s): + // drop: function (e, data) {}, // .bind('fileuploaddrop', func); + + // Callback for dragover events of the dropZone(s): + // dragover: function (e) {}, // .bind('fileuploaddragover', func); + + // Callback for the start of each chunk upload request: + // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func); + + // Callback for successful chunk uploads: + // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func); + + // Callback for failed (abort or error) chunk uploads: + // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func); + + // Callback for completed (success, abort or error) chunk upload requests: + // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func); + + // The plugin options are used as settings object for the ajax calls. + // The following are jQuery ajax settings required for the file uploads: + processData: false, + contentType: false, + cache: false + }, + + // A list of options that require reinitializing event listeners and/or + // special initialization code: + _specialOptions: [ + 'fileInput', + 'dropZone', + 'pasteZone', + 'multipart', + 'forceIframeTransport' + ], + + _BitrateTimer: function () { + this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime()); + this.loaded = 0; + this.bitrate = 0; + this.getBitrate = function (now, loaded, interval) { + var timeDiff = now - this.timestamp; + if (!this.bitrate || !interval || timeDiff > interval) { + this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8; + this.loaded = loaded; + this.timestamp = now; + } + return this.bitrate; + }; + }, + + _isXHRUpload: function (options) { + return !options.forceIframeTransport && + ((!options.multipart && $.support.xhrFileUpload) || + $.support.xhrFormDataFileUpload); + }, + + _getFormData: function (options) { + var formData; + if (typeof options.formData === 'function') { + return options.formData(options.form); + } + if ($.isArray(options.formData)) { + return options.formData; + } + if ($.type(options.formData) === 'object') { + formData = []; + $.each(options.formData, function (name, value) { + formData.push({name: name, value: value}); + }); + return formData; + } + return []; + }, + + _getTotal: function (files) { + var total = 0; + $.each(files, function (index, file) { + total += file.size || 1; + }); + return total; + }, + + _initProgressObject: function (obj) { + var progress = { + loaded: 0, + total: 0, + bitrate: 0 + }; + if (obj._progress) { + $.extend(obj._progress, progress); + } else { + obj._progress = progress; + } + }, + + _initResponseObject: function (obj) { + var prop; + if (obj._response) { + for (prop in obj._response) { + if (obj._response.hasOwnProperty(prop)) { + delete obj._response[prop]; + } + } + } else { + obj._response = {}; + } + }, + + _onProgress: function (e, data) { + if (e.lengthComputable) { + var now = ((Date.now) ? Date.now() : (new Date()).getTime()), + loaded; + if (data._time && data.progressInterval && + (now - data._time < data.progressInterval) && + e.loaded !== e.total) { + return; + } + data._time = now; + loaded = Math.floor( + e.loaded / e.total * (data.chunkSize || data._progress.total) + ) + (data.uploadedBytes || 0); + // Add the difference from the previously loaded state + // to the global loaded counter: + this._progress.loaded += (loaded - data._progress.loaded); + this._progress.bitrate = this._bitrateTimer.getBitrate( + now, + this._progress.loaded, + data.bitrateInterval + ); + data._progress.loaded = data.loaded = loaded; + data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate( + now, + loaded, + data.bitrateInterval + ); + // Trigger a custom progress event with a total data property set + // to the file size(s) of the current upload and a loaded data + // property calculated accordingly: + this._trigger('progress', e, data); + // Trigger a global progress event for all current file uploads, + // including ajax calls queued for sequential file uploads: + this._trigger('progressall', e, this._progress); + } + }, + + _initProgressListener: function (options) { + var that = this, + xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr(); + // Accesss to the native XHR object is required to add event listeners + // for the upload progress event: + if (xhr.upload) { + $(xhr.upload).bind('progress', function (e) { + var oe = e.originalEvent; + // Make sure the progress event properties get copied over: + e.lengthComputable = oe.lengthComputable; + e.loaded = oe.loaded; + e.total = oe.total; + that._onProgress(e, options); + }); + options.xhr = function () { + return xhr; + }; + } + }, + + _isInstanceOf: function (type, obj) { + // Cross-frame instanceof check + return Object.prototype.toString.call(obj) === '[object ' + type + ']'; + }, + + _initXHRData: function (options) { + var that = this, + formData, + file = options.files[0], + // Ignore non-multipart setting if not supported: + multipart = options.multipart || !$.support.xhrFileUpload, + paramName = options.paramName[0]; + options.headers = options.headers || {}; + if (options.contentRange) { + options.headers['Content-Range'] = options.contentRange; + } + if (!multipart) { + options.headers['Content-Disposition'] = 'attachment; filename="' + + encodeURI(file.name) + '"'; + options.contentType = file.type; + options.data = options.blob || file; + } else if ($.support.xhrFormDataFileUpload) { + if (options.postMessage) { + // window.postMessage does not allow sending FormData + // objects, so we just add the File/Blob objects to + // the formData array and let the postMessage window + // create the FormData object out of this array: + formData = this._getFormData(options); + if (options.blob) { + formData.push({ + name: paramName, + value: options.blob + }); + } else { + $.each(options.files, function (index, file) { + formData.push({ + name: options.paramName[index] || paramName, + value: file + }); + }); + } + } else { + if (that._isInstanceOf('FormData', options.formData)) { + formData = options.formData; + } else { + formData = new FormData(); + $.each(this._getFormData(options), function (index, field) { + formData.append(field.name, field.value); + }); + } + if (options.blob) { + options.headers['Content-Disposition'] = 'attachment; filename="' + + encodeURI(file.name) + '"'; + formData.append(paramName, options.blob, file.name); + } else { + $.each(options.files, function (index, file) { + // This check allows the tests to run with + // dummy objects: + if (that._isInstanceOf('File', file) || + that._isInstanceOf('Blob', file)) { + formData.append( + options.paramName[index] || paramName, + file, + file.name + ); + } + }); + } + } + options.data = formData; + } + // Blob reference is not needed anymore, free memory: + options.blob = null; + }, + + _initIframeSettings: function (options) { + var targetHost = $('').prop('href', options.url).prop('host'); + // Setting the dataType to iframe enables the iframe transport: + options.dataType = 'iframe ' + (options.dataType || ''); + // The iframe transport accepts a serialized array as form data: + options.formData = this._getFormData(options); + // Add redirect url to form data on cross-domain uploads: + if (options.redirect && targetHost && targetHost !== location.host) { + options.formData.push({ + name: options.redirectParamName || 'redirect', + value: options.redirect + }); + } + }, + + _initDataSettings: function (options) { + if (this._isXHRUpload(options)) { + if (!this._chunkedUpload(options, true)) { + if (!options.data) { + this._initXHRData(options); + } + this._initProgressListener(options); + } + if (options.postMessage) { + // Setting the dataType to postmessage enables the + // postMessage transport: + options.dataType = 'postmessage ' + (options.dataType || ''); + } + } else { + this._initIframeSettings(options); + } + }, + + _getParamName: function (options) { + var fileInput = $(options.fileInput), + paramName = options.paramName; + if (!paramName) { + paramName = []; + fileInput.each(function () { + var input = $(this), + name = input.prop('name') || 'files[]', + i = (input.prop('files') || [1]).length; + while (i) { + paramName.push(name); + i -= 1; + } + }); + if (!paramName.length) { + paramName = [fileInput.prop('name') || 'files[]']; + } + } else if (!$.isArray(paramName)) { + paramName = [paramName]; + } + return paramName; + }, + + _initFormSettings: function (options) { + // Retrieve missing options from the input field and the + // associated form, if available: + if (!options.form || !options.form.length) { + options.form = $(options.fileInput.prop('form')); + // If the given file input doesn't have an associated form, + // use the default widget file input's form: + if (!options.form.length) { + options.form = $(this.options.fileInput.prop('form')); + } + } + options.paramName = this._getParamName(options); + if (!options.url) { + options.url = options.form.prop('action') || location.href; + } + // The HTTP request method must be "POST" or "PUT": + options.type = (options.type || options.form.prop('method') || '') + .toUpperCase(); + if (options.type !== 'POST' && options.type !== 'PUT' && + options.type !== 'PATCH') { + options.type = 'POST'; + } + if (!options.formAcceptCharset) { + options.formAcceptCharset = options.form.attr('accept-charset'); + } + }, + + _getAJAXSettings: function (data) { + var options = $.extend({}, this.options, data); + this._initFormSettings(options); + this._initDataSettings(options); + return options; + }, + + // jQuery 1.6 doesn't provide .state(), + // while jQuery 1.8+ removed .isRejected() and .isResolved(): + _getDeferredState: function (deferred) { + if (deferred.state) { + return deferred.state(); + } + if (deferred.isResolved()) { + return 'resolved'; + } + if (deferred.isRejected()) { + return 'rejected'; + } + return 'pending'; + }, + + // Maps jqXHR callbacks to the equivalent + // methods of the given Promise object: + _enhancePromise: function (promise) { + promise.success = promise.done; + promise.error = promise.fail; + promise.complete = promise.always; + return promise; + }, + + // Creates and returns a Promise object enhanced with + // the jqXHR methods abort, success, error and complete: + _getXHRPromise: function (resolveOrReject, context, args) { + var dfd = $.Deferred(), + promise = dfd.promise(); + context = context || this.options.context || promise; + if (resolveOrReject === true) { + dfd.resolveWith(context, args); + } else if (resolveOrReject === false) { + dfd.rejectWith(context, args); + } + promise.abort = dfd.promise; + return this._enhancePromise(promise); + }, + + // Adds convenience methods to the data callback argument: + _addConvenienceMethods: function (e, data) { + var that = this, + getPromise = function (data) { + return $.Deferred().resolveWith(that, [data]).promise(); + }; + data.process = function (resolveFunc, rejectFunc) { + if (resolveFunc || rejectFunc) { + data._processQueue = this._processQueue = + (this._processQueue || getPromise(this)) + .pipe(resolveFunc, rejectFunc); + } + return this._processQueue || getPromise(this); + }; + data.submit = function () { + if (this.state() !== 'pending') { + data.jqXHR = this.jqXHR = + (that._trigger('submit', e, this) !== false) && + that._onSend(e, this); + } + return this.jqXHR || that._getXHRPromise(); + }; + data.abort = function () { + if (this.jqXHR) { + return this.jqXHR.abort(); + } + return that._getXHRPromise(); + }; + data.state = function () { + if (this.jqXHR) { + return that._getDeferredState(this.jqXHR); + } + if (this._processQueue) { + return that._getDeferredState(this._processQueue); + } + }; + data.progress = function () { + return this._progress; + }; + data.response = function () { + return this._response; + }; + }, + + // Parses the Range header from the server response + // and returns the uploaded bytes: + _getUploadedBytes: function (jqXHR) { + var range = jqXHR.getResponseHeader('Range'), + parts = range && range.split('-'), + upperBytesPos = parts && parts.length > 1 && + parseInt(parts[1], 10); + return upperBytesPos && upperBytesPos + 1; + }, + + // Uploads a file in multiple, sequential requests + // by splitting the file up in multiple blob chunks. + // If the second parameter is true, only tests if the file + // should be uploaded in chunks, but does not invoke any + // upload requests: + _chunkedUpload: function (options, testOnly) { + var that = this, + file = options.files[0], + fs = file.size, + ub = options.uploadedBytes = options.uploadedBytes || 0, + mcs = options.maxChunkSize || fs, + slice = file.slice || file.webkitSlice || file.mozSlice, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + upload; + if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) || + options.data) { + return false; + } + if (testOnly) { + return true; + } + if (ub >= fs) { + file.error = options.i18n('uploadedBytes'); + return this._getXHRPromise( + false, + options.context, + [null, 'error', file.error] + ); + } + // The chunk upload method: + upload = function () { + // Clone the options object for each chunk upload: + var o = $.extend({}, options), + currentLoaded = o._progress.loaded; + o.blob = slice.call( + file, + ub, + ub + mcs, + file.type + ); + // Store the current chunk size, as the blob itself + // will be dereferenced after data processing: + o.chunkSize = o.blob.size; + // Expose the chunk bytes position range: + o.contentRange = 'bytes ' + ub + '-' + + (ub + o.chunkSize - 1) + '/' + fs; + // Process the upload data (the blob and potential form data): + that._initXHRData(o); + // Add progress listeners for this chunk upload: + that._initProgressListener(o); + jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) || + that._getXHRPromise(false, o.context)) + .done(function (result, textStatus, jqXHR) { + ub = that._getUploadedBytes(jqXHR) || + (ub + o.chunkSize); + // Create a progress event if no final progress event + // with loaded equaling total has been triggered + // for this chunk: + if (currentLoaded + o.chunkSize - o._progress.loaded) { + that._onProgress($.Event('progress', { + lengthComputable: true, + loaded: ub - o.uploadedBytes, + total: ub - o.uploadedBytes + }), o); + } + options.uploadedBytes = o.uploadedBytes = ub; + o.result = result; + o.textStatus = textStatus; + o.jqXHR = jqXHR; + that._trigger('chunkdone', null, o); + that._trigger('chunkalways', null, o); + if (ub < fs) { + // File upload not yet complete, + // continue with the next chunk: + upload(); + } else { + dfd.resolveWith( + o.context, + [result, textStatus, jqXHR] + ); + } + }) + .fail(function (jqXHR, textStatus, errorThrown) { + o.jqXHR = jqXHR; + o.textStatus = textStatus; + o.errorThrown = errorThrown; + that._trigger('chunkfail', null, o); + that._trigger('chunkalways', null, o); + dfd.rejectWith( + o.context, + [jqXHR, textStatus, errorThrown] + ); + }); + }; + this._enhancePromise(promise); + promise.abort = function () { + return jqXHR.abort(); + }; + upload(); + return promise; + }, + + _beforeSend: function (e, data) { + if (this._active === 0) { + // the start callback is triggered when an upload starts + // and no other uploads are currently running, + // equivalent to the global ajaxStart event: + this._trigger('start'); + // Set timer for global bitrate progress calculation: + this._bitrateTimer = new this._BitrateTimer(); + // Reset the global progress values: + this._progress.loaded = this._progress.total = 0; + this._progress.bitrate = 0; + } + // Make sure the container objects for the .response() and + // .progress() methods on the data object are available + // and reset to their initial state: + this._initResponseObject(data); + this._initProgressObject(data); + data._progress.loaded = data.loaded = data.uploadedBytes || 0; + data._progress.total = data.total = this._getTotal(data.files) || 1; + data._progress.bitrate = data.bitrate = 0; + this._active += 1; + // Initialize the global progress values: + this._progress.loaded += data.loaded; + this._progress.total += data.total; + }, + + _onDone: function (result, textStatus, jqXHR, options) { + var total = options._progress.total, + response = options._response; + if (options._progress.loaded < total) { + // Create a progress event if no final progress event + // with loaded equaling total has been triggered: + this._onProgress($.Event('progress', { + lengthComputable: true, + loaded: total, + total: total + }), options); + } + response.result = options.result = result; + response.textStatus = options.textStatus = textStatus; + response.jqXHR = options.jqXHR = jqXHR; + this._trigger('done', null, options); + }, + + _onFail: function (jqXHR, textStatus, errorThrown, options) { + var response = options._response; + if (options.recalculateProgress) { + // Remove the failed (error or abort) file upload from + // the global progress calculation: + this._progress.loaded -= options._progress.loaded; + this._progress.total -= options._progress.total; + } + response.jqXHR = options.jqXHR = jqXHR; + response.textStatus = options.textStatus = textStatus; + response.errorThrown = options.errorThrown = errorThrown; + this._trigger('fail', null, options); + }, + + _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) { + // jqXHRorResult, textStatus and jqXHRorError are added to the + // options object via done and fail callbacks + this._trigger('always', null, options); + }, + + _onSend: function (e, data) { + if (!data.submit) { + this._addConvenienceMethods(e, data); + } + var that = this, + jqXHR, + aborted, + slot, + pipe, + options = that._getAJAXSettings(data), + send = function () { + that._sending += 1; + // Set timer for bitrate progress calculation: + options._bitrateTimer = new that._BitrateTimer(); + jqXHR = jqXHR || ( + ((aborted || that._trigger('send', e, options) === false) && + that._getXHRPromise(false, options.context, aborted)) || + that._chunkedUpload(options) || $.ajax(options) + ).done(function (result, textStatus, jqXHR) { + that._onDone(result, textStatus, jqXHR, options); + }).fail(function (jqXHR, textStatus, errorThrown) { + that._onFail(jqXHR, textStatus, errorThrown, options); + }).always(function (jqXHRorResult, textStatus, jqXHRorError) { + that._onAlways( + jqXHRorResult, + textStatus, + jqXHRorError, + options + ); + that._sending -= 1; + that._active -= 1; + if (options.limitConcurrentUploads && + options.limitConcurrentUploads > that._sending) { + // Start the next queued upload, + // that has not been aborted: + var nextSlot = that._slots.shift(); + while (nextSlot) { + if (that._getDeferredState(nextSlot) === 'pending') { + nextSlot.resolve(); + break; + } + nextSlot = that._slots.shift(); + } + } + if (that._active === 0) { + // The stop callback is triggered when all uploads have + // been completed, equivalent to the global ajaxStop event: + that._trigger('stop'); + } + }); + return jqXHR; + }; + this._beforeSend(e, options); + if (this.options.sequentialUploads || + (this.options.limitConcurrentUploads && + this.options.limitConcurrentUploads <= this._sending)) { + if (this.options.limitConcurrentUploads > 1) { + slot = $.Deferred(); + this._slots.push(slot); + pipe = slot.pipe(send); + } else { + pipe = (this._sequence = this._sequence.pipe(send, send)); + } + // Return the piped Promise object, enhanced with an abort method, + // which is delegated to the jqXHR object of the current upload, + // and jqXHR callbacks mapped to the equivalent Promise methods: + pipe.abort = function () { + aborted = [undefined, 'abort', 'abort']; + if (!jqXHR) { + if (slot) { + slot.rejectWith(options.context, aborted); + } + return send(); + } + return jqXHR.abort(); + }; + return this._enhancePromise(pipe); + } + return send(); + }, + + _onAdd: function (e, data) { + var that = this, + result = true, + options = $.extend({}, this.options, data), + limit = options.limitMultiFileUploads, + paramName = this._getParamName(options), + paramNameSet, + paramNameSlice, + fileSet, + i; + if (!(options.singleFileUploads || limit) || + !this._isXHRUpload(options)) { + fileSet = [data.files]; + paramNameSet = [paramName]; + } else if (!options.singleFileUploads && limit) { + fileSet = []; + paramNameSet = []; + for (i = 0; i < data.files.length; i += limit) { + fileSet.push(data.files.slice(i, i + limit)); + paramNameSlice = paramName.slice(i, i + limit); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); + } + } else { + paramNameSet = paramName; + } + data.originalFiles = data.files; + $.each(fileSet || data.files, function (index, element) { + var newData = $.extend({}, data); + newData.files = fileSet ? element : [element]; + newData.paramName = paramNameSet[index]; + that._initResponseObject(newData); + that._initProgressObject(newData); + that._addConvenienceMethods(e, newData); + result = that._trigger('add', e, newData); + return result; + }); + return result; + }, + + _replaceFileInput: function (input) { + var inputClone = input.clone(true); + $('

    ').append(inputClone)[0].reset(); + // Detaching allows to insert the fileInput on another form + // without loosing the file input value: + input.after(inputClone).detach(); + // Avoid memory leaks with the detached file input: + $.cleanData(input.unbind('remove')); + // Replace the original file input element in the fileInput + // elements set with the clone, which has been copied including + // event handlers: + this.options.fileInput = this.options.fileInput.map(function (i, el) { + if (el === input[0]) { + return inputClone[0]; + } + return el; + }); + // If the widget has been initialized on the file input itself, + // override this.element with the file input clone: + if (input[0] === this.element[0]) { + this.element = inputClone; + } + }, + + _handleFileTreeEntry: function (entry, path) { + var that = this, + dfd = $.Deferred(), + errorHandler = function (e) { + if (e && !e.entry) { + e.entry = entry; + } + // Since $.when returns immediately if one + // Deferred is rejected, we use resolve instead. + // This allows valid files and invalid items + // to be returned together in one set: + dfd.resolve([e]); + }, + dirReader; + path = path || ''; + if (entry.isFile) { + if (entry._file) { + // Workaround for Chrome bug #149735 + entry._file.relativePath = path; + dfd.resolve(entry._file); + } else { + entry.file(function (file) { + file.relativePath = path; + dfd.resolve(file); + }, errorHandler); + } + } else if (entry.isDirectory) { + dirReader = entry.createReader(); + dirReader.readEntries(function (entries) { + that._handleFileTreeEntries( + entries, + path + entry.name + '/' + ).done(function (files) { + dfd.resolve(files); + }).fail(errorHandler); + }, errorHandler); + } else { + // Return an empy list for file system items + // other than files or directories: + dfd.resolve([]); + } + return dfd.promise(); + }, + + _handleFileTreeEntries: function (entries, path) { + var that = this; + return $.when.apply( + $, + $.map(entries, function (entry) { + return that._handleFileTreeEntry(entry, path); + }) + ).pipe(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _getDroppedFiles: function (dataTransfer) { + dataTransfer = dataTransfer || {}; + var items = dataTransfer.items; + if (items && items.length && (items[0].webkitGetAsEntry || + items[0].getAsEntry)) { + return this._handleFileTreeEntries( + $.map(items, function (item) { + var entry; + if (item.webkitGetAsEntry) { + entry = item.webkitGetAsEntry(); + if (entry) { + // Workaround for Chrome bug #149735: + entry._file = item.getAsFile(); + } + return entry; + } + return item.getAsEntry(); + }) + ); + } + return $.Deferred().resolve( + $.makeArray(dataTransfer.files) + ).promise(); + }, + + _getSingleFileInputFiles: function (fileInput) { + fileInput = $(fileInput); + var entries = fileInput.prop('webkitEntries') || + fileInput.prop('entries'), + files, + value; + if (entries && entries.length) { + return this._handleFileTreeEntries(entries); + } + files = $.makeArray(fileInput.prop('files')); + if (!files.length) { + value = fileInput.prop('value'); + if (!value) { + return $.Deferred().resolve([]).promise(); + } + // If the files property is not available, the browser does not + // support the File API and we add a pseudo File object with + // the input value as name with path information removed: + files = [{name: value.replace(/^.*\\/, '')}]; + } else if (files[0].name === undefined && files[0].fileName) { + // File normalization for Safari 4 and Firefox 3: + $.each(files, function (index, file) { + file.name = file.fileName; + file.size = file.fileSize; + }); + } + return $.Deferred().resolve(files).promise(); + }, + + _getFileInputFiles: function (fileInput) { + if (!(fileInput instanceof $) || fileInput.length === 1) { + return this._getSingleFileInputFiles(fileInput); + } + return $.when.apply( + $, + $.map(fileInput, this._getSingleFileInputFiles) + ).pipe(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _onChange: function (e) { + var that = this, + data = { + fileInput: $(e.target), + form: $(e.target.form) + }; + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + if (that.options.replaceFileInput) { + that._replaceFileInput(data.fileInput); + } + if (that._trigger('change', e, data) !== false) { + that._onAdd(e, data); + } + }); + }, + + _onPaste: function (e) { + var items = e.originalEvent && e.originalEvent.clipboardData && + e.originalEvent.clipboardData.items, + data = {files: []}; + if (items && items.length) { + $.each(items, function (index, item) { + var file = item.getAsFile && item.getAsFile(); + if (file) { + data.files.push(file); + } + }); + if (this._trigger('paste', e, data) === false || + this._onAdd(e, data) === false) { + return false; + } + } + }, + + _onDrop: function (e) { + var that = this, + dataTransfer = e.dataTransfer = e.originalEvent && + e.originalEvent.dataTransfer, + data = {}; + if (dataTransfer && dataTransfer.files && dataTransfer.files.length) { + e.preventDefault(); + this._getDroppedFiles(dataTransfer).always(function (files) { + data.files = files; + if (that._trigger('drop', e, data) !== false) { + that._onAdd(e, data); + } + }); + } + }, + + _onDragOver: function (e) { + var dataTransfer = e.dataTransfer = e.originalEvent && + e.originalEvent.dataTransfer; + if (dataTransfer) { + if (this._trigger('dragover', e) === false) { + return false; + } + if ($.inArray('Files', dataTransfer.types) !== -1) { + dataTransfer.dropEffect = 'copy'; + e.preventDefault(); + } + } + }, + + _initEventHandlers: function () { + if (this._isXHRUpload(this.options)) { + this._on(this.options.dropZone, { + dragover: this._onDragOver, + drop: this._onDrop + }); + this._on(this.options.pasteZone, { + paste: this._onPaste + }); + } + this._on(this.options.fileInput, { + change: this._onChange + }); + }, + + _destroyEventHandlers: function () { + this._off(this.options.dropZone, 'dragover drop'); + this._off(this.options.pasteZone, 'paste'); + this._off(this.options.fileInput, 'change'); + }, + + _setOption: function (key, value) { + var reinit = $.inArray(key, this._specialOptions) !== -1; + if (reinit) { + this._destroyEventHandlers(); + } + this._super(key, value); + if (reinit) { + this._initSpecialOptions(); + this._initEventHandlers(); + } + }, + + _initSpecialOptions: function () { + var options = this.options; + if (options.fileInput === undefined) { + options.fileInput = this.element.is('input[type="file"]') ? + this.element : this.element.find('input[type="file"]'); + } else if (!(options.fileInput instanceof $)) { + options.fileInput = $(options.fileInput); + } + if (!(options.dropZone instanceof $)) { + options.dropZone = $(options.dropZone); + } + if (!(options.pasteZone instanceof $)) { + options.pasteZone = $(options.pasteZone); + } + }, + + _getRegExp: function (str) { + var parts = str.split('/'), + modifiers = parts.pop(); + parts.shift(); + return new RegExp(parts.join('/'), modifiers); + }, + + _isRegExpOption: function (key, value) { + return key !== 'url' && $.type(value) === 'string' && + /^\/.*\/[igm]{0,3}$/.test(value); + }, + + _initDataAttributes: function () { + var that = this, + options = this.options; + // Initialize options set via HTML5 data-attributes: + $.each( + $(this.element[0].cloneNode(false)).data(), + function (key, value) { + if (that._isRegExpOption(key, value)) { + value = that._getRegExp(value); + } + options[key] = value; + } + ); + }, + + _create: function () { + this._initDataAttributes(); + this._initSpecialOptions(); + this._slots = []; + this._sequence = this._getXHRPromise(true); + this._sending = this._active = 0; + this._initProgressObject(this); + this._initEventHandlers(); + }, + + // This method is exposed to the widget API and allows to query + // the number of active uploads: + active: function () { + return this._active; + }, + + // This method is exposed to the widget API and allows to query + // the widget upload progress. + // It returns an object with loaded, total and bitrate properties + // for the running uploads: + progress: function () { + return this._progress; + }, + + // This method is exposed to the widget API and allows adding files + // using the fileupload API. The data parameter accepts an object which + // must have a files property and can contain additional options: + // .fileupload('add', {files: filesList}); + add: function (data) { + var that = this; + if (!data || this.options.disabled) { + return; + } + if (data.fileInput && !data.files) { + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + that._onAdd(null, data); + }); + } else { + data.files = $.makeArray(data.files); + this._onAdd(null, data); + } + }, + + // This method is exposed to the widget API and allows sending files + // using the fileupload API. The data parameter accepts an object which + // must have a files or fileInput property and can contain additional options: + // .fileupload('send', {files: filesList}); + // The method returns a Promise object for the file upload call. + send: function (data) { + if (data && !this.options.disabled) { + if (data.fileInput && !data.files) { + var that = this, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + aborted; + promise.abort = function () { + aborted = true; + if (jqXHR) { + return jqXHR.abort(); + } + dfd.reject(null, 'abort', 'abort'); + return promise; + }; + this._getFileInputFiles(data.fileInput).always( + function (files) { + if (aborted) { + return; + } + data.files = files; + jqXHR = that._onSend(null, data).then( + function (result, textStatus, jqXHR) { + dfd.resolve(result, textStatus, jqXHR); + }, + function (jqXHR, textStatus, errorThrown) { + dfd.reject(jqXHR, textStatus, errorThrown); + } + ); + } + ); + return this._enhancePromise(promise); + } + data.files = $.makeArray(data.files); + if (data.files.length) { + return this._onSend(null, data); + } + } + return this._getXHRPromise(false, data && data.context); + } + + }); + +})); diff --git a/files_widget/static/files_widget/js/jquery.iframe-transport.js b/files_widget/static/files_widget/js/jquery.iframe-transport.js new file mode 100644 index 0000000..073c5fb --- /dev/null +++ b/files_widget/static/files_widget/js/jquery.iframe-transport.js @@ -0,0 +1,205 @@ +/* + * jQuery Iframe Transport Plugin 1.7 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint unparam: true, nomen: true */ +/*global define, window, document */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery'], factory); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // Helper variable to create unique names for the transport iframes: + var counter = 0; + + // The iframe transport accepts three additional options: + // options.fileInput: a jQuery collection of file input fields + // options.paramName: the parameter name for the file form data, + // overrides the name property of the file input field(s), + // can be a string or an array of strings. + // options.formData: an array of objects with name and value properties, + // equivalent to the return data of .serializeArray(), e.g.: + // [{name: 'a', value: 1}, {name: 'b', value: 2}] + $.ajaxTransport('iframe', function (options) { + if (options.async) { + var form, + iframe, + addParamChar; + return { + send: function (_, completeCallback) { + form = $('
    '); + form.attr('accept-charset', options.formAcceptCharset); + addParamChar = /\?/.test(options.url) ? '&' : '?'; + // XDomainRequest only supports GET and POST: + if (options.type === 'DELETE') { + options.url = options.url + addParamChar + '_method=DELETE'; + options.type = 'POST'; + } else if (options.type === 'PUT') { + options.url = options.url + addParamChar + '_method=PUT'; + options.type = 'POST'; + } else if (options.type === 'PATCH') { + options.url = options.url + addParamChar + '_method=PATCH'; + options.type = 'POST'; + } + // javascript:false as initial iframe src + // prevents warning popups on HTTPS in IE6. + // IE versions below IE8 cannot set the name property of + // elements that have already been added to the DOM, + // so we set the name along with the iframe HTML markup: + counter += 1; + iframe = $( + '' + ).bind('load', function () { + var fileInputClones, + paramNames = $.isArray(options.paramName) ? + options.paramName : [options.paramName]; + iframe + .unbind('load') + .bind('load', function () { + var response; + // Wrap in a try/catch block to catch exceptions thrown + // when trying to access cross-domain iframe contents: + try { + response = iframe.contents(); + // Google Chrome and Firefox do not throw an + // exception when calling iframe.contents() on + // cross-domain requests, so we unify the response: + if (!response.length || !response[0].firstChild) { + throw new Error(); + } + } catch (e) { + response = undefined; + } + // The complete callback returns the + // iframe content document as response object: + completeCallback( + 200, + 'success', + {'iframe': response} + ); + // Fix for IE endless progress bar activity bug + // (happens on form submits to iframe targets): + $('') + .appendTo(form); + window.setTimeout(function () { + // Removing the form in a setTimeout call + // allows Chrome's developer tools to display + // the response result + form.remove(); + }, 0); + }); + form + .prop('target', iframe.prop('name')) + .prop('action', options.url) + .prop('method', options.type); + if (options.formData) { + $.each(options.formData, function (index, field) { + $('') + .prop('name', field.name) + .val(field.value) + .appendTo(form); + }); + } + if (options.fileInput && options.fileInput.length && + options.type === 'POST') { + fileInputClones = options.fileInput.clone(); + // Insert a clone for each file input field: + options.fileInput.after(function (index) { + return fileInputClones[index]; + }); + if (options.paramName) { + options.fileInput.each(function (index) { + $(this).prop( + 'name', + paramNames[index] || options.paramName + ); + }); + } + // Appending the file input fields to the hidden form + // removes them from their original location: + form + .append(options.fileInput) + .prop('enctype', 'multipart/form-data') + // enctype must be set as encoding for IE: + .prop('encoding', 'multipart/form-data'); + } + form.submit(); + // Insert the file input fields at their original location + // by replacing the clones with the originals: + if (fileInputClones && fileInputClones.length) { + options.fileInput.each(function (index, input) { + var clone = $(fileInputClones[index]); + $(input).prop('name', clone.prop('name')); + clone.replaceWith(input); + }); + } + }); + form.append(iframe).appendTo(document.body); + }, + abort: function () { + if (iframe) { + // javascript:false as iframe src aborts the request + // and prevents warning popups on HTTPS in IE6. + // concat is used to avoid the "Script URL" JSLint error: + iframe + .unbind('load') + .prop('src', 'javascript'.concat(':false;')); + } + if (form) { + form.remove(); + } + } + }; + } + }); + + // The iframe transport returns the iframe content document as response. + // The following adds converters from iframe to text, json, html, xml + // and script. + // Please note that the Content-Type for JSON responses has to be text/plain + // or text/html, if the browser doesn't include application/json in the + // Accept header, else IE will show a download dialog. + // The Content-Type for XML responses on the other hand has to be always + // application/xml or text/xml, so IE properly parses the XML response. + // See also + // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation + $.ajaxSetup({ + converters: { + 'iframe text': function (iframe) { + return iframe && $(iframe[0].body).text(); + }, + 'iframe json': function (iframe) { + return iframe && $.parseJSON($(iframe[0].body).text()); + }, + 'iframe html': function (iframe) { + return iframe && $(iframe[0].body).html(); + }, + 'iframe xml': function (iframe) { + var xmlDoc = iframe && iframe[0]; + return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc : + $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) || + $(xmlDoc.body).html()); + }, + 'iframe script': function (iframe) { + return iframe && $.globalEval($(iframe[0].body).text()); + } + } + }); + +})); diff --git a/files_widget/static/files_widget/js/widgets.js b/files_widget/static/files_widget/js/widgets.js new file mode 100644 index 0000000..c311a1e --- /dev/null +++ b/files_widget/static/files_widget/js/widgets.js @@ -0,0 +1,485 @@ +$(function(){ + + var csrfToken = getCookie('csrftoken'), + widget = $('.files-widget'), + effectTime = 200, + mediaURL = $('[data-media-url]').data('media-url'), + staticURL = $('[data-static-url]').data('static-url'), + thumbnailURL = $('[data-get-thumbnail-url]').data('get-thumbnail-url'), + undoText = $('[data-undo-text]').data('undo-text'), + template, + deletedTemplate; + + template = + '
    '+ + ''+ + ''+ + ''+ + ''+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + + deletedTemplate = + '
    '+ + ''+ + ''+ + ''+ + ''+ + ''+ + ''+ + undoText+ + ''+ + ''+ + '
    '; + + function splitlines(str) { + return str.match(/[^\r\n]+/g) || []; + } + + function filenameFromPath(path) { + return path.replace(/^.+\//, ''); + } + + function stripMediaURL(path) { + if (path.indexOf(mediaURL) === 0) { + return path.replace(mediaURL, ''); + } + return path; + } + + function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + + function numberformat( number, decimals, dec_point, thousands_sep ) { + // http://kevin.vanzonneveld.net + // + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) + // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) + // * example 1: number_format(1234.5678, 2, '.', ''); + // * returns 1: 1234.57 + + var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals; + var d = dec_point == undefined ? "," : dec_point; + var t = thousands_sep == undefined ? "." : thousands_sep, s = n < 0 ? "-" : ""; + var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0; + + return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ""); + } + + function sizeformat(filesize, bits) { + var b = 'B'; + if (bits) { + b = 'b'; + } + + // from http://snipplr.com/view/5945/javascript-numberformat--ported-from-php/ + if (filesize >= 1073741824) { + filesize = numberformat(filesize / 1073741824, 2, '.', '') + 'G' + b; + } else { + if (filesize >= 1048576) { + filesize = numberformat(filesize / 1048576, 2, '.', '') + 'M' + b; + } else { + if (filesize >= 1024) { + filesize = numberformat(filesize / 1024, 0) + 'k' + b; + } else { + filesize = numberformat(filesize, 0) + b; + }; + }; + }; + return filesize; + }; + + function fillIn(input, files) { + var value = ''; + files.each(function() { + var path = $(this).data('image-path'); + if (path) { + value += path + '\n'; + } + }); + input.val(value); + } + + function fillInHiddenInputs(dropbox, movedOutFile, movedInFile) { + var input = $('input[name="' + dropbox.data('input-name') + '_0"]'), + deletedInput = $('input[name="' + dropbox.data('input-name') + '_1"]'), + movedInput = $('input[name="' + dropbox.data('input-name') + '_2"]'), + widget = input.closest('.files-widget'), + files = widget.find('.preview'), + deletedFiles = widget.find('.deleted-file'); + + fillIn(input, files.add(movedInFile)); + fillIn(deletedInput, deletedFiles); + + if (movedOutFile) { + var movedInputValue = splitlines(movedInput.val()), + filename = movedOutFile.data('image-path'); + + movedInputValue.push(filename); + movedInput.val(movedInputValue.join('\n')); + } + if (movedInFile) { + var movedInputValue = splitlines(movedInput.val()), + filename = movedInFile.data('image-path'), + index = movedInputValue.indexOf(filename); + + if (index != -1) { + movedInputValue.splice(index, 1); + movedInput.val(movedInputValue); + } + } + } + + function downloadThumbnail(preview) { + var imagePath = stripMediaURL(preview.data('image-path')), + dropbox = preview.closest('.files-widget-dropbox'), + previewSize = dropbox.data('preview-size'); + + $.get(thumbnailURL, + 'img=' + encodeURIComponent(imagePath) + '&preview_size=' + previewSize, + function(data) { + preview.find('.thumbnail') + .css({ 'width': '', 'height': '' }).attr('src', data); + preview.removeClass('new'); + }); + } + + function generateThumbnail(preview, file) { + var image = $('.thumbnail', preview), + reader = new FileReader(), + dropbox = preview.closest('.files-widget-dropbox'), + previewSize = dropbox.data('preview-size'), + defaultSize = parseInt(+previewSize * 2 / 3, 10); + + reader.onload = function(e) { + image.attr('src', e.target.result); + image.css({ 'width': '', 'height': '' }); + }; + + image.css({ + 'max-width': previewSize, 'max-height': previewSize, + 'width': defaultSize, 'height': defaultSize + }); + + if (file.size < 500000) { + reader.readAsDataURL(file); + } else { + $('').addClass('filename').text(file.name) + .appendTo(preview.find('.image-holder')); + } + } + + function addPreview(dropbox, imagePath, thumbnailPath, file, fromHiddenInput) { + var preview = $(template); + + if (dropbox.data('multiple') != 1) { + dropbox.find('.preview').each(function() { + deletePreview($(this), true); + }); + } + + dropbox.find('.message').hide(); + preview.hide().insertAfter(dropbox.children(':last-child')).fadeIn(effectTime); + if (imagePath) { + completePreview(preview, imagePath, thumbnailPath, fromHiddenInput); + } else if (file) { + generateThumbnail(preview, file); + } + + return preview; + } + + function completePreview(preview, imagePath, thumbnailPath, fromHiddenInput) { + var dropbox = preview.closest('.files-widget-dropbox'); + + preview.removeClass('new').attr('data-image-path', imagePath); + preview.find('.progress-holder, .filename').remove(); + + if (thumbnailPath) { + preview.find('.thumbnail') + .css({ 'width': '', 'height': '' }).attr('src', thumbnailPath); + } else { + downloadThumbnail(preview); + } + if (!fromHiddenInput) { + fillInHiddenInputs(dropbox); + } + } + + function onPreviewMove(preview, oldDropbox, newDropbox) { + if (oldDropbox.is(newDropbox)) { + fillInHiddenInputs(oldDropbox); + } else { + if (newDropbox.data('multiple') != 1) { + newDropbox.find('.preview').not(preview).each(function() { + deletePreview($(this), true); + }); + } + fillInHiddenInputs(oldDropbox, preview, null); + fillInHiddenInputs(newDropbox, null, preview); + if (!oldDropbox.find('.preview').length) { + oldDropbox.find('.message').show(); + } + if (oldDropbox.data('preview-size') !== newDropbox.data('preview-size')) { + downloadThumbnail(preview); + } + } + } + + function deletePreview(preview, changingToNewPreview) { + var dropbox = preview.closest('.files-widget-dropbox'), + widget = dropbox.closest('.files-widget'), + deletedPreview = $(deletedTemplate), + deletedContainer = $('.files-widget-deleted', widget), + deletedList = $('.deleted-list', deletedContainer), + path = preview.data('image-path'); + + function doDelete() { + $('.icon', deletedPreview).attr('src', preview.find('.thumbnail').attr('src')); + $('.name', deletedPreview).text(filenameFromPath(path)); + deletedPreview.attr('data-image-path', path); + deletedContainer.show(); + deletedPreview.hide().appendTo(deletedList) + deletedPreview.slideDown(effectTime); + preview.remove(); + + if (!dropbox.find('.preview').length && !changingToNewPreview) { + dropbox.find('.message').show(); + }; + fillInHiddenInputs(dropbox); + } + + if (changingToNewPreview) { + doDelete(); + } else { + preview.fadeOut(effectTime, doDelete); + } + } + + function undoDeletePreview(deletedPreview) { + var imagePath = deletedPreview.data('image-path'), + thumbnailPath = $('.icon', deletedPreview).attr('src'), + widget = deletedPreview.closest('.files-widget'), + dropbox = widget.find('.files-widget-dropbox'), + deletedContainer = $('.files-widget-deleted', widget), + deletedList = $('.deleted-list', deletedContainer), + preview = addPreview(dropbox, imagePath, thumbnailPath); + + deletedPreview.slideUp(effectTime, function() { + $(this).remove(); + if (!deletedList.find('.deleted-file').length) { + deletedContainer.hide(); + }; + fillInHiddenInputs(dropbox); + }); + } + + $(document).bind('drag dragover', function (e) { + e.preventDefault(); + $('.files-widget-dropbox').addClass('dragging-files'); + }).bind('drop', function (e) { + e.preventDefault(); + $('.files-widget-dropbox').removeClass('dragging-files'); + }).bind('dragleave', function (e) { + $('.files-widget-dropbox').removeClass('dragging-files'); + }); + + widget.each(function() { + var that = $(this), + dropbox = $('.files-widget-dropbox', that), + filesInput = $('.files-input', that), + message = $('.message', dropbox), + uploadURL = dropbox.data('upload-url'), + multiple = dropbox.data('multiple') == 1, + previewSize = dropbox.data('preview-size'), + initialFiles = $('.preview', dropbox), + fileBrowserResultInput = $('.filebrowser-result', that), + deletedContainer = $('.files-widget-deleted', that), + deletedList = $('.deleted-list', deletedContainer), + stats = $('.upload-progress-stats', that), + hiddenInput = $('input[name="' + dropbox.data('input-name') + '_0"]'), + initialFileNames = splitlines(hiddenInput.val()), + name; + + for (name in initialFileNames) { + if (!initialFiles.filter('[data-image-path="' + initialFileNames[name] + '"]').length) { + addPreview(dropbox, initialFileNames[name], null, null, true); + } + } + + initialFiles = $('.preview', dropbox); + if (initialFiles.length) { + message.hide(); + } + if (deletedList.find('.deleted-file').length) { + deletedContainer.show(); + } + + dropbox.on('click', '.remove-button', function() { + var preview = $(this).closest('.preview'); + deletePreview(preview); + }); + + that.on('click', '.undo-remove-button', function() { + var deletedPreview = $(this).closest('.deleted-file'); + undoDeletePreview(deletedPreview); + }); + + dropbox.on('click', '.enlarge-button', function() { + window.open(mediaURL + $(this).closest('.preview').data('image-path')); + }); + + function onFileBrowserResult() { + var imagePath = stripMediaURL(fileBrowserResultInput.val()), + preview = addPreview(dropbox, imagePath); + fileBrowserResultInput.val(''); + } + + function checkFileBrowserResult() { + var oldVal = fileBrowserResultInput.val(), + checkInterval; + + checkInterval = setInterval(function() { + var newVal = fileBrowserResultInput.val(); + if (oldVal != newVal) { + clearInterval(checkInterval); + onFileBrowserResult(); + } + }, 250); + } + + $('.media-library-button', that).on('click', function() { + var url = window.__filebrowser_url || '/admin/media-library/browse/' + FileBrowser.show(fileBrowserResultInput.attr('id'), url + '?pop=1'); + checkFileBrowserResult(); + }); + + $('.add-by-url-button', that).on('click', function() { + $('.add-by-url-container', that).show(); + $(this).hide(); + $('.add-by-url', that).trigger('focus'); + }); + + $('.add-by-url', that).on('focusout', function() { + $('.add-by-url-button', that).show(); + $('.add-by-url-container', that).hide(); + }).on('keypress', function (e) { + var urlInput = $(this), + val = urlInput.val(); + + if (e.which == 13) { + e.stopPropagation(); + e.preventDefault(); + + $('.add-by-url-button', that).show(); + $('.add-by-url-container', that).hide(); + urlInput.val(''); + + if (val.length) { + addPreview(dropbox, val); + } + return false; + } + }); + + dropbox.disableSelection(); + dropbox.bind('dragover', function (e) { + dropbox.addClass('dragover'); + }).bind('dragleave drop', function (e) { + dropbox.removeClass('dragover'); + }); + + dropbox.sortable({ + placeholder: 'sortable-placeholder', + //tolerance: 'pointer', + connectWith: '.files-widget-dropbox', + //cursorAt: { top: 0, left: 0 }, + //items: '.preview:not(.controls-preview)', + revert: effectTime, + start: function(e, ui) { + $('.sortable-placeholder').width(ui.item.width()).height(ui.item.height()); + }, + over: function() { + message.hide(); + }, + beforeStop: function(e, ui) { + var newDropbox = ui.placeholder.closest('.files-widget-dropbox'); + onPreviewMove(ui.item, dropbox, newDropbox); + } + }); + + filesInput.fileupload({ + url: uploadURL, + type: 'POST', + dataType: 'json', + dropZone: dropbox, + pasteZone: dropbox, + paramName: 'files[]', + limitConcurrentUploads: 3, + formData: [ + { name: 'csrfmiddlewaretoken', value: csrfToken }, + { name: 'preview_size', value: previewSize } + ], + autoUpload: true, + maxFileSize: 10000000, + acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i, + maxNumberOfFiles: undefined, + previewMaxWidth: 150, + previewMaxHeight: 150, + previewCrop: true, + add: function(e, data) { + var preview = addPreview(dropbox, undefined, undefined, data.files[0]); + data.context = preview; + data.submit(); + }, + submit: function(e, data) { + // console.log('submit', data); + // create thumbnail client side? + }, + done: function(e, data) { + completePreview(data.context, + data.result.imagePath, data.result.thumbnailPath); + }, + fail: function(e, data) { + //console.log('failed', data); + // display errors + }, + always: function(e, data) { + //console.log('always', data); + stats.text(''); + }, + progress: function(e, data) { + //console.log('progress', data); + var progress = parseInt(data.loaded / data.total * 100, 10); + data.context.find('.progress').css('width', progress + '%'); + }, + progressall: function(e, data) { + //console.log('progressall', data); + stats.text(sizeformat(data.loaded) + + ' of ' + sizeformat(data.total) + + ' (' + sizeformat(data.bitrate, true) + 'ps)'); + }, + }); + }); +}); diff --git a/files_widget/templates/files_widget/files_widget.html b/files_widget/templates/files_widget/files_widget.html new file mode 100644 index 0000000..aa6e974 --- /dev/null +++ b/files_widget/templates/files_widget/files_widget.html @@ -0,0 +1,91 @@ +{% load i18n files_widget_tags %} +
    +
    + + {% if multiple %} + {% trans 'Drop multiple images here to upload' %} + {% else %} + {% trans 'Drop an image here to upload' %} + {% endif %} + + {% for path_to_file in files.splitlines %}{% spaceless %} +
    +
    + {% if path_to_file|is_image %} + + {% else %} + + {% endif %} + +
    +
    + {{ path_to_file|filename_from_path }} +
    + + + + + + + + +
    + {% endspaceless %}{% endfor %} +
    +
    + + + {% trans 'Upload' %}... + + + {% if use_filebrowser %} +  |  + {% trans 'Library' %} + {% endif %} + {% if add_image_by_url %} +  |  + {% trans 'Add by url...' %} + + {% endif %} + {{ input_string }} + {# here comes the hacked mezzanine-filebrowser-safe integration #} + + + + + + + + + + +
    + +
    diff --git a/files_widget/templates/files_widget/images_widget.html b/files_widget/templates/files_widget/images_widget.html new file mode 100644 index 0000000..073b21f --- /dev/null +++ b/files_widget/templates/files_widget/images_widget.html @@ -0,0 +1,90 @@ +{% load i18n files_widget_tags %} +
    +
    + + {% if multiple %} + {% trans 'Drop multiple images here to upload' %} + {% else %} + {% trans 'Drop an image here to upload' %} + {% endif %} + + {% for path_to_file in files.splitlines %}{% spaceless %} +
    +
    + {% if path_to_file|is_image %} + + {% else %} + + {% endif %} + + + + + + + + + +
    +
    + {{ path_to_file|filename_from_path }} +
    +
    + {% endspaceless %}{% endfor %} +
    +
    + + + {% trans 'Upload' %}... + + + {% if use_filebrowser %} +  |  + {% trans 'Library' %} + {% endif %} + {% if add_image_by_url %} +  |  + {% trans 'Add by url...' %} + + {% endif %} + {{ input_string }} + {# here comes the hacked mezzanine-filebrowser-safe integration #} + + + + + + + + + + +
    + +
    diff --git a/files_widget/templates/files_widget/includes/file.html b/files_widget/templates/files_widget/includes/file.html new file mode 100644 index 0000000..a90f904 --- /dev/null +++ b/files_widget/templates/files_widget/includes/file.html @@ -0,0 +1,10 @@ +{% load i18n files_widget_tags %} + +
    +
    + +
    +
    + {{ path_to_file|filename_from_path }} +
    +
    \ No newline at end of file diff --git a/files_widget/templates/files_widget/includes/thumbnail.html b/files_widget/templates/files_widget/includes/thumbnail.html new file mode 100644 index 0000000..a4c64ca --- /dev/null +++ b/files_widget/templates/files_widget/includes/thumbnail.html @@ -0,0 +1 @@ +{% load thumbnail files_widget_tags %}{% thumbnail path_to_file|unquote preview_size|add:'x'|add:preview_size upscale=False format=path_to_file|thumbnail_format as thumb %}{{ thumb.url }}{% endthumbnail %} \ No newline at end of file diff --git a/files_widget/templatetags/__init__.py b/files_widget/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/files_widget/templatetags/files_widget_tags.py b/files_widget/templatetags/files_widget_tags.py new file mode 100644 index 0000000..67cd2ae --- /dev/null +++ b/files_widget/templatetags/files_widget_tags.py @@ -0,0 +1,46 @@ +import re +from six.moves import urllib + +from django import template + + +register = template.Library() + +@register.tag +def sorl_thumbnail(parser, token): + from sorl.thumbnail.templatetags.thumbnail import thumbnail + try: + res = thumbnail(parser, token) + except Exception as e: + res = None + print('1') + return res + + +@register.filter +def is_image(path): + from ..files import is_file_image + from tEDataProj.settings import MEDIA_ROOT + path = f'{MEDIA_ROOT}{path}' + return is_file_image(path) + + +@register.filter +def thumbnail_format(path): + match = re.search(r'\.\w+$', path) + if match: + ext = match.group(0) + if ext.lower() in ['.gif', '.png']: + return 'PNG' + return 'JPEG' + +@register.filter +def filename_from_path(path): + path = re.sub(r'^.+\/', '', path) + path = re.sub(r'^.+\\', '', path) + return path + +@register.filter +def unquote(value): + "urldecode" + return urllib.parse.unquote(value) diff --git a/files_widget/urls.py b/files_widget/urls.py new file mode 100644 index 0000000..a767108 --- /dev/null +++ b/files_widget/urls.py @@ -0,0 +1,12 @@ +try: + from django.conf.urls.defaults import url +except: + from django.conf.urls import url + +from django.conf import settings +from .views import upload, thumbnail_url + +urlpatterns = [ + url(u'^upload/$', upload, name="files_widget_upload"), + url(u'^thumbnail-url/$', thumbnail_url, name="files_widget_get_thumbnail_url"), +] diff --git a/files_widget/utils.py b/files_widget/utils.py new file mode 100644 index 0000000..1798f53 --- /dev/null +++ b/files_widget/utils.py @@ -0,0 +1,5 @@ +from functools import partial + + +def curry(func, *a, **kw): + return partial(func, *a, **kw) diff --git a/files_widget/views.py b/files_widget/views.py new file mode 100644 index 0000000..56ebe37 --- /dev/null +++ b/files_widget/views.py @@ -0,0 +1,71 @@ +import json + +from django.http import Http404, HttpResponse, HttpResponseBadRequest +from django.conf import settings +from django.utils.translation import ugettext_lazy as _ +from django.template.loader import render_to_string +from django.contrib.auth.decorators import permission_required + +from .files import save_upload, is_file_image +from .controllers import FilePath, ImagePath + +# @permission_required('files_widget.can_upload_files') +def upload(request): + if not request.method == 'POST': + raise Http404 + + # if request.is_ajax(): + # # the file is stored raw in the request + # upload = request + # is_raw = True + # # AJAX Upload will pass the filename in the querystring if it is the "advanced" ajax upload + # try: + # filename = request.GET['files[0]'] + # except KeyError: + # return HttpResponseBadRequest(json.dumps({ + # 'success': False, + # 'message': 'Error while uploading file', + # })) + # not an ajax upload, so it was the "basic" iframe version with submission via form + # else: + is_raw = False + try: + upload = next(iter(request.FILES.values())) + except StopIteration: + return HttpResponseBadRequest(json.dumps({ + 'success': False, + 'message': 'Error while uploading file.', + })) + filename = upload.name + + path_to_file = save_upload(upload, filename, is_raw, request.user) + MEDIA_URL = settings.MEDIA_URL + + if 'preview_size' in request.POST: + preview_size = request.POST['preview_size'] + else: + preview_size = '64' + + if not is_file_image(f'{settings.MEDIA_ROOT}{path_to_file}'): + thumbnailPath = f'{settings.STATIC_URL}files_widget/img/file-icons/file_icon.png' + else: + thumbnailPath = render_to_string('files_widget/includes/thumbnail.html', locals()) + + return HttpResponse(json.dumps({ + 'success': True, + 'imagePath': path_to_file, + 'thumbnailPath': thumbnailPath, + })) + +# @permission_required('files_widget.can_upload_files') +def thumbnail_url(request): + try: + if not 'img' in request.GET or not 'preview_size' in request.GET: + raise Http404 + + thumbnail_url = ImagePath(request.GET['img']).thumbnail(request.GET['preview_size']).url + + except: + thumbnail_url = 'files_widget/static/files_widget/img/file-icons/file_icon.png' + + return HttpResponse(thumbnail_url) diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..47a6680 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'FirePlayProj.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/templates/admin/change_form.html b/templates/admin/change_form.html new file mode 100644 index 0000000..0d7dcd0 --- /dev/null +++ b/templates/admin/change_form.html @@ -0,0 +1,6 @@ +{% extends "admin/change_form.html" %} + +{% block extrahead %} + +{{ block.super }} +{% endblock %} \ No newline at end of file