diff --git a/admin/pageaudit/report/migrations/0016_merge_20181204_1315.py b/admin/pageaudit/report/migrations/0016_merge_20181204_1315.py new file mode 100644 index 0000000..977f134 --- /dev/null +++ b/admin/pageaudit/report/migrations/0016_merge_20181204_1315.py @@ -0,0 +1,14 @@ +# Generated by Django 2.0.8 on 2018-12-04 18:15 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('report', '0015_auto_20181130_1123'), + ('report', '0012_auto_20181109_1225'), + ] + + operations = [ + ] diff --git a/admin/pageaudit/report/migrations/0017_auto_20181204_1315.py b/admin/pageaudit/report/migrations/0017_auto_20181204_1315.py new file mode 100644 index 0000000..c358896 --- /dev/null +++ b/admin/pageaudit/report/migrations/0017_auto_20181204_1315.py @@ -0,0 +1,24 @@ +# Generated by Django 2.0.8 on 2018-12-04 18:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('report', '0016_merge_20181204_1315'), + ] + + operations = [ + migrations.AddField( + model_name='urlfilter', + name='mode', + field=models.CharField(choices=[('AND', 'AND'), ('OR', 'OR')], default='AND', max_length=16), + preserve_default=False, + ), + migrations.AlterField( + model_name='urlfilter', + name='slug', + field=models.SlugField(unique=True), + ), + ] diff --git a/admin/pageaudit/report/models.py b/admin/pageaudit/report/models.py index fe30001..6063310 100644 --- a/admin/pageaudit/report/models.py +++ b/admin/pageaudit/report/models.py @@ -961,11 +961,17 @@ class UrlFilter(models.Model): A named UrlFilter. Allows users to create and save a filter for reuse and shared usage. """ + FILTER_MODES = ( + ('AND', 'AND',), + ('OR', 'OR',), + ) + created_date = models.DateTimeField(auto_now_add=True, editable=False) modified_date = models.DateTimeField(auto_now=True, editable=False) name = models.CharField(max_length=255, unique=True) description = models.TextField(null=True, blank=True) slug = models.SlugField(unique=True) + mode = models.CharField(max_length=16, choices=FILTER_MODES) class Meta: ordering = ['name'] @@ -985,12 +991,13 @@ def run_query(self): to do dashboard operations on. """ filter_parts = UrlFilterPart.objects.filter(url_filter=self) + filter_map = {'OR': Q.OR, 'AND': Q.AND} and_condition = Q() for part in filter_parts: query_obj = self.make_query_object(part) - and_condition.add(Q(**query_obj), Q.AND) + and_condition.add(Q(**query_obj), filter_map[self.mode]) query_set = Url.objects.filter(and_condition).distinct() diff --git a/admin/pageaudit/report/templates/reports_filters.html b/admin/pageaudit/report/templates/reports_filters.html index 143c565..48e5917 100644 --- a/admin/pageaudit/report/templates/reports_filters.html +++ b/admin/pageaudit/report/templates/reports_filters.html @@ -93,7 +93,10 @@ {% for part in parts %} - {{ part.prop|title }} = {{ part.filter_val }} + {{ part.prop|title }} = {{ part.filter_val }} + {% if forloop.last == False %} + {{ filter.mode|lower }} + {% endif %} {% endfor %} diff --git a/admin/pageaudit/report/tests/test_filters.py b/admin/pageaudit/report/tests/test_filters.py index 7dd4169..f81a080 100644 --- a/admin/pageaudit/report/tests/test_filters.py +++ b/admin/pageaudit/report/tests/test_filters.py @@ -38,14 +38,16 @@ def setUp(self): ) # make 3 UrlFilters - filters = ['foo', 'bar', 'w00t'] + filters = ['foo', 'bar', 'foo or w00t'] filter_arr = [] for filter in filters: filter_arr.append( UrlFilter.objects.create( name='%s filter' % filter, - description='%s filter description' % filter + description='%s filter description' % filter, + slug='%s-filter' % filter, + mode='AND' if 'or' not in filter else 'OR' ) ) @@ -63,12 +65,17 @@ def setUp(self): filter_path_index=1, url_filter=filter_arr[1] ) - elif filter == 'w00t': + elif filter == 'foo or w00t': UrlFilterPart.objects.create( prop='hash', filter_val='w00t', url_filter=filter_arr[2] ) + UrlFilterPart.objects.create( + prop='path_segment', + filter_val='foo', + url_filter=filter_arr[2] + ) def test_UrlFilters(self): # import ipdb; ipdb.set_trace() @@ -81,9 +88,11 @@ def test_UrlFilters(self): bar = UrlFilter.objects.get(name='bar filter') urls = bar.run_query() - self.assertEqual(urls[0].url, 'https://ibm.com/bar/baz/biff') + self.assertEqual(urls[0].url, 'https://ibm.com/bar/baz/#w00t') - woot = UrlFilter.objects.get(name='w00t filter') - urls = woot.run_query() + foo_or_woot = UrlFilter.objects.get(name='foo or w00t filter') + urls = foo_or_woot.run_query() self.assertEqual(urls[0].url, 'https://ibm.com/bar/baz/#w00t') + self.assertEqual(urls[1].url, 'https://ibm.com/foo') + self.assertEqual(len(urls), 2)