mirror of https://github.com/snachodog/mybuddy.git
Add a basic Welcome page.
This commit is contained in:
parent
b7de3999b9
commit
00d3cf65f5
|
@ -0,0 +1,69 @@
|
||||||
|
{% extends 'babybuddy/page.html' %}
|
||||||
|
{% load widget_tweaks %}
|
||||||
|
|
||||||
|
{% block title %}Welcome!{% endblock %}
|
||||||
|
|
||||||
|
{% block breadcrumbs %}
|
||||||
|
<li class="breadcrumb-item active" aria-current="page">Welcome!</li>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="jumbotron">
|
||||||
|
<h1 class="display-3">Welcome to Baby Buddy!</h1>
|
||||||
|
<p class="lead">
|
||||||
|
Learn about and predict baby's needs without (<em>as much</em>)
|
||||||
|
guess work by using Baby Buddy to track —
|
||||||
|
</p>
|
||||||
|
<hr class="my-4">
|
||||||
|
<div class="card-deck">
|
||||||
|
<div class="card card-diaperchange">
|
||||||
|
<div class="card-header text-center">
|
||||||
|
<i class="icon icon-2x icon-diaperchange" aria-hidden="true"></i>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<h3 class="card-title text-center">Diaper Changes</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card card-feeding">
|
||||||
|
<div class="card-header text-center">
|
||||||
|
<i class="icon icon-2x icon-feeding" aria-hidden="true"></i>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<h3 class="card-title text-center">Feedings</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card card-sleep">
|
||||||
|
<div class="card-header text-center">
|
||||||
|
<i class="icon icon-2x icon-sleep" aria-hidden="true"></i>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<h3 class="card-title text-center">Sleep</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card card-tummytime">
|
||||||
|
<div class="card-header text-center">
|
||||||
|
<i class="icon icon-2x icon-tummytime" aria-hidden="true"></i>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<h3 class="card-title text-center">Tummy Time</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr class="my-4">
|
||||||
|
<p class="lead">
|
||||||
|
As the amount of entries grows, Baby Buddy will help
|
||||||
|
parents and caregivers to identify small patterns in baby's habits
|
||||||
|
using the dashboard and graphs. Baby Buddy is mobile-friendly and
|
||||||
|
uses a dark theme to help weary moms and dads with 2AM feedings and
|
||||||
|
changings. To get started, just click the button below to add your
|
||||||
|
first (or second, third, etc.) child!
|
||||||
|
</p>
|
||||||
|
<p class="text-center">
|
||||||
|
{% if perms.core.add_child %}
|
||||||
|
<a href="{% url 'child-add' %}" class="btn btn-lg btn-success">
|
||||||
|
<i class="icon icon-child" aria-hidden="true"></i> Add a Child
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,49 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.test import TestCase
|
||||||
|
from django.test import Client as HttpClient
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from django.core.management import call_command
|
||||||
|
|
||||||
|
from faker import Factory
|
||||||
|
|
||||||
|
from core.models import Child
|
||||||
|
|
||||||
|
|
||||||
|
class ViewsTestCase(TestCase):
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super(ViewsTestCase, cls).setUpClass()
|
||||||
|
fake = Factory.create()
|
||||||
|
call_command('migrate', verbosity=0)
|
||||||
|
|
||||||
|
cls.c = HttpClient()
|
||||||
|
|
||||||
|
fake_user = fake.simple_profile()
|
||||||
|
cls.credentials = {
|
||||||
|
'username': fake_user['username'],
|
||||||
|
'password': fake.password()
|
||||||
|
}
|
||||||
|
cls.user = User.objects.create_user(
|
||||||
|
is_superuser=True, **cls.credentials)
|
||||||
|
|
||||||
|
cls.c.login(**cls.credentials)
|
||||||
|
|
||||||
|
def test_root_router(self):
|
||||||
|
page = self.c.get('/')
|
||||||
|
self.assertEqual(page.url, '/welcome/')
|
||||||
|
|
||||||
|
call_command('fake', verbosity=0, children=1, days=1)
|
||||||
|
child = Child.objects.first()
|
||||||
|
page = self.c.get('/')
|
||||||
|
self.assertEqual(
|
||||||
|
page.url, '/children/{}/dashboard/'.format(child.slug))
|
||||||
|
|
||||||
|
Child.objects.create(
|
||||||
|
first_name='Second',
|
||||||
|
last_name='Child',
|
||||||
|
birth_date='2000-01-01'
|
||||||
|
)
|
||||||
|
page = self.c.get('/')
|
||||||
|
self.assertEqual(page.url, '/dashboard/')
|
|
@ -3,16 +3,21 @@ from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.conf.urls import url, include
|
from django.conf.urls import url, include
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.contrib.auth import views
|
from django.contrib.auth import views as auth_views
|
||||||
|
|
||||||
|
from . import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^admin/', admin.site.urls),
|
url(r'^admin/', admin.site.urls),
|
||||||
|
|
||||||
url(r'^login/$', views.LoginView.as_view(), name='login'),
|
url(r'^login/$', auth_views.LoginView.as_view(), name='login'),
|
||||||
url(r'^logout/$', views.LogoutView.as_view(), name='logout'),
|
url(r'^logout/$', auth_views.LogoutView.as_view(), name='logout'),
|
||||||
url('^password_reset/$', views.PasswordResetView.as_view(),
|
url('^password_reset/$', auth_views.PasswordResetView.as_view(),
|
||||||
name='password_reset',),
|
name='password_reset',),
|
||||||
|
|
||||||
|
url(r'^$', views.RootRouter.as_view(), name='root-router'),
|
||||||
|
url(r'^welcome/$', views.Welcome.as_view(), name='welcome'),
|
||||||
|
|
||||||
url(r'', include('api.urls', namespace='api')),
|
url(r'', include('api.urls', namespace='api')),
|
||||||
url(r'', include('core.urls')),
|
url(r'', include('core.urls')),
|
||||||
url(r'', include('dashboard.urls')),
|
url(r'', include('dashboard.urls')),
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
from django.urls import reverse
|
||||||
|
from django.views.generic.base import TemplateView, RedirectView
|
||||||
|
|
||||||
|
from core.models import Child
|
||||||
|
|
||||||
|
|
||||||
|
class RootRouter(LoginRequiredMixin, RedirectView):
|
||||||
|
def get_redirect_url(self, *args, **kwargs):
|
||||||
|
children = Child.objects.count()
|
||||||
|
if children == 0:
|
||||||
|
self.url = reverse('welcome')
|
||||||
|
elif children == 1:
|
||||||
|
self.url = reverse(
|
||||||
|
'dashboard-child', args={Child.objects.first().slug})
|
||||||
|
else:
|
||||||
|
self.url = reverse('dashboard')
|
||||||
|
return super(RootRouter, self).get_redirect_url(self, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class Welcome(LoginRequiredMixin, TemplateView):
|
||||||
|
template_name = 'babybuddy/welcome.html'
|
|
@ -31,12 +31,8 @@ class ViewsTestCase(TestCase):
|
||||||
cls.c.login(**cls.credentials)
|
cls.c.login(**cls.credentials)
|
||||||
|
|
||||||
def test_dashboard_views(self):
|
def test_dashboard_views(self):
|
||||||
"""Dashboard handles the root URL and redirects based on zero, one, or
|
|
||||||
more than one child is in the database."""
|
|
||||||
page = self.c.get('/')
|
|
||||||
self.assertEqual(page.url, '/dashboard/')
|
|
||||||
page = self.c.get('/dashboard/')
|
page = self.c.get('/dashboard/')
|
||||||
self.assertEqual(page.url, '/children/add/')
|
self.assertEqual(page.url, '/welcome/')
|
||||||
|
|
||||||
call_command('fake', verbosity=0, children=1, days=1)
|
call_command('fake', verbosity=0, children=1, days=1)
|
||||||
child = Child.objects.first()
|
child = Child.objects.first()
|
||||||
|
|
|
@ -6,7 +6,6 @@ from django.conf.urls import url
|
||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^$', views.DashboardRedirect.as_view(), name='dashboard-redirect'),
|
|
||||||
url(r'^dashboard/$', views.Dashboard.as_view(), name='dashboard'),
|
url(r'^dashboard/$', views.Dashboard.as_view(), name='dashboard'),
|
||||||
url(r'^children/(?P<slug>[^/.]+)/dashboard/$',
|
url(r'^children/(?P<slug>[^/.]+)/dashboard/$',
|
||||||
views.ChildDashboard.as_view(), name='dashboard-child'),
|
views.ChildDashboard.as_view(), name='dashboard-child'),
|
||||||
|
|
|
@ -5,16 +5,12 @@ from django.contrib.auth.mixins import (LoginRequiredMixin,
|
||||||
PermissionRequiredMixin)
|
PermissionRequiredMixin)
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.views.generic.base import TemplateView, RedirectView
|
from django.views.generic.base import TemplateView
|
||||||
from django.views.generic.detail import DetailView
|
from django.views.generic.detail import DetailView
|
||||||
|
|
||||||
from core.models import Child
|
from core.models import Child
|
||||||
|
|
||||||
|
|
||||||
class DashboardRedirect(LoginRequiredMixin, RedirectView):
|
|
||||||
url = '/dashboard/'
|
|
||||||
|
|
||||||
|
|
||||||
class Dashboard(LoginRequiredMixin, TemplateView):
|
class Dashboard(LoginRequiredMixin, TemplateView):
|
||||||
# TODO: Use .card-deck in this template once BS4 is finalized.
|
# TODO: Use .card-deck in this template once BS4 is finalized.
|
||||||
template_name = 'dashboard/dashboard.html'
|
template_name = 'dashboard/dashboard.html'
|
||||||
|
@ -23,8 +19,7 @@ class Dashboard(LoginRequiredMixin, TemplateView):
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
children = Child.objects.count()
|
children = Child.objects.count()
|
||||||
if children == 0:
|
if children == 0:
|
||||||
# TODO: Create some sort of welcome page.
|
return HttpResponseRedirect(reverse('welcome'))
|
||||||
return HttpResponseRedirect(reverse('child-add'))
|
|
||||||
elif children == 1:
|
elif children == 1:
|
||||||
return HttpResponseRedirect(
|
return HttpResponseRedirect(
|
||||||
reverse('dashboard-child', args={Child.objects.first().slug}))
|
reverse('dashboard-child', args={Child.objects.first().slug}))
|
||||||
|
|
Loading…
Reference in New Issue