From eed54deeb54390a78da583aa46f280d7cc87d113 Mon Sep 17 00:00:00 2001 From: Bryan Wilson Date: Thu, 14 May 2020 02:59:56 +0000 Subject: [PATCH 1/4] register and send a new Signal on AggregationUpdater.update --- completion_aggregator/core.py | 4 ++++ completion_aggregator/signals.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/completion_aggregator/core.py b/completion_aggregator/core.py index 0524ffda..e92a6ca7 100644 --- a/completion_aggregator/core.py +++ b/completion_aggregator/core.py @@ -23,6 +23,7 @@ from . import tracking from .cachegroup import CacheGroup from .models import Aggregator, StaleCompletion + from .utils import BagOfHolding @@ -217,6 +218,9 @@ def update(self, changed_blocks=frozenset(), force=False): Aggregator.objects.bulk_create_or_update(updated_aggregators) self.resolve_stale_completions(changed_blocks, start) + from .signals import AGGREGATORS_UPDATED # avoid circular imports + AGGREGATORS_UPDATED.send(sender=self.__class__, aggregators=updated_aggregators) + def update_for_block(self, block, affected_aggregators, force=False): """ Recursive function to perform updates for a given block. diff --git a/completion_aggregator/signals.py b/completion_aggregator/signals.py index c1d28909..803cba12 100644 --- a/completion_aggregator/signals.py +++ b/completion_aggregator/signals.py @@ -5,6 +5,7 @@ import logging +from django.dispatch import Signal from django.conf import settings from django.db.models.signals import post_save @@ -14,6 +15,9 @@ log = logging.getLogger(__name__) +AGGREGATORS_UPDATED = Signal(providing_args=["aggregators"]) + + def register(): """ Register signal handlers. From d64146ef07a216736c95306ae76dfad5b4c89190 Mon Sep 17 00:00:00 2001 From: Bryan Wilson Date: Wed, 20 May 2020 00:34:54 +0000 Subject: [PATCH 2/4] test method for checking Signal sent properly after aggregators are updated --- tests/test_core.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/test_core.py b/tests/test_core.py index c2a51ec5..77a95829 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -241,6 +241,22 @@ def test_tracking_func_calls(self, mock_track_func): mock_track_func.assert_any_call(agg, False, True) + @XBlock.register_temp_plugin(CourseBlock, 'course') + @XBlock.register_temp_plugin(OtherAggBlock, 'chapter') + @mock.patch('completion_aggregator.signals.AGGREGATORS_UPDATED.send') + def test_signal_sent_on_update(self, mock_send_signal): + """ + Test that the AGGREGATOR_UPDATED signal is sent w/correct args when aggregators are updated. + """ + self.agg.delete() + self.updater = AggregationUpdater(self.user, self.course_key, mock.MagicMock()) + self.updater.update() + mock_send_signal.assert_any_call( + sender=self.updater.__class__, + aggregators=self.updater.updated_aggregators + ) + + class CalculateUpdatedAggregatorsTestCase(TestCase): """ Test that AggragationUpdater.calculate_updated_aggregators() finds the latest completions. From f7697d7ed59d1bbcd41f76c946d1b02a7b387c32 Mon Sep 17 00:00:00 2001 From: Bryan Wilson Date: Fri, 22 May 2020 21:10:19 +0000 Subject: [PATCH 3/4] fix import paths --- completion_aggregator/batch.py | 4 ++-- completion_aggregator/core.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/completion_aggregator/batch.py b/completion_aggregator/batch.py index a75d249a..92f2b2d0 100644 --- a/completion_aggregator/batch.py +++ b/completion_aggregator/batch.py @@ -15,7 +15,7 @@ import six from . import models, utils -from .tasks import aggregation_tasks +from . import tasks log = logging.getLogger(__name__) @@ -95,7 +95,7 @@ def perform_aggregation(batch_size=10000, delay=0.0, limit=None, routing_key=Non blocks = [] else: blocks = [six.text_type(block_key) for block_key in stale_blocks[enrollment]] - aggregation_tasks.update_aggregators.apply_async( + tasks.aggregation_tasks.update_aggregators.apply_async( kwargs={ 'username': enrollment.username, 'course_key': six.text_type(enrollment.course_key), diff --git a/completion_aggregator/core.py b/completion_aggregator/core.py index e92a6ca7..b2fb115f 100644 --- a/completion_aggregator/core.py +++ b/completion_aggregator/core.py @@ -24,6 +24,7 @@ from .cachegroup import CacheGroup from .models import Aggregator, StaleCompletion +from . import signals from .utils import BagOfHolding @@ -218,8 +219,7 @@ def update(self, changed_blocks=frozenset(), force=False): Aggregator.objects.bulk_create_or_update(updated_aggregators) self.resolve_stale_completions(changed_blocks, start) - from .signals import AGGREGATORS_UPDATED # avoid circular imports - AGGREGATORS_UPDATED.send(sender=self.__class__, aggregators=updated_aggregators) + signals.AGGREGATORS_UPDATED.send(sender=self.__class__, aggregators=updated_aggregators) def update_for_block(self, block, affected_aggregators, force=False): """ From 21df2c87d8698f68c5ada26b284687d3831fa2f7 Mon Sep 17 00:00:00 2001 From: Bryan Wilson Date: Fri, 22 May 2020 22:01:59 +0000 Subject: [PATCH 4/4] whitespace --- test_utils/compat.py | 2 +- test_utils/test_mixins.py | 1 - tests/test_core.py | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/test_utils/compat.py b/test_utils/compat.py index a8def862..4173f90c 100644 --- a/test_utils/compat.py +++ b/test_utils/compat.py @@ -8,7 +8,7 @@ from mock import MagicMock -from django.conf import settings +from django.conf import settings from completion.models import BlockCompletion diff --git a/test_utils/test_mixins.py b/test_utils/test_mixins.py index b41b9779..b92484a6 100644 --- a/test_utils/test_mixins.py +++ b/test_utils/test_mixins.py @@ -96,4 +96,3 @@ def create_course_completion_data(self, user, earned, possible): possible=possible, last_modified=timezone.now() ) - diff --git a/tests/test_core.py b/tests/test_core.py index 77a95829..adfa89f3 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -252,7 +252,7 @@ def test_signal_sent_on_update(self, mock_send_signal): self.updater = AggregationUpdater(self.user, self.course_key, mock.MagicMock()) self.updater.update() mock_send_signal.assert_any_call( - sender=self.updater.__class__, + sender=self.updater.__class__, aggregators=self.updater.updated_aggregators )