mirror of https://github.com/snachodog/mybuddy.git
Add Timer model.
This will used for creating timers in the app and (eventually) applying them to entries during create operations.
This commit is contained in:
parent
79472dcdbe
commit
6b2de93736
|
@ -3,7 +3,8 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from core.models import Child, DiaperChange, Feeding, Note, Sleep, TummyTime
|
from core.models import (Child, DiaperChange, Feeding, Note, Sleep, Timer,
|
||||||
|
TummyTime)
|
||||||
|
|
||||||
|
|
||||||
class ChildSerializer(serializers.HyperlinkedModelSerializer):
|
class ChildSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
|
@ -37,6 +38,12 @@ class SleepSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
fields = ('baby', 'start', 'end', 'duration')
|
fields = ('baby', 'start', 'end', 'duration')
|
||||||
|
|
||||||
|
|
||||||
|
class TimerSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Timer
|
||||||
|
fields = ('name', 'start', 'end', 'duration', 'active')
|
||||||
|
|
||||||
|
|
||||||
class TummyTimeSerializer(serializers.HyperlinkedModelSerializer):
|
class TummyTimeSerializer(serializers.HyperlinkedModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = TummyTime
|
model = TummyTime
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.conf.urls import url, include
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
from .views import (ChildViewSet, DiaperChangeViewSet, FeedingViewSet,
|
from .views import (ChildViewSet, DiaperChangeViewSet, FeedingViewSet,
|
||||||
NoteViewSet, SleepViewSet, TummyTimeViewSet)
|
NoteViewSet, SleepViewSet, TimerViewSet, TummyTimeViewSet)
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register(r'children', ChildViewSet)
|
router.register(r'children', ChildViewSet)
|
||||||
|
@ -13,6 +13,7 @@ router.register(r'diaper-changes', DiaperChangeViewSet)
|
||||||
router.register(r'feedings', FeedingViewSet)
|
router.register(r'feedings', FeedingViewSet)
|
||||||
router.register(r'notes', NoteViewSet)
|
router.register(r'notes', NoteViewSet)
|
||||||
router.register(r'sleep', SleepViewSet)
|
router.register(r'sleep', SleepViewSet)
|
||||||
|
router.register(r'timers', TimerViewSet)
|
||||||
router.register(r'tummy-times', TummyTimeViewSet)
|
router.register(r'tummy-times', TummyTimeViewSet)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
15
api/views.py
15
api/views.py
|
@ -3,11 +3,13 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
|
|
||||||
from core.models import Child, DiaperChange, Feeding, Note, Sleep, TummyTime
|
from core.models import (Child, DiaperChange, Feeding, Note, Sleep, Timer,
|
||||||
|
TummyTime)
|
||||||
from core.utils import filter_by_params
|
from core.utils import filter_by_params
|
||||||
|
|
||||||
from .serializers import (ChildSerializer, DiaperChangeSerializer,
|
from .serializers import (ChildSerializer, DiaperChangeSerializer,
|
||||||
FeedingSerializer, NoteSerializer, SleepSerializer,
|
FeedingSerializer, NoteSerializer, SleepSerializer,
|
||||||
TummyTimeSerializer,)
|
TimerSerializer, TummyTimeSerializer,)
|
||||||
|
|
||||||
|
|
||||||
class ChildViewSet(viewsets.ModelViewSet):
|
class ChildViewSet(viewsets.ModelViewSet):
|
||||||
|
@ -55,6 +57,15 @@ class SleepViewSet(viewsets.ModelViewSet):
|
||||||
return filter_by_params(self.request, Sleep, params)
|
return filter_by_params(self.request, Sleep, params)
|
||||||
|
|
||||||
|
|
||||||
|
class TimerViewSet(viewsets.ModelViewSet):
|
||||||
|
queryset = Timer.objects.all()
|
||||||
|
serializer_class = TimerSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
params = ['name', 'active']
|
||||||
|
return filter_by_params(self.request, Timer, params)
|
||||||
|
|
||||||
|
|
||||||
class TummyTimeViewSet(viewsets.ModelViewSet):
|
class TummyTimeViewSet(viewsets.ModelViewSet):
|
||||||
queryset = TummyTime.objects.all()
|
queryset = TummyTime.objects.all()
|
||||||
serializer_class = TummyTimeSerializer
|
serializer_class = TummyTimeSerializer
|
||||||
|
|
|
@ -3,7 +3,8 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from .models import Child, DiaperChange, Feeding, Note, Sleep, TummyTime
|
from .models import (Child, DiaperChange, Feeding, Note, Sleep, Timer,
|
||||||
|
TummyTime)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Child)
|
@admin.register(Child)
|
||||||
|
@ -43,6 +44,13 @@ class SleepAdmin(admin.ModelAdmin):
|
||||||
search_fields = ('child__first_name', 'child__last_name',)
|
search_fields = ('child__first_name', 'child__last_name',)
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(Timer)
|
||||||
|
class TimerAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('name', 'start', 'end', 'duration', 'active',)
|
||||||
|
list_filter = ('active',)
|
||||||
|
search_fields = ('name',)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(TummyTime)
|
@admin.register(TummyTime)
|
||||||
class TummyTimeAdmin(admin.ModelAdmin):
|
class TummyTimeAdmin(admin.ModelAdmin):
|
||||||
list_display = ('start', 'end', 'duration', 'child', 'milestone',)
|
list_display = ('start', 'end', 'duration', 'child', 'milestone',)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
from .utils import duration_string
|
from .utils import duration_string
|
||||||
|
|
||||||
|
@ -41,7 +42,8 @@ class DiaperChange(models.Model):
|
||||||
ordering = ['-time']
|
ordering = ['-time']
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return 'Diaper change for {} on {}'.format(self.child, self.time.date())
|
return 'Diaper change for {} on {}'.format(
|
||||||
|
self.child, self.time.date())
|
||||||
|
|
||||||
|
|
||||||
class Feeding(models.Model):
|
class Feeding(models.Model):
|
||||||
|
@ -108,6 +110,29 @@ class Sleep(models.Model):
|
||||||
return duration_string(self.start, self.end)
|
return duration_string(self.start, self.end)
|
||||||
|
|
||||||
|
|
||||||
|
class Timer(models.Model):
|
||||||
|
name = models.CharField(max_length=255, blank=True)
|
||||||
|
start = models.DateTimeField(auto_now=True)
|
||||||
|
end = models.DateTimeField(blank=True, null=True, editable=False)
|
||||||
|
active = models.BooleanField(default=True, editable=False)
|
||||||
|
|
||||||
|
objects = models.Manager()
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
default_permissions = ('view', 'add', 'change', 'delete')
|
||||||
|
ordering = ['active', '-start']
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return 'Timer ({})'.format(self.name)
|
||||||
|
|
||||||
|
def duration(self):
|
||||||
|
return duration_string(self.start, self.end or timezone.now())
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.active = self.end is None
|
||||||
|
super(Timer, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class TummyTime(models.Model):
|
class TummyTime(models.Model):
|
||||||
child = models.ForeignKey('Child', related_name='tummy_time')
|
child = models.ForeignKey('Child', related_name='tummy_time')
|
||||||
start = models.DateTimeField(blank=False, null=False)
|
start = models.DateTimeField(blank=False, null=False)
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
</head>
|
</head>
|
||||||
<body style="padding-top: 5rem;">
|
<body style="padding-top: 5rem;">
|
||||||
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
||||||
<a class="navbar-brand" href="#"><span class="text-info">Baby</span> Blotter</a>
|
<a class="navbar-brand" href="/"><span class="text-info">Baby</span> Blotter</a>
|
||||||
<button class="navbar-toggler" type="button" data-toggle="collapse"
|
<button class="navbar-toggler" type="button" data-toggle="collapse"
|
||||||
data-target="#navbarsExampleDefault"
|
data-target="#navbarsExampleDefault"
|
||||||
aria-controls="navbarsExampleDefault" aria-expanded="false"
|
aria-controls="navbarsExampleDefault" aria-expanded="false"
|
||||||
|
|
Loading…
Reference in New Issue