customeranalytics 0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- customeranalytics/__init__.py +319 -0
- customeranalytics/configs.py +480 -0
- customeranalytics/data_storage_configurations/__init__.py +245 -0
- customeranalytics/data_storage_configurations/data_access.py +165 -0
- customeranalytics/data_storage_configurations/data_works_pipeline.py +207 -0
- customeranalytics/data_storage_configurations/es_create_index.py +544 -0
- customeranalytics/data_storage_configurations/logger.py +36 -0
- customeranalytics/data_storage_configurations/query_es.py +157 -0
- customeranalytics/data_storage_configurations/reports.py +684 -0
- customeranalytics/data_storage_configurations/schedule_data_integration.py +355 -0
- customeranalytics/docs/queries.yaml +245 -0
- customeranalytics/docs/web_configs.yaml +2 -0
- customeranalytics/exploratory_analysis/__init__.py +109 -0
- customeranalytics/exploratory_analysis/churn.py +232 -0
- customeranalytics/exploratory_analysis/cohorts.py +535 -0
- customeranalytics/exploratory_analysis/descriptive_statistics.py +470 -0
- customeranalytics/exploratory_analysis/funnels.py +407 -0
- customeranalytics/exploratory_analysis/product_analytics.py +340 -0
- customeranalytics/exploratory_analysis/promotion_analytics.py +299 -0
- customeranalytics/exploratory_analysis/rfm.py +202 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_avg_order_count_per_promo_per_cust.csv +99 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_chart_1_search.csv +2 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_chart_2_search.csv +46 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_chart_3_search.csv +2 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_chart_4_search.csv +2 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_churn.csv +2 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_churn_weekly.csv +10 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_client_feature_predicted.csv +1590 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_client_kpis.csv +7060 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_clvrfm_anomaly.csv +561 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_clvsegments_amount.csv +8 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_customer_journey.csv +18 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_clv.csv +103 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_cohort_downloads.csv +68 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_cohort_from_1_to_2.csv +66 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_cohort_from_2_to_3.csv +64 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_cohort_from_3_to_4.csv +55 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_dimension_values.csv +199 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_funnel.csv +36 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_funnel_downloads.csv +68 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_inorganic_ratio.csv +6070 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_orders.csv +57 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_organic_orders.csv +64 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_products_of_sales.csv +12574 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_promotion_discount.csv +64 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_daily_promotion_revenue.csv +6070 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_dcohort_anomaly.csv +6 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_dcohort_anomaly_2.csv +118 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_deliver.csv +47 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_deliver_kpis.csv +2 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_deliver_weekday_hour.csv +25 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_dfunnel_anomaly.csv +118 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_dimension_kpis.csv +199 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_dorders_anomaly.csv +85 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_frequency_clusters.csv +6 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_frequency_recency.csv +3740 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_hourly_funnel.csv +25 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_hourly_funnel_downloads.csv +25 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_hourly_inorganic_ratio.csv +2353 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_hourly_orders.csv +25 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_hourly_organic_orders.csv +2353 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_inorganic_orders_per_promotion_per_day.csv +6070 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_kpis.csv +2 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_monetary_clusters.csv +6 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_monetary_frequency.csv +3740 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_monthly_funnel.csv +5 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_monthly_funnel_downloads.csv +5 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_monthly_orders.csv +4 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_most_combined_products.csv +11 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_most_ordered_categories.csv +11 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_most_ordered_products.csv +11 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_order_and_payment_amount_differences.csv +91 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_prepare.csv +101 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_prepare_weekday_hour.csv +25 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_product_kpis.csv +201 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_product_usage_before_after_amount_accept.csv +11 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_product_usage_before_after_amount_reject.csv +7 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_product_usage_before_after_orders_accept.csv +11 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_product_usage_before_after_orders_reject.csv +11 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_comparison.csv +91 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_kpis.csv +99 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_number_of_customer.csv +99 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_usage_before_after_amount_accept.csv +81 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_usage_before_after_amount_reject.csv +11 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_usage_before_after_orders_accept.csv +55 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_promotion_usage_before_after_orders_reject.csv +37 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_purchase_amount_distribution.csv +22 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_recency_clusters.csv +6 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_recency_monetary.csv +3740 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_rfm.csv +2001 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_ride.csv +101 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_ride_weekday_hour.csv +25 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_segmentation.csv +11 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_daily_before_after_amount.csv +10 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_daily_before_after_orders.csv +9 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_monthly_before_after_amount.csv +10 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_monthly_before_after_orders.csv +11 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_weekly_before_after_amount.csv +10 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_segments_change_weekly_before_after_orders.csv +10 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_user_counts_per_order_seq.csv +47 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_average_order_per_user.csv +13 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_average_payment_amount.csv +13 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_average_session_per_user.csv +13 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_cohort_downloads.csv +13 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_cohort_from_1_to_2.csv +13 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_cohort_from_2_to_3.csv +13 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_cohort_from_3_to_4.csv +12 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_funnel.csv +25 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_funnel_downloads.csv +25 -0
- customeranalytics/exploratory_analysis/sample_data/sample_data_weekly_orders.csv +10 -0
- customeranalytics/ml_process/__init__.py +64 -0
- customeranalytics/ml_process/ab_test.py +615 -0
- customeranalytics/ml_process/anomaly_detection.py +456 -0
- customeranalytics/ml_process/clv_prediction.py +301 -0
- customeranalytics/ml_process/customer_segmentation.py +354 -0
- customeranalytics/ml_process/delivery_analytics.py +754 -0
- customeranalytics/utils.py +186 -0
- customeranalytics/web/app/__init__.py +37 -0
- customeranalytics/web/app/base/__init__.py +9 -0
- customeranalytics/web/app/base/forms.py +16 -0
- customeranalytics/web/app/base/models.py +43 -0
- customeranalytics/web/app/base/routes.py +126 -0
- customeranalytics/web/app/base/static/assets/css/app.css +20 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Black.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Black.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-BlackItalic.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-BlackItalic.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Bold.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Bold.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-BoldItalic.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-BoldItalic.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraBold.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraBold.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraBoldItalic.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraBoldItalic.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraLight-BETA.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraLight-BETA.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraLightItalic-BETA.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-ExtraLightItalic-BETA.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Italic.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Italic.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Light-BETA.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Light-BETA.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-LightItalic-BETA.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-LightItalic-BETA.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Medium.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Medium.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-MediumItalic.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-MediumItalic.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Regular.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Regular.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-SemiBold.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-SemiBold.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-SemiBoldItalic.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-SemiBoldItalic.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Thin-BETA.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-Thin-BETA.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-ThinItalic-BETA.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-ThinItalic-BETA.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-italic.var.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter-upright.var.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/Inter.var.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-brands-400.eot +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-brands-400.svg +3570 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-brands-400.ttf +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-brands-400.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-brands-400.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-regular-400.eot +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-regular-400.svg +801 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-regular-400.ttf +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-regular-400.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-regular-400.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-solid-900.eot +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-solid-900.svg +5028 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-solid-900.ttf +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-solid-900.woff +0 -0
- customeranalytics/web/app/base/static/assets/fonts/fa-solid-900.woff2 +0 -0
- customeranalytics/web/app/base/static/assets/img/avatars/avatar-1.png +0 -0
- customeranalytics/web/app/base/static/assets/img/avatars/avatar-2.png +0 -0
- customeranalytics/web/app/base/static/assets/img/avatars/avatar-3.png +0 -0
- customeranalytics/web/app/base/static/assets/img/avatars/avatar-4.png +0 -0
- customeranalytics/web/app/base/static/assets/img/avatars/avatar-5.png +0 -0
- customeranalytics/web/app/base/static/assets/img/avatars/info.jpeg +0 -0
- customeranalytics/web/app/base/static/assets/img/icons/customanality.png +0 -0
- customeranalytics/web/app/base/static/assets/img/icons/icon-48x48.png +0 -0
- customeranalytics/web/app/base/static/assets/js/app.js +2 -0
- customeranalytics/web/app/base/static/assets/js/app.js.LICENSE +566 -0
- customeranalytics/web/app/base/static/assets/js/app.js.LICENSE.txt +556 -0
- customeranalytics/web/app/base/static/assets/js/modules/bootstrap.js +15 -0
- customeranalytics/web/app/base/static/assets/js/modules/chartjs.js +4 -0
- customeranalytics/web/app/base/static/assets/js/modules/feather.js +8 -0
- customeranalytics/web/app/base/static/assets/js/modules/flatpickr.js +4 -0
- customeranalytics/web/app/base/static/assets/js/modules/moment.js +4 -0
- customeranalytics/web/app/base/static/assets/js/modules/sidebar.js +23 -0
- customeranalytics/web/app/base/static/assets/js/modules/theme.js +16 -0
- customeranalytics/web/app/base/templates/accounts/login.html +81 -0
- customeranalytics/web/app/base/templates/accounts/register.html +80 -0
- customeranalytics/web/app/base/templates/includes/footer.html +28 -0
- customeranalytics/web/app/base/templates/includes/navigation.html +51 -0
- customeranalytics/web/app/base/templates/includes/scripts.html +3 -0
- customeranalytics/web/app/base/templates/includes/sidebar.html +146 -0
- customeranalytics/web/app/base/templates/layouts/base-fullscreen.html +36 -0
- customeranalytics/web/app/base/templates/layouts/base.html +84 -0
- customeranalytics/web/app/base/util.py +30 -0
- customeranalytics/web/app/home/__init__.py +9 -0
- customeranalytics/web/app/home/forms.py +1039 -0
- customeranalytics/web/app/home/models.py +438 -0
- customeranalytics/web/app/home/profiles.py +310 -0
- customeranalytics/web/app/home/routes.py +386 -0
- customeranalytics/web/app/home/search.py +288 -0
- customeranalytics/web/app/home/static/assets/img/avatars/avatar-1.png +0 -0
- customeranalytics/web/app/home/static/assets/img/avatars/avatar-2.png +0 -0
- customeranalytics/web/app/home/static/assets/img/avatars/avatar-3.png +0 -0
- customeranalytics/web/app/home/static/assets/img/avatars/avatar-4.png +0 -0
- customeranalytics/web/app/home/static/assets/img/avatars/avatar-5.png +0 -0
- customeranalytics/web/app/home/static/assets/img/icons/customanality.png +0 -0
- customeranalytics/web/app/home/static/assets/img/icons/icon-48x48.png +0 -0
- customeranalytics/web/app/home/templates/abtest-product.html +280 -0
- customeranalytics/web/app/home/templates/abtest-promotion.html +362 -0
- customeranalytics/web/app/home/templates/abtest-segments.html +298 -0
- customeranalytics/web/app/home/templates/add-data-delivery.html +184 -0
- customeranalytics/web/app/home/templates/add-data-product.html +177 -0
- customeranalytics/web/app/home/templates/add-data-purchase.html +392 -0
- customeranalytics/web/app/home/templates/anomaly.html +261 -0
- customeranalytics/web/app/home/templates/clv.html +211 -0
- customeranalytics/web/app/home/templates/cohorts.html +308 -0
- customeranalytics/web/app/home/templates/customer-segmentation.html +308 -0
- customeranalytics/web/app/home/templates/data-es.html +152 -0
- customeranalytics/web/app/home/templates/data-execute.html +397 -0
- customeranalytics/web/app/home/templates/delivery.html +404 -0
- customeranalytics/web/app/home/templates/funnel-customer.html +240 -0
- customeranalytics/web/app/home/templates/funnel-session.html +236 -0
- customeranalytics/web/app/home/templates/index.html +524 -0
- customeranalytics/web/app/home/templates/index2.html +515 -0
- customeranalytics/web/app/home/templates/page-403.html +46 -0
- customeranalytics/web/app/home/templates/page-404.html +45 -0
- customeranalytics/web/app/home/templates/page-500.html +45 -0
- customeranalytics/web/app/home/templates/pages-blank.html +33 -0
- customeranalytics/web/app/home/templates/pages-sign-in.html +67 -0
- customeranalytics/web/app/home/templates/pages-sign-up.html +61 -0
- customeranalytics/web/app/home/templates/product.html +203 -0
- customeranalytics/web/app/home/templates/profile.html +1009 -0
- customeranalytics/web/app/home/templates/rfm.html +254 -0
- customeranalytics/web/app/home/templates/search.html +167 -0
- customeranalytics/web/app/home/templates/settings.html +205 -0
- customeranalytics/web/app/home/templates/stats-desc.html +230 -0
- customeranalytics/web/app/home/templates/stats-purchase.html +221 -0
- customeranalytics/web/config.py +30 -0
- customeranalytics/web/db.sqlite3 +0 -0
- customeranalytics/web/run.py +30 -0
- customeranalytics-0.1.dist-info/METADATA +1102 -0
- customeranalytics-0.1.dist-info/RECORD +254 -0
- customeranalytics-0.1.dist-info/WHEEL +4 -0
- customeranalytics-0.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
import sys, os, inspect
|
|
2
|
+
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
|
|
3
|
+
parentdir = os.path.dirname(currentdir)
|
|
4
|
+
sys.path.insert(0, parentdir)
|
|
5
|
+
|
|
6
|
+
import pandas as pd
|
|
7
|
+
from numpy import array
|
|
8
|
+
import json
|
|
9
|
+
import datetime
|
|
10
|
+
|
|
11
|
+
from os.path import join, dirname, exists
|
|
12
|
+
from flask_login import current_user
|
|
13
|
+
from os import listdir
|
|
14
|
+
import plotly.graph_objs as go
|
|
15
|
+
import plotly
|
|
16
|
+
from screeninfo import get_monitors
|
|
17
|
+
from sqlalchemy import create_engine, MetaData
|
|
18
|
+
from werkzeug.utils import secure_filename
|
|
19
|
+
|
|
20
|
+
from customeranalytics.utils import abspath_for_sample_data, read_yaml, current_date_to_day, convert_to_date
|
|
21
|
+
from customeranalytics.configs import query_path, chart_names, ALLOWED_IMAGE_EXTENSIONS, MAX_IMAGE_FILESIZE, TIME_DIFF_STR, DATE_DIFF_STR
|
|
22
|
+
from .forms import SampleData, RealData, Charts, charts
|
|
23
|
+
|
|
24
|
+
engine = create_engine('sqlite://///' + join(abspath_for_sample_data(), "web", 'db.sqlite3'),
|
|
25
|
+
connect_args={'check_same_thread': False})
|
|
26
|
+
metadata = MetaData()
|
|
27
|
+
con = engine.connect()
|
|
28
|
+
|
|
29
|
+
samples = SampleData()
|
|
30
|
+
real = RealData()
|
|
31
|
+
charts = Charts(samples.kpis, real)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def image_format(filename):
|
|
35
|
+
return filename.rsplit(".", 1)[1]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def allowed_image(filename):
|
|
39
|
+
|
|
40
|
+
if not "." in filename:
|
|
41
|
+
return False
|
|
42
|
+
|
|
43
|
+
ext = image_format(filename)
|
|
44
|
+
|
|
45
|
+
if ext.upper() in ALLOWED_IMAGE_EXTENSIONS:
|
|
46
|
+
return True
|
|
47
|
+
else:
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def allowed_image_filesize(request):
|
|
52
|
+
if "filesize" in request.cookies:
|
|
53
|
+
if int(request.cookies['filesize']) <= MAX_IMAGE_FILESIZE:
|
|
54
|
+
return True
|
|
55
|
+
else:
|
|
56
|
+
return False
|
|
57
|
+
else:
|
|
58
|
+
return True
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class Profiles:
|
|
62
|
+
def __init__(self, user=None):
|
|
63
|
+
self.user = user
|
|
64
|
+
self.users = []
|
|
65
|
+
self.sqlite_queries = read_yaml(query_path, "queries.yaml")
|
|
66
|
+
self.tables = pd.read_sql(self.sqlite_queries['tables'], con)
|
|
67
|
+
self.data_types = {'orders': 'Sessions', 'downloads': 'Customers', 'products': 'Products (Baskets)'}
|
|
68
|
+
self.log_file = []
|
|
69
|
+
self.recent_chats = pd.DataFrame()
|
|
70
|
+
self.filters = ['main']
|
|
71
|
+
self.message_sep = "#*#*£½"
|
|
72
|
+
self.message_key_sep = "_1_1_1_"
|
|
73
|
+
self.message_key_val_sep = ":1:1:1:"
|
|
74
|
+
|
|
75
|
+
def insert_query(self, table, columns, values):
|
|
76
|
+
values = [values[col] for col in columns]
|
|
77
|
+
_query = "INSERT INTO " + table + " "
|
|
78
|
+
_query += " (" + ", ".join(columns) + ") "
|
|
79
|
+
_query += " VALUES (" + ", ".join([" '{}' ".format(v) for v in values]) + ") "
|
|
80
|
+
_query = _query.replace("\\", "")
|
|
81
|
+
return _query
|
|
82
|
+
|
|
83
|
+
def update_query(self, table, condition, columns, values):
|
|
84
|
+
values = [(col, values[col]) for col in columns if values.get(col, None) is not None]
|
|
85
|
+
_query = "UPDATE " + table
|
|
86
|
+
_query += " SET " + ", ".join([i[0] + " = '" + i[1] + "'" for i in values])
|
|
87
|
+
_query +=" WHERE " + condition
|
|
88
|
+
_query = _query.replace("\\", "")
|
|
89
|
+
return _query
|
|
90
|
+
|
|
91
|
+
def delete_query(self, table, condition):
|
|
92
|
+
_query = "DELETE FROM " + table
|
|
93
|
+
_query += " WHERE " + condition
|
|
94
|
+
_query = _query.replace("\\", "")
|
|
95
|
+
return _query
|
|
96
|
+
|
|
97
|
+
def check_for_table_exits(self, table):
|
|
98
|
+
"""
|
|
99
|
+
checking sqlite if table is created before. If it not, table is created.
|
|
100
|
+
:params table: checking table name in sqlite
|
|
101
|
+
"""
|
|
102
|
+
if table not in list(self.tables['name']):
|
|
103
|
+
con.execute(self.sqlite_queries[table])
|
|
104
|
+
|
|
105
|
+
def read_chats(self):
|
|
106
|
+
try:
|
|
107
|
+
return pd.read_sql("""
|
|
108
|
+
SELECT chat.*, user_avatar.user_avatar
|
|
109
|
+
FROM chat LEFT JOIN (SELECT user, user_avatar FROM user_avatar) AS user_avatar
|
|
110
|
+
ON chat.user = user_avatar.user
|
|
111
|
+
""", con)
|
|
112
|
+
except Exception as e:
|
|
113
|
+
return pd.DataFrame()
|
|
114
|
+
|
|
115
|
+
def check_sub_chats(self, messages):
|
|
116
|
+
updated_messages = ""
|
|
117
|
+
if messages != "":
|
|
118
|
+
updated_messages = []
|
|
119
|
+
for m in messages.split(self.message_sep):
|
|
120
|
+
d = {k.split(self.message_key_val_sep)[0]: k.split(self.message_key_val_sep)[1] for k in
|
|
121
|
+
m.split(self.message_key_sep)}
|
|
122
|
+
d['date_1'] = self.get_time_diff_string(convert_to_date(d['date']))
|
|
123
|
+
d['date_2'] = self.get_date_diff_string(convert_to_date(d['date']))
|
|
124
|
+
d['user_avatar'] = self.fetch_pic(user=d['user'])
|
|
125
|
+
updated_messages.append(d)
|
|
126
|
+
return updated_messages
|
|
127
|
+
|
|
128
|
+
def find_user(self):
|
|
129
|
+
try:
|
|
130
|
+
user = current_user.username
|
|
131
|
+
except Exception as e:
|
|
132
|
+
user = "_"
|
|
133
|
+
return user
|
|
134
|
+
|
|
135
|
+
def get_plots(self, plots):
|
|
136
|
+
charts_for_profile = {}
|
|
137
|
+
_updated_chart_names = []
|
|
138
|
+
for plot in plots:
|
|
139
|
+
_chart_name = None
|
|
140
|
+
if plot != '':
|
|
141
|
+
_target, _chart, _index, _date = plot.split("*")
|
|
142
|
+
graph_json = charts.get_individual_chart(target=_target, chart=_chart, index=_index, date=_date if _date != '' else None)
|
|
143
|
+
charts_for_profile[_chart] = charts.get_json_format(graph_json)
|
|
144
|
+
_chart_name = _chart
|
|
145
|
+
_updated_chart_names.append(_chart_name)
|
|
146
|
+
for page in chart_names:
|
|
147
|
+
for i in chart_names[page]:
|
|
148
|
+
_chart_name = chart_names[page][i].split("*")[-1]
|
|
149
|
+
if _chart_name not in list(charts_for_profile.keys()):
|
|
150
|
+
charts_for_profile[chart_names[page][i].split("*")[-1]] = {'trace': [], 'layout': []}
|
|
151
|
+
return charts_for_profile, _updated_chart_names
|
|
152
|
+
|
|
153
|
+
def get_time_diff_string(self, date):
|
|
154
|
+
_total_sec = abs(date - current_date_to_day()).total_seconds()
|
|
155
|
+
counter = 0
|
|
156
|
+
detected = False
|
|
157
|
+
_format = ("%b %d %H:%M ", "%p") if _total_sec < (60 * 60 * 24 * 365) else ("'%y %b %d %H:%M ", "%p")
|
|
158
|
+
time_diff_str = ""
|
|
159
|
+
default_condition = lambda x: True if x >= len(TIME_DIFF_STR) - 1 else False
|
|
160
|
+
condition = lambda x: True if TIME_DIFF_STR[x][0] <= _total_sec < TIME_DIFF_STR[x + 1][0] else False
|
|
161
|
+
while not detected:
|
|
162
|
+
if condition(counter) or default_condition(counter):
|
|
163
|
+
value = ""
|
|
164
|
+
try:
|
|
165
|
+
value = str(int(_total_sec / TIME_DIFF_STR[counter][0]))
|
|
166
|
+
except Exception as e:
|
|
167
|
+
print(e)
|
|
168
|
+
time_diff_str = value + TIME_DIFF_STR[counter + 1][1]
|
|
169
|
+
detected = True
|
|
170
|
+
counter += 1
|
|
171
|
+
return time_diff_str
|
|
172
|
+
|
|
173
|
+
def get_date_diff_string(self, date):
|
|
174
|
+
_total_sec = abs(date - current_date_to_day()).total_seconds()
|
|
175
|
+
_format = ("%b %d %H:%M ", "%p") if _total_sec < (60 * 60 * 24 * 365) else ("'%y %b %d %H:%M ", "%p")
|
|
176
|
+
date_str, prefix_date_str = [""]*2
|
|
177
|
+
|
|
178
|
+
for p_d_str in range(2):
|
|
179
|
+
if DATE_DIFF_STR[p_d_str][0] < _total_sec < DATE_DIFF_STR[p_d_str + 1][0]:
|
|
180
|
+
prefix_date_str = DATE_DIFF_STR[p_d_str + 1][1]
|
|
181
|
+
if prefix_date_str in [DATE_DIFF_STR[0][1], DATE_DIFF_STR[1][1]]:
|
|
182
|
+
date_str = DATE_DIFF_STR[0][1] + " " + date.strftime("%b %d %H:%M ") + date.strftime("%p").lower()
|
|
183
|
+
datetime.datetime.now().strftime("%b %d %H:%M ") + datetime.datetime.now().strftime("%p").lower()
|
|
184
|
+
else:
|
|
185
|
+
date_str = date.strftime(_format[0]) + date.strftime(_format[1]).lower()
|
|
186
|
+
return date_str
|
|
187
|
+
|
|
188
|
+
def fetch_chats(self):
|
|
189
|
+
recent_chats = self.read_chats()
|
|
190
|
+
charts_for_profiles = {}
|
|
191
|
+
if len(recent_chats) != 0:
|
|
192
|
+
recent_chats['message'] = recent_chats['message'].apply(lambda x: self.check_sub_chats(x))
|
|
193
|
+
recent_chats['date'] = recent_chats['date'].apply(lambda x: convert_to_date(x))
|
|
194
|
+
recent_chats = recent_chats.sort_values('date', ascending=False)
|
|
195
|
+
recent_chats['date_1'] = recent_chats['date'].apply(lambda x: self.get_time_diff_string(x))
|
|
196
|
+
recent_chats['date_2'] = recent_chats['date'].apply(lambda x: self.get_date_diff_string(x))
|
|
197
|
+
charts_for_profiles, recent_chats['chart_name'] = self.get_plots(list(recent_chats['chart']))
|
|
198
|
+
self.filters = {"dimensions": real.get_report_dimensions(), "chart_names": chart_names}
|
|
199
|
+
return {"messages": recent_chats.to_dict('records') if len(recent_chats) != 0 else None,
|
|
200
|
+
'charts': charts_for_profiles, 'filters': self.filters}
|
|
201
|
+
|
|
202
|
+
def fetch_pic(self, user=None):
|
|
203
|
+
_user_name = current_user.username
|
|
204
|
+
logo = "info.pic"
|
|
205
|
+
if user is not None:
|
|
206
|
+
_user_name = user
|
|
207
|
+
try:
|
|
208
|
+
logo = list(pd.read_sql("""
|
|
209
|
+
SELECT user_avatar
|
|
210
|
+
FROM user_avatar
|
|
211
|
+
WHERE user = '{}'
|
|
212
|
+
""".format(_user_name), con)['user_avatar'])[0]
|
|
213
|
+
except Exception as e:
|
|
214
|
+
print(e)
|
|
215
|
+
logo = "info.jpeg"
|
|
216
|
+
return logo
|
|
217
|
+
|
|
218
|
+
def add_pic(self, request):
|
|
219
|
+
"""
|
|
220
|
+
|
|
221
|
+
"""
|
|
222
|
+
|
|
223
|
+
try:
|
|
224
|
+
image = request.files["image"]
|
|
225
|
+
filename = secure_filename(image.filename)
|
|
226
|
+
if allowed_image(filename) and allowed_image_filesize(request):
|
|
227
|
+
updated_filename = ".".join([current_user.username, image_format(filename)])
|
|
228
|
+
path = os.path.join(abspath_for_sample_data(),
|
|
229
|
+
"web", "app", "base", "static", "assets", "img", "avatars", updated_filename)
|
|
230
|
+
image.save(path)
|
|
231
|
+
|
|
232
|
+
try:
|
|
233
|
+
self.check_for_table_exits('user_avatar')
|
|
234
|
+
except Exception as e:
|
|
235
|
+
print()
|
|
236
|
+
|
|
237
|
+
try:
|
|
238
|
+
con.execute(self.delete_query(table='user_avatar',
|
|
239
|
+
condition=" user = '" + current_user.username + "' "))
|
|
240
|
+
except Exception as e:
|
|
241
|
+
print()
|
|
242
|
+
try:
|
|
243
|
+
con.execute(self.insert_query(table='user_avatar',
|
|
244
|
+
columns=self.sqlite_queries['columns']['user_avatar'][1:],
|
|
245
|
+
values={'user': current_user.username,
|
|
246
|
+
"user_avatar": updated_filename}
|
|
247
|
+
))
|
|
248
|
+
except Exception as e:
|
|
249
|
+
print()
|
|
250
|
+
|
|
251
|
+
except Exception as e:
|
|
252
|
+
print("no files uploaded")
|
|
253
|
+
|
|
254
|
+
def add_new_message(self, request):
|
|
255
|
+
"""
|
|
256
|
+
|
|
257
|
+
"""
|
|
258
|
+
if request != {}:
|
|
259
|
+
_user = self.find_user()
|
|
260
|
+
_user_logo = self.fetch_pic()
|
|
261
|
+
try:
|
|
262
|
+
_chart_name = chart_names[request['chart'].split("*")[0]][request['chart'].split("*")[1]]
|
|
263
|
+
_index = request['index']
|
|
264
|
+
_date = '' if request['date'] == '' else request['date']
|
|
265
|
+
_chart = _chart_name + "*" + _index + "*" + _date
|
|
266
|
+
except Exception as e:
|
|
267
|
+
_chart = ""
|
|
268
|
+
|
|
269
|
+
try:
|
|
270
|
+
self.check_for_table_exits("chat")
|
|
271
|
+
except Exception as e:
|
|
272
|
+
print()
|
|
273
|
+
|
|
274
|
+
_ts = str(current_date_to_day())
|
|
275
|
+
_message = "user" + self.message_key_val_sep +_user + self.message_key_sep + \
|
|
276
|
+
"user_avatar" + self.message_key_val_sep + _user_logo + self.message_key_sep + \
|
|
277
|
+
"date" + self.message_key_val_sep + _ts + self.message_key_sep + \
|
|
278
|
+
"message" + self.message_key_val_sep + request['message']
|
|
279
|
+
_id = request.get('id', None)
|
|
280
|
+
if _id is not None:
|
|
281
|
+
_id = request['id']
|
|
282
|
+
chat = self.read_chats()
|
|
283
|
+
chat = chat[chat['id'] == int(_id)]
|
|
284
|
+
chat['message'] = chat['message'] + self.message_sep + _message
|
|
285
|
+
|
|
286
|
+
try:
|
|
287
|
+
con.execute(self.update_query(table='chat',
|
|
288
|
+
condition=" id = " + str(_id),
|
|
289
|
+
columns=['message'], values={'message': list(chat['message'])[0]}))
|
|
290
|
+
except Exception as e:
|
|
291
|
+
print()
|
|
292
|
+
|
|
293
|
+
else:
|
|
294
|
+
chat = {'user': _user,
|
|
295
|
+
'general_message': request['general_message'],
|
|
296
|
+
'message': _message,
|
|
297
|
+
'date': _ts,
|
|
298
|
+
'chart': _chart,
|
|
299
|
+
'chat_type': 'message',
|
|
300
|
+
'user_logo': _user + '.png'}
|
|
301
|
+
try:
|
|
302
|
+
con.execute(self.insert_query(table='chat',
|
|
303
|
+
columns=self.sqlite_queries['columns']['chat'][1:],
|
|
304
|
+
values=chat
|
|
305
|
+
))
|
|
306
|
+
except Exception as e:
|
|
307
|
+
print()
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
|