Example #1
0
 def test_exceptions_on_complex_calls(self):
     for daterange in [
             choice for choice in get_all_daterange_choices()
             if not choice.simple
     ]:
         with self.assertRaises(InvalidDaterangeException):
             get_daterange_start_end_dates(daterange.slug)
Example #2
0
    def test_pre_filter_dyn_operator(self):
        from corehq.apps.reports.daterange import get_daterange_start_end_dates

        column = Mock()
        column.name = 'dob_field'
        column.between.return_value = 'foo'
        table = Mock()
        table.c = [column]

        start_date, end_date = get_daterange_start_end_dates('lastmonth')

        value = {'operator': 'lastmonth', 'operand': [None]}
        filter_ = ReportFilter.wrap({
            'type': 'pre',
            'field': 'dob_field',
            'slug': 'dob_slug',
            'datatype': 'array',
            'pre_value': value['operand'],
            'pre_operator': value['operator'],
        })
        filter_value = PreFilterValue(filter_, value)
        self.assertEqual(filter_value.to_sql_values(), {
            'dob_slug_0': str(start_date),
            'dob_slug_1': str(end_date),
        })
        self.assertEqual(filter_value.to_sql_filter().build_expression(table), 'foo')
Example #3
0
    def get_date_range(self):
        date_range = self.date_range
        # allow old report email notifications to represent themselves as a
        # report config by leaving the default date range up to the report
        # dispatcher
        if not date_range:
            return {}

        try:
            start_date, end_date = get_daterange_start_end_dates(
                date_range,
                start_date=self.start_date,
                end_date=self.end_date,
                days=self.days,
            )
        except InvalidDaterangeException:
            # this is due to bad validation. see: http://manage.dimagi.com/default.asp?110906
            logging.error('saved report %s is in a bad state - date range is misconfigured' % self._id)
            return {}

        dates = {
            'startdate': start_date.isoformat(),
            'enddate': end_date.isoformat(),
        }

        if self.is_configurable_report:
            filter_slug = self.datespan_slug
            if filter_slug:
                return {
                    '%s-start' % filter_slug: start_date.isoformat(),
                    '%s-end' % filter_slug: end_date.isoformat(),
                    filter_slug: '%(startdate)s to %(enddate)s' % dates,
                }
        return dates
Example #4
0
 def to_sql_values(self):
     if self._is_dyn_date():
         start_date, end_date = get_daterange_start_end_dates(
             self.value['operator'], *self.value['operand'])
         return {
             get_INFilter_element_bindparam(self.filter['slug'], i): str(v)
             for i, v in enumerate([start_date, end_date])
         }
     elif self._is_empty() or self._is_exists():
         if self.filter.get('datatype') in [
                 DATA_TYPE_DATE, DATA_TYPE_DATETIME
         ]:
             # Both == '' and != '' do not work for dates in postgres so the expression should only be for NULL
             # checks that get added later. Hence don't return any comparison for value here
             return {}
         else:
             return {
                 self.filter['slug']: '',
             }
     elif self._is_list():
         # Array params work like IN bind params
         return {
             get_INFilter_element_bindparam(self.filter['slug'], i): v
             for i, v in enumerate(self.value['operand'])
         }
     else:
         return {self.filter['slug']: self.value['operand']}
Example #5
0
    def test_since(self, date_patch):
        date_patch.today.return_value = self.first_performance

        saturday = datetime.date(year=1829, month=8, day=1)
        start_date, end_date = get_daterange_start_end_dates('since', start_date=saturday)
        self.assertEqual(start_date, saturday)
        self.assertEqual(end_date, self.first_performance)
Example #6
0
    def get_date_range(self):
        """Duplicated in reports.config.js"""
        date_range = self.date_range
        # allow old report email notifications to represent themselves as a
        # report config by leaving the default date range up to the report
        # dispatcher
        if not date_range:
            return {}

        try:
            start_date, end_date = get_daterange_start_end_dates(
                date_range,
                start_date=self.start_date,
                end_date=self.end_date,
                days=self.days,
            )
        except InvalidDaterangeException:
            # this is due to bad validation. see: http://manage.dimagi.com/default.asp?110906
            logging.error('saved report %s is in a bad state - date range is misconfigured' % self._id)
            return {}

        dates = {
            'startdate': start_date.isoformat(),
            'enddate': end_date.isoformat(),
        }

        if self.is_configurable_report:
            filter_slug = self.datespan_slug
            if filter_slug:
                return {
                    '%s-start' % filter_slug: start_date.isoformat(),
                    '%s-end' % filter_slug: end_date.isoformat(),
                    filter_slug: '%(startdate)s to %(enddate)s' % dates,
                }
        return dates
Example #7
0
    def test_pre_filter_dyn_operator(self):
        from corehq.apps.reports.daterange import get_daterange_start_end_dates

        column = Mock()
        column.name = 'dob_field'
        column.between.return_value = 'foo'
        table = Mock()
        table.c = [column]

        start_date, end_date = get_daterange_start_end_dates('lastmonth')

        value = {'operator': 'lastmonth', 'operand': [None]}
        filter_ = ReportFilter.wrap({
            'type': 'pre',
            'field': 'dob_field',
            'slug': 'dob_slug',
            'datatype': 'array',
            'pre_value': value['operand'],
            'pre_operator': value['operator'],
        })
        filter_value = PreFilterValue(filter_, value)
        self.assertEqual(filter_value.to_sql_values(), {
            'dob_slug_0': str(start_date),
            'dob_slug_1': str(end_date),
        })
        self.assertEqual(filter_value.to_sql_filter().build_expression(table),
                         'foo')
Example #8
0
 def _resolve_from_template(self, template, query_context):
     # todo: support other types and options
     assert template.type == 'form'
     startdate, enddate = get_daterange_start_end_dates(template.time_range)
     xmlns = Form.get_form(template.source_id).xmlns
     return FormES().user_id(query_context.user._id).xmlns([xmlns]).submitted(
         gte=startdate,
         lte=enddate,
     ).size(0).count()
Example #9
0
    def test_lastn(self):
        date_class = datetime.date
        with patch('datetime.date') as date_patch:
            date_patch.today.return_value = self.first_performance
            date_patch.side_effect = lambda *args, **kwargs: date_class(*args, **kwargs)

            start_date, end_date = get_daterange_start_end_dates('lastn', days=-14)  # In two weeks' time
            self.assertEqual(start_date, datetime.date(year=1829, month=8, day=17))
            self.assertEqual(end_date, self.first_performance)
Example #10
0
    def test_last30(self):
        date_class = datetime.date
        with patch('datetime.date') as date_patch:
            date_patch.today.return_value = self.first_performance
            date_patch.side_effect = lambda *args, **kwargs: date_class(*args, **kwargs)

            start_date, end_date = get_daterange_start_end_dates('last30')
            self.assertEqual(start_date, datetime.date(year=1829, month=7, day=4))  # Woo!
            self.assertEqual(end_date, self.first_performance)
Example #11
0
 def _resolve_from_template(self, template, query_context):
     # todo: support other types and options
     assert template.type == 'form'
     startdate, enddate = get_daterange_start_end_dates(template.time_range)
     xmlns = Form.get_form(template.source_id).xmlns
     return FormES().user_id(query_context.user._id).xmlns(
         [xmlns]).submitted(
             gte=startdate,
             lte=enddate,
         ).size(0).count()
Example #12
0
 def to_es_filter(self):
     # TODO: support the array and null operators defined at top of class
     if self._is_dyn_date():
         start_date, end_date = get_daterange_start_end_dates(self.value['operator'], *self.value['operand'])
         return filters.date_range(self.filter.field, gt=start_date, lt=end_date)
     elif self._is_null():
         return filters.missing(self.filter.field)
     else:
         terms = [v.value.lower() for v in self.value]
         return filters.term(self.filter.field, terms)
Example #13
0
 def _resolve_from_template(self, template, query_context):
     # todo: support other types and options
     assert template.type == 'form'
     startdate, enddate = get_daterange_start_end_dates(template.time_range)
     xmlns = Form.get_form(template.source_id).xmlns
     return FormData.objects.filter(
         user_id=query_context.user._id,
         xmlns=xmlns,
         received_on__gte=startdate,
         received_on__lt=enddate,
     ).count()
Example #14
0
    def test_range(self):
        # Zane Grey dedicated his book "The Lone Star Ranger" to Texas Ranger Captain John R. Hughes in 1915
        john_hughes_birthday = datetime.date(year=1855, month=2, day=11)

        start_date, end_date = get_daterange_start_end_dates(
            'range',
            start_date=self.first_performance,
            end_date=john_hughes_birthday,
        )
        self.assertEqual(start_date, self.first_performance)
        self.assertEqual(end_date, john_hughes_birthday)
Example #15
0
    def test_range(self):
        # Zane Grey dedicated his book "The Lone Star Ranger" to Texas Ranger Captain John R. Hughes in 1915
        john_hughes_birthday = datetime.date(year=1855, month=2, day=11)

        start_date, end_date = get_daterange_start_end_dates(
            'range',
            start_date=self.first_performance,
            end_date=john_hughes_birthday,
        )
        self.assertEqual(start_date, self.first_performance)
        self.assertEqual(end_date, john_hughes_birthday)
Example #16
0
 def to_es_filter(self):
     # TODO: support the array and null operators defined at top of class
     if self._is_dyn_date():
         start_date, end_date = get_daterange_start_end_dates(self.value['operator'], *self.value['operand'])
         return filters.date_range(self.filter.field, gt=start_date, lt=end_date)
     elif self._is_null():
         return filters.missing(self.filter.field)
     elif self._is_list():
         terms = [v.value for v in self.value['operand']]
         return filters.term(self.filter.field, terms)
     else:
         return self._scalar_filter.es(self.filter.field, self.value['operand'])
Example #17
0
        def check_dates(on_date, expected_start_date, expected_end_date):
            date_class = datetime.date
            with patch('datetime.date') as date_patch:
                date_patch.side_effect = lambda *args, **kwargs: date_class(
                    *args, **kwargs)
                date_patch.today.return_value = on_date
                start_date, end_date = get_daterange_start_end_dates(
                    'currentindianfinancialyear')

                # to avoid false positives when compared with mock
                self.assertIsInstance(start_date, date_class)
                self.assertIsInstance(end_date, date_class)

                self.assertEqual(start_date, expected_start_date)
                self.assertEqual(end_date, expected_end_date)
Example #18
0
 def to_sql_values(self):
     if self._is_dyn_date():
         start_date, end_date = get_daterange_start_end_dates(self.value['operator'], *self.value['operand'])
         return {
             get_INFilter_element_bindparam(self.filter.slug, i): str(v)
             for i, v in enumerate([start_date, end_date])
         }
     elif self._is_null():
         return {}
     elif self._is_list():
         # Array params work like IN bind params
         return {
             get_INFilter_element_bindparam(self.filter.slug, i): v
             for i, v in enumerate(self.value['operand'])
         }
     else:
         return {self.filter.slug: self.value['operand']}
Example #19
0
 def to_sql_values(self):
     if self._is_dyn_date():
         start_date, end_date = get_daterange_start_end_dates(self.value['operator'], *self.value['operand'])
         return {
             get_INFilter_element_bindparam(self.filter.slug, i): str(v)
             for i, v in enumerate([start_date, end_date])
         }
     elif self._is_null():
         return {}
     elif self._is_list():
         # Array params work like IN bind params
         return {
             get_INFilter_element_bindparam(self.filter.slug, i): v
             for i, v in enumerate(self.value['operand'])
         }
     else:
         return {self.filter.slug: self.value['operand']}
Example #20
0
    def test_pre_filter_dyn_operator(self):
        from corehq.apps.reports.daterange import get_daterange_start_end_dates
        start_date, end_date = get_daterange_start_end_dates('lastmonth')

        value = {'operator': 'lastmonth', 'operand': [None]}
        filter_ = {
            'type': 'pre',
            'field': 'dob_field',
            'slug': 'dob_slug',
            'datatype': 'array',
            'pre_value': value['operand'],
            'pre_operator': value['operator'],
        }
        filter_value = PreFilterValue(filter_, value)
        self.assertEqual(filter_value.to_sql_values(), {
            'dob_slug_0': str(start_date),
            'dob_slug_1': str(end_date),
        })
        self.assertEqual(str(filter_value.to_sql_filter().build_expression()),
                         'dob_field BETWEEN :dob_slug_0 AND :dob_slug_1')
Example #21
0
    def test_pre_filter_dyn_operator(self):
        from corehq.apps.reports.daterange import get_daterange_start_end_dates
        start_date, end_date = get_daterange_start_end_dates('lastmonth')

        value = {'operator': 'lastmonth', 'operand': [None]}
        filter_ = {
            'type': 'pre',
            'field': 'dob_field',
            'slug': 'dob_slug',
            'datatype': 'array',
            'pre_value': value['operand'],
            'pre_operator': value['operator'],
        }
        filter_value = PreFilterValue(filter_, value)
        self.assertEqual(filter_value.to_sql_values(), {
            'dob_slug_0': str(start_date),
            'dob_slug_1': str(end_date),
        })
        self.assertEqual(
            str(filter_value.to_sql_filter().build_expression()),
            'dob_field BETWEEN :dob_slug_0 AND :dob_slug_1'
        )
Example #22
0
 def test_exceptions_on_complex_calls(self):
     for daterange in [choice for choice in get_all_daterange_choices() if not choice.simple]:
         with self.assertRaises(InvalidDaterangeException):
             get_daterange_start_end_dates(daterange.slug)
Example #23
0
    def test_thismonth(self, date_patch):
        date_patch.today.return_value = self.first_performance

        start_date, end_date = get_daterange_start_end_dates('thismonth')
        self.assertEqual(start_date, datetime.date(year=1829, month=8, day=1))
        self.assertEqual(end_date, datetime.date(year=1829, month=8, day=31))
Example #24
0
    def test_lastyear(self, date_patch):
        date_patch.today.return_value = self.first_performance

        start_date, end_date = get_daterange_start_end_dates('lastyear')
        self.assertEqual(start_date, datetime.date(year=1828, month=1, day=1))
        self.assertEqual(end_date, datetime.date(year=1828, month=12, day=31))
Example #25
0
 def test_exceptions_on_complex_calls(self):
     for daterange in get_complex_dateranges():
         with self.assertRaises(InvalidDaterangeException):
             get_daterange_start_end_dates(daterange.slug)
Example #26
0
 def test_exceptions_on_complex_calls(self):
     for daterange in filter(lambda choice: not choice.simple, get_all_daterange_choices()):
         with self.assertRaises(InvalidDaterangeException):
             get_daterange_start_end_dates(daterange.slug)
Example #27
0
 def test_no_exceptions_on_simple_calls(self):
     for daterange in get_simple_dateranges():
         get_daterange_start_end_dates(daterange.slug)
Example #28
0
 def test_exceptions_on_complex_calls(self):
     for daterange in filter(lambda choice: not choice.simple,
                             get_all_daterange_choices()):
         with self.assertRaises(InvalidDaterangeException):
             get_daterange_start_end_dates(daterange.slug)
Example #29
0
 def test_no_exceptions_on_simple_calls(self):
     for daterange in get_simple_dateranges():
         get_daterange_start_end_dates(daterange.slug)
Example #30
0
    def test_thismonth(self, date_patch):
        date_patch.today.return_value = self.first_performance

        start_date, end_date = get_daterange_start_end_dates('thismonth')
        self.assertEqual(start_date, datetime.date(year=1829, month=8, day=1))
        self.assertEqual(end_date, self.first_performance)
Example #31
0
    def test_lastyear(self, date_patch):
        date_patch.today.return_value = self.first_performance

        start_date, end_date = get_daterange_start_end_dates('lastyear')
        self.assertEqual(start_date, datetime.date(year=1828, month=1, day=1))
        self.assertEqual(end_date, datetime.date(year=1828, month=12, day=31))