Skip to content

Commit

Permalink
Merge branch 'feature/django-2.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
cyberbudy committed Apr 13, 2018
2 parents aa32999 + e26d2cc commit 5712bc0
Show file tree
Hide file tree
Showing 20 changed files with 172 additions and 60 deletions.
7 changes: 6 additions & 1 deletion report_builder/admin.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
from django.contrib import admin
from django.contrib.admin import SimpleListFilter
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from report_builder.models import Report, Format
from django.conf import settings

try:
from django.core.urlresolvers import reverse
except ModuleNotFoundError:
from django.urls import reverse


static_url = getattr(settings, 'STATIC_URL', '/static/')


Expand Down
12 changes: 6 additions & 6 deletions report_builder/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,10 @@ class Migration(migrations.Migration):
('distinct', models.BooleanField(default=False)),
('report_file', models.FileField(upload_to=b'report_files', blank=True)),
('report_file_creation', models.DateTimeField(null=True, blank=True)),
('root_model', models.ForeignKey(to='contenttypes.ContentType')),
('root_model', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)),
('starred', models.ManyToManyField(help_text=b'These users have starred this report for easy reference.', related_name='report_starred_set', to=settings.AUTH_USER_MODEL, blank=True)),
('user_created', models.ForeignKey(blank=True, editable=False, to=settings.AUTH_USER_MODEL, null=True)),
('user_modified', models.ForeignKey(related_name='report_modified_set', blank=True, editable=False, to=settings.AUTH_USER_MODEL, null=True)),
('user_created', models.ForeignKey(blank=True, editable=False, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL)),
('user_modified', models.ForeignKey(related_name='report_modified_set', blank=True, editable=False, to=settings.AUTH_USER_MODEL, null=True, on_delete=models.SET_NULL)),
],
options={
},
Expand All @@ -89,19 +89,19 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='filterfield',
name='report',
field=models.ForeignKey(to='report_builder.Report'),
field=models.ForeignKey(to='report_builder.Report', on_delete=models.CASCADE),
preserve_default=True,
),
migrations.AddField(
model_name='displayfield',
name='display_format',
field=models.ForeignKey(blank=True, to='report_builder.Format', null=True),
field=models.ForeignKey(blank=True, to='report_builder.Format', null=True, on_delete=models.SET_NULL),
preserve_default=True,
),
migrations.AddField(
model_name='displayfield',
name='report',
field=models.ForeignKey(to='report_builder.Report'),
field=models.ForeignKey(to='report_builder.Report', on_delete=models.CASCADE),
preserve_default=True,
),
]
20 changes: 20 additions & 0 deletions report_builder/migrations/0006_auto_20180413_0747.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 2.0.4 on 2018-04-13 07:47

from django.db import migrations, models
import django.db.models.deletion
import report_builder.models


class Migration(migrations.Migration):

dependencies = [
('report_builder', '0005_add_delta_filtering'),
]

operations = [
migrations.AlterField(
model_name='report',
name='root_model',
field=models.ForeignKey(limit_choices_to=report_builder.models.get_limit_choices_to_callable, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'),
),
]
19 changes: 13 additions & 6 deletions report_builder/models.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from django import forms
from django.contrib.contenttypes.models import ContentType
from django.conf import settings
from django.core.urlresolvers import reverse
from django.core.files.base import ContentFile
from django.core.exceptions import ValidationError, ObjectDoesNotExist
from django.utils.safestring import mark_safe
Expand All @@ -21,6 +20,11 @@
import datetime
import re

try:
from django.core.urlresolvers import reverse
except ModuleNotFoundError:
from django.urls import reverse

AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')


Expand Down Expand Up @@ -73,14 +77,16 @@ def allowed_models():
slug = models.SlugField(verbose_name="Short Name")
description = models.TextField(blank=True)
root_model = models.ForeignKey(
ContentType, limit_choices_to=get_limit_choices_to_callable)
ContentType, limit_choices_to=get_limit_choices_to_callable,
on_delete=models.CASCADE)
created = models.DateField(auto_now_add=True)
modified = models.DateField(auto_now=True)
user_created = models.ForeignKey(
AUTH_USER_MODEL, editable=False, blank=True, null=True)
AUTH_USER_MODEL, editable=False, blank=True, null=True,
on_delete=models.SET_NULL)
user_modified = models.ForeignKey(
AUTH_USER_MODEL, editable=False, blank=True, null=True,
related_name="report_modified_set")
related_name="report_modified_set", on_delete=models.SET_NULL)
distinct = models.BooleanField(default=False)
report_file = models.FileField(upload_to="report_files", blank=True)
report_file_creation = models.DateTimeField(blank=True, null=True)
Expand Down Expand Up @@ -497,7 +503,7 @@ def __str__(self):


class AbstractField(models.Model):
report = models.ForeignKey(Report)
report = models.ForeignKey(Report, on_delete=models.CASCADE)
path = models.CharField(max_length=2000, blank=True)
path_verbose = models.CharField(max_length=2000, blank=True)
field = models.CharField(max_length=2000)
Expand Down Expand Up @@ -545,7 +551,8 @@ class DisplayField(AbstractField):
)
total = models.BooleanField(default=False)
group = models.BooleanField(default=False)
display_format = models.ForeignKey(Format, blank=True, null=True)
display_format = models.ForeignKey(Format, blank=True, null=True,
on_delete=models.SET_NULL)

def get_choices(self, model, field_name):
try:
Expand Down
16 changes: 13 additions & 3 deletions report_builder/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,12 @@ def test_a_initial_rel_field_name(self):
Test that the initial assumption about the ManyToOneRel field_name is
correct
"""
self.assertEquals(Waiter.restaurant.field.rel.field_name, "place")
field_name = (
Waiter.restaurant.field.rel.name
if hasattr(Waiter.restaurant.field, 'rel')
else Waiter.restaurant.field.target_field.name
)
self.assertEquals(field_name, "place")

def test_get_relation_fields_from_model_does_not_change_field_name(self):
"""
Expand All @@ -31,8 +36,13 @@ def test_get_relation_fields_from_model_does_not_change_field_name(self):
ManyToManyRel objects are not affected.
"""
get_relation_fields_from_model(Restaurant)
self.assertEquals(Waiter.restaurant.field.rel.field_name, "place")
Waiter.restaurant.field.rel.get_related_field()
field_name = (
Waiter.restaurant.field.rel.name
if hasattr(Waiter.restaurant.field, 'rel')
else Waiter.restaurant.field.target_field.name
)
self.assertEquals(field_name, "place")
# Waiter.restaurant.field.rel.get_related_field()


class UtilityFunctionTests(TestCase):
Expand Down
51 changes: 28 additions & 23 deletions report_builder/tests/tests.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.db.models.query import QuerySet
from django.test import TestCase
from django.test.utils import override_settings
Expand All @@ -20,6 +19,12 @@
from datetime import date, datetime, timedelta, time as dtime

from django.contrib.auth import get_user_model

try:
from django.core.urlresolvers import reverse
except ModuleNotFoundError:
from django.urls import reverse

User = get_user_model()


Expand Down Expand Up @@ -80,7 +85,7 @@ def test_get_allowed_models_lookup_dict(self):
self.assertTrue(callable(get_limit_choices_to_callable))
self.assertTrue(isinstance(lookup_dict['pk__in'], QuerySet))
self.assertQuerysetEqual(lookup_dict['pk__in'], map(repr, models), ordered=False)

def test_report_builder_reports(self):
url = '/report_builder/api/reports/'
no_auth_client = APIClient()
Expand Down Expand Up @@ -187,7 +192,7 @@ def test_report_builder_understands_empty_string(self):
report = Report.objects.create(
name="foo report",
root_model=ct)

display_field = DisplayField.objects.create(
name='foo',
report=report,
Expand Down Expand Up @@ -543,13 +548,13 @@ def make_people_report(self):
"""
Make a mock report using the People demo model.
Creates mock People instances and returns a report including the
Creates mock People instances and returns a report including the
following DisplayFields:
first_name (CharField)
last_modifed (DateField)
birth_date (DateTimeField)
hammer_time (TimeField)
"""
"""
self.make_people()
model = ContentType.objects.get(model="person",
app_label="demo_models")
Expand Down Expand Up @@ -601,7 +606,7 @@ def test_filter_datetime_lte_filter(self):
# DateField
ff = FilterField.objects.create(
report=people_report,
field='last_modifed',
field='last_modifed',
filter_type='lte',
filter_value=str(date.today() - timedelta(seconds=self.day * 10)),
)
Expand All @@ -612,15 +617,15 @@ def test_filter_datetime_lte_filter(self):
self.assertEquals(len(response.data['data']), 3)

# TimeField
ff.field = 'hammer_time'
ff.field = 'hammer_time'
ff.filter_value = str(dtime(hour=13))
ff.save()

response = self.client.get(generate_url)
self.assertEquals(len(response.data['data']), 1)

# DateTimeField
ff.field = 'birth_date'
ff.field = 'birth_date'
ff.filter_value = str(datetime.today() - timedelta(seconds=self.day * 40))
ff.save()

Expand All @@ -631,8 +636,8 @@ def test_filter_datetime_lte_filter(self):
def test_filter_datetime_range(self):
"""
Test filtering 'DateTime' field types using a range filter.
Each FilterField accepts 2 values of the respective field type to
Each FilterField accepts 2 values of the respective field type to
create the range.
Ex. Filter a TimeField for 'user logins between 10am - 1pm':
Expand All @@ -645,7 +650,7 @@ def test_filter_datetime_range(self):
# DateField
ff = FilterField.objects.create(
report=people_report,
field='last_modifed',
field='last_modifed',
filter_type='range',
filter_value=str(date.today() - timedelta(seconds=self.day * 7)),
filter_value2=str(date.today()),
Expand All @@ -656,7 +661,7 @@ def test_filter_datetime_range(self):
self.assertEquals(len(response.data['data']), 1)

# TimeField
ff.field = 'hammer_time'
ff.field = 'hammer_time'
ff.filter_value = str(dtime(hour=10))
ff.filter_value2 = str(dtime(hour=13))
ff.save()
Expand All @@ -665,7 +670,7 @@ def test_filter_datetime_range(self):
self.assertEquals(len(response.data['data']), 1)

# DateTimeField
ff.field = 'birth_date'
ff.field = 'birth_date'
ff.filter_value = str(datetime.now() - timedelta(seconds=self.day * 50))
ff.filter_value2 = str(datetime.now() - timedelta(seconds=self.day * 70))
ff.save()
Expand All @@ -678,8 +683,8 @@ def test_filter_datetime_relative_range(self):
"""
Test filtering 'DateTime' field types using a relative range filter.
Each FilterField accepts a delta value (in seconds) which represents
the range (positive or negative) off of the current date.
Each FilterField accepts a delta value (in seconds) which represents
the range (positive or negative) off of the current date.
Ex. Filter a TimeField for 'user logins in the last 3 hours':
filter_type='relative_range',
Expand All @@ -700,7 +705,7 @@ def test_filter_datetime_relative_range(self):
self.assertEquals(len(response.data['data']), 1)

# DateField w/ partial day
ff.filter_delta = self.day * -7 + 5
ff.filter_delta = self.day * -7 + 5
ff.save()

response = self.client.get(generate_url)
Expand Down Expand Up @@ -739,7 +744,7 @@ def test_filter_datetime_relative_range(self):
def test_filter_datefield_relative_range_over_time(self):
"""
Test filtering DateField types using a relative range filter
over time.
over time.
"""
people_report = self.make_people_report()
generate_url = reverse('generate_report', args=[people_report.id])
Expand All @@ -766,15 +771,15 @@ def test_filter_datefield_relative_range_over_time(self):
def test_filter_timefield_relative_range_over_time(self):
"""
Test filtering TimeField field types using a relative range filter
over time.
over time.
"""

people_report = self.make_people_report()
generate_url = reverse('generate_report', args=[people_report.id])

initial_today = datetime(2017, 11, 1, 12)
four_hours_later_today = datetime(2017, 11, 1, 16)

# TimeField with login 'now'
with freeze_time(initial_today) as frozen_today:
FilterField.objects.create(
Expand All @@ -794,11 +799,11 @@ def test_filter_timefield_relative_range_over_time(self):
def test_filter_datetimefield_relative_range_over_time(self):
"""
Test filtering DateTimeField field types using a relative range filter
over time.
over time.
"""
people_report = self.make_people_report()
generate_url = reverse('generate_report', args=[people_report.id])

initial_today = datetime(2017, 10, 1, 12)
one_month_later = datetime(2017, 11, 1, 12)

Expand Down
2 changes: 1 addition & 1 deletion report_builder_demo/demo_models/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='FooExclude',
fields=[
('foo_ptr', models.OneToOneField(auto_created=True, serialize=False, parent_link=True, primary_key=True, to='demo_models.Foo')),
('foo_ptr', models.OneToOneField(auto_created=True, serialize=False, parent_link=True, primary_key=True, to='demo_models.Foo', on_delete=models.CASCADE)),
],
options={
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Restaurant',
fields=[
('place', models.OneToOneField(primary_key=True, to='demo_models.Place', serialize=False)),
('place', models.OneToOneField(primary_key=True, to='demo_models.Place', serialize=False, on_delete=models.CASCADE)),
('serves_hot_dogs', models.BooleanField(default=False)),
('serves_pizza', models.BooleanField(default=False)),
],
),
migrations.AddField(
model_name='waiter',
name='restaurant',
field=models.ForeignKey(to='demo_models.Restaurant'),
field=models.ForeignKey(to='demo_models.Restaurant', on_delete=models.CASCADE),
),
]
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='bar',
name='check_mate_status',
field=models.CharField(default=b'CH', max_length=2, choices=[(b'CH', b'CHECK'), (b'MA', b'CHECKMATE')]),
field=models.CharField(default='CH', max_length=2, choices=[('CH', 'CHECK'), ('MA', 'CHECKMATE')]),
),
migrations.AddField(
model_name='child',
name='parent',
field=models.ForeignKey(related_name='children', to='demo_models.Person'),
field=models.ForeignKey(related_name='children', to='demo_models.Person', on_delete=models.CASCADE),
),
]
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, serialize=False, primary_key=True, verbose_name='ID')),
('object_pk', models.TextField()),
('content_type', models.ForeignKey(to='contenttypes.ContentType')),
('content_type', models.ForeignKey(to='contenttypes.ContentType', on_delete=models.CASCADE)),
],
),
migrations.AlterField(
Expand Down

0 comments on commit 5712bc0

Please sign in to comment.