Пример #1
0
    def run(self, worklogentry_id, serialized_right_boundary):
        logger = self.get_logger()
        step = self.model.step

        right_boundary = parse_datetime(serialized_right_boundary)
        left_boundary = right_boundary - step

        if right_boundary != floor_to_base(right_boundary, step):
            raise ValueError('Right boundary is not a multiple of %s.' % step)

        try:
            with transaction.atomic():
                aggregates_to_create = self.aggregate(left_boundary,
                                                      right_boundary)
                if aggregates_to_create:
                    for instance_name, group in groupby(
                            aggregates_to_create, lambda o: o.instance_name):
                        self.notify_about_aggregate(instance_name, list(group))
                    self.model.objects.bulk_create(aggregates_to_create)

                WorkLogEntry.objects.filter(pk=worklogentry_id).update(
                    status=WorkLogEntry.STATUS_CHOICES.DONE)
            interval_aggregated.send(sender=self,
                                     left_boundary=left_boundary,
                                     right_boundary=right_boundary)
        except Exception:
            WorkLogEntry.objects.filter(pk=worklogentry_id).update(
                status=WorkLogEntry.STATUS_CHOICES.FAILED)
            logger.exception('Unexpected error when aggregating %s - %s.' %
                             (left_boundary, right_boundary))
    def test_filtering_by_date(self):
        now = floor_to_base(timezone.now(), self.model.step)
        aggregate1 = G(self.model, admin=self.admin, timestamp=now, value=100)
        aggregate2 = G(self.model,
                       admin=self.admin,
                       timestamp=now - timedelta(days=1),
                       value=150)

        if self.as_date:
            now = now.date()

        response = self.client.get(self.url, {'start': now})
        self.assertEqual(len(response.data['objects']), 1)
        self.assertEqual(response.data['objects'][0]['value'],
                         aggregate1.value)

        response = self.client.get(self.url, {'end': now - timedelta(days=1)})
        self.assertEqual(len(response.data['objects']), 1)
        self.assertEqual(response.data['objects'][0]['value'],
                         aggregate2.value)

        response = self.client.get(self.url, {
            'start': now + timedelta(days=1),
            'end': now + timedelta(days=2)
        })
        self.assertEqual(len(response.data['objects']), 0)
Пример #3
0
from datetime import timedelta
from unittest import mock

from django.test import TestCase
from django.utils.timezone import now
from django_dynamic_fixture import G

from apps.metrics.helpers import floor_to_base
from apps.metrics.models import WorkLogEntry
from apps.metrics.tasks import AggregateHourTask

last_full_hour = floor_to_base(now(), base=timedelta(hours=1))


class ChargingTestCase(TestCase):
    @mock.patch('apps.billing.tasks.ChargeOneHour.run')
    def test_one_hour_is_charged_when_metrics_finish_calculating(
            self, mock_func):
        worklog = G(WorkLogEntry)
        AggregateHourTask.delay(worklog.id, (last_full_hour +
                                             timedelta(hours=1)).isoformat())
        mock_func.assert_called_with(last_full_hour.isoformat())
Пример #4
0
 def create_worklog(self, step):
     right_boundary = floor_to_base(now() - step, base=step)
     return G(WorkLogEntry,
              left_boundary=right_boundary - step,
              right_boundary=right_boundary,
              seconds=step.total_seconds())
Пример #5
0
 def create_boundary(self, base, precision):
     right_boundary = floor_to_base(now(), base)
     left_boundary = right_boundary - precision
     return left_boundary, right_boundary