diff --git a/api/serializers.py b/api/serializers.py index 2a777187..90db035c 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -174,17 +174,20 @@ class WeightSerializer(CoreModelSerializer): model = models.Weight fields = ('id', 'child', 'weight', 'date', 'notes') + class HeightSerializer(CoreModelSerializer): class Meta: model = models.Height fields = ('id', 'child', 'height', 'date', 'notes') + class HeadCircumferenceSerializer(CoreModelSerializer): class Meta: model = models.HeadCircumference fields = ('id', 'child', 'head_circumference', 'date', 'notes') + class BMISerializer(CoreModelSerializer): class Meta: model = models.BMI - fields = ('id', 'child', 'bmi', 'date', 'notes') \ No newline at end of file + fields = ('id', 'child', 'bmi', 'date', 'notes') diff --git a/api/views.py b/api/views.py index 9a9dfb57..3f2329d5 100644 --- a/api/views.py +++ b/api/views.py @@ -61,16 +61,19 @@ class WeightViewSet(viewsets.ModelViewSet): serializer_class = serializers.WeightSerializer filterset_fields = ('child', 'date') + class HeightViewSet(viewsets.ModelViewSet): queryset = models.Height.objects.all() serializer_class = serializers.HeightSerializer filterset_fields = ('child', 'date') + class HeadCircumferenceViewSet(viewsets.ModelViewSet): queryset = models.HeadCircumference.objects.all() serializer_class = serializers.HeadCircumferenceSerializer filterset_fields = ('child', 'date') + class BMIViewSet(viewsets.ModelViewSet): queryset = models.BMI.objects.all() serializer_class = serializers.BMISerializer diff --git a/babybuddy/management/commands/fake.py b/babybuddy/management/commands/fake.py index a68f9db2..fc168d30 100644 --- a/babybuddy/management/commands/fake.py +++ b/babybuddy/management/commands/fake.py @@ -74,6 +74,18 @@ class Command(BaseCommand): self._add_weight_entry() last_weight_entry_time = self.time + self.height = round(uniform(8.0, 12.0), 2) + self._add_height_entry() + last_height_entry_time = self.time + + self.head_circumference = round(uniform(8.0, 12.0), 2) + self._add_head_circumference_entry() + last_head_circumference_entry_time = self.time + + self.bmi = round(uniform(8.0, 12.0), 2) + self._add_bmi_entry() + last_bmi_entry_time = self.time + self._add_note_entry() while self.time < self.time_now: self._add_sleep_entry() @@ -91,6 +103,15 @@ class Command(BaseCommand): if (self.time - last_weight_entry_time).days > 6: self._add_weight_entry() last_weight_entry_time = self.time + if (self.time - last_height_entry_time).days > 6: + self._add_height_entry() + last_height_entry_time = self.time + if (self.time - last_head_circumference_entry_time).days > 6: + self._add_head_circumference_entry() + last_head_circumference_entry_time = self.time + if (self.time - last_bmi_entry_time).days > 6: + self._add_bmi_entry() + last_bmi_entry_time = self.time @transaction.atomic def _add_diaperchange_entry(self): @@ -268,7 +289,7 @@ class Command(BaseCommand): date=self.time.date(), notes=notes ).save() - + @transaction.atomic def _add_head_circumference_entry(self): """ @@ -300,7 +321,7 @@ class Command(BaseCommand): if choice([True, False, False, False]): notes = ' '.join(self.faker.sentences(randint(1, 5))) - models.bmi.objects.create( + models.BMI.objects.create( child=self.child, bmi=round(self.bmi, 2), date=self.time.date(), diff --git a/core/forms.py b/core/forms.py index 1f0e701f..a1be301a 100644 --- a/core/forms.py +++ b/core/forms.py @@ -242,6 +242,7 @@ class WeightForm(CoreModelForm): 'notes': forms.Textarea(attrs={'rows': 5}), } + class HeightForm(CoreModelForm): class Meta: model = models.Height @@ -254,6 +255,7 @@ class HeightForm(CoreModelForm): 'notes': forms.Textarea(attrs={'rows': 5}), } + class HeadCircumferenceForm(CoreModelForm): class Meta: model = models.HeadCircumference @@ -266,6 +268,7 @@ class HeadCircumferenceForm(CoreModelForm): 'notes': forms.Textarea(attrs={'rows': 5}), } + class BMIForm(CoreModelForm): class Meta: model = models.BMI @@ -276,4 +279,4 @@ class BMIForm(CoreModelForm): 'data-target': '#datetimepicker_date', }), 'notes': forms.Textarea(attrs={'rows': 5}), - } \ No newline at end of file + } diff --git a/core/models.py b/core/models.py index ec6f5c46..e0216877 100644 --- a/core/models.py +++ b/core/models.py @@ -592,6 +592,7 @@ class Weight(models.Model): def clean(self): validate_date(self.date, 'date') + class Height(models.Model): model_name = 'height' child = models.ForeignKey( @@ -626,6 +627,7 @@ class Height(models.Model): def clean(self): validate_date(self.date, 'date') + class HeadCircumference(models.Model): model_name = 'head_circumference' child = models.ForeignKey( @@ -660,6 +662,7 @@ class HeadCircumference(models.Model): def clean(self): validate_date(self.date, 'date') + class BMI(models.Model): model_name = 'bmi' child = models.ForeignKey( @@ -692,4 +695,4 @@ class BMI(models.Model): return str(_('BMI')) def clean(self): - validate_date(self.date, 'date') \ No newline at end of file + validate_date(self.date, 'date') diff --git a/core/urls.py b/core/urls.py index 0ade7908..e6244aca 100644 --- a/core/urls.py +++ b/core/urls.py @@ -172,8 +172,16 @@ urlpatterns = [ name='height-delete' ), - path('head-circumference/', views.HeadCircumferenceList.as_view(), name='head-circumference-list'), - path('head-circumference/add/', views.HeadCircumferenceAdd.as_view(), name='head-circumference-add'), + path( + 'head-circumference/', + views.HeadCircumferenceList.as_view(), + name='head-circumference-list' + ), + path( + 'head-circumference/add/', + views.HeadCircumferenceAdd.as_view(), + name='head-circumference-add' + ), path( 'head-circumference//', views.HeadCircumferenceUpdate.as_view(), diff --git a/core/views.py b/core/views.py index 373b09ec..5db65dbe 100644 --- a/core/views.py +++ b/core/views.py @@ -470,6 +470,7 @@ class WeightDelete(CoreDeleteView): permission_required = ('core.delete_weight',) success_url = reverse_lazy('core:weight-list') + class HeightList(PermissionRequiredMixin, BabyBuddyFilterView): model = models.Height template_name = 'core/height_list.html' @@ -497,6 +498,7 @@ class HeightDelete(CoreDeleteView): permission_required = ('core.delete_height',) success_url = reverse_lazy('core:height-list') + class HeadCircumferenceList(PermissionRequiredMixin, BabyBuddyFilterView): model = models.HeadCircumference template_name = 'core/head_circumference_list.html' @@ -527,6 +529,7 @@ class HeadCircumferenceDelete(CoreDeleteView): permission_required = ('core.delete_head_circumference',) success_url = reverse_lazy('core:head-circumference-list') + class BMIList(PermissionRequiredMixin, BabyBuddyFilterView): model = models.BMI template_name = 'core/bmi_list.html' @@ -552,4 +555,4 @@ class BMIUpdate(CoreUpdateView): class BMIDelete(CoreDeleteView): model = models.BMI permission_required = ('core.delete_bmi',) - success_url = reverse_lazy('core:bmi-list') \ No newline at end of file + success_url = reverse_lazy('core:bmi-list') diff --git a/dashboard/templatetags/cards.py b/dashboard/templatetags/cards.py index 5c2754b8..8036871d 100644 --- a/dashboard/templatetags/cards.py +++ b/dashboard/templatetags/cards.py @@ -312,7 +312,7 @@ def card_statistics(context, child): 'type': 'float', 'stat': weight['change_weekly'], 'title': _('Weight change per week')}) - + height = _height_statistics(child) if height: stats.append({ @@ -497,6 +497,7 @@ def _weight_statistics(child): return weight + def _height_statistics(child): """ Statistical height data. @@ -519,6 +520,7 @@ def _height_statistics(child): return height + def _head_circumference_statistics(child): """ Statistical head circumference data. @@ -527,7 +529,9 @@ def _head_circumference_statistics(child): """ head_circumference = {'change_weekly': 0.0} - instances = models.HeadCircumference.objects.filter(child=child).order_by('-date') + instances = models.HeadCircumference.objects.filter( + child=child + ).order_by('-date') if len(instances) == 0: return False @@ -535,12 +539,13 @@ def _head_circumference_statistics(child): oldest = instances.last() if newest != oldest: - head_circumference_change = newest.head_circumference - oldest.head_circumference + hc_change = newest.head_circumference - oldest.head_circumference weeks = (newest.date - oldest.date).days/7 - head_circumference['change_weekly'] = head_circumference_change/weeks + head_circumference['change_weekly'] = hc_change/weeks return head_circumference + def _bmi_statistics(child): """ Statistical BMI data. @@ -563,6 +568,7 @@ def _bmi_statistics(child): return bmi + @register.inclusion_tag('cards/timer_list.html', takes_context=True) def card_timer_list(context, child=None): """ diff --git a/reports/graphs/__init__.py b/reports/graphs/__init__.py index e188518d..5f69f491 100644 --- a/reports/graphs/__init__.py +++ b/reports/graphs/__init__.py @@ -7,6 +7,6 @@ from .sleep_pattern import sleep_pattern # NOQA from .sleep_totals import sleep_totals # NOQA from .tummytime_duration import tummytime_duration # NOQA from .weight_weight import weight_weight # NOQA -from .height_height import height_height #NOQA -from .head_circumference_head_circumference import head_circumference_head_circumference #NOQA -from .bmi_bmi import bmi_bmi #NOQA +from .height_height import height_height # NOQA +from .head_circumference_head_circumference import head_circumference_head_circumference # NOQA +from .bmi_bmi import bmi_bmi # NOQA diff --git a/reports/tests/tests_views.py b/reports/tests/tests_views.py index cf92501d..cf1b4d2c 100644 --- a/reports/tests/tests_views.py +++ b/reports/tests/tests_views.py @@ -56,7 +56,9 @@ class ViewsTestCase(TestCase): page = self.c.get('{}/height/height/'.format(base_url)) self.assertEqual(page.status_code, 200) - page = self.c.get('{}/head-circumference/head-circumference/'.format(base_url)) + page = self.c.get( + '{}/head-circumference/head-circumference/'.format(base_url) + ) self.assertEqual(page.status_code, 200) page = self.c.get('{}/bmi/bmi/'.format(base_url)) diff --git a/reports/views.py b/reports/views.py index e5561d1f..f4e8c258 100644 --- a/reports/views.py +++ b/reports/views.py @@ -196,6 +196,7 @@ class WeightWeightChildReport(PermissionRequiredMixin, DetailView): context['html'], context['js'] = graphs.weight_weight(objects) return context + class HeightHeightChildReport(PermissionRequiredMixin, DetailView): """ Graph of height change over time. @@ -213,7 +214,10 @@ class HeightHeightChildReport(PermissionRequiredMixin, DetailView): context['html'], context['js'] = graphs.height_height(objects) return context -class HeadCircumferenceHeadCircumferenceChildReport(PermissionRequiredMixin, DetailView): + +class HeadCircumferenceHeadCircumferenceChildReport( + PermissionRequiredMixin, DetailView +): """ Graph of head circumference change over time. """ @@ -222,14 +226,19 @@ class HeadCircumferenceHeadCircumferenceChildReport(PermissionRequiredMixin, Det template_name = 'reports/head_circumference_change.html' def get_context_data(self, **kwargs): - context = super(HeadCircumferenceHeadCircumferenceChildReport, self).get_context_data( - **kwargs) + context = super( + HeadCircumferenceHeadCircumferenceChildReport, + self + ).get_context_data(**kwargs) child = context['object'] objects = models.HeadCircumference.objects.filter(child=child) if objects: - context['html'], context['js'] = graphs.head_circumference_head_circumference(objects) + context['html'], context['js'] = ( + graphs.head_circumference_head_circumference(objects) + ) return context + class BMIBMIChildReport(PermissionRequiredMixin, DetailView): """ Graph of BMI change over time. @@ -245,4 +254,4 @@ class BMIBMIChildReport(PermissionRequiredMixin, DetailView): objects = models.BMI.objects.filter(child=child) if objects: context['html'], context['js'] = graphs.bmi_bmi(objects) - return context \ No newline at end of file + return context