· 5 years ago · Dec 20, 2019, 06:04 AM
1import base64
2import boto.utils
3import boto3
4import datetime
5import logging
6import os
7import pytz
8import sys
9import time
10
11from Crypto.Hash import HMAC
12from django.core.urlresolvers import reverse_lazy
13from os.path import abspath, dirname, join, pardir
14
15# set the default Django settings module for the 'celery' program.
16from celery import Celery
17
18LOGIN_URL = reverse_lazy('two_factor:login')
19
20base64_keys = [ var for var in os.environ if var.endswith('_B64') ]
21for base64_key in base64_keys:
22    os.environ[base64_key[:-4]] = base64.b64decode(os.environ[base64_key]).strip()
23
24def read_dev_secret(path):
25    file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'dev-secrets', path)
26    if (os.path.exists(file_path)):
27        try:
28            with open(file_path) as fd:
29                return fd.read()
30        except Exception as e:
31            logging.exception('Could not load dev-secret `%s`' % path)
32    return ''
33
34def get_env(name, default=None, prefix='CC_'):
35    val = os.environ.get(prefix + name, default)
36    try:
37        return eval(val) # this is a potential security risk
38    except:
39        return val
40
41
42IS_DEV = get_env('IS_DEV', False)
43IS_LOAD_TESTING = get_env('IS_LOAD_TESTING', False)
44IS_PROD = get_env('IS_PROD', False)
45IS_BETA = get_env('IS_BETA', False)
46IS_ALPHA = get_env('IS_ALPHA', False)
47IS_STAGE = get_env('IS_STAGE', False)
48IS_WORKER = get_env('IS_WORKER', False)
49IS_QA = get_env('IS_QA', False)
50IS_REPORTING = get_env('IS_REPORTING', prefix='')
51IS_TESTING = get_env('IS_TESTING', False)
52IS_EOD = get_env('IS_EOD', False)
53ENV = get_env('ENV')
54ENV_NAME = get_env('ENV_NAME', '')
55QUEUE_PREFIX = get_env('QUEUE_PREFIX', ENV_NAME)
56PROJECT_ROOT = dirname(abspath(join(__file__, pardir)))
57
58TESTS_IN_PROGRESS = 'test' in sys.argv[1:]
59
60if ENV is None:
61    print('ENV is required.')
62    sys.exit(1)
63
64# Needed for canada: http://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html
65AWS_S3_HOST = get_env('AWS_S3_HOST', 's3.amazonaws.com')
66
67NOSE_ARGS = []
68ADMINS = (
69    ('Clearcare Alerts', 'clearcare-alerts@googlegroups.com'),
70)
71ADMIN_MEDIA_PREFIX = '/media/admin/'
72ADMIN_SUBDOMAINS = frozenset(['admin', 'admin2', 'twilio', 'admin-alpha', 'admin-beta'])
73
74ALLOWED_HOSTS = ['*']
75
76APPNEXUS_RETARGETING_PIXEL_ID = get_env('APPNEXUS_RETARGETING_PIXEL_ID', '')
77
78AUTHENTICATION_BACKENDS = (
79    'ratelimit.auth_backend.RateLimitedModelBackend',
80    'core.auth_backend.ModelBackend',
81)
82AUTH_USER_MODEL = 'ccauth.User'
83
84AUTO_LOGOUT_IGNORE_URL = '/is_logged_in/'
85AUTO_LOGOUT_MINS = 1500
86
87AWS_KINESIS_ACCESS_KEY_ID = get_env('AWS_KINESIS_ACCESS_KEY_ID')
88AWS_KINESIS_SECRET_ACCESS_KEY = get_env('AWS_KINESIS_SECRET_ACCESS_KEY')
89KINESIS_EVENT_STREAM_NAME = get_env('KINESIS_EVENT_STREAM_NAME')
90ELASTICSEARCH_EVENT_STREAM_NAME = get_env('ELASTICSEARCH_EVENT_STREAM_NAME')
91
92AWS_ACCESS_KEY_ID = get_env('AWS_ACCESS_KEY_ID', None)
93AWS_SECRET_ACCESS_KEY = get_env('AWS_SECRET_ACCESS_KEY', None)
94AWS_ADMIN_BUCKET_NAME = get_env('AWS_ADMIN_BUCKET_NAME', 'devs-clearcareonline-com')
95AWS_ATTACHMENTS_BUCKET_NAME = get_env('AWS_ATTACHMENTS_BUCKET_NAME', 'devs-clearcareonline-com')
96AWS_SIGNATURE_BUCKET_NAME = get_env('AWS_SIGNATURE_BUCKET_NAME', 'devs-clearcareonline-com')
97AWS_AUDIO_BUCKET_NAME = get_env('AWS_AUDIO_BUCKET_NAME', 'devs-clearcareonline-com')
98AWS_AUTOSCALE_QUEUE = get_env('AWS_AUTOSCALE_QUEUE', 'autoscale')
99AWS_BUCKET_ACL = get_env('AWS_BUCKET_ACL', 'private')
100AWS_BUCKET_NAME = get_env('AWS_BUCKET_NAME', 'devs-clearcareonline-com')
101AWS_DEFAULT_ACL = get_env('AWS_DEFAULT_ACL', 'private')
102AWS_DOCUMENTS_BUCKET_NAME = get_env('AWS_DOCUMENTS_BUCKET_NAME', 'devs-clearcareonline-com')
103AWS_QOC_BUCKET_NAME = get_env('AWS_QOC_BUCKET_NAME', 'devs-clearcareonline-com')
104
105# Access Keys for HSA Page: https://clearcare.atlassian.net/browse/CC-21818
106HSA_AWS_ACCESS_KEY_ID = get_env('HSA_AWS_ACCESS_KEY_ID', AWS_ACCESS_KEY_ID)
107HSA_AWS_SECRET_ACCESS_KEY = get_env('HSA_AWS_SECRET_ACCESS_KEY', AWS_SECRET_ACCESS_KEY)
108
109AWS_DYNAMODB_ACCESS_KEY = get_env('AWS_DYNAMODB_ACCESS_KEY', 'clearcare_local')
110AWS_DYNAMODB_CONFIG_PATH = get_env('AWS_DYNAMODB_CONFIG_PATH', os.path.join(PROJECT_ROOT, 'config/dynamodb.yml'))
111AWS_DYNAMODB_NAMESPACE = get_env('AWS_DYNAMODB_NAMESPACE', 'dev_')
112AWS_TELEPHONY_DYNAMODB_NAMESPACE = get_env('AWS_TELEPHONY_DYNAMODB_NAMESPACE', AWS_DYNAMODB_NAMESPACE)
113AWS_DYNAMODB_SECRET_ACCESS_KEY = get_env('AWS_DYNAMODB_SECRET_ACCESS_KEY', 'secret')
114
115AWS_DYNAMODB_THROUGHPUT = get_env('AWS_DYNAMODB_THROUGHPUT', {
116    'nps_survey':          { 'read': 16, 'write': 8, },
117    'nps_survey_2015_q1':  { 'read': 16, 'write': 8, },
118    'nps_survey_2015_q3':  { 'read': 16, 'write': 8, },
119    'nps_survey_2015_q4':  { 'read': 16, 'write': 8, },
120    'telephony_call_logs': { 'read': 32, 'write': 128, },
121    'change_in_condition': { 'read': 13, 'write': 13, },
122    'conversion_report':   { 'read': 10, 'write': 10, }, })
123
124# this must be set to 'cc-dynamodb' to use local DynamoDB
125AWS_DYNAMODB_HOST = get_env('AWS_DYNAMODB_HOST', None)
126AWS_DYNAMODB_PORT = get_env('AWS_DYNAMODB_PORT', 8000)  # Depending on Docker port mapping, this may be different
127
128AWS_EC2_ACCESS_KEY_ID = get_env('AWS_EC2_ACCESS_KEY_ID')
129AWS_EC2_SECRET_ACCESS_KEY = get_env('AWS_EC2_SECRET_ACCESS_KEY')
130AWS_ES_KMS_ACCESS_KEY_ID = get_env('AWS_ES_KMS_ACCESS_KEY_ID', None)
131AWS_ES_KMS_BUCKET = get_env('AWS_ES_KMS_BUCKET', 'cco-kms')
132AWS_ES_KMS_REGION = get_env('AWS_ES_KMS_REGION', 'us-west-2')
133AWS_ES_KMS_SECRET_ACCESS_KEY = get_env('AWS_ES_KMS_SECRET_ACCESS_KEY', None)
134
135AWS_EXPORTS_BUCKET_NAME = get_env('AWS_EXPORTS_BUCKET_NAME', 'devs-clearcareonline-com')
136AWS_IS_GZIPPED = True
137AWS_LOGOS_BUCKET_NAME = get_env('AWS_LOGOS_BUCKET_NAME', 'devs-clearcareonline-com')
138AWS_PHOTOS_BUCKET_NAME = get_env('AWS_PHOTOS_BUCKET_NAME', 'devs-clearcareonline-com')
139AWS_QUERYSTRING_EXPIRE = 31536000
140AWS_SECURE_URL_EXPIRATION = get_env('AWS_SECURE_URL_EXPIRATION', 60 * 60 * 24 * 14)
141AWS_REGION = get_env('AWS_REGION', 'us-west-2')
142AWS_REPORTS_BUCKET_NAME = get_env('AWS_REPORTS_BUCKET_NAME', 'devs-clearcareonline-com')
143AWS_REDSHIFT_REPORTS_BUCKET_NAME = get_env('AWS_REDSHIFT_REPORTS_BUCKET_NAME', 'report-generation-925330166298-stage')
144AWS_REMITTANCE_ADVICE_FILES_BUCKET_NAME = get_env('AWS_REMITTANCE_ADVICE_FILES_BUCKET_NAME', 'devs-clearcareonline-com')
145AWS_STORAGE_BUCKET_NAME = get_env('AWS_STORAGE_BUCKET_NAME', 'devs-clearcareonline-com')
146AWS_TEMPORARY_BUCKET_NAME = get_env('AWS_TEMPORARY_BUCKET_NAME', 'devs-clearcareonline-com')
147AWS_HSA_PHOTOS_BUCKET_NAME = get_env('AWS_HSA_PHOTOS_BUCKET_NAME', 'devs-clearcareonline-com')
148AWS_REDSHIFT_REPORT_FUNCTION_NAME = get_env('AWS_REDSHIFT_REPORT_FUNCTION_NAME', 'reporting_get_data_url-stage')
149
150AUTH_PASSWORD_RESET_URL = get_env('PASSWORD_RESET_URL', '/password/reset')
151
152AWS_COGNITO_USER_POOL_ID = get_env('AWS_COGNITO_USER_POOL_ID')
153
154BITLY_ACCESS_TOKENS = [
155    'ac368a6aeda49d2f7fa08b2382c0cf66f7bcd597',
156    '43252ac8d9d4cf336c8f46953622b590aef476de',
157]
158
159CACHEOPS = {
160    '*.*': {
161        'ops': (),
162        'timeout': 60,
163    }
164}
165
166if get_env('CACHEOPS_ENABLE', True):
167
168    CACHEOPS_DEFAULTS = {
169        'timeout': 60 * 60 * 2,  # Cache for 2 hrs by default
170        #'db_agnostic': False,
171    }
172
173    # Note: Please don't add any other apps unless you talk to Peter.  If we add more
174    # we need to make sure there are no .update() or .create() orm calls that affect that
175    # app and models
176    CACHEOPS = {
177        'activity.troubledomain': {'ops': ()},
178        'agency.agencyadminalert': {'ops': ()},
179        'agency.agencyadmin': {'ops': ()},
180        'agency.agencyadmin_permissions': {'ops': ()},
181        'agency.agency_agency_tags': {'ops': ()},
182        'agency.agencycaregivercertification': {'ops': ()},
183        'agency.agencycountry': {'ops': ()},
184        'agency.agencycustomfield': {'ops': ()},
185        'agency.agencylocation': {'ops': ()},
186        'agency.agencymonthlystats': {'ops': ()},
187        'agency.agency': {'ops': ()},
188        'agency.agencystatuscolor': {'ops': ()},
189        'agency.sampledata': {'ops': ()},
190        'alerts.alert': {'ops': ()},
191        'auth.*': {'ops': ()},
192        # Billing has raw sql, bypassing Django saves and therefore bypassing
193        # cacheops. If billing tables are ever cached, the use of raw sql in
194        # billing will have to be revisited to make sure that cacheops is
195        # properly invalidated.
196        'caregiver.applicantanswer': {'ops': ()},
197        'caregiver.applicantstatus': {'ops': ()},
198        'caregiver.applicationformsetting': {'ops': ()},
199        'caregiver.caregiver': {'ops': ()},
200        'caregiver.caregiveractivationrecord': {'ops': ()},
201        'caregiver.caregivercertification': {'ops': ()},
202        'caregiver.caregivereducation': {'ops': ()},
203        'caregiver.cargiveremploymenthistory': {'ops': ()},
204        'caregiver.cargiverprofessionalreferences': {'ops': ()},
205        'caregiver.caregiverskillseducation': {'ops': ()},
206        'caregiver.caregiverrecordcheckresults': {'ops': ()},
207        'carelogs.taskcomment': {'ops': ()},
208        'contenttypes.contenttype': {'ops': ()},
209        'holidays.holiday': {'ops': ()},
210        'patient.clientmatchingcriteria': {'ops': ()},
211        'patient.patient': {'ops': ()},
212        'patient.patient_cached_relations': {'ops': ()},
213        'patient.patientactivationrecord': {'ops': ()},
214        'patient.patientcareneedsplan': {'ops': ()},
215        'patient.patientplan': {'ops': ()},
216        'patient.patientplan_allergies': {'ops': ()},
217        'patient.patienticd9code': {'ops': ()},
218        'patient.patientreport': {'ops': ()},
219        'profile.parentpayer': {'ops': ()},
220        'profile.parentpayerservice': {'ops': ()},
221        'profile.patientcontact': {'ops': ()},
222        'profile.phonecarrier': {'ops': ()},
223        'profile.profile': {'ops': ()},
224        'profile.profilederived': {'ops': ()},
225        'profile.receivablesbalance': {'ops': ()},
226        'qbdata.qbconnection': {'ops': ()},
227        'salesforce.salesforceclient': {'ops': ()},
228    }
229
230# Redis must be set to maxmemory-policy volatile-lru
231CACHEOPS_DEGRADE_ON_FAILURE = get_env('CACHEOPS_DEGRADE_ON_FAILURE', True)
232# Note, this isn't working unless we upgrade to a newer version of cacheops
233CACHEOPS_FAKE = get_env('CACHEOPS_FAKE', False)
234CACHEOPS_LRU = get_env('CACHEOPS_LRU', True)
235
236CACHEOPS_REDIS = {
237    'host': get_env('CACHEOPS_REDIS_HOST', 'cc_redis'),
238    'port': get_env('CACHEOPS_REDIS_PORT', 6379),
239    'db': get_env('CACHEOPS_REDIS_DB', '5'),
240}
241
242# Gather cache backend information
243_cache_backend = get_env('CACHE_BACKEND', 'redis_cache.RedisCache')
244_cache_timeout = get_env('CACHE_TIMEOUT', 3600)
245_cache_ssl = get_env('REDIS_SSL', False)
246_cache_database = get_env('CACHE_DB', 1)
247# No SSL or AUTH in lower environments, so don't check for one if SSL is off
248_cache_password = get_env('CACHE_REDIS_TOKEN', None) if _cache_ssl else None
249_cache_connstr = 'redis{}://{}{}:{}/{}'.format(
250    's' if _cache_ssl else '',
251    ':{}@'.format(_cache_password) if _cache_password else '',
252    get_env('CACHE_HOST', 'cache.ccointernal.com'),
253    get_env('CACHE_PORT', 6379),
254    _cache_database
255)
256_cache_location = get_env('CACHE_LOCATION', _cache_connstr)
257
258# Gather sessions backend information
259_sessions_backend = get_env('SESSIONS_BACKEND', 'redis_cache.RedisCache')
260_sessions_timeout = get_env('SESSIONS_TIMEOUT', 3600)
261_sessions_ssl = get_env('SESSIONS_SSL', False)
262_sessions_database = get_env('SESSIONS_DB', 0)
263# No SSL or AUTH in lower environments, so don't check for one if SSL is off
264_sessions_password = get_env('SESSIONS_REDIS_TOKEN', None) if _sessions_ssl else None
265_sessions_connstr = 'redis{}://{}{}:{}/{}'.format(
266    's' if _sessions_ssl else '',
267    ':{}@'.format(_sessions_password) if _sessions_password else '',
268    get_env('SESSIONS_HOST', 'session.ccointernal.com'),
269    get_env('SESSIONS_PORT', 6379),
270    _sessions_database
271)
272_sessions_location = get_env('SESSIONS_LOCATION', _sessions_connstr)
273
274# Define cache backends
275CACHES = {
276    'default': {
277        'BACKEND': _cache_backend,
278        'LOCATION': _cache_location,
279        'OPTIONS': {
280            'PARSER_CLASS': 'redis.connection.HiredisParser',
281        },
282        'TIMEOUT': _cache_timeout,
283    },
284    'sessions': {
285        'BACKEND': _sessions_backend,
286        'LOCATION': _sessions_location,
287        'TIMEOUT': _sessions_timeout
288    }
289}
290
291# Name of cache backend to cache user agents. If it not specified default
292# cache alias will be used. Set to `None` to disable caching.
293USER_AGENTS_CACHE = None
294
295if IS_PROD:
296    _logmein_timeout = get_env('LOGMEIN_TIMEOUT', 10)
297    _logmein_database = get_env('LOGMEIN_DB', 1)
298    CACHES['logmein'] = {
299        'BACKEND': _sessions_backend,
300        'LOCATION': _sessions_location,
301        'OPTIONS': {
302            'DB': _logmein_database,
303            'PARSER_CLASS': 'redis.connection.HiredisParser',
304        },
305        'TIMEOUT': _logmein_timeout,
306    }
307
308LOGIN_RATE_LIMIT_ENABLE = get_env('LOGIN_RATE_LIMIT_ENABLE', default=True)
309LOGIN_RATE_LIMIT_LOCKOUT = get_env('LOGIN_RATE_LIMIT_LOCKOUT', default=False)
310LOGIN_RATE_LIMIT_MINUTES = get_env('LOGIN_RATE_LIMIT_MINUTES', default=5)
311LOGIN_RATE_LIMIT_MAX_TRIES = get_env('LOGIN_RATE_LIMIT_MAX_TRIES', default=3)
312
313CAREGIVER_PORTAL_AGENCY_URL = get_env('CAREGIVER_PORTAL_AGENCY_URL', 'http://agency.ats.vg')
314CAREGIVER_PORTAL_API_URL = get_env('CAREGIVER_PORTAL_API_URL', 'http://api.ats.vg')
315CAREGIVER_PORTAL_SHARED_SECRET = '8MOG2z1K5s78v9A34H4SR33RTMGmcoc0'
316
317CELERYBEAT_SCHEDULE = {}
318CELERYD_HIJACK_ROOT_LOGGER = False
319
320CELERY_ALWAYS_EAGER = get_env('CELERY_ALWAYS_EAGER', False)
321CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
322CELERY_DEFAULT_EXCHANGE = get_env('CELERY_DEFAULT_EXCHANGE', 'celery_topic')
323CELERY_DEFAULT_EXCHANGE_TYPE = 'topic'
324CELERY_DEFAULT_QUEUE = get_env('CELERY_DEFAULT_QUEUE', 'celery')
325CELERY_EAGER_PROPAGATES_EXCEPTIONS = get_env('CELERY_EAGER_PROPAGATES_EXCEPTIONS', True)
326CELERY_EVENT_QUEUE_TTL = 10
327CELERY_HAYSTACK_DEFAULT_TASK = 'celery_haystack.tasks.CeleryHaystackSignalHandler'
328CELERY_HAYSTACK_QUEUE = None
329CELERY_HAYSTACK_COUNTDOWN = 0
330
331if not IS_DEV:
332    QUEUE_BUCKETS = {
333        '00m_sla': frozenset([
334            'authorizations.tasks.authorization_set_carelog_task',
335            'authorizations.tasks.authorization_set_shift_task',
336            'authorizations.tasks.authorization_update_objects_task',
337            'authorizations.tasks.process_splits_for_auth_task',
338            'accounting_exports.tasks.update_carelogs_and_items_to_exported_task',
339            'core.tasks.invalidate_objects_task',
340            'quality_care.tasks.send_qoc_reminder_alerts_task',
341            'quickbooks.tasks.release_qbo_sync_key_for_agency',
342            'sms.tasks.receive_sms_task',
343
344        ]),
345        '00m_sla_reporting': frozenset([
346            'reports.tasks.generate_standard_report_data_task',
347            'reports.tasks.generate_franchisor_report_data_task',
348            'reports.tasks.generate_report_data_task',
349            'accounting_exports.tasks.export_billing_finalized_accounting_task',
350            'accounting_exports.tasks.export_payroll_finalized_accounting_task',
351        ]),
352        '01m_sla': frozenset([
353            'activity.tasks.send_email_task',
354            'activity.tasks.send_maillog_task',
355            'alerts.tasks.agency_clock_in_task',
356            'alerts.tasks.agency_clock_out_task',
357            'billing.tasks.agency_create_caregiver_rates_task',
358            'billing.tasks.agency_create_client_rates_task',
359            'billing.tasks.compute_travel_time_duration',
360            'billing.tasks.compute_travel_time_miles',
361            'billing.tasks.create_caregiver_rates_task',
362            'billing.tasks.create_caregiver_rate_task',
363            'billing.tasks.create_client_rates_task',
364            'billing.tasks.create_client_rate_task',
365            'billing.tasks.create_rates_task',
366            'billing.tasks.delete_rates_task',
367            'billing.tasks.handle_adjustment_after_saving_carelog_task',
368            'billing.tasks.save_items_task',
369            'billing.tasks.update_caregiver_rate_task',
370            'billing.tasks.update_client_rate_task',
371            'billing.tasks.update_last_item_date',
372            'billing.tasks.update_mileage_task',
373            'billing.tasks.update_rates_task',
374            'billing.tasks.update_rates_task_noop',
375            'billing.tasks.update_tiered_rates_task',
376            'carelogs.tasks.retroactively_update_carelog_pay_rate_amount_task',
377            'dashboard.tasks.add_activity_task',
378            'employment_screening.tasks.checkr_candidate_submit_authorization_task',
379            'holidays.tasks.update_holiday_info_for_date',
380            'medicaid.tasks.enqueue_carelog',
381            'medicaid.tasks.enqueue_invoice',
382            'medicaid.tasks.enqueue_profile',
383            'medicaid.tasks.enqueue_authorization_carelog',
384            'quality_care.tasks.add_carelog_stats_task',
385            'quickbooks.tasks.execute_session_todos_task',
386            'quickbooks.tasks.sync_with_qbo_task',
387            'receivables.tasks.create_invoices_task',
388            'receivables.tasks.do_designations_task',
389            'receivables.tasks.email_invoice_task',
390            'receivables.tasks.update_profile_receivables_balance',
391            'reports.tasks.remove_report_status_from_firebase',
392            'subscription.tasks.send_subscription_webhook',
393        ]),
394        '05m_sla': frozenset([
395            'activity.tasks.handle_event_task',
396            'agency.tasks.migrate_agency_to_care_finder',
397            'alerts.tasks.process_geolocation',
398            'alerts.tasks.agency_missed_tasks_task',
399            'caregiver.tasks.update_user_is_active_send_login_email',
400            'carelogs.tasks.download_task_comment',
401            'carelogs.tasks.split_carelog_task',
402            'ccadmin.tasks.import_excel_file_task',
403            'ccadmin.tasks.undo_import_excel_file_task',
404            'employment_screening.tasks.checkr_update_packages_for_es_account_task',
405            'geocode.tasks.geolocate_task',
406            'medicaid.tasks.generate_evv_file',
407            'payments.tasks.email_scheduled_transactions_summary_task',
408            'payments.tasks.email_ach_failures_task',
409            'payments.tasks.reconcile_scheduled_payments_task',
410            'quality_care.tasks.qoc_enable_automated_tasks_for_all_clients_task',
411            'quickbooks.models.process_todo_delayed_task',
412            'quickbooks.tasks.grab_actions_task',
413            'quickbooks.tasks.grab_action_task',
414            'quickbooks.tasks.qbo_sync_payment_methods_task',
415            'quickbooks.tasks.update_qb_invoice_task',
416            'quickbooks.tasks.update_qb_payment_task',
417            'receivables.tasks.update_agency_receivables_balance_task',
418            'referral_sources.tasks.get_owner_from_company',
419            'referral_sources.tasks.propagate_owner_to_personnel',
420            'salesforce.tasks.create_missing_sf_contact',
421            'salesforce.tasks.handle_salesforce_outbound_message_task',
422            'salesforce.tasks.update_salesforce_task',
423            'schedules.tasks.fcfs_broadcast_open_shift_task',
424            'schedules.tasks.fcfs_broadcast_accepted_shift_task',
425            'schedules.tasks.fcfs_remove_notification_task',
426            'sms.tasks.register_more_twilio_sms_numbers_task',
427            'sms.tasks.sms_status_task',
428            'zuora_app.tasks.zuora_create_amendment_task',
429            'zuora_app.tasks.zuora_delete_amendment_task',
430            'zuora_app.tasks.zuora_set_default_payment_method',
431            'zuora_app.tasks.zuora_update_tablet_count_task',
432            'caregiver.tasks.update_user_is_active_send_login_email',
433            'profile.tasks.family_room_invite_email_task',
434            'profile.tasks.reset_all_caregiver_rounding_rules_task',
435            'profile.tasks.reset_all_client_rounding_rules_task',
436            'profile.tasks.reset_all_caregiver_minimum_minutes_task',
437            'profile.tasks.reset_all_client_minimum_minutes_task',
438            'medicaid.tasks.update_transaction_by_external_vendor',
439        ]),
440        '10m_sla': frozenset([
441            'activity.tasks.send_task_reminders_task',
442            'agency.status_io_utils.status_io_add_agency_admin',
443            'agency.status_io_utils.status_io_update_agency_admin',
444            'agency.status_io_utils.status_io_remove_agency_admin',
445            'agency.tasks.make_agency_admin_alert_instances',
446            'agency.tasks.register_agency_telephony_number_task',
447            'agency.tasks.sync_holidays_task',
448            'authorizations.tasks.authorization_save_task',
449            'caregiver.tasks.handle_caregiver_referrer_changes_task',
450            'carelogs.tasks.caregiver_update_first_and_last_carelog_date',
451            'carelogs.tasks.client_update_last_carelog_date',
452            'carelogs.tasks.download_signature_file_task',
453            'carelogs.tasks.run_overtime_calculations_task',
454            'data_exports.tasks.export_client_data_task',
455            'data_exports.tasks.export_invoice_data_task',
456            'data_exports.tasks.export_payment_data_task',
457            'medicaid.tasks.convert_remittance_file_task',
458            'patient.tasks.cc_send_email_hsa',
459            'patient.tasks.update_cached_relations_task',
460            'quickbooks.tasks.create_quickbook_export_items_task',
461            'quickbooks.tasks.create_quickbook_jobs_task',
462            'recruiting.tasks.sync_agency_to_caregiver_portal',
463            'salesforce.tasks.salesforce_contact_delete_task',
464            'salesforce.tasks.salesforce_contact_update_task',
465            'salesforce.tasks.salesforce_es_status_update_task',
466            'salesforce.tasks.salesforce_pp_status_activation_task',
467            'salesforce.tasks.salesforce_pp_total_processed_task',
468            'salesforce.tasks.salesforce_rename_account_task',
469            'salesforce.tasks.salesforce_ws_feature_flags_update_task',
470            'salesforce.tasks.ws_status_activation_task',
471            'schedules.tasks.convert_shifts_task',
472            'twilio_app.tasks.task_create_cic_in_rdb',
473            'zuora_app.tasks.zuora_sync_agency_task',
474            'reports.tasks.email_report_complete',
475        ]),
476        '30m_sla': frozenset([
477            'cognito.tasks.update_dynamodb_migration_data',
478            'cognito.tasks.delete_user_from_dynamodb',
479        ]),
480        '60m_sla': frozenset([
481            'activity.tasks.send_shift_reminder_maillog_task',
482            'activity.tasks.unsubscribe_profile_bounced',
483            'activity.tasks.unsubscribe_profile_spamreport',
484            'activity.tasks.update_status_last_contact_task',
485            'agency.tasks.publish_agency_oboarding_complete_event_task',
486            'alerts.tasks.calc_shift_reminders_task',
487            'alerts.tasks.send_shift_reminders_task',
488            'caregiver.tasks.batch_work_order_request',
489            'caregiver.tasks.disable_careguard',
490            'caregiver.tasks.work_order_request',
491            'celery_haystack.tasks.CeleryHaystackUpdateIndex',
492            'patient.tasks.handle_client_referrer_changes_task',
493            'payments.tasks.update_ach_status_task',
494            'qbdata.tasks.delete_qb_connection_task',
495            'referral_sources.tasks.create_first_time_referral_task',
496            'referral_sources.tasks.update_count_task',
497            'referral_sources.tasks.update_lifetime_value_carelog',
498            'referral_sources.tasks.update_lifetime_value_item',
499            'salesforce.tasks.salesforce_update_es_oppty_set_closed_won_task',
500            'salesforce.tasks.update_salesforce_task_wrapper',
501            'schedules.tasks.update_shift_dates_task',
502            'sms.tasks.mark_invalid_non_unsubscribed_numbers_valid',
503            'twilio_app.tasks.release_twilio_number',
504            'quality_care.tasks.send_qoc_missing_ccc_alert_task',
505            'quickbooks.tasks.match_and_cleanup_customers',
506            'workers_compensation.tasks.send_shift_injury_email_task',
507            'workers_compensation.tasks.send_instructions_to_caregiver_in_case_of_injury_task',
508            'workers_compensation.tasks.download_safety_recording_task',
509            'profile.tasks.update_carelog_esignature_status_task',
510        ]),
511        '00m_sla_debug': frozenset([
512        ]),
513        '00m_sla_reporting_debug': frozenset([
514        ]),
515        '01m_sla_debug': frozenset([
516        ]),
517        '05m_sla_debug': frozenset([
518            'core.tasks.CeleryHaystackIndexTask',
519            'celery_haystack.tasks.CeleryHaystackSignalHandler',
520        ]),
521        '10m_sla_debug': frozenset([
522            'receivables.tasks.update_balances_task',
523        ]),
524        '60m_sla_debug': frozenset([
525        ]),
526        'migration': frozenset([
527            'activity.management.commands.extract_email_ids.process_records',
528            'activity.management.commands.purge_email_bodies.process_records',
529        ]),
530    }
531
532    from kombu import Queue, Exchange, binding
533
534    celery_queues = []
535    celery_routes = []
536    for queue_name, queue_tasks in QUEUE_BUCKETS.iteritems():
537        queue_name = '{}-{}'.format(QUEUE_PREFIX, queue_name)
538        for task_name in queue_tasks:
539            celery_queues.append(Queue(queue_name, Exchange(queue_name), routing_key=queue_name))
540            celery_routes.append({task_name: {'queue': queue_name, 'exchange': queue_name, 'routing_key': queue_name}})
541    CELERY_QUEUES = tuple(celery_queues)
542    CELERY_ROUTES = tuple(celery_routes)
543else:
544    CELERY_ROUTES = ()
545
546CELERY_SEND_TASK_ERROR_EMAILS = get_env('CELERY_SEND_TASK_ERROR_EMAILS', False)
547CELERY_TASK_ERROR_WHITELIST = ('carelogs.tasks.download_signature_file_task',)
548
549CELERY_TIMEZONE = 'US/Eastern'
550
551# set delay to compensate for lag in database write
552CELERY_HAYSTACK_COUNTDOWN = get_env('CELERY_HAYSTACK_COUNTDOWN', 10)
553
554# Checkr production account
555CHECKR_API_KEY = get_env('CHECKR_API_KEY', '372678834135f791f6375f74764422f1d12b5e27')
556CHECKR_CLIENT_ID = get_env('CHECKR_CLIENT_ID', '8bada460240f3844466385e3')
557CHECKR_SECRET_ID = get_env('CHECKR_SECRET_ID', '9dcec1d469975e0b9a2e76e22ed1f3276dbea1ee')
558
559CLEARCAREMAIL_HOST = get_env('CLEARCAREMAIL_HOST', 'mail.docker.vg')
560CLEARCARE_REPLY_MAIL_HOST = get_env('CLEARCARE_REPLY_MAIL_HOST', 'mail.docker.vg')
561
562CLIENT_BILLING_TYPES_CUTOFF_DATE = datetime.datetime(2016, 2, 29, 0, 0)
563CLOCK_IN_GRACE_MINUTES_MAX = 500
564
565COMPRESS_CSS_FILTERS = (
566    'compressor.filters.css_default.CssAbsoluteFilter',
567    'compressor.filters.cssmin.CSSMinFilter',
568)
569COMPRESS_CSS_HASHING_METHOD = 'content'
570COMPRESS_DEBUG_TOGGLE = 'no_compress'
571COMPRESS_ENABLED = False
572COMPRESS_OFFLINE_CONTEXT = {
573    'MEDIA_URL': '/media/',
574    'STATIC_URL': get_env('OFFLINE_STATIC_URL', '/media/static/'),
575}
576COMPRESS_OFFLINE_MANIFEST = 'manifest.json'
577COMPRESS_OUTPUT_DIR = 'cache'
578
579COMPRESS_PRECOMPILERS = get_env('COMPRESS_PRECOMPILERS', ())
580
581COMPRESS_ROOT = get_env('COMPRESS_ROOT', '/code/clearcare/media')
582COMPRESS_STORAGE = get_env('COMPRESS_STORAGE', 'compressor.storage.CompressorFileStorage')
583
584COMPRESS_URL = get_env('COMPRESS_URL', '/static/')
585
586CONVERSION_REPORT_RECIPIENTS = get_env('CONVERSION_REPORT_RECIPIENTS', [])
587
588CORS_ALLOW_CREDENTIALS = True
589CORS_ALLOW_HEADERS = (
590    'accept',
591    'application',
592    'authorization',
593    'content-type',
594    'origin',
595    'x-csrftokenX-Csrftoken',
596    'X-CSRFToken',
597    'x-requested-with',
598    'X-Requested-With',
599    'X-Version',
600    'x-version',
601)
602CORS_ORIGIN_ALLOW_ALL = True
603CORS_PREFLIGHT_MAX_AGE = 86400
604COVERAGE_EXCLUDES_FOLDERS = ('*migrations*', '*management/commands*', '*tests*')
605# Note!  The value of this is hardcoded in our javascript: common.js.  If the value of
606# CSRF_COOKIE_NAME changes, the javascript *must* change to match, otherwise all ajax requests will
607# fail.
608CSRF_COOKIE_NAME = get_env('CSRF_COOKIE_NAME', 'cc_csrftokenator')
609CSRF_COOKIE_SECURE = get_env('CSRF_COOKIE_SECURE', False)
610CSRF_FAILURE_VIEW = 'core.views.csrf_failure'
611
612# Database configuration
613
614WEB_WRITE_ELB_CONF = {
615    'ENGINE': 'backends.db',
616    'NAME': get_env('WEB_WRITE_ELB_CONF_NAME', 'clearcare'),
617    'USER': get_env('WEB_WRITE_ELB_CONF_USER', 'cc_user'),
618    'PASSWORD': get_env('WEB_WRITE_ELB_CONF_PASSWORD', '1a2b3c4d'),
619    'HOST': get_env('WEB_WRITE_ELB_CONF_HOST', 'write.ccodb.ccointernal.com'),
620    'PORT': get_env('WEB_WRITE_ELB_CONF_PORT', '6432'),
621}
622
623WEB_READ_ELB_CONF = {
624    'ENGINE': 'backends.db',
625    'NAME': get_env('WEB_READ_ELB_CONF_NAME', 'clearcare'),
626    'USER': get_env('WEB_READ_ELB_CONF_USER', 'cc_user'),
627    'PASSWORD': get_env('WEB_READ_ELB_CONF_PASSWORD', '1a2b3c4d'),
628    'HOST': get_env('WEB_READ_ELB_CONF_HOST', 'read.ccodb.ccointernal.com'),
629    'PORT': get_env('WEB_READ_ELB_CONF_PORT', '6432'),
630}
631
632WORKER_WRITE_ELB_CONF = {
633    'ENGINE': 'backends.db',
634    'NAME': get_env('WORKER_WRITE_ELB_CONF_NAME', 'clearcare_worker'),
635    'USER': get_env('WORKER_WRITE_ELB_CONF_USER', 'cc_user'),
636    'PASSWORD': get_env('WORKER_WRITE_ELB_CONF_PASSWORD', '1a2b3c4d'),
637    'HOST': get_env('WORKER_WRITE_ELB_CONF_HOST', 'write.ccodb.ccointernal.com'),
638    'PORT': get_env('WORKER_WRITE_ELB_CONF_PORT', '6432'),
639}
640
641WORKER_READ_ELB_CONF = {
642    'ENGINE': 'backends.db',
643    'NAME': get_env('WORKER_READ_ELB_CONF_NAME', 'clearcare_worker'),
644    'USER': get_env('WORKER_READ_ELB_CONF_USER', 'cc_user'),
645    'PASSWORD': get_env('WORKER_READ_ELB_CONF_PASSWORD', '1a2b3c4d'),
646    'HOST': get_env('WORKER_READ_ELB_CONF_HOST', 'worker.ccodb.ccointernal.com'),
647    'PORT': get_env('WORKER_READ_ELB_CONF_PORT', '6432')
648}
649
650REPORTING_READ_ELB_CONF = {
651    'ENGINE': 'backends.db',
652    'NAME': get_env('REPORTING_READ_ELB_CONF_NAME', 'clearcare_reporting'),
653    'USER': get_env('REPORTING_READ_ELB_CONF_USER', 'cc_user'),
654    'PASSWORD': get_env('REPORTING_READ_ELB_CONF_PASSWORD', '1a2b3c4d'),
655    'HOST': get_env('REPORTING_READ_ELB_CONF_HOST', 'reporting.ccodb.ccointernal.com'),
656    'PORT': get_env('REPORTING_READ_ELB_CONF_PORT', '6432'),
657}
658
659DATABASES = {
660    'default': WEB_WRITE_ELB_CONF,
661    'masterdb': WEB_WRITE_ELB_CONF,
662    'masterdb2': WEB_WRITE_ELB_CONF,
663    'workerslavedb1': WORKER_READ_ELB_CONF,
664    'slavedb1': WEB_READ_ELB_CONF,
665    'slavedb2': WEB_READ_ELB_CONF,
666    'slavedb3': WEB_READ_ELB_CONF,
667    'slavedb4': WEB_READ_ELB_CONF,
668    'api-slave-db1': REPORTING_READ_ELB_CONF,
669}
670
671if IS_DEV or IS_QA:
672    DATABASES = {
673        'default': {
674            'ENGINE': 'backends.db',
675            'HOST': get_env('DATABASE_HOST', 'cc_db'),
676            'NAME': get_env('DATABASE_NAME', 'clearcare'),
677            'PASSWORD': get_env('DATABASE_PASSWORD', ''),
678            'PORT': get_env('DATABASE_PORT', 5432),
679            'USER': get_env('DATABASE_USER', 'postgres'),
680        },
681    }
682
683DATABASE_ROUTERS = ('multidb.PinningMasterSlaveRouter',)
684DEBUG = get_env('DEBUG', True)
685
686DEFAULT_DATABASE_OPTIONS = get_env('DEFAULT_DATABASE_OPTIONS', ['default'])
687
688DEFAULT_FROM_EMAIL = get_env('DEFAULT_FROM_EMAIL', 'no-reply@testclearcaremail.com')
689DEFAULT_TIMEZONE = get_env('DEFAULT_TIMEZONE', 'US/Pacific')
690DEFAULT_TO_EMAIL = get_env('DEFAULT_TO_EMAIL', 'dev@clearcareonline.com')
691DEV_BUCKET_NAME = get_env('DEV_BUCKET_NAME', 'devs-clearcareonline-com')
692
693DYNAMODB_TABLE_CHANGE_IN_CONDITION = get_env('DYNAMODB_TABLE_CHANGE_IN_CONDITION', 'new_change_in_condition')
694DYNAMODB_TABLE_OLD_CHANGE_IN_CONDITION = get_env('DYNAMODB_TABLE_OLD_CHANGE_IN_CONDITION', 'change_in_condition')
695DYNAMODB_TABLE_ES_CONVERSION_REPORT = get_env('DYNAMODB_TABLE_ES_CONVERSION_REPORT', 'es_conversion_report')
696DYNAMODB_TABLE_NPS_SURVEY = get_env('DYNAMODB_TABLE_NPS_SURVEY', 'nps_survey_2015_q3')
697DYNAMODB_TABLE_PP_CONVERSION_REPORT = get_env('DYNAMODB_TABLE_PP_CONVERSION_REPORT', 'conversion_report')
698DYNAMODB_TABLE_QUALITY_OF_CARE = get_env('DYNAMODB_TABLE_QUALITY_OF_CARE', 'quality_of_care_study')
699# Telephony specific tables:
700DYNAMODB_TABLE_TELEPHONY_LOGS = get_env('DYNAMODB_TABLE_TELEPHONY_LOGS', 'telephony_call_logs')
701DYNAMODB_TABLE_TELEPHONY_SESSION = get_env('DYNAMODB_TABLE_TELEPHONY_SESSION', 'telephony_session')
702DYNAMODB_TABLE_NEW_TELEPHONY_LOGS = get_env('DYNAMODB_TABLE_NEW_TELEPHONY_LOGS', 'new_telephony_call_logs')
703
704DYNAMODB_TABLE_WC_RENEWAL = get_env('DYNAMODB_TABLE_WC_RENEWAL', 'wc_renewal')
705DYNAMODB_TABLE_WOTC_PAY_PERIOD = get_env('DYNAMODB_TABLE_WOTC_PAY_PERIOD', 'es_wotc_pay_period')
706
707ELASTICSEARCH_HOST = get_env('ELASTICSEARCH_HOST', 'es-cco.ccointernal.com')
708ELASTICSEARCH_PORT = get_env('ELASTICSEARCH_PORT', 9200)
709
710EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
711EMAIL_HOST = get_env('EMAIL_HOST', 'smtp.sendgrid.net')
712EMAIL_PORT = get_env('EMAIL_PORT', 587)
713EMAIL_HOST_USER = get_env('EMAIL_HOST_USER', '')
714EMAIL_HOST_PASSWORD = get_env('EMAIL_HOST_PASSWORD', '')
715if IS_PROD:
716    EMAIL_SUBJECT_PREFIX = 'Prod Web: '
717else:
718    EMAIL_SUBJECT_PREFIX = 'DEV: '
719
720EMPLOYMENT_SCREENING_ENV = get_env('EMPLOYMENT_SCREENING_ENV', 'dev')
721EMPLOYMENT_SCREENING_ENDPOINT = get_env('EMPLOYMENT_SCREENING_ENDPOINT', 'http://esm.vg')
722EMPLOYMENT_SCREENING_SHARED_SECRET = get_env('EMPLOYMENT_SCREENING_SHARED_SECRET', 'Tq/*_\eZR2E(duHE')
723EMPLOYMENT_SCREENING_STANDARD_AUTHORIZATION_LABEL = (
724    'By checking this box you acknowledge that you have read the Consumer Disclosure '
725    'below and that you authorize General Information Services, Inc. ("GIS") to request '
726    'and report information as fully described in the Authorization below.'
727)
728EMPLOYMENT_SCREENING_STANDARD_AUTHORIZATION_TEXT = """AUTHORIZATION
729
730You authorize: (a) General Information Services, Inc. ("GIS") to request information about you from any public or private information source; (b) anyone to provide information about you to GIS; (c) GIS to provide us, {agency_name}, one or more reports based on that information; and (d) us to share those reports with others for legitimate business purposes related to your employment. GIS may investigate your education, work history, professional licenses and credentials, references, address history, social security number validity, right to work, criminal record, lawsuits, driving record, credit history, and any other information with public or private information sources. You acknowledge that an image or electronic copy of this authorization is as valid as the original. You make this authorization to be valid for as long as you are an applicant or employee with us.
731
732The Consumer Financial Protection Bureau's "Summary of Your Rights under the Fair Credit Reporting Act" is available at http://www.geninfo.com/docs/Summary-of-Rights.pdf
733
734If you are a New York applicant, a copy of New York's law on the use of criminal records is available at http://www.geninfo.com/docs/New-York-Corrections-Law-Article-23-A.pdf
735
736CONSUMER DISCLOSURE
737
738We, {agency_name}, will obtain one or more consumer reports or investigative consumer reports (or both) about you for employment purposes. These purposes may include hiring, contract, assignment, promotion, re-assignment, and termination. The reports will include information about your character, general reputation, personal characteristics, and mode of living. We will obtain these reports through a consumer reporting agency. Our consumer reporting agency is General Information Services, Inc. GIS's address is P.O. Box 353, Chapin, SC 29036. GIS's telephone number is (866) 265-4917. GIS's website is at www.geninfo.com, where you can find information about GIS's international privacy practices. To prepare the reports, GIS may investigate your education, work history, professional licenses and credentials, references, address history, social security number validity, right to work, criminal record, lawsuits, driving record, credit history, and any other information with public or private information sources. You may obtain a copy of any report that GIS provides and GIS's files about you (in person, by mail, or by phone) by providing identification to GIS. If you do, GIS will provide you help to understand the files, including trained personnel and an explanation of any codes. Another person may accompany you by providing identification. If GIS obtains any information by interview, you have the right to obtain a complete and accurate disclosure of the scope and nature of the investigation performed."""
739EMPLOYMENT_SCREENING_UPDATE_REPORTS_ORDERED_BY = get_env('EMPLOYMENT_SCREENING_UPDATE_REPORTS_ORDERED_BY', 'clearcare_admin')
740EMPLOYMENT_SCREENING_WOTC_ENCRYPTION_SECRET = get_env('EMPLOYMENT_SCREENING_WOTC_ENCRYPTION_SECRET', '')
741
742ENABLE_CAREGIVER_PORTAL_SYNC = get_env('ENABLE_CAREGIVER_PORTAL_SYNC', True)
743ENABLE_GOOGLE_MAPS_ENTERPRISE = get_env('ENABLE_GOOGLE_MAPS_ENTERPRISE', False)
744ENABLE_HCA_SALESFORCE_INTEGRATION = get_env('ENABLE_HCA_SALESFORCE_INTEGRATION', False)
745ENABLE_NPS_SURVEY = get_env('ENABLE_NPS_SURVEY', False)
746ENABLE_PROFILING = get_env('ENABLE_PROFILING', False)
747ENABLE_QUALITY_OF_CARE_EXPORT = get_env('ENABLE_QUALITY_OF_CARE_EXPORT', False)
748ENABLE_QUICKBOOKS_ONLINE_INTEGRATION = get_env('ENABLE_QUICKBOOKS_ONLINE_INTEGRATION', True)
749ENABLE_SALESFORCE_INTEGRATION = get_env('ENABLE_SALESFORCE_INTEGRATION', False)
750ENABLE_SCHEDULED_PAYMENTS_TESTING = get_env('ENABLE_SCHEDULED_PAYMENTS_TESTING', False)
751ENABLE_SECONDARY_INDEXING = get_env('ENABLE_SECONDARY_INDEXING', False)
752ENABLE_TWILIO_INTEGRATION = get_env('ENABLE_TWILIO_INTEGRATION', True)
753ENABLE_WALKME = get_env('ENABLE_WALKME', False)
754ENABLE_WALKME_ICONS = get_env('ENABLE_WALKME_ICONS', False)
755ENABLE_WEB_AND_MARKETING_ANALYTICS = get_env('ENABLE_WEB_AND_MARKETING_ANALYTICS', False)
756INTERCOM_IO_APP_ID = get_env('INTERCOM_IO_APP_ID', '')
757ENABLE_ZUORA_INTEGRATION = get_env('ENABLE_ZUORA_INTEGRATION', True)
758
759ACH_ZERO_OUT_STATUSES = ['Returned', 'Voided', 'Reversed', 'Unknown', 'Error']
760
761ES_REPORT_RECIPIENTS = get_env('ES_REPORT_RECIPIENTS', [])
762
763QOC_REPORT_RECIPIENTS = get_env('QOC_REPORT_RECIPIENTS', [])
764
765HCA_SFDC_ERRORS_RECIPIENTS = get_env('HCA_SFDC_ERRORS_RECIPIENTS', [])
766
767
768FEATURE_FLAGS = {
769    'parent_payer_rounding': (),
770    'qbo_oauth2': (),
771    'toggle_queued_to_exported': (),
772    'hq_tags': (),
773    'looker_admin_analytics': (),
774    'overtime_minutes': (),
775    'bill_pay_automation': (),
776    'qoc_agency_settings': (),
777    'retroactive_pay_rate_changes': (),
778    'ajax_rates_shift_modal': (),
779    'community_task_sets': (),
780    'disable_employment_screening': (),
781    'disable_payment_services': (),
782    'payroll_export_data': (),
783    'overtime_combine_holiday_premium': (),
784    'quickbooks_export_holiday_fix': (),
785    'epayments_as_deposits': (),
786    'recurring_tasks': (),
787    'looker_dashboards': (),
788    'telephonysession_in_dynamodb': (
789
790    ),
791    'acl_roles': (),
792    'secure_links': (),
793    'confidential_links': (),
794    'google_url_shortener': (
795
796    ),
797    'home_safety_assessment': (
798
799    ),
800    'new_table_dict': (
801    ),
802    'suppress_false_alerts': (),
803    'use_graphql_search': (),
804    'client_places': [
805        {
806            'argument_class': 'AgencyArgument',
807            'argument_attribute': 'subdomain',
808            'operator': 'equals',
809            'value': 'metzler',
810        },
811    ],
812    'community_care_alternate_pricing': [
813        {
814            'argument_class': 'AgencyArgument',
815            'argument_attribute': 'subdomain',
816            'operator': 'equals',
817            'value': 'metzler',
818        },
819    ],
820    'family_care':[
821        {
822            'argument_class': 'AgencyArgument',
823            'argument_attribute': 'subdomain',
824            'operator': 'equals',
825            'value': 'metzler',
826        },
827    ],
828    'adhoc_carelogs_update': [
829        {
830            'argument_class': 'AgencyArgument',
831            'argument_attribute': 'subdomain',
832            'operator': 'equals',
833            'value': 'metzler',
834        },
835    ],
836    'individual_rate_policy_and_auths':(),
837    'async_qb_match_and_cleanup': (),
838    'force_worksafe_tab_visible': (),
839    'payroll_bulk_export': (
840        {
841            'value': 'metzler',
842        },
843    ),
844    'billing_bulk_export': (
845        {
846            'value': 'metzler',
847        },
848    ),
849
850    'quickbooks_debug_mode': (),
851    'receivables_custom_field': (),
852    'mobile_location_disabled_setting': [
853        {
854            'argument_class': 'AgencyArgument',
855            'argument_attribute': 'subdomain',
856            'operator': 'equals',
857            'value': 'metzler',
858        },
859    ],
860    'family_room_pictures': [
861        {
862            'argument_class': 'AgencyArgument',
863            'argument_attribute': 'subdomain',
864            'operator': 'equals',
865            'value': 'metzler',
866        },
867    ],
868    'family_room_pictures_web': [
869        {
870            'argument_class': 'AgencyArgument',
871            'argument_attribute': 'subdomain',
872            'operator': 'equals',
873            'value': 'metzler',
874        },
875    ],
876    'family_room_pictures_mobile': [
877        {
878            'argument_class': 'AgencyArgument',
879            'argument_attribute': 'subdomain',
880            'operator': 'equals',
881            'value': 'metzler',
882        },
883    ],
884    'family_room_pictures_gallery': [
885        {
886            'argument_class': 'AgencyArgument',
887            'argument_attribute': 'subdomain',
888            'operator': 'equals',
889            'value': 'metzler',
890        },
891    ],
892    '835_remittance_conversion': [
893        {
894            'argument_class': 'AgencyArgument',
895            'argument_attribute': 'subdomain',
896            'operator': 'equals',
897            'value': 'metzler',
898        },
899    ],
900    'modify_client_geolocation': [
901        {
902            'argument_class': 'AgencyArgument',
903            'argument_attribute': 'subdomain',
904            'operator': 'equals',
905            'value': 'metzler',
906        },
907    ],
908    'contacts_on_assessment': (),
909    'ibm_himss_demo': [
910        {
911            'argument_class': 'AgencyArgument',
912            'argument_attribute': 'subdomain',
913            'operator': 'equals',
914            'value': 'metzler',
915        },
916    ],
917    'disable_referral_sources_tabs': (),
918    'scheduling_horizon_365_days': (),
919    'quickapply': [
920        {
921            'argument_class': 'AgencyArgument',
922            'argument_attribute': 'subdomain',
923            'operator': 'equals',
924            'value': 'metzler',
925        },
926    ],
927    'quickreferrals': [
928        {
929            'argument_class': 'AgencyArgument',
930            'argument_attribute': 'subdomain',
931            'operator': 'equals',
932            'value': 'metzler',
933        },
934    ],
935    'eclaim': [
936        {
937            'argument_class': 'AgencyArgument',
938            'argument_attribute': 'subdomain',
939            'operator': 'equals',
940            'value': 'metzler',
941        },
942    ],
943    'electronic_visit_verification': (),
944    'new_payment_page': (),
945    # Feature Flag for AFNB(agency) and SRI/LaSRS EVV.
946    'is_evv_SRI':(),
947    'invoice_surcharge':(),
948    'invoice_notes':(),
949    'rolling_calendar':(),
950    'redshift_reporting':(),
951    'datatable_column_filters': (),
952    'log_email_data':[
953        {
954            'argument_class': 'AgencyArgument',
955            'argument_attribute': 'subdomain',
956            'operator': 'equals',
957            'value': 'metzler',
958        },
959    ],
960    'ck_lead_to_offer': (),
961    'lead_to_revenue': (),
962    'care_coordination_fix': (),
963    'emit_cc_events': (),
964    'ck_lead_to_offer_ui': (),
965    'new_med_data': (),  # enable it globally
966    'enable_add_refund': (),
967    'admin_mobile_login_access':[
968        {
969            'argument_class': 'AgencyArgument',
970            'argument_attribute': 'subdomain',
971            'operator': 'equals',
972            'value': 'metzler',
973        },
974    ],
975    'admin_roles':[
976        {
977            'argument_class': 'AgencyArgument',
978            'argument_attribute': 'subdomain',
979            'operator': 'equals',
980            'value': 'metzler',
981        },
982    ],
983    'app_prompt_via_telephony': (),
984    'alerts_locking': (),
985    'cg_unavailability_mobile':[
986        {
987            'argument_class': 'AgencyArgument',
988            'argument_attribute': 'subdomain',
989            'operator': 'equals',
990            'value': 'metzler',
991        },
992    ],
993    'connect_api_new_lead_status': (),
994    'generate_485': (),
995    'new_powertools': (),
996    'new_powertools_down': (),
997    'mobile_offline_mode': (),
998    'disable_clock_in_out_alerts_by_client': (),
999    'payment_page_date_filter': (),
1000    'lock_activity_notes': (),
1001    'hubspot_setting': (),
1002    'hubspot_configuration': (),
1003    'hireology_integration': (),
1004    'tiered_rates': (),
1005    'report_throttling_tier_1': (),
1006    'report_throttling_tier_2': (),
1007    'dynamodb_email_write': (),
1008    'dynamodb_email_read': (),
1009    'dynamodb_email_no_postgres': (),
1010}
1011
1012_fflags_db = get_env('FEATURE_FLAG_DB', 0)
1013_fflags_host = get_env('FEATURE_FLAG_DB_HOST', 'fflags.ccointernal.com')
1014_fflags_ssl = get_env('FEATURE_FLAG_SSL', False)
1015# No SSL or AUTH in lower environments, so don't check for one if SSL is off
1016_fflags_password = get_env('FFLAGS_REDIS_TOKEN', None) if _fflags_ssl else None
1017_fflags_port = get_env('FEATURE_FLAG_DB_PORT', 6379)
1018_fflags_timeout = get_env('FEATURE_FLAG_TIMEOUT', 1)
1019
1020FEATURE_FLAG_DB = {
1021    'connection': {
1022        'db': _fflags_db,
1023        'host': _fflags_host,
1024        'password': _fflags_password,
1025        'port': _fflags_port,
1026        'ssl': _fflags_ssl,
1027        'socket_timeout': _fflags_timeout,
1028    },
1029    'db_type': 'redis',
1030}
1031
1032FEATURE_FLAG_BOOTSTRAP = get_env("FEATURE_FLAG_BOOTSTRAP", default=True)
1033
1034FLASH_MESSAGE_VAR = 'flash_message'
1035
1036
1037GEOCODING_BACKENDS = get_env('GEOCODING_BACKENDS', ('geocode.backends.google_backend.GoogleBackend',))
1038
1039GEOCODIO_API_KEY = get_env('GEOCODIO_API_KEY', '16a7e91e5ca62707203555a206115a632533e37')
1040
1041GIS_CAREGUARD_FTP_PATH = get_env('GIS_CAREGUARD_FTP_PATH', '/Incoming_Monitoring')
1042GIS_CAREGUARD_FTP_DOWNLOAD_PATH = get_env('GIS_CAREGUARD_FTP_DOWNLOAD_PATH', '/Outgoing_Monitoring')
1043GIS_GNUPG_HOME_DIR = get_env('GIS_GNUPG_HOME_DIR', '/tmp/.gnupg')
1044GIS_PACKAGES_FTP_HOST = get_env('GIS_PACKAGES_FTP_HOST', 'ftp3.geninfo.com')
1045GIS_PACKAGES_FTP_PORT = get_env('GIS_PACKAGES_FTP_PORT', 22)
1046GIS_PACKAGES_FTP_PATH = get_env('GIS_PACKAGES_FTP_PATH', '/Payroll')
1047GIS_PACKAGES_FTP_USER = get_env('GIS_PACKAGES_FTP_USER', 'ClearCareftp')
1048GIS_PACKAGES_FTP_PASSWORD = get_env('GIS_PACKAGES_FTP_PASSWORD', '')
1049GIS_PGP_RECIPIENT = get_env('GIS_PGP_RECIPIENT', 'giseservices@geninfo.com')
1050
1051GIT_PATH = '/usr/bin/git'
1052
1053GOOGLE_ANALYTICS_DOMAIN = get_env('GOOGLE_ANALYTICS_DOMAIN', '')
1054GOOGLE_ANALYTICS_PROPERTY_ID = get_env('GOOGLE_ANALYTICS_PROPERTY_ID', '')
1055GOOGLE_MAPS_ENTERPRISE_CLIENT_ID = get_env('GOOGLE_MAPS_ENTERPRISE_CLIENT_ID', 'gme-clearcareinc')
1056GOOGLE_MAPS_ENTERPRISE_CRYPTO_KEY = get_env('GOOGLE_MAPS_ENTERPRISE_CRYPTO_KEY', 'gRm3QY5z8D_kNaMZcSSQ_ncKcrc=')
1057GOOGLE_URL_SHORTENER_API_KEY = get_env('GOOGLE_URL_SHORTENER_API_KEY', r'AIzaSyD2hO5VSX_P4OXF7BCwTJ5XjqHJcfQKXYo')
1058GOOGLE_URL_SHORTENER_API_TIMEOUT = get_env('GOOGLE_URL_SHORTENER_API_TIMEOUT', 2)
1059GOOGLE_MAPS_API_KEY = get_env('GOOGLE_MAPS_API_KEY', 'AIzaSyCCq9vFExJSv4QwE7LcZEpKKXCLnfgH3z4')
1060
1061_haystack_host = get_env('HAYSTACK_HOST', 'elasticsearch')
1062_haystack_port = get_env('HAYSTACK_PORT', '80')
1063_haystack_index_name = get_env('HAYSTACK_INDEX_NAME', 'haystack')
1064
1065HAYSTACK_CONNECTIONS = {
1066    'default': {
1067        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
1068        'INDEX_NAME': _haystack_index_name,
1069        'URL': '%s:%s/' % (_haystack_host, _haystack_port),
1070        'TIMEOUT': 60
1071    },
1072}
1073HAYSTACK_SIGNAL_PROCESSOR = get_env('HAYSTACK_SIGNAL_PROCESSOR', 'celery_haystack.signals.CelerySignalProcessor')
1074
1075HOST_NAME = get_env('HOST_NAME', 'docker.vg')
1076
1077# NOTE!
1078# The following 2 constants referring to image sizes need to be in sync with the same constants from here:
1079# https://github.com/clearcare/lambda_shrink_image/blob/master/src/shrink_image.py
1080HSA_IMAGE_MAX_HEIGHT = 200
1081HSA_IMAGE_MAX_WIDTH = 400
1082
1083# some HSA image-upload-related settings
1084HSA_IMAGE_ORIGINAL_SUBPATH = '/hsa-images/'
1085HSA_IMAGE_RESIZED_SUBPATH = '/hsa-images-resized/'
1086HSA_IMAGE_SIZE_MIN = 0
1087HSA_IMAGE_SIZE_MAX = 3 * 1048576  # 3 MB
1088
1089INSIGHTS_BATCH_SIZE = get_env('INSIGHTS_BATCH_SIZE', 1000)
1090INSIGHTS_ACCOUNT_ID = get_env('INSIGHTS_ACCOUNT_ID', '')
1091
1092SEND_CELERY_QUEUE_NAME_TO_INSIGHTS = get_env('SEND_CELERY_QUEUE_NAME_TO_INSIGHTS', False)
1093INSIGHTS_CACHEOPS_INSERT_KEY = get_env('INSIGHTS_CACHEOPS_INSERT_KEY', 'KjG_V_8s04giojL-_0FCm6yQAzK7cWF6')
1094
1095INSIGHTS_CACHEOPS_BATCH_SIZE = get_env('INSIGHTS_CACHEOPS_BATCH_SIZE', 300)
1096INSIGHTS_CACHEOPS_INVALIDATION_LOG_SLOWER_THAN = get_env('INSIGHTS_CACHEOPS_INVALIDATION_LOG_SLOWER_THAN', 10000)
1097INSIGHTS_CACHEOPS_INVALIDATION_SAMPLE_RATE = get_env('INSIGHTS_CACHEOPS_INVALIDATION_SAMPLE_RATE', 0)
1098INSIGHTS_CACHEOPS_LOG_ALL_EVENTS = frozenset()
1099INSIGHTS_CACHEOPS_READ_SAMPLE_RATE = get_env('INSIGHTS_CACHEOPS_READ_SAMPLE_RATE', 0)
1100INSIGHTS_CACHEOPS_WHITELIST = frozenset([
1101    '*.*',
1102])
1103INSIGHTS_EVENT_URL = get_env('INSIGHTS_EVENT_URL', 'https://insights-collector.newrelic.com/v1/accounts/92732/events')
1104
1105PROJECT_APPS = [
1106    # ClearCare Internal
1107    'accounting_exports',
1108    'acl_auth',
1109    'activity',
1110    'agency',
1111    'agency_calendar',
1112    'agency_settings',
1113    'alerts',
1114    'api',
1115    'authorizations',
1116    'assessment',
1117    'background_checks',
1118    'employment_screening',
1119    'billing',
1120    'caregiver',
1121    'carelogs',
1122    'ccadmin',
1123    'ccauth',
1124    'client_contacts',
1125    'client_places',
1126    'cms',
1127    'cognito',
1128    'core',
1129    'dashboard',
1130    'data_exports',
1131    'docusign',
1132    'events',
1133    'family_room',
1134    'feature_flags',
1135    'franchises',
1136    'holidays',
1137    'geocode',
1138    'lead_to_revenue',
1139    'logit',
1140    'medicaid',
1141    'meds',
1142    'metrics',
1143    'monitor',
1144    'patient',
1145    'payments',
1146    'profile',
1147    'pull_agency',
1148    'qbdata',
1149    'quality_care',
1150    'quickbooks',
1151    'ratelimit',
1152    'receivables',
1153    'recruiting',
1154    'referrals',
1155    'referral_sources',
1156    'reports',
1157    'salesforce',
1158    'sms',
1159    'schedules',
1160    'subscription',
1161    'twilio_app',
1162    'user_portal',
1163    'workers_compensation',
1164    'zuora_app',
1165]
1166
1167INSTALLED_APPS = PROJECT_APPS
1168
1169INSTALLED_APPS += [
1170    # Thrid Party
1171    'cacheops',
1172    'django.contrib.auth',
1173    'django.contrib.admin',
1174    'django.contrib.contenttypes',
1175    'django.contrib.gis',
1176    'django.contrib.messages',
1177    'django.contrib.sessions',
1178    'django.contrib.staticfiles',
1179    'django.contrib.sites',
1180    'django.contrib.flatpages',
1181    'django.contrib.humanize',
1182    'django_otp',
1183    'django_otp.plugins.otp_static',
1184    'django_otp.plugins.otp_totp',
1185    'django_user_agents',
1186    'two_factor',
1187    'athumb',
1188    'celery_haystack',
1189    'compressor',
1190    'dj_pagination',
1191    'storages',
1192    'django_nose',
1193    'haystack',
1194    'django_extensions',
1195    'session_security',
1196    'rest_framework',
1197    'provider',
1198    'provider.oauth2',
1199    'corsheaders',
1200    'crispy_forms',
1201    'versioning',
1202]
1203
1204if not IS_TESTING:
1205    # Raven (actually, eventlet) doesn't play nice with moto & HTTPretty.
1206    # HTTPretty & eventlet both want to monkey patch sockets, particularly SSL.
1207    # This results in tests that use moto mocking attempting to use HTTPretty functions
1208    # on eventlet SSL sockets. That just doesn't work.
1209    # Raven (Sentry) isn't really needed during testing,
1210    # so we'll avoid the conflict by not including Raven when running tests.
1211    # See also the LOGGING configuration.
1212    INSTALLED_APPS += ['raven.contrib.django.raven_compat', ]
1213
1214INTERNAL_IPS = (
1215    '127.0.0.1',
1216)
1217
1218if not IS_PROD:
1219    INTERNAL_IPS += (
1220        '192.168.88.1',
1221        '192.168.88.100',
1222    )
1223
1224JINJA2_EXTENSIONS = [
1225    'compressor.contrib.jinja2ext.CompressorExtension',
1226]
1227
1228JWT_AUTH = {
1229    'JWT_ALLOW_REFRESH': True,
1230    'JWT_EXPIRATION_DELTA': datetime.timedelta(0, 300),
1231    'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(7),
1232}
1233
1234KEEP_LOGGED_DURATION = 1296000
1235
1236LANGUAGE_CODE = 'en-us'
1237
1238LOGGLY_TOKEN = get_env('LOGGLY_TOKEN', '9e752df0-bd82-464d-a3a5-880a4be77554')
1239ENABLE_LOGGLY = get_env('ENABLE_LOGGLY', False)
1240
1241LOGGING = {
1242    'version': 1,
1243    'disable_existing_loggers': True,
1244    'filters': {
1245        'require_debug_false': {
1246            '()': 'django.utils.log.RequireDebugFalse',
1247        },
1248    },
1249    'formatters': {
1250        'verbose': {
1251            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
1252        },
1253        'simple': {
1254            'format': '%(name)s %(levelname)s %(message)s'
1255        },
1256        'json': {
1257            '()': 'jsonlogger.JsonFormatter',
1258            'format': '%(message)s',
1259        },
1260    },
1261    'handlers': {
1262        'console': {
1263            'class': 'logging.StreamHandler',
1264            'formatter': get_env('LOGGER_CONSOLE_FORMATTER', 'json'),
1265            'level': get_env('LOGGER_CONSOLE_LEVEL', 'INFO'),
1266        },
1267        'loggly': {
1268            'class': 'core.log.LogglyWrapper',
1269            'formatter': 'json',
1270            'level': 'DEBUG',
1271            'url': 'https://logs-01.loggly.com/inputs/{loggly_token}/tag/{env},django/'.format(
1272                loggly_token=LOGGLY_TOKEN,
1273                env=ENV_NAME
1274            )
1275        },
1276        'mail_admins': {
1277            'class': 'core.log.AdminEmailHandler',
1278            'filters': ['require_debug_false'],
1279            'level': 'ERROR',
1280        },
1281        'null': {
1282            'class': 'django.utils.log.NullHandler',
1283            'level': 'DEBUG',
1284        },
1285        'sentry': {
1286            'level': 'ERROR',
1287            'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
1288            'tags': {'hostname': HOST_NAME}
1289        },
1290    },
1291    'loggers': {
1292        '': {
1293            'handlers': [get_env('LOGGER_HANDLER', 'console')],
1294            'level': get_env('LOGGER_CONSOLE_LEVEL', 'INFO'),
1295        },
1296        'cc_dynamodb': {
1297            'handlers': ['console'],
1298            'level': get_env('LOGGER_DYNAMODB_LEVEL', 'WARN'),
1299            'propagate': False,
1300        },
1301        'infoLogger': {
1302            'handlers': ['null'],
1303            'level': 'DEBUG',
1304            'propagate': True,
1305        },
1306        'qbxml.sync': {
1307            'handlers': ['null'],
1308            'level': 'INFO',
1309            'propagate': True,
1310        },
1311        'qoc': {
1312            'handlers': ['null'],
1313            'level': 'DEBUG',
1314            'propagate': True,
1315        },
1316        'elasticsearch.trace': {
1317            'handlers': ['null'],
1318            'level': 'DEBUG',
1319            'propagate': False,
1320        },
1321        'events': {
1322            'handlers': ['console'],
1323            'level': 'DEBUG',
1324            'propagate': True,
1325        },
1326    },
1327}
1328
1329if IS_PROD:
1330    LOGGING["loggers"]['']["handlers"].extend(['sentry'])
1331
1332if ENABLE_LOGGLY:
1333    LOGGING['loggers']['']['handlers'].extend(['loggly'])
1334
1335if not IS_TESTING:
1336    LOGGING['handlers']['sentry'] = {
1337        'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
1338        'level': 'ERROR',
1339    }
1340
1341LOGIN_REDIRECT_URL = '/'
1342LOGIN_URL = '/login/'
1343LOGIN_URL_MOBILE = '/caregiver/login/'
1344LOGOUT_URL = '/login/?auto_logged_out=True'
1345
1346LOGSTASH_INDEX_NAME = 'logstash'
1347
1348MANAGERS = (
1349    ('Clearcare Alerts', 'clearcare-alerts@googlegroups.com'),
1350)
1351MEDIA_CACHE_BUSTER = ''
1352MEDIA_ROOT = os.environ.get('MEDIA_ROOT', '/code/media')
1353MEDIA_URL = get_env('MEDIA_URL', '/media/')
1354
1355MIDDLEWARE_CLASSES = [
1356    'multidb.middleware.PinningRouterMiddleware',  # This always has to be first
1357    'core.middleware.GlobalStorageInitMiddleware',
1358    'core.middleware.SecureRequestPropagationMiddleware',
1359    'django.contrib.sessions.middleware.SessionMiddleware',
1360    'django.middleware.csrf.CsrfViewMiddleware',
1361    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
1362    'django.contrib.auth.middleware.AuthenticationMiddleware',
1363    'django.contrib.messages.middleware.MessageMiddleware',
1364    'django.middleware.common.CommonMiddleware',
1365    'django.middleware.http.ConditionalGetMiddleware',
1366    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
1367    'django_user_agents.middleware.UserAgentMiddleware',
1368    'core.middleware.SubdomainMiddleware',
1369    'core.middleware.RestrictAccessMiddleware',
1370    'session_security.middleware.SessionSecurityMiddleware',
1371    'feature_flags.middleware.FlagMiddleware',
1372    'core.middleware.FlashMessageMiddleware',
1373    'dj_pagination.middleware.PaginationMiddleware',
1374    'corsheaders.middleware.CorsMiddleware',
1375    'api.middleware.APIVersionMiddleware',
1376    'core.middleware.GlobalStorageMiddleware',
1377    'django_otp.middleware.OTPMiddleware'
1378]
1379MULTIDB_PINNING_COOKIE = 'cc_multidb_pinning'
1380MULTIDB_PINNING_SECONDS = 0
1381MULTIDB_PINNING_VIEWS = ()
1382
1383
1384NPS_SURVEY_RECIPIENTS = get_env('NPS_SURVEY_RECIPIENTS', [])
1385
1386PAGERDUTY_APIKEY = get_env('PAGERDUTY_APIKEY', '')
1387PAGERDUTY_SERVICEKEY = get_env('PAGERDUTY_SERVICEKEY', '')
1388PAGERDUTY_USERNAME = get_env('PAGERDUTY_USERNAME', '')
1389
1390PAGINATION_DEFAULT_PAGINATION = 15
1391PASSWORD_RESET_TIMEOUT_DAYS = 60
1392PEOPLE_PICKER_TIMEOUT = 500
1393POWERTOOLS_DEFAULT_RECIPIENT = get_env('POWERTOOLS_DEFAULT_RECIPIENT', 'support@clearcareonline.com')
1394POWERTOOLS_FEATURE_FLAG = get_env('POWERTOOLS_FEATURE_FLAG','new_powertools, hubspot_setting, hubspot_configuration, hireology_integration')
1395PG_DUMP = '/usr/bin/pg_dump'
1396
1397POSTGIS_VERSION = (2, 0, 3)
1398PROTOCOL = get_env('PROTOCOL', 'http')
1399
1400QB_FILES_EMPTY_SPACES_TO_SHOW = 5
1401QB_FILES_MAX_ALLOWED = 5
1402
1403QBO3_OAUTH2_CLIENT_ID = get_env('QBO3_OAUTH2_CLIENT_ID', '')
1404QBO3_OAUTH2_CLIENT_SECRET = get_env('QBO3_OAUTH2_CLIENT_SECRET','')
1405QBO3_OAUTH2_AUTH_URI = 'https://appcenter.intuit.com/connect/oauth2'
1406QBO3_OAUTH2_TOKEN_URI = 'https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer'
1407QBO3_OAUTH2_BASE_URI = get_env('QBO3_OAUTH2_BASE_URI', 'https://api.intuit.com')
1408
1409QBO3_ACCESS_TOKEN_URL = 'https://oauth.intuit.com/oauth/v1/get_access_token'
1410QBO3_APP_TOKEN = get_env('QBO3_APP_TOKEN', '')
1411QBO3_AUTHORIZE_URL = 'https://appcenter.intuit.com/Connect/Begin'
1412QBO3_BASE_URL = 'https://appcenter.intuit.com'
1413QBO3_BATCH_SIZE = 100
1414QBO3_CONSUMER_KEY = get_env('QBO3_CONSUMER_KEY', '')
1415QBO3_CONSUMER_SECRET = get_env('QBO3_CONSUMER_SECRET', '')
1416QBO3_REQUEST_TOKEN_URL = 'https://oauth.intuit.com/oauth/v1/get_request_token'
1417QBO_BASE_TEMPLATE_URL = get_env('QBO_BASE_TEMPLATE_URL', 'https://quickbooks.api.intuit.com/v3/company/{company_id}')
1418
1419QBO_CC_APP_ID = get_env('QBO_CC_APP_ID', '')
1420QBO_CC_APP_LOGIN = get_env('QBO_CC_APP_LOGIN', 'quickbooks.clearcareonline.com')
1421QBO_CC_APP_VER = get_env('QBO_CC_APP_VER', '1')
1422QBO_AUTHORIZATION_URL = 'https://login.quickbooks.com/j/qbn/sdkapp/confirm?appid={app_id}&serviceid=2004&appdata={app_ver}'.format(
1423    app_id=QBO_CC_APP_ID,
1424    app_ver=QBO_CC_APP_VER
1425)
1426
1427QBO_HEADERS = {'Content-Type': 'application/x-qbxml'}
1428QBO_URL = 'https://apps.quickbooks.com/j/AppGateway'
1429QUICKBOOKS_ITERABLE_MAX_RETURNED = get_env('QUICKBOOKS_ITERABLE_MAX_RETURNED', 100)
1430
1431QOC_AGENCY_DOC_TYPE = 'agency_type'
1432QOC_EVENT_DOC_TYPE = 'event_type'
1433QOC_USER_DOC_TYPE = 'user_type'
1434QOC_FRANCHISOR_ID = 15
1435
1436WOTC_DISABLED_FRANCHISOR_IDS = [8, 15, 17, 69]
1437BG_CHECKS_DISABLED_FRANCHISOR_IDS = [8, 15, 17, 69]
1438ENABLE_INITIAL_CALL_SAME_AS_CALLER_FRANCHISOR_IDS = [8, 15, 69]
1439
1440QUEUE_BACKEND = 'redisd'
1441QUEUE_REDIS_DB = '0'
1442_queue_redis_host = get_env('QUEUE_REDIS_HOST', 'cache.ccointernal.com')
1443_queue_redis_port = get_env('QUEUE_REDIS_PORT', 6379)
1444_queue_redis_ssl = get_env('QUEUE_REDIS_SSL', False)
1445_queue_redis_password = get_env('QUEUE_REDIS_PASSWORD', _cache_password) if _queue_redis_ssl else None
1446# Not sure if QUEUE_REDIS_CONNECTION even does anything. If not we should remove this
1447QUEUE_REDIS_CONNECTION = 'redis{}://{}{}:{}/{}'.format(
1448    's' if _queue_redis_ssl else '',
1449    ':{}@'.format(_queue_redis_password) if _queue_redis_password else '',
1450    _queue_redis_host,
1451    _queue_redis_port,
1452    QUEUE_REDIS_DB
1453)
1454
1455RAVEN_CONFIG = {
1456    'dsn': get_env('SENTRY_DSN', 'https://677481a450a245c3967f607d6fec0f8f:bce32dc7c8f44157a875584faf894fdd@app.getsentry.com/61938')
1457}
1458
1459if IS_PROD:
1460    RAVEN_CONFIG['shutdown_timeout'] = '10'
1461
1462REDIS_DB = get_env('REDIS_DB', 1)
1463REDIS_HOST = get_env('REDIS_HOST', 'cache.ccointernal.com')
1464REDIS_PASSWORD = get_env('REDIS_PASSWORD', '')
1465REDIS_PORT = get_env('REDIS_PORT', 6379)
1466
1467REPORTS_DB = get_env('REPORTS_DB', 'default')
1468REPORTS_DB_QUERY_CHUNK_SIZE = get_env('REPORTS_DB_QUERY_CHUNK_SIZE', 1000)
1469
1470RESERVED_SUBDOMAINS = frozenset([
1471    'admin',
1472    'admin2',
1473    'api',
1474    'app',
1475    'billing',
1476    'flower',
1477    'graphite',
1478    'hq',
1479    'mail',
1480    'marketing',
1481    'nagios',
1482    'payments',
1483    'post',
1484    'proxy1',
1485    'proxy2',
1486    'rabbitmq',
1487    'sentry',
1488    'shs',
1489    'spf',
1490    'static',
1491    'status',
1492    'support',
1493    'www',
1494])
1495
1496REST_FRAMEWORK = {
1497    'DEFAULT_AUTHENTICATION_CLASSES': (
1498        'rest_framework.authentication.SessionAuthentication',
1499        'rest_framework.authentication.OAuth2Authentication',
1500        'payments.authentication.PaymentPortalWebTokenAuthentication',
1501    ),
1502    'DEFAULT_FILTER_BACKENDS': (
1503        'rest_framework.filters.DjangoFilterBackend',
1504        'rest_framework.filters.SearchFilter',
1505        'rest_framework.filters.OrderingFilter',
1506    ),
1507    'DEFAULT_PERMISSION_CLASSES': (
1508        'rest_framework.permissions.IsAuthenticated',
1509    ),
1510    'DEFAULT_THROTTLE_CLASSES': (
1511        'rest_framework.throttling.UserRateThrottle',
1512        'rest_framework.throttling.ScopedRateThrottle',
1513    ),
1514    'DEFAULT_THROTTLE_RATES': {
1515        'long_running': get_env('REST_FRAMEWORK_LONG_RUNNING_THROTTLE_RATE', '3/minute'),
1516        'user': get_env('REST_FRAMEWORK_USER_THROTTLE_RATE', '60/minute'),
1517    },
1518    'MAX_PAGINATE_BY': 1000,
1519    'PAGINATE_BY': 100,
1520    'PAGINATE_BY_PARAM': 'page_size',
1521}
1522
1523ROOT_URLCONF = 'urls'
1524
1525ROUND_HALF_UP = 'ROUND_HALF_UP'
1526
1527SALESFORCE_URL = 'https://clearcareonline.my.salesforce.com/'
1528SALESFORCE_COMMUNITY_PROFILE_ID = get_env('SALESFORCE_COMMUNITY_PROFILE_ID', '')
1529SALESFORCE_COMMUNITY_ROOT = 'https://clearcareonline.force.com'
1530SALESFORCE_DISABLED_CACHE_KEY = 'salesforce-disabled'
1531SALESFORCE_SUPPORT_ENABLED = get_env('SALESFORCE_SUPPORT_ENABLED', False)
1532SALESFORCE_SANDBOX_SETTINGS = {
1533    'username': 'cc_billing@clearcareonline.com.sandbox',
1534    'password': 'rx^OsqIe#^0l',
1535    'security_token': 'vhSbvICRPdLQqAMSR8SxVeBp',
1536    'wsdl_filename': 'hca_sandbox_wsdl.xml'
1537}
1538SALESFORCE_UPSELL_SAM_ID = get_env(
1539    'SALESFORCE_UPSELL_SAM_ID',
1540    'a8p44000000PF5P',  # Default: Tara Kaneko
1541)
1542SALESFORCE_UPSELL_OPPORTUNITIES_RECORD_TYPE_ID = get_env(
1543    'SALESFORCE_UPSELL_OPPORTUNITIES_RECORD_TYPE_ID',
1544    '012E0000000Vf4n',  # Upsell Opportunities
1545)
1546
1547SAML_AUDIENCE = get_env('SAML_AUDIENCE', 'https://clearcareonline.force.com')
1548SAML_ISSUER = get_env('SAML_ISSUER', 'Clearcare2020')
1549SAML_PRIVATE_KEY_VERSION = get_env('SAML_PRIVATE_KEY_VERSION', 'alpha')
1550SAML_CERTIFICATE_VERSION = get_env('SAML_CERTIFICATE_VERSION', 'alpha')
1551
1552SECONDARY_QUEUE_REDIS_DB = '0'
1553
1554SECRET_KEY = '!q9)w@f2gf1+9z2bf75!avfhslm7baifav-(47ivv)x@f(r7sg'
1555
1556SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
1557
1558SERVER_EMAIL = get_env('SERVER_EMAIL', 'no-reply@testclearcaremail.com')
1559
1560SESSION_COOKIE_NAME = get_env('SESSION_COOKIE_NAME', 'cc_session_id')
1561SESSION_COOKIE_SECURE = get_env('SESSION_COOKIE_SECURE', False)
1562SESSION_EXPIRE_AT_BROWSER_CLOSE = get_env('SESSION_EXPIRE_AT_BROWSER_CLOSE', True)
1563SESSION_ENGINE=get_env('SESSION_ENGINE', 'django.contrib.sessions.backends.cache')
1564SESSION_CACHE_ALIAS = 'sessions'
1565
1566# Django Session Secuirty (forced logout)
1567SESSION_SECURITY_WARN_AFTER = get_env('SESSION_SECURITY_WARN_AFTER', 3300)  # Default 55 minutes
1568SESSION_SECURITY_EXPIRE_AFTER = get_env('SESSION_SECURITY_EXPIRE_AFTER', 3600)  # Default 60 minutes
1569
1570SITE_ID = get_env('SITE_ID', 1)
1571
1572if IS_REPORTING:
1573    SLAVE_DATABASES = get_env('REPORTING_SLAVE_DATABASES', [])
1574else:
1575    SLAVE_DATABASES = get_env('SLAVE_DATABASES', [])
1576
1577USE_DEV_REPLICAS = get_env('USE_DEV_REPLICAS', False)
1578
1579if (IS_PROD or IS_STAGE) and IS_WORKER:
1580    DATABASES['default'] = WORKER_WRITE_ELB_CONF
1581    DATABASES['slavedb1'] = WORKER_READ_ELB_CONF
1582    SLAVE_DATABASES = get_env('WORKER_SLAVE_DATABASES', ['workerslavedb1'])
1583    REPORTS_DB = get_env('WORKER_REPORTS_DB', 'workerslavedb1')
1584    EMAIL_SUBJECT_PREFIX = 'Prod Worker: '
1585
1586if USE_DEV_REPLICAS:
1587    DATABASES['replica1'] = {
1588        'ENGINE': 'backends.db',
1589        'HOST': get_env('SLAVE_DATABASE_HOST1', 'db_replica1'),
1590        'NAME': get_env('SLAVE_DATABASE_NAME', 'clearcare'),
1591        'PASSWORD': get_env('SLAVE_DATABASE_PASSWORD', ''),
1592        'PORT': get_env('SLAVE_DATABASE_PORT', 5432),
1593        'USER': get_env('SLAVE_DATABASE_USER', 'postgres'),
1594    }
1595    DATABASES['replica2'] = {
1596        'ENGINE': 'backends.db',
1597        'HOST': get_env('SLAVE_DATABASE_HOST2', 'db_replica2'),
1598        'NAME': get_env('SLAVE_DATABASE_NAME', 'clearcare'),
1599        'PASSWORD': get_env('SLAVE_DATABASE_PASSWORD', ''),
1600        'PORT': get_env('SLAVE_DATABASE_PORT', 5432),
1601        'USER': get_env('SLAVE_DATABASE_USER', 'postgres'),
1602    }
1603
1604STATICFILES_FINDERS = (
1605    'django.contrib.staticfiles.finders.FileSystemFinder',
1606    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
1607    'compressor.finders.CompressorFinder',
1608)
1609STATIC_ROOT = get_env('STATIC_ROOT', '/code/media/static/')
1610STATIC_URL = get_env('STATIC_URL', '/static/')
1611
1612STATUS_IO_API_ID = get_env('STATUS_IO_API_ID', '')
1613STATUS_IO_API_KEY = get_env('STATUS_IO_API_KEY', '')
1614STATUS_IO_PAGE_ID = get_env('STATUS_IO_PAGE_ID', '')
1615
1616TAMU_API_KEY = get_env('TAMU_API_KEY', '52200bd1edde4664b979f4831264f220')
1617
1618TEMPLATE_LOADERS = (
1619    ('django.template.loaders.cached.Loader', (
1620        'django.template.loaders.filesystem.Loader',
1621        'django.template.loaders.app_directories.Loader',
1622    )),
1623)
1624
1625if DEBUG:
1626    TEMPLATE_LOADERS = (
1627        'django.template.loaders.filesystem.Loader',
1628        'django.template.loaders.app_directories.Loader',
1629    )
1630
1631TEMPLATES = [
1632    {
1633        'BACKEND': 'django.template.backends.jinja2.Jinja2',
1634        'DIRS': [
1635            os.path.join(PROJECT_ROOT, "jinja2"),
1636        ],
1637        'APP_DIRS': True,
1638        'OPTIONS': {
1639            'environment': 'jinja2_bridge.environment',
1640            'extensions': [
1641                'jdj_tags.extensions.DjangoStatic',
1642                'jdj_tags.extensions.DjangoI18n',
1643                'jdj_tags.extensions.DjangoCompat',
1644                'jinja2.ext.autoescape',
1645                'core.defaulttags.LoadExtension',
1646                'core.defaulttags.WithExtension',
1647            ]
1648        },
1649    },
1650    {
1651        'BACKEND': 'django.template.backends.django.DjangoTemplates',
1652        'DIRS': [
1653            os.path.join(PROJECT_ROOT, "templates/"),
1654        ],
1655        'OPTIONS': {
1656            'context_processors': [
1657                'django.contrib.auth.context_processors.auth',
1658                'django.template.context_processors.debug',
1659                'django.template.context_processors.i18n',
1660                'django.template.context_processors.media',
1661                'django.template.context_processors.request',
1662                'django.contrib.messages.context_processors.messages',
1663                'core.context_processors.extra',
1664                'core.context_processors.quickbooks_upgrade_notification',
1665            ],
1666            'debug': get_env('TEMPLATE_DEBUG', False),
1667            'loaders': TEMPLATE_LOADERS
1668        },
1669    },
1670]
1671
1672TESTING_NOW = pytz.utc.localize(datetime.datetime.utcnow())
1673TEST_DOMAIN = 'test'
1674TEST_RUNNER = 'core.test_runner.ClearCareTestSuiteRunner'
1675
1676if IS_TESTING:
1677    SLAVE_DATABASES = None
1678    DATABASE_ROUTERS = ()
1679    PASSWORD_HASHERS = (
1680        'django.contrib.auth.hashers.MD5PasswordHasher',
1681    )
1682
1683    DEBUG = False
1684    TEMPLATE_DEBUG = False
1685    logging.disable(logging.CRITICAL)
1686    CELERY_ALWAYS_EAGER = True
1687    BROKER_BACKEND = 'memory'
1688    HAYSTACK_CONNECTIONS['default']['INDEX_NAME'] = "haystacktest"
1689
1690TIME_ZONE = 'UTC'
1691
1692TWILIO_API_SID = get_env('TWILIO_API_SID', 'AC0e093dc4938d959eedf241300540de18')
1693TWILIO_API_VERSION = '2010-04-01'
1694TWILIO_APP_SID = get_env('TWILIO_APP_SID', 'TE5t093dc4938d959eedf241300540de18')
1695TWILIO_AUTH_TOKEN = get_env('TWILIO_AUTH_TOKEN', '35924d996b1fb0d4cda19727b0f25a34')
1696TWILIO_EXTRA_SMS_NUMBERS = get_env('TWILIO_EXTRA_SMS_NUMBERS', 1)
1697TWILIO_RECORDINGS_API_SID = get_env('TWILIO_RECORDINGS_API_SID', TWILIO_API_SID)
1698TWILIO_RETRY_ATTEMPTS = get_env('TWILIO_RETRY_ATTEMPTS', 5)
1699TWILIO_TEST_API_SID = 'AC0e093dc4938d959eedf241300540de18'
1700TWILIO_TEST_APP_SID = 'TE5t093dc4938d959eedf241300540de18'
1701TWILIO_TEST_AUTH_TOKEN = '35924d996b1fb0d4cda19727b0f25a34'
1702
1703UNKNOWN_AGENCY_REDIRECT = get_env('UNKNOWN_AGENCY_REDIRECT', 'http://admin.docker.vg')
1704
1705USE_I18N = get_env('USE_I18N', False)
1706USE_L10N = get_env('USE_L10N', False)
1707
1708VERBOSE_LOGGING_KEY = 'verbose_request_logging'
1709
1710WEBDRIVER = 'firefox'
1711
1712WKHTMLTOPDF_PATH = get_env('WKHTMLTOPDF_PATH', '/usr/local/bin/wkhtmltopdf')
1713WKHTMLTOPDF_PATH_11 = get_env('WKHTMLTOPDF_PATH_11', '/usr/local/bin/wkhtmltopdf')
1714WORKERS_COMPENSATION_ENABLED_STATES = frozenset([])
1715
1716ZUORA_DOMAIN = get_env('ZUORA_DOMAIN', 'https://apisandbox.zuora.com/apps/')
1717ZUORA_PAGE_ID = get_env('ZUORA_PAGE_ID', '2c92c0f94a140541014a1bfb76ee2647')
1718ZUORA_PASSWORD = get_env('ZUORA_PASSWORD', 'eUgLkQ6LmDDCbZMHPLh8ZFd')
1719ZUORA_SECURITY_KEY = get_env('ZUORA_SECURITY_KEY', 'WK4LGJBk9Q6vLoI243sh8oB2e_di9jywxz9VTwX8dIU=')
1720ZUORA_TENANT_ID = get_env('ZUORA_TENANT_ID', '11813')
1721ZUORA_USERNAME = get_env('ZUORA_USERNAME', 'zuora@clearcare.it')
1722ZUORA_WSDL_FILE = get_env('ZUORA_WSDL_FILE', 'zuora_sandbox.a.52.0.wsdl')
1723
1724CC_BILLING_SEND_REPORT_ALIAS = get_env('CC_BILLING_SEND_REPORT_ALIAS', 'billingreport@clearcareonline.com')
1725
1726USE_RABBITMQ_CELERY = get_env('USE_RABBITMQ_CELERY', False)
1727if USE_RABBITMQ_CELERY:
1728    _celery_rabbit_connection_kwargs = {
1729        'transport': get_env('CELERY_TRANSPORT', 'amqp'),
1730        'host': get_env('CELERY_RABBITMQ_HOST', 'cc_rabbitmq'),
1731        'port': get_env('CELERY_RABBITMQ_PORT', 5672),
1732        'user': get_env('CELERY_RABBITMQ_USER', 'guest'),
1733        'password': get_env('CELERY_RABBITMQ_PASSWORD', 'guest'),
1734        'vhost': get_env('CELERY_RABBITMQ_VHOST', ''),
1735    }
1736    _default_broker_url = '{transport}://{user}:{password}@{host}:{port}/{vhost}/'.format(
1737        **_celery_rabbit_connection_kwargs)
1738    BROKER_URL = get_env('BROKER_URL', _default_broker_url)
1739else:
1740    BROKER_TRANSPORT = 'sqs'
1741    BROKER_URL = 'sqs://'
1742    # See http://docs.celeryproject.org/en/3.1/getting-started/brokers/sqs.html for the meaning of each value:
1743    BROKER_TRANSPORT_OPTIONS = {'region': AWS_REGION,
1744                                'polling_interval': 1,
1745                                'visibility_timeout': 3600}
1746    # If using SQS, we should set these to False
1747    # See https://dzone.com/articles/using-sqs-with-celery for more details.
1748    CELERY_ENABLE_REMOTE_CONTROL = False
1749    CELERY_SEND_EVENTS = False
1750
1751app = Celery('clearcare')
1752app.config_from_object('django.conf:settings')
1753app.autodiscover_tasks(lambda: INSTALLED_APPS)
1754
1755CONFIRM_BALANCES_DELAY = get_env('CONFIRM_BALANCES_DELAY', 0)
1756
1757TESTING = sys.argv[1:2] == ['test']
1758BETTER_SQL_DEBUGGING = get_env('BETTER_SQL_DEBUGGING', False)
1759BETTER_CELERY_SQL_DEBUGGING = get_env('BETTER_CELERY_SQL_DEBUGGING', False)
1760
1761# Turn off debug toolbar with ?toolbar=no, or edit show_toolbar() below to make it always return False.
1762# NOTE THAT you must have debug_toolbar static assets installed in your /media/static directory or
1763# you will just get a loading indicator forever. To install static files, run
1764# ./manage.py collectstatic
1765# You can also use this to test ajax interactions using the instructions in the template dummy.html.
1766
1767if DEBUG and not IS_PROD and not TESTING:
1768    INSTALLED_APPS.append('debug_toolbar')
1769    MIDDLEWARE_CLASSES.insert(1, 'debug_toolbar.middleware.DebugToolbarMiddleware')
1770    def show_toolbar(request):
1771        if IS_QA:
1772            return False
1773        else:
1774            return request.GET.get('toolbar') != 'no'
1775
1776    DEBUG_TOOLBAR_CONFIG = {
1777        "SHOW_TOOLBAR_CALLBACK": show_toolbar,
1778    }
1779    DEBUG_TOOLBAR_PANELS = [
1780        # 'debug_toolbar.panels.versions.VersionsPanel',
1781        'debug_toolbar.panels.timer.TimerPanel',
1782        # 'debug_toolbar.panels.settings.SettingsPanel',
1783        # 'debug_toolbar.panels.headers.HeadersPanel',
1784        # 'debug_toolbar.panels.request.RequestPanel',
1785        # 'debug_toolbar.panels.sql.SQLPanel',
1786        'debug.StdOutSQLPanel' if BETTER_SQL_DEBUGGING else 'debug_toolbar.panels.sql.SQLPanel',
1787        # 'debug_toolbar.panels.staticfiles.StaticFilesPanel',
1788        'debug_toolbar.panels.templates.TemplatesPanel',
1789        # 'debug_toolbar.panels.cache.CachePanel',
1790        # 'debug_toolbar.panels.signals.SignalsPanel',
1791        # 'debug_toolbar.panels.logging.LoggingPanel',
1792        # 'debug_toolbar.panels.redirects.RedirectsPanel',
1793    ]
1794
1795AUGUST_2016_HASH = HMAC.new('Cl3arCArESup3r53cret').hexdigest()
1796CRYPTO_KEYS = {
1797    AUGUST_2016_HASH: "8q]H+=6E7][@A!U="
1798}
1799
1800CURRENT_CRYTPO_HASH = AUGUST_2016_HASH
1801
1802
1803DOCUSIGN_CLIENT_ID = get_env('DOCUSIGN_CLIENT_ID', '67fc03be-50fe-4b87-89d2-1cbcba369c5f')
1804DOCUSIGN_USER_NAME = get_env('DOCUSIGN_USER_NAME', 'djohnston@clearcareonline.com')
1805DOCUSIGN_ALTERNATE_PRICING_CONTRACT_TEMPLATE_ID = get_env('DOCUSIGN_ALTERNATE_PRICING_CONTRACT_TEMPLATE_ID', 'ac180ac0-a76a-4eee-b6f7-f89dbe8e9363')
1806DOCUSIGN_INTEGRATOR_KEY = get_env('DOCUSIGN_INTEGRATOR_KEY', '79e58240-86e5-4c6a-9d7b-5b8b1dea48e0')
1807DOCUSIGN_OAUTH_BASE_PATH = get_env('DOCUSIGN_OAUTH_BASE_PATH', 'account-d.docusign.com')
1808DOCUSIGN_REDIRECT_URL = get_env('DOCUSIGN_REDIRECT_URL', 'https://www.clearcareonline.com')
1809DOCUSIGN_BASE_URL = get_env('DOCUSIGN_BASE_URL', 'https://demo.docusign.net/restapi') # use account.docusign.com for Live/Production base_url
1810DOCUSIGN_RSA_PRIVATE_KEY_STR = get_env('DOCUSIGN_RSA_PRIVATE_KEY_STR', '''-----BEGIN RSA PRIVATE KEY-----
1811MIIEowIBAAKCAQEAvoTU/7f7v7OMwAjD2/U5qXuLaExertuBwSCbbG212SX5z/hV
181275zvCFiZan9M0Ef6492y/govLE9Y7Y2himpFWddRaiGoS2s1osILRc2hE/NrbMKj
1813EDFtA/OEHPJcvHxJNT4Rc5RaV+BDfWb7oW3BkF8/dFI0efKbcj1qjIJLVDg52fYE
18145QTLYVwye+crR0e7C7NELmXlZUvM2ZF9DTV+Pi6u0xTZH6fCzz7WHWkZJ5G/zu+X
1815NJtKt41ThhPLGBBY9UNhZ8vnfxdJplVJGLwd2JmKC6URyTNeCBiofbEso7+eSYoJ
1816lYi5BLaeZ2nmlqmcVDwwowsvWUrvdSJxHU55kQIDAQABAoIBAC01SXLFtm4KndVK
1817rykwY0api47MAnK1ITDR+zeLQAm/VmxIZiH16A2fsoXgH7rTvb/Y8XqRMZju2jAC
1818eejlpz+2lXnc8zm0PrW4nGKrtPOOQTk9ZWK4C8GShRC2XRWX22pQKGV3+EkebP1i
1819lMa9S99ljqHcSNoAHO1KkBA38caRqR1HHfz4EdmuUC6qQgG+c2oOZK0T1vDVWGcM
18209ghmsbKIITBRra3Rt7gMZtbAW4t1dH3FM+zKNkQdFO/kNPExdZeL1PdG9RaiMxmR
1821DIXnnyEvxuldRWTGLA91CZfCi1cmHLcxfutDpda35bbyBJqt8UDcZgPQESIfLW7t
18226fGf340CgYEA5Q/1ZDDbAmgwQm6rwfichMAFEfDSz5z0F+AzqlBsb3yCnM4+nVkG
1823vMttQ4w7WxpdanLROItbjb00uSNuISQO7AN9gH/PsYnOI10WIGFRE0WxtiE37avv
1824D1WFjQ+8v4B501jTSrcUMincc+WxwSRxlbgHw23+VbOqd/8Uhe0AKbUCgYEA1OyA
1825mteL9AhzEzflzbckx3V5y3qV4RC1J/cCtuxuFrMfc2+bAioCjefuN73EHXmPOCQG
1826vFx6Q0JFD+wcvxZmWPjgn95LbTsdmsGpXlMjqa3ojfrgdZH3gx8v9BGdYA06IcEX
1827PgGxyH53G97oxwXRWvWD5s940KwYY6O2ofQ+ie0CgYAxt/oKijQvXJAFC2KKkrze
1828b5NqJnyLhcTRnd94+0XeGQd8o6OhoZ49wmXwAHMtvhZCsbNJ862moUfdW5xe4yW+
1829Aq/uAVACeCffMyhHVPg1F66QGru6AdS83lJDoQPWCTvoLOKH2B8xGDb6jQO9KXzi
1830A3Tj7W8ECSBaNWqt+xhK9QKBgAb5tIDeHNyixjpT83hYzqCmLZZH7s8PwA+OHQ2n
1831Ezg1KAudFWPtwmWpunkjA2C/0bxSGdJj6TF441BROOPdtP6nMJysKKZscFzYiVbo
1832vFtbsimslVvkq0olZGnHhfNWm5ftfnhuj8d0tSw5kkCq5R/ouSh/lYKokKf6/gmy
1833ObZFAoGBAJTQV/91EFa8WSn5o5KU3sdpuhJBxSEdyS8/hWrf24iSQtQt42tF7der
1834NqUUhGHCQGPu9kpBPP7ibzVybYavhAAhNmaF5sVJqd0lDNAO4DfWWAUBrbp9/l1k
1835j13NxQlAlFb005tBHa3Mf9yLKBsXmUVs+1578AMOYUDPtEoEl/I4
1836-----END RSA PRIVATE KEY-----''')
1837DOCUSIGN_ENCRYPTED_KEY = get_env('DOCUSIGN_ENCRYPTED_KEY', '')
1838
1839
1840DOCUMENT_PORTAL_URL = get_env('DOCUMENT_PORTAL_URL', 'http://docs-api.ccointernal.com')
1841# Which franchisors to enable the KPI report for.
1842# This could conceivably be a feature flag sometime in the future,
1843# but currently there is no way to toggle feature flags per-franchisor.
1844KPI_REPORT_FRANCHISOR_IDS = [13, 22]  # Always Best Care, Metzler
1845
1846BILLING_SERVICE_API_SECRET = get_env('BILLING_SERVICE_API_SECRET', '2A4kVpkMSQStgW7tpsEN7La3Rblx2s47urHbqfKS')
1847BILLING_SERVICE_API_BASE = get_env('BILLING_SERVICE_API_BASE', 'https://a32kpqhlc3.execute-api.us-west-2.amazonaws.com/prod/api')
1848
1849
1850# GraphQL API secret
1851GRAPHQL_AUTH_SECRET = get_env(
1852    'GRAPHQL_AUTH_SECRET',
1853    default='iNgu5queTai3Roh8ET4iyaudau8xooZeNie0Aipa'
1854)
1855
1856GRAPHQL_ENDPOINT = get_env(
1857    'GRAPHQL_ENDPOINT',
1858    default=('https://graphql.clearcareonline.com' if IS_PROD else 'http://graphql.docker.vg')
1859)
1860CLAIRE_GRAPHQL_ENDPOINT = get_env('CLAIRE_GRAPHQL_ENDPOINT', '')
1861CLAIRE_X_API_KEY = get_env('CLAIRE_X_API_KEY', '')
1862
1863CONNECT_ENDPOINT = get_env(
1864    'CONNECT_ENDPOINT',
1865    default=('https://connect.clearcareonline.com' if IS_PROD else 'https://connect-dev.clearcareonline.com')
1866)
1867CLAIRE_ENDPOINT = get_env('CLAIRE_ENDPOINT', default='https://claire.mobi')
1868CLAIRE_WIDGETS_HOST = get_env('CLAIRE_WIDGETS_HOST', default='https://stoic-yonath-f7db1f.netlify.com')
1869
1870# Deprecated Firebase config
1871FIREBASE_SERVER_KEY = get_env('FIREBASE_SERVER_KEY', 'AAAArUURfp8:APA91bEhtFjtqrWQ5lS2IU0fZlgpo-lDAyfVVcsXAsu4ymEzm3EaGzRFeu0AMO4q0xxWAH_vNrLWaY55ikcFAv5cqtpD0JHNzoG6CfdoksmNX92zxaQQKOGu9QYetDKol6531jQblw_S2wZwo7tzw-olglzgek_LpQ')
1872FIREBASE_SECRET = get_env('FIREBASE_SECRET', '2A4kVpkMSQStgW7tpsEN7La3Rblx2s47urHbqfKS')
1873
1874FIREBASE_URL = get_env('FIREBASE_URL', None)
1875if not FIREBASE_URL:
1876    if IS_PROD:
1877        FIREBASE_URL = 'https://amber-fire-8317.firebaseio.com/'
1878    elif IS_QA or IS_STAGE:
1879        FIREBASE_URL = 'https://clearcare-qa.firebaseio.com/'
1880    else:
1881        FIREBASE_URL = 'https://sweltering-fire-3627.firebaseio.com/'
1882
1883# New Firebase config
1884FIREBASE_SERVICE_ACCOUNT_KEY_PATH = get_env('FIREBASE_SERVICE_ACCOUNT_KEY_PATH', '/code/deploy/firebase')
1885
1886FIREBASE_SERVICE_ACCOUNT_KEY = '{0}/clearcare-dev-service-account-key.json'.format(FIREBASE_SERVICE_ACCOUNT_KEY_PATH)
1887if IS_PROD:
1888    FIREBASE_SERVICE_ACCOUNT_KEY = '{0}/clearcare-prod-service-account-key.json'.format(FIREBASE_SERVICE_ACCOUNT_KEY_PATH)
1889if IS_DEV:
1890    FIREBASE_SERVICE_ACCOUNT_KEY = '{0}/clearcare-dev-service-account-key.json'.format(FIREBASE_SERVICE_ACCOUNT_KEY_PATH)
1891if IS_QA or IS_STAGE:
1892    FIREBASE_SERVICE_ACCOUNT_KEY = '{0}/clearcare-qa-service-account-key.json'.format(FIREBASE_SERVICE_ACCOUNT_KEY_PATH)
1893
1894# Override default options
1895FIREBASE_SERVICE_ACCOUNT_KEY = get_env('FIREBASE_SERVICE_ACCOUNT_KEY', FIREBASE_SERVICE_ACCOUNT_KEY)
1896
1897RHAPSODY_HTTP_ENDPOINT = get_env('RHAPSODY_HTTP_ENDPOINT', 'http://rhapsody.ccointernal.com:5001/CCCP')
1898#Eclaims Configurations
1899RHAPSODY_ECLAIMS_HTTP_ENDPOINT = get_env('RHAPSODY_ECLAIMS_HTTP_ENDPOINT', 'http://rhapsody.ccointernal.com:5002/Test_HTTP_Connect/')
1900ECLAIM_GRAPHQL_ENDPOINT = get_env('ECLAIM_GRAPHQL_ENDPOINT', 'https://lsza2bsepbdbfd4ocnhmbo37ze.appsync-api.us-west-2.amazonaws.com/graphql')
1901ECLAIM_GRAPHQL_ENDPOINT_API_KEY = get_env('ECLAIM_GRAPHQL_ENDPOINT_API_KEY', 'da2-jvts5maglbhsblcwo67ptnam2i')
1902ECLAIMS_BUCKET_NAME = get_env('ECLAIMS_BUCKET_NAME', 'dev-eclaims')
1903
1904EVV_BUCKET_NAME = 'evv-prod-file-submission' if IS_PROD or IS_BETA or IS_ALPHA else 'evv-dev'
1905
1906# EVV serverless configurations
1907EVV_GRAPHQL_ENDPOINT = get_env('EVV_GRAPHQL_ENDPOINT', 'https://kzz6cf36bbck5i6nxksybf4mdq.appsync-api.us-west-2.amazonaws.com/graphql')
1908EVV_GRAPHQL_ENDPOINT_API_KEY = get_env('EVV_GRAPHQL_ENDPOINT_API_KEY', 'da2-sxrdp6coujhmtnqiougs6aodjq')
1909EVV_TELLUS_PEM = get_env('EVV_TELLUS_PEM', read_dev_secret('evv/tellus-pem'))
1910
1911################################################################
1912
1913# FORM 485 CONFIGURATION
1914FORM_485_RHAPSODY_ENDPOINT = get_env('FORM_485_RHAPSODY_ENDPOINT', 'http://rhapsody.ccointernal.com:5006/ClearCare_Form_485')
1915# CDN CONFIGURATION
1916USE_CDN = get_env('USE_CDN', False)
1917CLOUDFRONT_HOST = get_env('CDN_CLOUDFRONT_HOST', 'd136jy3m9efo1h.cloudfront.net')
1918S3_BUCKET_NAMESPACE = get_env('CDN_BUCKET_ASSET_NAMESPACE')
1919if USE_CDN:
1920    assert S3_BUCKET_NAMESPACE is not None
1921    MEDIA_URL = 'https://{1}/{2}/'.format(PROTOCOL, CLOUDFRONT_HOST, S3_BUCKET_NAMESPACE)
1922    STATIC_URL = 'https://{1}/{2}/static/'.format(PROTOCOL, CLOUDFRONT_HOST, S3_BUCKET_NAMESPACE)
1923
1924CONNECT_USER_USER_EMAIL = get_env('CONNECT_USER_USER_EMAIL', 'ametzler+admin@clearcareonline.com')
1925CONNECT_USER_USER_PASSWORD = get_env('CONNECT_USER_USER_PASSWORD', 'test123')
1926
1927USE_DUMP_FOR_FFLAGS=get_env('USE_DUMP_FOR_FFLAGS', False)
1928
1929class DisableMigrations(object):
1930
1931    def __contains__(self, item):
1932        return True
1933
1934    def __getitem__(self, item):
1935        return "notmigrations"
1936
1937
1938if TESTS_IN_PROGRESS:
1939    MIGRATION_MODULES = DisableMigrations()
1940
1941# Looker Settings:
1942LOOKER_CLIENT_SECRET = get_env('LOOKER_CLIENT_SECRET', None)
1943LOOKER_CLIENT_ID = get_env('LOOKER_CLIENT_ID', None)
1944LOOKER_SSO_SECRET = get_env('LOOKER_SSO_SECRET', None)
1945LOOKER_API_HOST = get_env('LOOKER_API_HOST', 'https://analytics.ccointernal.com:19999')
1946LOOKER_WEB_HOST = get_env('LOOKER_WEB_HOST', 'analytics-ui.clearcareonline.com')
1947# This is to make the cache name user friendly and unique between stacks:
1948LOOKER_CACHE_NAME = get_env('LOOKER_CACHE_NAME', ENV_NAME)
1949INSIGHTS_DB_PASSWORD = get_env('INSIGHTS_DB_PASSWORD_SECRET', None) if ENV_NAME else get_env('INSIGHTS_DB_PASSWORD', None)
1950
1951if IS_PROD:
1952    URL_SHORTENER_BUCKET = get_env('URL_SHORTENER_BUCKET', "links.%s" % HOST_NAME)
1953else:
1954    URL_SHORTENER_BUCKET = get_env('URL_SHORTENER_BUCKET', "links-%s.%s" % (ENV_NAME, HOST_NAME))
1955URL_SHORTENER_KEY_LENGTH = get_env('URL_SHORTENER_KEY_LENGTH', 12)
1956URL_SHORTENER_PROTO = get_env('URL_SHORTENER_PROTO', 'http')
1957URL_SHORTENER_MAX_RETRIES = get_env('URL_SHORTENER_MAX_RETRIES', 5)
1958
1959# new POWERTOOLS
1960POWERTOOLS_AUTH_SECRET = get_env(
1961    'POWERTOOLS_AUTH_SECRET',
1962    default='rDjFiBT6bFC2gJzaYil3yKnEm6f20wOGBayNHVxq'
1963)
1964POWERTOOLS_HOST = get_env(
1965    'POWERTOOLS_HOST',
1966    default='https://powertools.ccointernal.com'
1967)
1968
1969# GraphQL Elasticsearch
1970USE_GRAPHQL_SEARCH = get_env('USE_GRAPHQL_SEARCH', False)
1971ELASTIC_SEARCH_DOMAIN_ENDPOINT = get_env('ELASTIC_SEARCH_DOMAIN_ENDPOINT', "search-search-qa-jkvdvcanbupijv2fitycixff4e.us-west-2.es.amazonaws.com")
1972
1973# New Fflags using DynFlags
1974USE_DYNFLAGS = get_env('USE_DYNFLAGS', False)
1975DYNFLAGS_ROBUST_READ = get_env('DYNFLAGS_ROBUST_READ', False)
1976DYNFLAGS_TABLE_NAME = get_env('DYNFLAGS_TABLE_NAME', '{}_feature-flag_MainTable'.format(ENV_NAME))
1977
1978# ApiGee & Hubspot Specific Configs
1979APIGEE_APPS_BASE_URL = get_env('APIGEE_APPS_BASE_URL', "https://api.enterprise.apigee.com/v1/organizations/clearcare/")
1980APIGEE_USERNAME = get_env('APIGEE_USERNAME', None)
1981APIGEE_PASSWORD = get_env('APIGEE_PASSWORD', None)
1982APIGEE_PROXY_REVISION_NUMBER = get_env('APIGEE_PROXY_REVISION_NUMBER','19')
1983APIGEE_PROXY = get_env('APIGEE_PROXY','connect_alpha')
1984APIGEE_API_PRODUCT = get_env('APIGEE_API_PRODUCT', 'ClearCare Connect')
1985
1986# Reporting Tier Throttling MAX CONCURRENT REPORTS (Maximum overall reports allowed to run at a time)
1987# Controlled by Feature Flags `report_throttleing_tier_1` and `report_throttling_tier_2`
1988# CC-26707
1989MAX_CONCURRENT_REPORTS = get_env('MAX_CONCURRENT_REPORTS', 250)