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)
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')
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
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']}
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)
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
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()
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)
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)
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()
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)
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()
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)
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'])
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)
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']}
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')
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' )
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)
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))
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))
def test_exceptions_on_complex_calls(self): for daterange in get_complex_dateranges(): with self.assertRaises(InvalidDaterangeException): get_daterange_start_end_dates(daterange.slug)
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)
def test_no_exceptions_on_simple_calls(self): for daterange in get_simple_dateranges(): get_daterange_start_end_dates(daterange.slug)
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)