Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions completion_aggregator/batch.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import six

from . import models, utils
from .tasks import aggregation_tasks
from . import tasks

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -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),
Expand Down
4 changes: 4 additions & 0 deletions completion_aggregator/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
from . import tracking
from .cachegroup import CacheGroup
from .models import Aggregator, StaleCompletion

Comment thread
bryanlandia marked this conversation as resolved.
from . import signals
from .utils import BagOfHolding


Expand Down Expand Up @@ -217,6 +219,8 @@ def update(self, changed_blocks=frozenset(), force=False):
Aggregator.objects.bulk_create_or_update(updated_aggregators)
self.resolve_stale_completions(changed_blocks, start)

signals.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.
Expand Down
4 changes: 4 additions & 0 deletions completion_aggregator/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import logging

from django.dispatch import Signal
from django.conf import settings
from django.db.models.signals import post_save

Expand All @@ -14,6 +15,9 @@
log = logging.getLogger(__name__)


AGGREGATORS_UPDATED = Signal(providing_args=["aggregators"])


def register():
"""
Register signal handlers.
Expand Down
2 changes: 1 addition & 1 deletion test_utils/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from mock import MagicMock

from django.conf import settings
from django.conf import settings

from completion.models import BlockCompletion

Expand Down
1 change: 0 additions & 1 deletion test_utils/test_mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,3 @@ def create_course_completion_data(self, user, earned, possible):
possible=possible,
last_modified=timezone.now()
)

16 changes: 16 additions & 0 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down