A :baby: buddy to help caregivers track sleep, feedings, diaper changes, and tummy time to learn about and predict baby's needs without (as much) guess work.

Overview

Baby Buddy

License Gitter

A buddy for babies! Helps caregivers track sleep, feedings, diaper changes, tummy time and more to learn about and predict baby's needs without (as much) guess work.

Baby Buddy desktop view

Baby Buddy mobile views

Table of Contents

Demo

A demo of Baby Buddy is available on Heroku. The demo instance resets every hour. Login credentials are:

  • Username: admin
  • Password: admin

Deployment

The default user name and password for Baby Buddy is admin/admin. For any deployment, log in and change the default admin password immediately.

Many of Baby Buddy's configuration settings can be controlled using environment variables - see Configuration for detailed information.

AWS Elastic Beanstalk

A basic Elastic Beanstalk configuration is provided in .ebextensions/babybuddy.config. The steps below are a rough guide to deployment. See Working with Python for detailed information.

  1. Clone/download the Baby Buddy repo

     git clone https://github.com/babybuddy/babybuddy.git
    
  2. Enter the cloned/downloaded directory

     cd babybuddy
    
  3. Set (at least) the SECRET_KEY environment value in .ebextensions/babybuddy.config

    *See Configuration for other settings that can be controlled by environment variables.

  4. Create an IAM user in AWS with EB, EC2, RDS and S3 privileges.

  5. Initialize the Elastic Bean application (using the IAM user from the previous step)

     eb init -p python-3.6
    
  6. Create/deploy the environment! ๐Ÿš€

     eb create -db -db.engine postgres
    

The create command will also do an initial deployment. Run eb deploy to redeploy the app (e.g. if there are errors or settings are changed).

Docker

A Docker deployment requires Docker Engine v18.06.0+ and Docker Compose v1.22.0+ to create two containers: one for the database and one for the application.

The example docker-compose.example.yml file provided in this repository is intended for production deployments. Baby Buddy is deployed to Docker Hub as babybuddy/babybuddy so this is the only file needed for a Docker deployment with Docker Compose.

A secondary example file docker-compose.example.sqlite.yml is also available for a simpler SQLite-based deployment (the default example users PostgreSQL).

  1. Copy the raw content of either docker-compose.example.yml or docker-compose.example.sqlite.yml into a new file named docker-compose.yml

     wget -O docker-compose.yml https://raw.githubusercontent.com/babybuddy/babybuddy/master/docker-compose.example.yml
    

    or

     wget -O docker-compose.yml https://raw.githubusercontent.com/babybuddy/babybuddy/master/docker-compose.example.sqlite.yml
    
  2. Within docker-compose.yml, at the very least, set the ALLOWED_HOSTS and SECRET_KEY variables under services:app:environment.

    See Configuration for other settings that can be controlled by environment variables.

  3. Build/run the application

     docker-compose up -d
    

The app should now be locally available at http://127.0.0.1:8000. See Docker's "Get Started" documentation for detailed information about deployment methods with Docker.

Heroku

Deploy

For manual deployments to Heroku without using the deploy button, make sure to create the following settings before pushing:

heroku config:set DJANGO_SETTINGS_MODULE=babybuddy.settings.heroku
heroku config:set SECRET_KEY=<CHANGE TO SOMETHING RANDOM>
heroku config:set DISABLE_COLLECTSTATIC=1
heroku config:set TIME_ZONE=<DESIRED DEFAULT TIMEZONE>

See Configuration for other settings that can be controlled by heroku config:set.

And after an initial push, execute the following commands:

heroku run python manage.py migrate
heroku run python manage.py createcachetable

Manual

There are many ways to deploy Baby Buddy manually to any server/VPS. The basic requirements are Python, a web server, an application server, and a database.

Requirements

Example deployment

This example assumes a 512MB VPS instance with Ubuntu 18.04. It uses Python 3.6+, nginx, uwsgi and sqlite and should be sufficient for a few users (e.g. two parents and 1+ child).

  1. Install system packages

     sudo apt-get install python3 python3-pip nginx uwsgi uwsgi-plugin-python3 git libopenjp2-7-dev
    
  2. Default python3 to python for this session

     alias python=python3
    
  3. Install pipenv

     sudo -H pip3 install pipenv
    
  4. Set up directories and files

     sudo mkdir /var/www/babybuddy
     sudo chown $USER:$(id -gn $USER) /var/www/babybuddy
     mkdir -p /var/www/babybuddy/data/media
     git clone https://github.com/babybuddy/babybuddy.git /var/www/babybuddy/public
    
  5. Move in to the application folder

     cd /var/www/babybuddy/public
    
  6. Set pipenv to install locally.

     export PIPENV_VENV_IN_PROJECT=1
    
  7. Initiate and enter the Python environment

     pipenv install --three
     pipenv shell
    
  8. Create a production settings file and set the SECRET_KEY and ALLOWED_HOSTS values

     cp babybuddy/settings/production.example.py babybuddy/settings/production.py
     editor babybuddy/settings/production.py
    
  9. Initiate the application

     export DJANGO_SETTINGS_MODULE=babybuddy.settings.production
     python manage.py migrate
     python manage.py createcachetable
    
  10. Set appropriate permissions on the database and data folder

     sudo chown -R www-data:www-data /var/www/babybuddy/data
     sudo chmod 640 /var/www/babybuddy/data/db.sqlite3
     sudo chmod 750 /var/www/babybuddy/data
    
  11. Create and configure the uwsgi app

     sudo editor /etc/uwsgi/apps-available/babybuddy.ini
    

    Example config:

     [uwsgi]
     plugins = python3
     project = babybuddy
     base_dir = /var/www/babybuddy
    
     chdir = %(base_dir)/public
     virtualenv = %(chdir)/.venv
     module =  %(project).wsgi:application
     env = DJANGO_SETTINGS_MODULE=%(project).settings.production
     master = True
     vacuum = True
    

    See the uWSGI documentation for more advanced configuration details.

  12. Symlink config and restart uWSGI:

     sudo ln -s /etc/uwsgi/apps-available/babybuddy.ini /etc/uwsgi/apps-enabled/babybuddy.ini
     sudo service uwsgi restart
    
  13. Create and configure the nginx server

     sudo editor /etc/nginx/sites-available/babybuddy
    

    Example config:

     upstream babybuddy {
         server unix:///var/run/uwsgi/app/babybuddy/socket;
     }
    
     server {
         listen 80;
         server_name babybuddy.example.com;
    
         location / {
             uwsgi_pass babybuddy;
             include uwsgi_params;
         }
         
         location /media {
             alias /var/www/babybuddy/data/media;
         }
     }
    

    See the nginx documentation for more advanced configuration details.

  14. Symlink config and restart NGINX:

     sudo ln -s /etc/nginx/sites-available/babybuddy /etc/nginx/sites-enabled/babybuddy
     sudo service nginx restart
    
  15. That's it (hopefully)! ๐ŸŽ‰

Configuration

Environment variables can be used to define a number of configuration settings. Baby Buddy will check the application directory structure for an .env file or take these variables from the system environment. System environment variables take precedence over the contents of an .env file.

ALLOWED_HOSTS

Default: * (any)

This option may be set to a single host or comma-separated list of hosts (without spaces). This should always be set to a specific host or hosts in production deployments.

See also: Django's documentation on the ALLOWED_HOSTS setting

ALLOW_UPLOADS

Default: True

Whether or not to allow uploads (e.g. of Child photos). For some deployments (AWS, Heroku) this setting will default to False due to the lack of available persistent storage.

AWS_ACCESS_KEY_ID

Default: None

Required to access your AWS S3 bucket, should be uniquely generated per bucket for security.

See also: AWS_STORAGE_BUCKET_NAME

AWS_SECRET_ACCESS_KEY

Default: None

Required to access your AWS S3 bucket, should be uniquely generated per bucket for security.

See also: AWS_STORAGE_BUCKET_NAME

AWS_STORAGE_BUCKET_NAME

Default: None

If you would like to use AWS S3 for storage on ephemeral storage platforms like Heroku you will need to create a bucket and add it's name. See django-storages' Amazon S3 documentation.

DEBUG

Default: False

When in debug mode, Baby Buddy will print much more detailed error information for exceptions. This setting should be False in production deployments.

See also Django's documentation on the DEBUG setting.

NAP_START_MAX

Default: 18:00

The maximum start time (in the instance's time zone) before which a sleep entry is consider a nap. Expects the 24-hour format %H:%M.

NAP_START_MIN

Default: 06:00

The minimum start time (in the instance's time zone) after which a sleep entry is considered a nap. Expects the 24-hour format %H:%M.

'DB_ENGINE'

Default: django.db.backends.postgresql

The database engine utilized for the deployment.

See also Django's documentation on the ENGINE setting .

'DB_HOST'

Default: db

The name of the database host for the deployment.

'DB_NAME'

Default: postgres

The name of the database table utilized for the deployment.

'DB_PASSWORD'

No Default

The password for the database user for the deployment. In the default example, this is the root PostgreSQL password.

'DB_PORT'

Default: 5432

The listening port for the database. The default port is 5432 for PostgreSQL.

'DB_USER'

Default: postgres

The database username utilized for the deployment.

SECRET_KEY

Default: None

A random, unique string must be set as the "secret key" before Baby Buddy can be deployed and run.

See also Django's documentation on the SECRET_KEY setting.

TIME_ZONE

Default: Etc/UTC

The default time zone to use for the instance. See List of tz database time zones for all possible values. This value can be overridden per use from the user settings form.

USE_24_HOUR_TIME_FORMAT

Default: False

Whether to force 24-hour time format for locales that do not ordinarily use it (e.g. en). Support for this feature must implemented on a per-locale basis. See format files under babybuddy/formats for supported locales.

Note: This value for this setting is interpreted as a boolean from a string using Python's built-in strtobool tool. Only certain strings are supported (e.g. "True" for True and "False" for False), other unrecognized strings will cause a ValueError and prevent Baby Buddy from loading.

Languages

Baby Buddy includes translation support as of v1.2.2. Language can be set on a per-user basis from the user settings page (/user/settings/). See CONTRIBUTING.md for information about how to create/update translations.

Available languages

๐Ÿ‡บ๐Ÿ‡ธ English (U.S.) (base)

๐Ÿ‡ณ๐Ÿ‡ฑ Dutch

๐Ÿ‡ซ๐Ÿ‡ฎ Finnish

๐Ÿ‡ซ๐Ÿ‡ท French

๐Ÿ‡ฉ๐Ÿ‡ช German

๐Ÿ‡ฒ๐Ÿ‡ฝ ๐Ÿ‡ช๐Ÿ‡ธ Spanish

๐Ÿ‡ธ๐Ÿ‡ช Swedish

๐Ÿ‡น๐Ÿ‡ท Turkish

Import/Export

Baby Buddy uses the django-import-export application to provide import and export functionality.

Export

Export actions are accessible from Baby Buddy's "Database Admin" area (the Django admin interface). For example, to export all diaper change entries from Baby Buddy as an Excel file:

  1. Log in as a user with "staff" access.

  2. From the user menu, click "Database Admin" under the "Site" heading.

  3. Click "Diaper Changes" in the list of data types.

  4. Click the "Export" button above the filters list on the right side of the screen.

  5. Select the "xlxs" format and click "Submit"

Note: any applied filters will also filter the exported entries. Alternatively, on the Diaper Change list screen (step 3 above), it is possible to select one or many individual records and select "Export selected Diaper Changes" from the "Actions" list.

Import

Import actions are accessible from Baby Buddy's "Database Admin" area (the Django admin interface). From the list of entry types in the Database Admin, select the type to import and click the "Import" button on the list page. The import screen for a particular type will list the fields generally expected to be present for an import. Multiple file types -- including csv, xlsx, etc. -- are supported for the import.

The import pages do not provide detailed information about the required data and formats. When an import is attempted, all rows will be checked for errors and any issues will be reported on screen and will need to be resolved before the import can be performed.

See the example import files used for tests to get an idea of the expected data format.

API

Baby Buddy uses the Django REST Framework (DRF) to provide a REST API.

The only requirement for (most) requests is that the Authorization header is set as described in the Authentication section. The one exception is the /api endpoint, which lists all available endpoints.

Currently, the following endpoints are available for GET, OPTIONS, and POST requests:

  • /api/children/
  • /api/changes/ (Diaper Changes)
  • /api/feedings/
  • /api/notes/
  • /api/sleep/
  • /api/temperature/
  • /api/timers/
  • /api/tummy-times/
  • /api/weight/

Authentication

By default, the TokenAuthentication and SessionAuthentication classes are enabled. Session authentication covers local API requests made by the application itself. Token authentication allows external requests to be made.

โ— In a production environment, token authentication should only be used for API calls to an https endpoint. โ—

Each user is automatically assigned an API key that can be used for token authentication. This key can be found on the User Settings page for the logged in the user. To use a key for an API request, set the request Authorization header to Token <user-key>. E.g.

Authorization: Token 2h23807gd72h7hop382p98hd823dw3g665g56

If the Authorization header is not set or the key is not valid, the API will return 403 Forbidden with additional details in the response body.

Schema

API schema information in the OpenAPI format can be found in the openapi-schema.yml file in the project root. A live version is also available at the /api/scehma path of a running instance.

GET Method

Request

The limit and offset request parameters can be used to limit and offset the results set respectively. For example, the following request will return five diaper changes starting from the 10th diaper change entry:

curl -X GET 'https://[...]/api/changes/?limit=5&offset=10' -H 'Authorization: Token [...]'
{
    "count": <int>,
    "next": "https://[...]/api/changes/?limit=5&offset=15",
    "previous": "https://[...]/api/changes/?limit=5&offset=5",
    "results": [...]
}

Field-based filters for specific endpoints can be found the in the filters field of the OPTIONS response for specific endpoints.

Single entries can also be retrieved by adding the ID (or in the case of a Child entry, the slug) of a particular entry:

 curl -X GET https://[...]/api/children/gregory-hill/ -H 'Authorization: Token [...]'
 {
    "id":3,
    "first_name":"Gregory",
    "last_name":"Hill",
    "birth_date":"2020-02-11",
    "slug":"gregory-hill",
    "picture":null
}
curl -X GET https://[...]/api/sleep/1/ -H 'Authorization: Token [...]'
{
 "id":480,
 "child":3,
 "start":"2020-03-12T21:25:28.916016-07:00",
 "end":"2020-03-13T01:34:28.916016-07:00",
 "duration":"04:09:00",
 "nap":false
}

Response

Returns JSON data in the response body in the following format:

{
    "count":<int>,
    "next":<url>,
    "previous":<url>,
    "results":[{...}]
}
  • count: Total number of records (in the database, not just the response).
  • next: URL for the next set of results.
  • previous: URL for the previous set of results.
  • results: An array of the results of the request.

For single entries, returns JSON data in the response body keyed by model field names. This will vary between models.

OPTIONS Method

Request

All endpoints will respond to an OPTIONS request with detailed information about the endpoint's purpose, parameters, filters, etc.

Response

Returns JSON data in the response body describing the endpoint, available options for POST requests, and available filters for GET requests. The following example describes the /api/children endpoint:

{
    "name": "Child List",
    "renders": [
        "application/json",
        "text/html"
    ],
    "parses": [
        "application/json",
        "application/x-www-form-urlencoded",
        "multipart/form-data"
    ],
    "actions": {
        "POST": {
            "id": {
                "type": "integer",
                "required": false,
                "read_only": true,
                "label": "ID"
            },
            [...]
        }
    },
    "filters": [
        "first_name",
        "last_name",
        "slug"
    ]
}

POST Method

Request

To add new entries for a particular endpoint, send a POST request with the entry data in JSON format in the request body. The Content-Type header for POST request must be set to application/json.

Regular sanity checks will be performed on relevant data. See the OPTIONS response for a particular endpoint for details on required fields and data formats.

Timer Field

The "timer" field is a special field available for POST operations to model endpoints supporting duration (Feeding, Sleep, Tummy Time). When the "timer" field is set in the request, the start and end fields will be filled in automatically using the start and end values from the Timer (the Timer will be stopped if it is currently running).

Additionally, if the Timer has a Child relationship, the child field will be filled in automatically use the child value from the Timer.

If the "timer" field is set, it's values will always override the relevant fields in the request. E.g. if a POST request is sent with both the timer and end fields, the value for the end field will be ignored and replaced by the Timer's end value. The same applies for start and child. These fields can all be left out of the request when the Timer is provided, otherwise they are required fields.

Response

Returns JSON data in the response body describing the added/updated instance or error details if errors exist. Errors are keyed by either the field in error or the general string non_field_errors (usually when validation involves multiple fields).

PATCH Method

Request

To update existing entries, send a PATCH request to the single entry endpoint for the entry to be updated. The Content-Type header for PATCH request must be set to application/json. For example, to update a Diaper Change entry with ID 947 to indicate a "wet" diaper only:

curl -X PATCH \
    -H 'Authorization: Token [...]' \
    -H "Content-Type: application/json" \
    -d '{"wet":1, "solid":0}' \
    https://[...]/api/changes/947/

Regular sanity checks will be performed on relevant data. See the OPTIONS response for a particular endpoint for details on required fields and data formats.

Response

Returns JSON data in the response body describing the added/updated instance or error details if errors exist. Errors are keyed by either the field in error or the general string non_field_errors (usually when validation involves multiple fields).

DELETE Method

Request

To delete an existing entry, send a DELETE request to the single entry endpoint to be deleted. For example, to delete a Diaper Change entry with ID 947:

curl -X DELETE https://[...]/api/changes/947/ -H 'Authorization: Token [...]'

Response

Returns an empty response with HTTP status code 204 on success, or a JSON encoded error detail if an error occurred (e.g. {"detail":"Not found."} if the requested ID does not exist).

Contributing

Contributions are welcome! See CONTRIBUTING.md for detailed information about how to contribute to Baby Buddy.

Comments
  • ERROR: Enter a valid date/time

    ERROR: Enter a valid date/time

    Hi,

    I woke up this morning to BabyBuddy being down, checked github and noticed there was an issue with the latest release, so while the fix was being worked on I decided to move BabyBuddy from being a docker run command to a docker-compose file.

    docker-compose file:

    version: "2.1"
    services:
      app:
        image: lscr.io/linuxserver/babybuddy:amd64-latest
        environment:
          - TZ=Pacific/Auckland
        volumes:
          - config:/config
        ports:
          - 8000:8000
        restart: unless-stopped
        networks:
          default:
            ipv4_address: 10.10.11.211
        dns:
          - 10.10.11.1
          
    networks:
      default:
        external:
          name: public
          
    volumes:
      config:
    

    I have now pulled the latest image 1.9.1-ls16, and I am having an issue with date/time when adding entries. See example below.

    Screenshot_20211115_135754

    I have tried different TZ variables but it doesn't seem to change the outcome.

    When I go to a running timer, and say, add it as a sleep timer, the time and date values appear then disappear.

    I believe I was running version 1.8, I can roll back to a backup from last night to check.

    Anyone have any suggestions?

    bug i18n/L10n 
    opened by BadCo-NZ 37
  • Heroku approaching row limit

    Heroku approaching row limit

    A day or two after deploying to Heroku using the deploy button, I have begun getting alerts that the database DATABASE_URL is approaching its allocated storage capacity. The number of rows continues to grow even though no data has been entered. I am not familiar enough with Heroku to have been able to find a solution on my own.

    bug 
    opened by Dza-byte 26
  • CSRF Error (403) When Adding Entry (v1.10.0)

    CSRF Error (403) When Adding Entry (v1.10.0)

    I can log feedings using a POST (iOS Shortcut) but I canโ€™t create an entry on the actual BabyBuddy site.

    9EDB6A32-1A15-41EE-A72E-6113835FD03F

    EDIT: Since I know nothing about Django troubleshooting, I just tried pulling 1.9.3 instead and everything is working normally. So Watchtower must have updated my Docker image to the newest and I didnโ€™t realize it. Let me know if there is anymore information I can provide to help get the latest image working.

    bug 
    opened by five2seven 23
  • Feeding via API returns 400

    Feeding via API returns 400

    Hello,

    I'm attempting to add a feeding via the API (though Bitfocus Companion). I got everything working for a diaper change, so I know the basic connection is correct. I am unable to get the feeding to work though. Does anyone see my error?

    URL: https://url.tld/api/feedings/
    
    JSON: { "child":"1", "method": "$(internal:custom_feedMethod)", "type": "$(internal:custom_feedType)", "amount": "$(internal:custom_feedQty)" }
    
    Header: {"authorization": "Token abc123"}
    
    Returns:
    172.17.0.4 - - [16/Aug/2022:12:55:46 +0000] "POST /api/feedings/ HTTP/1.1" 400 71 "-" "-"
    

    Thanks

    opened by dillwishlist 22
  • Favicon is hard to see on dark backgrounds

    Favicon is hard to see on dark backgrounds

    Switched my browser to a night-mode dark blue theme and... where did babybuddy go? Oh yeah, it's dark-blue-on-slightly-darker-blue. I don't have the know-how to do this neatly, especially with the smaller pixel sizes, but I'd advise:

    • Easy, but would look very different: Make eyes, mouth and clock-hands white
    • Hard, but would retain general aesthetic: Add a thin white border around the entire silhouette
    enhancement ui/ux 
    opened by lutzky 17
  • Tagging

    Tagging

    Fixes #380

    This took quite a bit longer than anticipated. Sorry for that. I had some problems with integrating taggit into BabyBuddy (see code comment). ~This is a "preview" of the new feature, it is rather trivial to complete from here: Code cleanups, adding tags to other models, maybe add tags to a few other views.~ Update: This is PR is ready.

    New features/changes

    • Added the taggit library for support (thanks for the tip)
    • Added custom tag-model with 4 fields: name, slug, color, and "last_used"
      • name + slug are taggit defaults
      • the color field for assigning unique colors to tags
      • the last_used field is for ordering tags in a recently-used list in the dedicated widget (see below)
    • Added a dedicated widget for editing tags: grafik
      • Allows to quickly and conveniently add tags from a "recently used tags" list
    • Added a REST-endpoint to list and create notes under http://localhost:8000/api/tags/
      • Supported filters: name and last_used
      • Example:
    {
        "count": 5,
        "next": null,
        "previous": null,
        "results": [
            {
                "slug": "some-tag",
                "name": "Some TAG",
                "color": "#007F00",
                "last_used": "2022-02-20T11:43:19.710098Z"
            },
    [...]
    

    I recorded a demo-video of how this all looks and works:

    https://user-images.githubusercontent.com/542105/154842589-949f098e-4a22-413b-81c6-9acc445fab51.mp4

    Todo

    Before this is merged the following problems should be addressed, IMO:

    • [x] Linting does not pass
    • [x] JavaScript needs to be removed from the widget-html code
    • ~Tags should be added to most items of the database (not only "notes")~
      • I will do this in a separate PR - this one is big enough
    • [x] Tests for this new, fresh feature

    I made this a draft to allow you to verify that this is looking ok/as intended and generally going in the right direction :-)

    enhancement 
    opened by MrApplejuice 16
  • Host in a subfolder / different root path

    Host in a subfolder / different root path

    Hi, instead of hosting on the root of a domain (like https://example.com/), I wanted to host babybuddy in a different path like https://example.com/examplepath.

    I was able to almost fully achieve it by setting

    FORCE_SCRIPT_NAME = '/examplepath'
    STATIC_URL = 'examplepath/static/'
    WHITENOISE_STATIC_PREFIX = 'static/'
    LOGIN_REDIRECT_URL = '/examplepath/'
    LOGIN_URL = '/examplepath/login/'
    LOGOUT_REDIRECT_URL = '/examplepath/login/'
    

    at the end of production.py.

    There are only two minor glitches: All functionality and links work nicely, with the exception of the textual "Home" link and the link on the Babybuddy logo, which leads to https://example.com/ instead of https://example.com/examplepath/

    What would be the best way to add that last bit of functionality?

    • Add something like path('', ?, name='home'), at https://github.com/babybuddy/babybuddy/blob/master/core/urls.py#L9
    • Change href="/" at https://github.com/babybuddy/babybuddy/blob/master/babybuddy/templates/babybuddy/nav-dropdown.html#L6 and https://github.com/babybuddy/babybuddy/blob/master/babybuddy/templates/babybuddy/base.html#L36 ?

    I'm unfortunately not very literate in Python, otherwise I would have tried myself. But if you can give me some hints in the right direction, I'd put up a PR for it.

    enhancement documentation 
    opened by friesenkiwi 16
  • Mobile UI Tweaks

    Mobile UI Tweaks

    Looking to use babybuddy instead of our current tracking app, I noticed a few things that I think are low-hanging fruit for UI cleanup, pertaining mostly to phone usability. (I'm making it a checklist here in hopes of it being a newfangled task-list thing; ideally the owner would turn their favorite suggestions into issues of their own)

    • Improvements to timeline view
      • [x] #244
      • [x] #270
      • [x] #271
      • [x] #243
      • [x] #240
      • [x] #247
      • [x] #272
      • [x] #246
    • [x] #239
    • [x] #251
    • Less vertical scrolling please
      • [x] #213
      • [x] #230
      • [x] #231
    • No horizontal scrolling please
      • These are things that can be done to reduce horizontal scrolling in activity log pages.
      • [x] #235
      • [x] #236
      • [x] #232
      • [x] #237
      • [x] #233
    • Less clicking please
      • [x] ~~Unified event log~~ this is the timeline view
      • [x] #234
    enhancement help wanted ui/ux 
    opened by lutzky 15
  • ARM (i.e. Raspberry Pi) install problematic

    ARM (i.e. Raspberry Pi) install problematic

    #41 and #42 seem to indicate some issues with doing a manual install on ARM devices. I'm going to work through testing this on a Model B from Raspbian Stretch Lite to see if things can be smoothed out.

    opened by cdubz 15
  • Docker installation

    Docker installation

    Not an issue, but a feature request: Is there a possibility to add docker installation instructions? I'm just starting to learn, and currently I'd like to reroute multiple webapps through a nginx reverse proxy. The problem is nanobox seems to only like outputting on port 80. With a more simple setup, and a docker image, one could output on localhost:anyport and route that to a subdomain using nginx

    opened by dunhamspider 15
  • Select list options intermittently invisible when used as a PWA iOS 15+

    Select list options intermittently invisible when used as a PWA iOS 15+

    Alright, so I'm still trying to nail down what could cause this. We now have a kid and can now test this app thoroughly! We have Sandstorm added to homescreen, so this would be in iOS Safari, with BabyBuddy in a Sandstorm iframe.

    My wife reported she could not add a feeding or diaper change because the dropdowns would not populate and could not be changed from default/null selections. Thought it was weird and saw some artifacts like the dropdowns persisting after leaving the page. I closed the app and reopened it and things worked fine.

    I then returned to my own phone, which had worked fine, doing the same thing for a bit, until I once again closed the app.

    My best guess so far is that it happens if you had the app open already on Sandstorm and then return to it without closing it in between. It's very possible this could be caused by something like the Sandstorm grain being closed but the app front end not noticing.

    bug third party 
    opened by ocdtrekkie 14
  • Pumping entries should be taggable

    Pumping entries should be taggable

    It would be good if pumping entries had tags. We have more than one pump and my wife would like to associate which entry comes from which pump - tags seems like a reasonable solution to this (rather than her manually entering things). It seems like a fairly straightforward change to accomplish as well (based on a quick look at the code - if that's not the case would definitely be open to correction!)

    enhancement 
    opened by btoconnor 1
  • Can't add event in the future

    Can't add event in the future

    Trying to add a change event in the future returns a 500 internal server error.

    I know what you might say "if something hasn't happened yet, just wait until it's happened", but i think there's a use case: a parent/carer gets ready to go change the child, so the other one knows a change will be done in 3 min and just adds it to Baby Buddy there and then to not forget. Without the possibility of adding events in the future, you have to stay concentrated on the upcoming event and not forget to put it one once done.

    Opinions welcome on this, obviously.

    opened by axelsimon 1
  • WIP: Add context to Timer model #575

    WIP: Add context to Timer model #575

    Issue: #575

    This adds a context field on the TImer class that allows 3rd party apps to store some information about the intent of the timer when it's created.

    I also added code to pre-fill the Feeding form from the web UI if there was context stored on the Timer for a feeding, so that the drop downs will automatically select the values that were stored in the context. These drop downs are not locked, but just default values.

    With this PR, I also had it validate the context coming in to make sure it made sense. While I can be convinced to do no validation, I'm not such a big fan of just having arbitrary dumping grounds on the db with a JSON field. Having some validation about what's going into the context to prevent a free-for-all makes sense to me so that there are some guard rails for what people put into context. Ie, if you're saying this timer is for a feeding, the attributes stored on the feeding should be valid feeding values.

    NOTE: This is a "work in progress" PR because I'm having trouble running the test suite on my development environment (even on a clean master). I am running into the issues outlined in issue #483 - the temporary workaround there solved some of my issues, but not all. Running the tests I added manually pass, and the failures seem unrelated (to my eye, anyway) to my patch. However, I can't be 100% certain of that and I'd love some pointers on getting around these issues. Example of some of the issues I'm running into:

    I see a lot of these in the start of each test run:

    WARNING:root:Permission not found with name Can delete Head Circumference.
    WARNING:root:Permission not found with name Can view Head Circumference.
    WARNING:root:Permission not found with name Can add Height.
    WARNING:root:Permission not found with name Can change Height.
    WARNING:root:Permission not found with name Can delete Height.
    WARNING:root:Permission not found with name Can view Height.
    WARNING:root:Permission not found with name Can add Note.
    WARNING:root:Permission not found with name Can change Note.
    WARNING:root:Permission not found with name Can delete Note.
    WARNING:root:Permission not found with name Can view Note.
    WARNING:root:Permission not found with name Can add Pumping.
    WARNING:root:Permission not found with name Can change Pumping.
    WARNING:root:Permission not found with name Can delete Pumping.
    WARNING:root:Permission not found with name Can view Pumping.
    

    which might be related to the following:

    ======================================================================
    FAIL: test_welcome (babybuddy.tests.tests_views.ViewsTestCase)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/brian/Programming/babybuddy/babybuddy/tests/tests_views.py", line 82, in test_welcome
        self.assertEqual(page.status_code, 200)
    AssertionError: 302 != 200
    

    and others around:

    ======================================================================
    FAIL: test_validate_unique_period (core.tests.tests_forms.ValidationsTestCase)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/usr/lib/python3.8/unittest/case.py", line 60, in testPartExecutor
        yield
      File "/usr/lib/python3.8/unittest/case.py", line 676, in run
        self._callTestMethod(testMethod)
      File "/usr/lib/python3.8/unittest/case.py", line 633, in _callTestMethod
        method()
      File "/home/brian/Programming/babybuddy/core/tests/tests_forms.py", line 885, in test_validate_unique_period
        self.assertFormError(
      File "/home/brian/.local/share/virtualenvs/babybuddy-OAJSsbzD/lib/python3.8/site-packages/django/test/testcases.py", line 279, in patched_method
        return old_method(self, *args, **kwargs)
      File "/home/brian/.local/share/virtualenvs/babybuddy-OAJSsbzD/lib/python3.8/site-packages/django/test/testcases.py", line 199, in assertFormError
        self.assertFormError(context[form], field, errors, msg_prefix=msg_prefix)
      File "/home/brian/.local/share/virtualenvs/babybuddy-OAJSsbzD/lib/python3.8/site-packages/django/test/testcases.py", line 263, in patched_method
        return new_method(self, *args, **kwargs)
      File "/home/brian/.local/share/virtualenvs/babybuddy-OAJSsbzD/lib/python3.8/site-packages/django/test/testcases.py", line 736, in assertFormError
        self._assert_form_error(form, field, errors, msg_prefix, f"form {form!r}")
      File "/home/brian/.local/share/virtualenvs/babybuddy-OAJSsbzD/lib/python3.8/site-packages/django/test/testcases.py", line 709, in _assert_form_error
        self.assertEqual(field_errors, errors, msg_prefix + failure_message)
      File "/usr/lib/python3.8/unittest/case.py", line 912, in assertEqual
        assertion_func(first, second, msg=msg)
      File "/usr/lib/python3.8/unittest/case.py", line 905, in _baseAssertEqual
        raise self.failureException(msg)
    AssertionError: [] != ['Another entry intersects the specified time period.'] : The non-field errors of form <TummyTimeForm bound=True, valid=False, fields=(child;start;end;milestone;tags)> don't match.
    

    Any pointers to resolve this would be greatly appreciated!

    enhancement 
    opened by btoconnor 3
  • Store context on timer

    Store context on timer

    As briefly discussed in https://github.com/babybuddy/babybuddy-alexa-skill/issues/11 - it would be good to store (optional) context on a timer when it's created. In the specific instance outlined above, something like:

    Alexa, ask Baby Buddy to start a bottle feeding

    should be able to store, on the timer, that this is a timer for a bottle feeding, and not a generic timer. The Alexa skill is currently just storing the intent on the timer name, in a pretty basic way (feeding timers have "feeding" as the name, "tummy time" for a tummy time timer, and "sleeping" for a sleep timer.

    Storing explicit, structured data on the timer would help open up the door for more natural actions from timers. As discussed in the ticket, this will probably only be used by 3rd party apps, at least to start.

    Open Questions

    The implementation of the context, as discussed in the original issue on the Alexa skill - is fairly straightforward. Use a JSONField on the Timer model and store the context there. I already have the code (mostly) ready to go for this.

    What I'd like to get some clarification on is how strictly we want to enforce the context. Let's say for instance I use the Alexa skill to start a formula bottle feeding:

    Alexa, tell Baby Buddy to start a formula feeding

    This would create the following context on the Timer:

    {
        "timer_type": "feeding",
        "method": "bottle",
        "type": "formula"
    }
    

    If I were then to load this timer on the web UI - should I be able to change these attributes that were provided at the start? So, for example, when we load the /timers/:id route - should I be able to create a sleep entry from this timer? Or should we lock this to a "Feeding"?

    Similarly, if I select "Feeding", should we be able to change this to "breast milk" or something else - or should those be locked in at what was provided at the start?

    What I guess I'm really getting at is - should we explicitly validate the resulting entry is created with the original context, or should we treat the context simply as pre-filled, default values on the form for applications that choose to read the context?

    FWIW, I think this issue is largely relevant for when people use Baby Buddy in mixed apps - I don't expect the Alexa Skill to need to reconcile context that it created - if we do

    Alexa, tell Baby Buddy to start a formula feeding

    then I don't think the Alexa skill would need to re-validate the context on the timer that it created when finishing the feeding through the Alexa app. It would then just be able to create the feeding entry directly from the context already stored on the timer.

    enhancement 
    opened by btoconnor 1
  • Instant App ignores SUB_PATH

    Instant App ignores SUB_PATH

    When installing Babybuddy with a SUB_PATH configured, the instant app ignores this setting.

    https://github.com/babybuddy/babybuddy/blob/94f81e3754794d3a934026b282c3c26ce21ce60b/static/babybuddy/root/site.c6c4158e40df.webmanifest#L17 Here is "/" as context hard coded.

    When SUB_PATH is set, set the start_url parameter accordingly.

    bug help wanted 
    opened by fs1 1
  • Pumping should have a start time and be creatable from a timer

    Pumping should have a start time and be creatable from a timer

    Just setting this up and looks like it meets pretty much all our needs (for the last child we used an Android app which was good but didn't sync between us), this is one thing suggested by my wife. Let's see if I can find time to look into it myself, but thought I may as well open an issue.

    enhancement good first issue 
    opened by hsharrison 1
Releases(v1.13.2)
  • v1.13.2(Oct 15, 2022)

  • v1.13.1(Oct 13, 2022)

  • v1.13.0(Oct 12, 2022)

    Full Changelog

    Implemented enhancements:

    • Dutch Translations updated on POEditor #535
    • Delete Inactive Timers shouldn't appear if there are no timer entries #533
    • Create a user add management command #528
    • French translations updated on POEditor #521
    • Allow REMOTE_USER authentication #517
    • "Recently used" shouldn't appear if no tags were recently used #470
    • Minutes instead of minutos in Spanish #468
    • Delete (instead of deactivate) completed timers #109
    • #468 Minutes instead of minutos in Spanish #538 (jmunoz94)
    • 533 - Delete Inactive Timers shouldn't appear if there are no timer entries #537 (earthcomfy)
    • 470 - "Recently used" shouldn't appear if no tags were recently used #536 (earthcomfy)
    • 528 - Create a user add management command #534 (earthcomfy)
    • Add forward auth by way of remote user #531 (EnsuingRequiem)
    • Install GNU gettext at gitpod startup #519 (amorphobia)
    • Update Chinese translations #518 (amorphobia)

    Fixed bugs:

    Closed issues:

    • Feeding via API returns 400 #522

    Merged pull requests:

    Source code(tar.gz)
    Source code(zip)
  • v1.12.2(Aug 4, 2022)

  • v1.12.1(Aug 4, 2022)

    Full Changelog

    Implemented enhancements:

    • Add a way to set the SMTP configuration #499
    • ๐Ÿšธ adds a child quick switch in breadcrumb #511 (jljouannic)
    • Add a way to set the SMTP configuration #506 (cdubz)

    Fixed bugs:

    • Bug - DateTime fields don't load the current values when the language is Portuguese #498
    • Set default date during picker initialization #505 (cdubz)

    Closed issues:

    • One user does not see the "Pumping entry" menu, the other one does #493
    • Move demo and PR deploys to new service #462
    Source code(tar.gz)
    Source code(zip)
  • v1.12.0(Jul 28, 2022)

  • v1.11.2(Jun 28, 2022)

  • v1.11.1(Jun 13, 2022)

    Full Changelog

    Implemented enhancements:

    Fixed bugs:

    • "No notes found" background doesn't extend to the Tags column #469
    • Can't filter notes by capitalized tags #467
    • Fix list view classes and colspans and re-sort menu items #481 (cdubz)
    • Fix filtering not working for capitalized tags #480 (Alberdi)

    Closed issues:

    • Handle plurals with count tag of blocktrans #472
    • Missing "timer" field documentation in openapi schema #439
    • Feature request: Support for tea and water as feeding type #432
    • Remove TIME_ZONE environment variable configuration #301

    Merged pull requests:

    Source code(tar.gz)
    Source code(zip)
  • v1.11.0(May 28, 2022)

    Full Changelog

    Implemented enhancements:

    • Diaper change frequency statistics #425
    • Tagging refinements #415
    • Track crying and bedtime #412
    • Feature suggestion: Add user editable tags to "notes"-sections #380
    • Feature Request: track milk pumping #159
    • Allow end of feeding to be in the future #443 (myxor)
    • change api date filter to datetime filter #442 (jcgoette)
    • Defaults some models to now #438 (jcgoette)
    • Add Catalan language support #436 (cdubz)
    • Further improve german translations #433 (myxor)
    • Allow diaper change without any contents #431 (myxor)
    • Add import/export support to new models + tag filtering in Database Admin #430 (cdubz)
    • Add tag filtering support to API #429 (cdubz)
    • Add diaper change stats for 3 days and 2 weeks #427 (myxor)
    • Update german translations #422 (myxor)
    • Show tags in lists #416 (MrApplejuice)
    • Add tags support to most things #414 (MrApplejuice)
    • Add breastpump measurement #409 (bugbountyguy)
    • Tagging #396 (MrApplejuice)

    Fixed bugs:

    • Photos of children not found after upgrade to v1.10.0 #400
    • Fix KeyError at /children/x/reports/sleep/pattern/ #445 (myxor)
    • Fix link to translation documentation #420 (myxor)

    Closed issues:

    • Feature Request : Ability to add custom activities. #455
    • API endpoint list missing port? #446
    • Sleep Pattern giving 500 Internal Server Error #440
    • catalan translation #434
    • Diaper change without wet/solid #426
    • "Failed to install add-on" in Home Assistant due to "non-zero code" #423
    • Update import/export support for new models #421
    • Sleep Patterns showing a 500 error - Exception Type: KeyError #417
    • 500 error when trying to login / 'attempt to write a readonly database' in the logs #411

    Merged pull requests:

    Source code(tar.gz)
    Source code(zip)
  • v1.10.2(Mar 4, 2022)

    Full Changelog

    Implemented enhancements:

    • Document Docker + NGINX HTTPS config #407
    • Create custom CSRF_FAILURE_VIEW with details about how to resolve the issue #402
    • Host in a subfolder / different root path #186
    • All the words have been translated into Chinese. #405 (gesisirus)
    • Update Spanish translations #404 (Alberdi)
    • Improve 403 Bad Origin and other error templates #403 (cdubz)

    Fixed bugs:

    • v1.9.0 update to manual timer edit makes mobile UX worse #385
    • Graph selection has unreachable areas on mobile #379
    • "Time since" using Django time zone and not user time zone #178

    Closed issues:

    • HTTPS doesn't seem to be working...? #406
    • Add documentation about proxy setup #394
    • Remove/Change Drop-down Options #389
    Source code(tar.gz)
    Source code(zip)
  • v1.10.1(Feb 22, 2022)

    | :exclamation: Configuration change :exclamation: | |:---------------------------| | This version adds support for a new environment configuration variable CSRF_TRUSTED_ORIGINS to address broken forms issues with v1.10.0 for deployments behind a proxy. See also SECURE_PROXY_SSL_HEADER and #393 for more information. |

    Full Changelog

    Implemented enhancements:

    • Add Chinese (simplified) translations #399 (cdubz)
    • Use "secret" generator for DISABLE_COLLECTSTATIC in Heroku #398 (cdubz)

    Fixed bugs:

    • CSRF Error (403) When Adding Entry (v1.10.0) #393

    Closed issues:

    • Heroku Server Error (500) #395

    Merged pull requests:

    Source code(tar.gz)
    Source code(zip)
  • v1.10.0(Feb 16, 2022)

    | :exclamation: Configuration change :exclamation: | |:---------------------------| | If you are using Baby Buddy behind a proxy this version may cause a CSRF error 403 when attempting to add new entries. Set the SECURE_PROXY_SSL_HEADER environment variable to True (or any non-falsy value) in your deployment to resolve this. This is correct behavior as of Django v4.0 (used by Baby Buddy v1.10.0+). See #393 for more information. |

    Full Changelog

    Implemented enhancements:

    • Hardcoded English strings on timeline #352
    • Feature Request: Track baby height #191
    • breakout feeding types #384 (alzyee)
    • Rearrange dashboard cards to set timer card first #382 (adamaze)
    • Update to Django 4.x #378 (cdubz)
    • Updated Italian translation #376 (nos86)
    • Fix ordering of start/stop items when start and stop times are the same #372 (MrApplejuice)
    • Fix German translation mistake #368 (MrApplejuice)
    • Add timer restart and stop triggers to REST-API #367 (MrApplejuice)
    • Optional last name #361 (Alberdi)
    • Add Height, Head Circumference, and BMI #360 (Daegalus)
    • Improve iOS webapp/clip/pwa experience #359 (cdubz)
    • Convert envir variables that are supposed to be boolean to boolean #356 (MagiX13)

    Fixed bugs:

    • iOS 15 web app experience is degraded #357
    • Boolean environmental variables #354
    • Sleep graph has incorrect positioning when there is a gap in days. #286
    • Sleep graph issues #283
    • KeyError at /children/XXX/reports/sleep/pattern/ #211
    • fix(sleep-reports): #286 Init all days in the period to remove gaps #341 (codisart)

    Closed issues:

    • Show type breakdown on feeding_amounts report #383
    • Error during add/edit action for fed and diaper #374
    • Evaluate replacements for Easy Thumbnails #373
    • Issue with timer API for Feeding, Sleep, and Tummy-Time #363

    Merged pull requests:

    Source code(tar.gz)
    Source code(zip)
  • v1.9.3(Dec 14, 2021)

  • v1.9.2(Dec 4, 2021)

    Full Changelog

    Implemented enhancements:

    • Wrong language after logging in #346
    • Notes on child timeline #343
    • Add notes to child timeline #344 (Alberdi)
    • Complete Spanish translations plus some fixes #338 (Alberdi)

    Fixed bugs:

    • New filters on date for changes #342
    • "Deploy to Heroku" button broken now README is separated. #340

    Closed issues:

    • column core_sleep.napping does not exist #348
    • Sleep pattern returns server error (500) #347
    • Connection to Home Assistant #345
    • Do not attempt to deploy demo on PRs in CI #339
    • Crashes on startup: ImportError: cannot import name 'etree' from 'lxml' #336
    Source code(tar.gz)
    Source code(zip)
  • v1.9.1(Nov 13, 2021)

    Full Changelog

    Implemented enhancements:

    Fixed bugs:

    • Custom en date formats interfere with en-GB language #324
    • gulp migrate failing in Gitpod #320
    • Selection not working on Firefox Android #258
    • Update format customizations handling #332 (cdubz)

    Closed issues:

    • OPTIONS API returns results instead of parameters #329
    • Enhancement: premature birth #313
    • SSL/TLS setup instructions #166

    Merged pull requests:

    • Reorganize documentation #331 (cdubz)
    • refacto(sleep-reports): #283 Replace times and labels lists by a single days list #327 (codisart)
    • refacto(sleep-reports): #283 Rename some variables and add constants for magic strings #326 (codisart)
    • Fix typo in README #322 (kejadlen)
    Source code(tar.gz)
    Source code(zip)
  • v1.9.0(Sep 25, 2021)

    Full Changelog

    Implemented enhancements:

    • Favicon is hard to see on dark backgrounds #297
    • Sleep graph y-axis should go "down" from midnight at the top. #289
    • Allow manual editting of datetime values #284
    • Add prominent link to timeline view from dashboard #271
    • Mobile UI Tweaks #229
    • Adding Portuguese Translation #308 (signorecello)
    • Date picker changes #304 (ntrecina)
    • reversing y-axis of sleep plot (top to down) #295 (fodi666)

    Fixed bugs:

    • Buttons icon glyphs missing in time selector #302
    • If there is only one sleep entry and it starts one day and ends the next day the sleep graph excepts. #290
    • Sleep graph uses 12h format when 24h is enabled. #287

    Closed issues:

    • All users lost #305
    • iOS Shortcuts #299
    • Button group flex spacing is weird on smaller screens #298
    • Add a gulp commend for font updates #296
    • Last Feed Time vs Last Time First Fed #162

    Merged pull requests:

    Source code(tar.gz)
    Source code(zip)
  • v1.8.3(Aug 28, 2021)

    Full Changelog

    Implemented enhancements:

    • Timeline view: Activities should include their notes (or at least mark activities that have notes) #272
    • Improve cross-midnight timeline view #270
    • Timeline: For feedings, show time-since-feeding-before #266
    • Start / finish times are treated as inclusive-at-both-ends ranges rather than standard half-open ranges #263
    • add SECURE_PROXY_SSL_HEADER env arg option #285 (jcgoette)

    Fixed bugs:

    • KeyError when generating graph for sleep pattern #293
    • Graph x-axis date labels should not show times, only dates. #288
    • Sleep graph uses 12h format when 24h is enabled. #287
    • Mobile submit button prevents date selection in some circumstances #265

    Merged pull requests:

    Source code(tar.gz)
    Source code(zip)
  • v1.8.2(Aug 6, 2021)

  • v1.8.1(Aug 6, 2021)

  • v1.8.0(Aug 5, 2021)

    Full Changelog

    Implemented enhancements:

    • Move Time column to be first in list view #232
    • Don't hide Submit button below optional fields #231
    • Dashboard: Move "Last Diaper Change" to near-top #230
    • Use shorter timestamp formats in list view #237
    • Move Color and Amount columns to far right in list view #236
    • Unify "wet" and "solid" columns to a quad-state in list view #235
    • Links from dashboard #234
    • Hide Child column if only one child is shown #233
    • Feature/UI Request: Only require a single time for feedings #192
    • Dashboard: Auto-refresh even if focus is supported #255 (lutzky)
    • Make form submit full width fixed #254 (cdubz)
    • Brighten blue and cyan colors #251 (lutzky)

    Fixed bugs:

    • Heroku approaching row limit #219

    Closed issues:

    • Force periodic refresh for always-on-devices #253
    • Upgrade from 1.41 #252

    Merged pull requests:

    • Ignore files in static for repository language #269 (lutzky)
    • Add links from dashboard #268 (lutzky)
    • Move Actions column to the far left #267 (lutzky)
    • Unify "wet" and "solid" columns #264 (lutzky)
    • Hide child column if only one child is shown #262 (lutzky)
    • Consider last-feeding-method as empty if never-changing #261 (lutzky)
    • Use short datetime string for lists #260 (cdubz)
    • Provide example config for secure cookies #259 (cdubz)
    • Move Time column to be first in list view #250 (lutzky)
    • Dashboard: Move all "last" cards to top #248 (lutzky)
    • Show duration in timeline #247 (lutzky)
    Source code(tar.gz)
    Source code(zip)
  • v1.7.0(Jul 8, 2021)

    :warning: :rotating_light: Docker users: This will be the final release published to babybuddy/babybuddy on Docker Hub. Please use the LSIO image linuxserver/docker-babybuddy instead. :rotating_light: :warning:

    Full Changelog

    Implemented enhancements:

    • Potential security issue #226
    • Feature/UI Request: Only require a single time for feedings #192

    Fixed bugs:

    • pipenv install fails because of psycopg2 #238
    • Disable autocomplete for date and time fields #224

    Closed issues:

    • WORKER TIMEOUT on Docker 20.x #227
    • iOS Shortcut: "Authentication credentials were not provided" #222
    • Heroku approaching row limit #219
    • Move from Travis CI to GitHub Actions or something else #214
    • Child slug may become empty #205
    • Unable to run on docker ARM64 #199

    Merged pull requests:

    Source code(tar.gz)
    Source code(zip)
  • v1.6.0(May 14, 2021)

    New Features

    • 1dca1cc0501707537f200878c8b7d4342ee11c0c: Add option to hide empty dashboard cards (thanks, @BenjaminHae and @jcgoette!).
    • 6fb958d6b3cf3a174faaa92ca4f1935155da12b5: Add Italian translations.

    Improvements

    • e27f7b76a067da2ae6fce05a2e173ad8bac405fa: Use new Django timesince feature for Child age (removing ugly monkey patching).
    • f4b9053c00d99c78c97c8726492284e96d3dcf8b: Add solid food option to feeding types (thanks, @0x4161726f6e!).
    • 29ef9f4f75946c4f82b542abd34b53815fd582e6: Add support for unicode characters in child slugs (thanks, @cben!).

    Bug fixes

    • e6838a0c0f64ee7e6a7d9a4b9eb05c07a2b5d59c: Correct sleep graph handling for entries that cross DST
    • 14b11db91bd7ca271ee28569dade808a57f1aafa, f5c1248fbd3757e1f993d6f3302f5245146f2c55, fe568876c7822e85371e4be5ab1dfc16afbda452: Fix German translation string formatting (thanks, @BenjaminHae)
    • f58571bf17b44a7572f2acd39baf885ca93c3447: Prevent blank child slugs (thanks, @cben!).
    • c0d20e3a940adb8488a6e0f58914fe9d4c74b0b6 ... 250e07e739ecbe224ade86b5aeb6bd51cb6a88c4: Fix broken tests
    Source code(tar.gz)
    Source code(zip)
  • v1.5.1(Feb 25, 2021)

    Improvements

    • 172167e6a1114c4ef4860bde5787aef77f0a725c ... 2c7ef55760a20bed79696b4dfa77fb2527ef067d: Added notes data to APIs (thanks, @jcgoette!).
    • 311c6d2e0583f28c9166c961b5c3ad88f9ea408e: Added Dutch translations.
    • a64b601f339ed8ca48793d5691a3060145aecbe0: Clarified manual install instructions.

    Bug fixes

    • 705f9d1ce143d2c20df141bba04922461ca504e3: Added locales to Dockerfile (thanks, @cephos!).
    • f5d523ba80ecb28c04f8feedbb11fb7f6116d46c: Made boolean labels clickable again (thanks, @ntrecina!).
    Source code(tar.gz)
    Source code(zip)
  • v1.5.0(Jan 6, 2021)

    New features

    • dfdadea5bab2dd001c2c2845569b4c15e31ea000 ... 634b1dafd117c16da1459dc46179df7c1cac077a: Add Finnish language support (thanks, @haiksu).
    • 3f0694dc9d9581895ad63d17e92b0b433de1e303: Make datetime editable for notes.
    • 187d2226e09aa53003f1f8ab3f00305e6e5cf625: Added double-submit protection for buttons (thanks, @ABOTlegacy).
    • 4733ec0b8335bed7d10e59e2d87accda9f8406a1: Expanded support for database settings (thanks, @Zutart).
    • 1b3f87ad8c3770f2b0b62ad197574c65c03e7afc: Added support for Portainer configurations (thanks, @phidauex).

    Improvements

    • 8a9dd9c04df8b145cc9814759249a43e1e2f9f88 ... 0fd8f1a3a79e4fb8ddbcf0616a573415f936dbe6: Run tests in parallel.
    • a4597cc5a61cf86d180968f70a10dd851e521729 ... 234a7a134e130026eb4e79e32d93c3d9d2944f36: Improved German translations (thanks, @dettmering).
    • 86434fdbd468bdc4af96839bf4d8c1c75f04169b ... 9d261efc366538caca1fa7ee891f64810586ca63: Update contributed translations from POEditor.
    • 95a2cdf06dca56cfbf931927eca64edb02e2f657: Use day precision for child age.
    • b67ccb2fed23f831fa4165030643ca36ac3fc27a ... 6d601abf30c35adeada147c7c347f47c5bf95feb: Improved Docker compose documentation (thanks, @jcgoette).
    • 3f1a7d9a9dc99b00e83524f5319e45cd28f3e735: Refactored graphs to remove Pandas dependency.

    Bug fixes

    • 9fb49876f4e52524766e8ca0432c0e67524e72a1: Fix Python versions in automated tests.
    • b009a0bebc4087fb9adce508c2a11eba086403ed: Fixed bug causing incorrect ("0 days") time since data on dashboards.
    Source code(tar.gz)
    Source code(zip)
  • v1.4.1(Jul 27, 2020)

    Major updates

    • 0082f0d...fbe1586: Added PATCH and DELETE support to API (#126).
    • fbe1586...d1cb5c2: Added support for associated API entries with a Timer ID instead of provided specific start and end times. (#131).
    • f29515a: Added "Today's Feeding" dashboard card (#149) (thanks, @JeanFred!)
    • c5e5589...dda1cd4: Added support for 24-hour time format for English locale.

    Minor updates

    • 853ab54: Added enhanced feeding statistics to dashboard card (#135) (thanks, @BenjaminHae!).
    • 4d74df2...8898a04: Improved feeding method selection process (#127) (thanks, @phardy!).
    • 8898a04...9944de9: Improved Docker Compose example (#142) (thanks, @MaximilianKindshofer!),
    • 9944de9...7fdc358: Added rolling session refresh (#143) (thanks, @phardy!).
    • 4e5153d: Set User on Timer automatically via API (#134).
    • 4e5153d...df0b54b: Added OpemAPI schema data (#147).
    • df0b54b...4e7d541: Improved support for SQLite-based Docker deployment (#145).
    Source code(tar.gz)
    Source code(zip)
  • v1.4.0(Feb 19, 2020)

    :exclamation::exclamation::exclamation:

    Baby Buddy v1.4.0 includes database and dependency updates. For manual deployments, run the following after pulling the updated code:

    • pipenv install
    • pipenv run python manage.py migrate

    Docker Compose users should only need to run (after updating the Docker image):

    • docker-compose exec app python manage.py migrate

    :exclamation::exclamation::exclamation:

    Major updates

    • 93207d88 - 785b87f6: Added per-user timezone configuration. The server TIME_ZONE setting will now be used only as a fallback default (#113).
    • cb171237 - a449de0b: Included past three methods is Last Feeding Method card (#117) .
    • 48a00937 - a751b0b2: Added general "notes" support to most models (#89).
    • 014b373a - 192d8d9b: Added initial basic admin import/export support (#35).

    Minor updates

    • bcfa352b: Fixed naps data calculation for reports.
    • f0d763d3: Removed deprecated Plot.ly graph generation code (#69).
    • 4d34a486: Standardized card language for "no data".
    • d0b33c2b: Updated to use user first and last name, when available, in UI.
    • a2f145f0: Updated all translation files and example French translations.
    Source code(tar.gz)
    Source code(zip)
  • v1.3.4(Feb 9, 2020)

    :exclamation::exclamation::exclamation: ATTENTION DOCKER USERS :exclamation::exclamation::exclamation:

    Beginning with v1.3.4, Baby Buddy is now published to a new Docker Hub repo (babybuddy/babybuddy). v1.3.4 will be the last version published to the old repo (cdubzzz/babybuddy). Users of Docker Compose should be able to change the services:app:image setting to the new repo. E.g. --

    docker-compose down
    <<< change "cdubzzz/babybuddy" to "babybuddy/babybuddy" in `docker-compose.yml` >>>
    docker-compose up -d
    docker-compose exec app python manage.py migrate
    docker-compose exec app python manage.py createcachetable
    

    :exclamation::exclamation::exclamation: ATTENTION DOCKER USERS :exclamation::exclamation::exclamation:

    This release should resolve any issues with static assets from v1.3.1 and v1.3.2. Hopefully the last release for a while... :goberserk:

    Source code(tar.gz)
    Source code(zip)
  • v1.3.3(Feb 8, 2020)

    This release fixes an issue introduced by 3eb0e336 that caused an exception when adding a feeding entry for a child with no previous feeding entries. :rage4:

    Source code(tar.gz)
    Source code(zip)
  • v1.3.2(Feb 7, 2020)

  • v1.3.1(Feb 7, 2020)

    Major updates

    • c16ba31a: Updated Docker Hub repo (#112). See notes above.
    • 127c3d5c - af710b97: Added ability to delete all inactive Timers (#108).
    • 682ebb34: Implement pull-to-refresh (#107)

    Minor updates

    • 005a4f18: Corrected timer urls to use plural form.
    • 6333b0b1: Move add button to header in list views.
    • 703782b2: Use provided end in Timer.stop() (#111)
    • 5b24ff21: Move environment variables to example Docker Compose file (#110)
    • 8e5364d8: Ensure that empty environment values get defaults
    • c0db2455: Do not enforce two columns in dashboard
    Source code(tar.gz)
    Source code(zip)
Owner
Baby Buddy
A baby buddy to help caregivers track sleep, feedings, diaper changes, and tummy time to learn about and predict baby's needs without (as much) guess work.
Baby Buddy
Scan, index, and archive all of your paper documents

[ en | de | el ] Important news about the future of this project It's been more than 5 years since I started this project on a whim as an effort to tr

Paperless 7.8k Jan 06, 2023
Open source platform for the machine learning lifecycle

MLflow: A Machine Learning Lifecycle Platform MLflow is a platform to streamline machine learning development, including tracking experiments, packagi

MLflow 13.3k Jan 04, 2023
Collect your thoughts and notes without leaving the command line.

jrnl To get help, submit an issue on Github. jrnl is a simple journal application for your command line. Journals are stored as human readable plain t

Manuel Ebert 31 Dec 01, 2022
The official source code repository for the calibre ebook manager

calibre calibre is an e-book manager. It can view, convert, edit and catalog e-books in all of the major e-book formats. It can also talk to e-book re

Kovid Goyal 14.1k Dec 27, 2022
The open-source core of Pinry, a tiling image board system for people who want to save, tag, and share images, videos and webpages in an easy to skim through format.

The open-source core of Pinry, a tiling image board system for people who want to save, tag, and share images, videos and webpages in an easy to skim

Pinry 2.7k Jan 08, 2023
๐Ÿ—ƒ Open source self-hosted web archiving. Takes URLs/browser history/bookmarks/Pocket/Pinboard/etc., saves HTML, JS, PDFs, media, and more...

ArchiveBox Open-source self-hosted web archiving. โ–ถ๏ธ Quickstart | Demo | Github | Documentation | Info & Motivation | Community | Roadmap "Your own pe

ArchiveBox 14.8k Jan 05, 2023
๐Ÿฆ‰Data Version Control | Git for Data & Models

Website โ€ข Docs โ€ข Blog โ€ข Twitter โ€ข Chat (Community & Support) โ€ข Tutorial โ€ข Mailing List Data Version Control or DVC is an open-source tool for data sci

Iterative 10.9k Jan 05, 2023
This is your launchpad that comes with a variety of applications waiting to run on your kubernetes cluster with a single click

This is your launchpad that comes with a variety of applications waiting to run on your kubernetes cluster with a single click.

M. Rehan 2 Jun 26, 2022
:books: Web app for browsing, reading and downloading eBooks stored in a Calibre database

About Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database. This softw

Jan B 8.2k Jan 02, 2023
Plugin-based, unopinionated membership administration software

byro is a membership administration tool for small and medium sized clubs/NGOs/associations of all kinds, with a focus on the DACH region. While it is

123 Nov 16, 2022
cherrytree

CherryTree A hierarchical note taking application, featuring rich text and syntax highlighting, storing data in a single XML or SQLite file. The proje

Giuseppe Penone 2.7k Jan 08, 2023
Automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic.

Automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic. Exclusiv

pyMedusa 1.5k Dec 30, 2022
:bookmark: Browser-independent bookmark manager

buku buku in action! Introduction buku is a powerful bookmark manager written in Python3 and SQLite3. When I started writing it, I couldn't find a fle

Mischievous Meerkat 5.4k Jan 02, 2023
Small and highly customizable twin-panel file manager for Linux with support for plugins.

Note: Prefered repository hosting is GitLab. If you don't have an account there and don't wish to make one interacting with one on GitHub is fine. Sun

Mladen Mijatov 407 Dec 29, 2022
Conference planning tool: CfP, scheduling, speaker management

pretalx is a conference planning tool focused on providing the best experience for organisers, speakers, reviewers, and attendees alike. It handles th

492 Dec 28, 2022
A time tracking application

GTimeLog GTimeLog is a simple app for keeping track of time. Contents Installing Documentation Resources Credits Installing GTimeLog is packaged for D

GTimeLog developers 224 Nov 28, 2022
Fava - web interface for Beancount

Fava is a web interface for the double-entry bookkeeping software Beancount with a focus on features and usability. Check out the online demo and lear

1.5k Dec 30, 2022
Wikidata scholarly profiles

Scholia is a python package and webapp for interaction with scholarly information in Wikidata. Webapp As a webapp, it currently runs from Wikimedia To

Finn ร…rup Nielsen 181 Jan 03, 2023
Indico - A feature-rich event management system, made @ CERN, the place where the Web was born.

Indico Indico is: ๐Ÿ—“ a general-purpose event management tool; ๐ŸŒ fully web-based; ๐Ÿงฉ feature-rich but also extensible through the use of plugins; โš–๏ธ O

Indico 1.4k Jan 09, 2023
Invenio digital library framework

Invenio Framework v3 Open Source framework for large-scale digital repositories. Invenio Framework is like a Swiss Army knife of battle-tested, safe a

Invenio digital repository framework 562 Jan 07, 2023