def test_get_standard_ratio_rate_definition(): testil.eq( get_standard_ratio_rate_definition(events_per_day=23), RateDefinition( per_week=115, per_day=23, per_hour=3, per_minute=0.07, per_second=0.005, ), )
def _get_per_user_submission_rate_definition(domain): return PerUserRateDefinition( per_user_rate_definition=get_dynamic_rate_definition( 'submissions_per_user', default=get_standard_ratio_rate_definition(events_per_day=46), ), constant_rate_definition=get_dynamic_rate_definition( 'baseline_submissions_per_project', default=RateDefinition( per_week=100, per_day=50, per_hour=30, per_minute=10, per_second=1, ), ), ).get_rate_limits(domain)
def test_get_dynamic_rate_definition(self): self.addCleanup( lambda: DynamicRateDefinition.objects.get(key='test').delete()) # On the first call, the return value is the default given self.assertEqual( get_dynamic_rate_definition( 'test', default=get_standard_ratio_rate_definition(events_per_day=50)), get_standard_ratio_rate_definition(events_per_day=50)) # once it's created changing the default doesn't affect the return value self.assertEqual( get_dynamic_rate_definition( 'test', default=get_standard_ratio_rate_definition( events_per_day=1000)), get_standard_ratio_rate_definition(events_per_day=50)) # The following lines simulates editing through the Django Admin dynamic_rate_definition = DynamicRateDefinition.objects.get(key='test') dynamic_rate_definition.per_week = 64 dynamic_rate_definition.per_day = 32 dynamic_rate_definition.per_hour = 16 dynamic_rate_definition.per_minute = 8 dynamic_rate_definition.per_second = 4 dynamic_rate_definition.save() # After editing, the return value is the newly saved value # (and the default doesn't matter) self.assertEqual( get_dynamic_rate_definition( 'test', default=get_standard_ratio_rate_definition(events_per_day=50)), rate_definition_from_db_object(dynamic_rate_definition)) # Deleting the db object makes it take on the given default value again dynamic_rate_definition.delete() self.assertEqual( get_dynamic_rate_definition( 'test', default=get_standard_ratio_rate_definition(events_per_day=95)), get_standard_ratio_rate_definition(events_per_day=95))
from corehq.project_limits.rate_limiter import ( PerUserRateDefinition, RateDefinition, RateLimiter, ) from corehq.project_limits.shortcuts import get_standard_ratio_rate_definition from corehq.toggles import RATE_LIMIT_RESTORES, NAMESPACE_DOMAIN, BLOCK_RESTORES from corehq.util.decorators import run_only_when, silence_and_report_error from corehq.util.metrics import metrics_counter RESTORES_PER_DAY = 3 restore_rate_limiter = RateLimiter( feature_key='restores', get_rate_limits=PerUserRateDefinition( per_user_rate_definition=get_standard_ratio_rate_definition( events_per_day=RESTORES_PER_DAY), constant_rate_definition=RateDefinition( per_week=50, per_day=25, per_hour=15, per_minute=5, per_second=1, ), ).get_rate_limits) SHOULD_RATE_LIMIT_RESTORES = not settings.ENTERPRISE_MODE and not settings.UNIT_TESTING @run_only_when(SHOULD_RATE_LIMIT_RESTORES) @silence_and_report_error("Exception raised in the restore rate limiter", 'commcare.restores.rate_limiter_errors')
# RateDefinition( # per_week=115, # per_day=23, # per_hour=3, # per_minute=0.07, # per_second=0.005, # ) == get_standard_ratio_rate_definition(events_per_day=23) # If we as a team end up regretting this decision, we'll have to reset expectations # with the Dimagi NDoH team. SUBMISSIONS_PER_DAY = 46 submission_rate_limiter = RateLimiter( feature_key='submissions', get_rate_limits=PerUserRateDefinition( per_user_rate_definition=get_standard_ratio_rate_definition( events_per_day=SUBMISSIONS_PER_DAY), constant_rate_definition=RateDefinition( per_week=100, per_day=50, per_hour=30, per_minute=10, per_second=1, ), ).get_rate_limits ) global_submission_rate_limiter = RateLimiter( feature_key='global_submissions', get_rate_limits=lambda: get_dynamic_rate_definition( 'global_submissions', default=RateDefinition(