Example #1
0
 def test_last_weight_entry(self):
     '''
     Tests that the last weight entry is correctly returned
     '''
     self.user_login('test')
     user = User.objects.get(pk=2)
     entry = WeightEntry()
     entry.creation_date = datetime.datetime.today()
     entry.user = user
     entry.weight = 100
     entry.save()
     self.assertEqual(user.userprofile.weight, 100)
     entry.weight = 150
     entry.save()
     self.assertEqual(user.userprofile.weight, 150)
Example #2
0
def parse_weight_csv(request, cleaned_data):

    try:
        dialect = csv.Sniffer().sniff(cleaned_data['csv_input'])
    except csv.Error:
        dialect = 'excel'

    # csv.reader expects a file-like object, so use StringIO
    parsed_csv = csv.reader(six.StringIO(cleaned_data['csv_input']), dialect)

    weight_list = []
    error_list = []
    for row in parsed_csv:
        try:
            parsed_date = datetime.datetime.strptime(
                row[0], cleaned_data['date_format'])
            parsed_weight = decimal.Decimal(row[1].replace(',', '.'))

            weight_list.append(
                WeightEntry(creation_date=parsed_date,
                            weight=parsed_weight,
                            user=request.user))

        except (ValueError, IndexError, decimal.InvalidOperation):
            error_list.append(row)

    return (weight_list, error_list)
Example #3
0
def fitbitComplete(request):
    code = request.GET.get('code')
    # print(code)
    fitConnect = Fitbit()
    token = fitConnect.GetAccessToken(code)

    headers = {
            'Authorization': 'Bearer %s' % token['access_token']
        }

    final_url = 'https://' + fitConnect.API_SERVER + '/1/user/-/body/weight/date/today/30d.json'
    try:
        resp = requests.get(final_url, headers=headers)
        data = resp.json()
        print(data)
        for content_data in data['body-weight']:
            weight = WeightEntry()
            weight.user = request.user
            weight.weight=content_data['value']
            weight.date = dateutil.parser.parse(content_data['dateTime'])
            try:
                weight.save()
            except Exception as e:
                pass
    except Exception as e:
        pass
    return HttpResponseRedirect(reverse('core:dashboard'))
Example #4
0
def add_excersise(request, response_activity, weight):
    entry = WeightEntry()
    entry.weight = weight
    entry.user = request.user
    entry.date = datetime.date.today()
    entry.save()
    messages.success(
        request, _('Successfully synced weight data.'))

    if not ExerciseCategory.objects.filter(name='Fitbit'):
        fitbit_category = ExerciseCategory()
        fitbit_category.name = 'Fitbit'
        fitbit_category.save()

    for detail in response_activity.json()['activities']:
        name = detail['name']
        description = detail['description']

        exercise = Exercise()
        exercise.name_original = name
        exercise.name = name
        exercise.category = ExerciseCategory.objects.get(
            name='Fitbit')
        exercise.description = description
        exercise.language = Language.objects.get(
            short_name='en')
        exercise.save()
Example #5
0
 def test_last_weight_entry(self):
     '''
     Tests that the last weight entry is correctly returned
     '''
     self.user_login('test')
     user = User.objects.get(pk=2)
     entry = WeightEntry()
     entry.date = datetime.datetime.today()
     entry.user = user
     entry.weight = 100
     entry.save()
     self.assertEqual(user.userprofile.weight, 100)
     entry.weight = 150
     entry.save()
     self.assertEqual(user.userprofile.weight, 150)
Example #6
0
    def user_bodyweight(self, weight):
        '''
        Create a new weight entry as needed
        '''
        if (not WeightEntry.objects.filter(user=self.user).exists() or
            (datetime.date.today() -
             WeightEntry.objects.filter(user=self.user).latest().creation_date
             > datetime.timedelta(days=3))):
            entry = WeightEntry()
            entry.weight = weight
            entry.user = self.user
            entry.creation_date = datetime.date.today()
            entry.save()

        # Update the last entry
        else:
            entry = WeightEntry.objects.filter(user=self.user).latest()
            entry.weight = weight
            entry.save()
        return entry
Example #7
0
    def user_bodyweight(self, weight):
        '''
        Create a new weight entry as needed
        '''
        if (not WeightEntry.objects.filter(user=self.user).exists()
            or (datetime.date.today()
                - WeightEntry.objects.filter(user=self.user).latest().date
                > datetime.timedelta(days=3))):
            entry = WeightEntry()
            entry.weight = weight
            entry.user = self.user
            entry.date = datetime.date.today()
            entry.save()

        # Update the last entry
        else:
            entry = WeightEntry.objects.filter(user=self.user).latest()
            entry.weight = weight
            entry.save()
        return entry
Example #8
0
def parse_weight_csv(request, cleaned_data):

    try:
        dialect = csv.Sniffer().sniff(cleaned_data['csv_input'])
    except csv.Error:
        dialect = 'excel'

    # csv.reader expects a file-like object, so use StringIO
    parsed_csv = csv.reader(io.StringIO(cleaned_data['csv_input']),
                            dialect)
    distinct_weight_entries = []
    entry_dates = set()
    weight_list = []
    error_list = []
    MAX_ROW_COUNT = 1000
    row_count = 0

    # Process the CSV items first
    for row in parsed_csv:
        try:
            parsed_date = datetime.datetime.strptime(row[0], cleaned_data['date_format'])
            parsed_weight = decimal.Decimal(row[1].replace(',', '.'))
            duplicate_date_in_db = WeightEntry.objects.filter(date=parsed_date,
                                                              user=request.user).exists()
            # within the list there are no duplicate dates
            unique_among_csv = parsed_date not in entry_dates

            # there is no existing weight entry in the database for that date
            unique_in_db = not duplicate_date_in_db

            if unique_among_csv and unique_in_db and parsed_weight:
                distinct_weight_entries.append((parsed_date, parsed_weight))
                entry_dates.add(parsed_date)
            else:
                error_list.append(row)

        except (ValueError, IndexError, decimal.InvalidOperation):
            error_list.append(row)
        row_count += 1
        if row_count > MAX_ROW_COUNT:
            break

    # Create the valid weight entries
    for date, weight in distinct_weight_entries:
        weight_list.append(WeightEntry(date=date,
                                       weight=weight,
                                       user=request.user))

    return (weight_list, error_list)
Example #9
0
def calculate(request):
    '''
    Calculates the BMI
    '''

    data = []

    form = BmiForm(request.POST, instance=request.user.userprofile)
    if form.is_valid():
        form.save()

        # Create a new weight entry as needed
        if (not WeightEntry.objects.filter(user=request.user).exists()
           or (datetime.date.today()
               - WeightEntry.objects.filter(user=request.user).latest().creation_date
               > datetime.timedelta(1))):
            entry = WeightEntry()
            entry.weight = form.cleaned_data['weight']
            entry.user = request.user
            entry.creation_date = datetime.date.today()
            entry.save()

        # Update the last entry
        else:
            entry = WeightEntry.objects.filter(user=request.user).latest()
            entry.weight = form.cleaned_data['weight']
            entry.save()

        bmi = request.user.userprofile.calculate_bmi()
        result = {'bmi': '{0:.2f}'.format(bmi),
                  'weight': form.cleaned_data['weight'],
                  'height': request.user.userprofile.height}
        data = json.dumps(result, cls=helpers.DecimalJsonEncoder)

    # Return the results to the client
    return HttpResponse(data, 'application/json')
Example #10
0
    def test_demo_data_body_weight(self):
        """
        Tests that the helper function that creates demo data filters out
        existing dates for the weight entries
        """
        self.client.get(reverse('core:dashboard'))
        self.assertEqual(self.count_temp_users(), 2)
        user = User.objects.get(pk=4)

        temp = []
        for i in range(1, 5):
            creation_date = datetime.date.today() - datetime.timedelta(days=i)
            entry = WeightEntry(user=user,
                                weight=80 + 0.5 * i + random.randint(1, 3),
                                date=creation_date)
            temp.append(entry)
        WeightEntry.objects.bulk_create(temp)
        create_demo_entries(user)

        # Body weight
        self.assertEqual(WeightEntry.objects.filter(user=user).count(), 19)
Example #11
0
    for user in userlist:
        new_entries = []
        print('   - generating for {0}'.format(user.username))

        existing_entries = [
            i.date for i in WeightEntry.objects.filter(user=user)
        ]

        # Weight entries
        for i in range(1, args.number_weight):

            creation_date = datetime.date.today() - datetime.timedelta(days=i)
            if creation_date not in existing_entries:
                entry = WeightEntry(user=user,
                                    weight=args.base_weight + 0.5 * i +
                                    random.randint(1, 3),
                                    date=creation_date)
                new_entries.append(entry)

        # Bulk-create the weight entries
        WeightEntry.objects.bulk_create(new_entries)

# Nutrition Generator
if hasattr(args, 'number_nutrition_plans'):
    print("** Generating {0} nutrition plan(s) per user".format(
        args.number_nutrition_plans))

    if args.add_to_user:
        userlist = [User.objects.get(pk=args.add_to_user)]
    else:
        userlist = [i for i in User.objects.all()]
Example #12
0
def create_demo_entries(user):
    """
    Creates some demo data for temporary users
    """

    # (this is a bit ugly and long...)
    language = load_language()

    #
    # Workout and exercises
    #
    setting_list = []
    weight_log = []
    workout = Workout(user=user, name=_('Sample workout'))
    workout.save()
    monday = DaysOfWeek.objects.get(pk=1)
    wednesday = DaysOfWeek.objects.get(pk=3)
    day = Day(training=workout, description=_('Sample day'))
    day.save()
    day.day.add(monday)

    day2 = Day(training=workout, description=_('Another sample day'))
    day2.save()
    day2.day.add(wednesday)

    # Biceps curls with dumbbell
    if language.short_name == 'de':
        exercise = Exercise.objects.get(pk=26)
    else:
        exercise = Exercise.objects.get(pk=81)
    day_set = Set(exerciseday=day, sets=4, order=2)
    day_set.save()

    setting = Setting(set=day_set, exercise=exercise, reps=8, order=1)
    setting.save()

    # Weight log entries
    for reps in (8, 10, 12):
        for i in range(1, 8):
            log = WorkoutLog(user=user,
                             exercise=exercise,
                             workout=workout,
                             reps=reps,
                             weight=18 - reps + random.randint(1, 4),
                             date=datetime.date.today() -
                             datetime.timedelta(weeks=i))
            weight_log.append(log)

    # French press
    if language.short_name == 'de':
        exercise = Exercise.objects.get(pk=25)
    else:
        exercise = Exercise.objects.get(pk=84)
    day_set = Set(exerciseday=day, sets=4, order=2)
    day_set.save()

    setting_list.append(
        Setting(set=day_set, exercise=exercise, reps=8, order=1))

    # Weight log entries
    for reps in (7, 10):
        for i in range(1, 8):
            log = WorkoutLog(user=user,
                             exercise=exercise,
                             workout=workout,
                             reps=reps,
                             weight=30 - reps + random.randint(1, 4),
                             date=datetime.date.today() -
                             datetime.timedelta(weeks=i))
            weight_log.append(log)

    # Squats
    if language.short_name == 'de':
        exercise = Exercise.objects.get(pk=6)
    else:
        exercise = Exercise.objects.get(pk=111)
    day_set = Set(exerciseday=day, sets=4, order=3)
    day_set.save()

    setting_list.append(
        Setting(set=day_set, exercise=exercise, reps=10, order=1))

    # Weight log entries
    for reps in (5, 10, 12):
        for i in range(1, 8):
            log = WorkoutLog(user=user,
                             exercise=exercise,
                             workout=workout,
                             reps=reps,
                             weight=110 - reps + random.randint(1, 10),
                             date=datetime.date.today() -
                             datetime.timedelta(weeks=i))
            weight_log.append(log)

    # Crunches
    if language.short_name == 'de':
        exercise = Exercise.objects.get(pk=4)
    else:
        exercise = Exercise.objects.get(pk=91)
    day_set = Set(exerciseday=day, sets=4, order=4)
    day_set.save()

    setting_list.append(
        Setting(set=day_set, exercise=exercise, reps=30, order=1))
    setting_list.append(
        Setting(set=day_set, exercise=exercise, reps=99, order=2))
    setting_list.append(
        Setting(set=day_set, exercise=exercise, reps=35, order=3))

    # Leg raises, supersets with crunches
    if language.short_name == 'de':
        exercise = Exercise.objects.get(pk=35)
    else:
        exercise = Exercise.objects.get(pk=126)

    setting_list.append(
        Setting(set=day_set, exercise=exercise, reps=30, order=1))
    setting_list.append(
        Setting(set=day_set, exercise=exercise, reps=40, order=2))
    setting_list.append(
        Setting(set=day_set, exercise=exercise, reps=99, order=3))

    Setting.objects.bulk_create(setting_list)

    # Save all the log entries
    WorkoutLog.objects.bulk_create(weight_log)

    #
    # (Body) weight entries
    #
    temp = []
    existing_entries = [i.date for i in WeightEntry.objects.filter(user=user)]
    for i in range(1, 20):
        creation_date = datetime.date.today() - datetime.timedelta(days=i)
        if creation_date not in existing_entries:
            entry = WeightEntry(user=user,
                                weight=80 + 0.5 * i + random.randint(1, 3),
                                date=creation_date)
            temp.append(entry)
    WeightEntry.objects.bulk_create(temp)

    #
    # Nutritional plan
    #
    plan = NutritionPlan()
    plan.user = user
    plan.language = language
    plan.description = _('Sample nutrional plan')
    plan.save()

    # Breakfast
    meal = Meal()
    meal.plan = plan
    meal.order = 1
    meal.time = datetime.time(7, 30)
    meal.save()

    # Oatmeal
    if language.short_name == 'de':
        ingredient = Ingredient.objects.get(pk=8197)
    else:
        ingredient = Ingredient.objects.get(pk=2126)

    mealitem = MealItem()
    mealitem.meal = meal
    mealitem.ingredient = ingredient
    mealitem.order = 1
    mealitem.amount = 100
    mealitem.save()

    # Milk
    if language.short_name == 'de':
        ingredient = Ingredient.objects.get(pk=8198)
    else:
        ingredient = Ingredient.objects.get(pk=154)

    mealitem = MealItem()
    mealitem.meal = meal
    mealitem.ingredient = ingredient
    mealitem.order = 2
    mealitem.amount = 100
    mealitem.save()

    # Protein powder
    if language.short_name == 'de':
        ingredient = Ingredient.objects.get(pk=8244)
    else:
        ingredient = Ingredient.objects.get(pk=196)

    mealitem = MealItem()
    mealitem.meal = meal
    mealitem.ingredient = ingredient
    mealitem.order = 3
    mealitem.amount = 30
    mealitem.save()

    #
    # 11 o'clock meal
    meal = Meal()
    meal.plan = plan
    meal.order = 2
    meal.time = datetime.time(11, 0)
    meal.save()

    # Bread, in slices
    if language.short_name == 'de':
        ingredient = Ingredient.objects.get(pk=8225)
        unit = None
        amount = 80
    else:
        ingredient = Ingredient.objects.get(pk=5370)
        unit = IngredientWeightUnit.objects.get(pk=9874)
        amount = 2

    mealitem = MealItem()
    mealitem.meal = meal
    mealitem.ingredient = ingredient
    mealitem.weight_unit = unit
    mealitem.order = 1
    mealitem.amount = amount
    mealitem.save()

    # Turkey
    if language.short_name == 'de':
        ingredient = Ingredient.objects.get(pk=8201)
    else:
        ingredient = Ingredient.objects.get(pk=1643)

    mealitem = MealItem()
    mealitem.meal = meal
    mealitem.order = 2
    mealitem.ingredient = ingredient
    mealitem.amount = 100
    mealitem.save()

    # Cottage cheese
    if language.short_name == 'de':
        ingredient = Ingredient.objects.get(pk=8222)  # TODO: check this!
    else:
        ingredient = Ingredient.objects.get(pk=17)

    mealitem = MealItem()
    mealitem.meal = meal
    mealitem.ingredient = ingredient
    mealitem.order = 3
    mealitem.amount = 50
    mealitem.save()

    # Tomato, one
    if language.short_name == 'de':
        ingredient = Ingredient.objects.get(pk=8217)
        unit = None
        amount = 120
    else:
        ingredient = Ingredient.objects.get(pk=3208)
        unit = IngredientWeightUnit.objects.get(pk=5950)
        amount = 1

    mealitem = MealItem()
    mealitem.meal = meal
    mealitem.weight_unit = unit
    mealitem.ingredient = ingredient
    mealitem.order = 4
    mealitem.amount = amount
    mealitem.save()

    #
    # Lunch (leave empty so users can add their own ingredients)
    meal = Meal()
    meal.plan = plan
    meal.order = 3
    meal.time = datetime.time(13, 0)
    meal.save()

    #
    # Workout schedules
    #

    # create some empty workouts to fill the list
    workout2 = Workout(
        user=user, name=_('Placeholder workout nr {0} for schedule').format(1))
    workout2.save()
    workout3 = Workout(
        user=user, name=_('Placeholder workout nr {0} for schedule').format(2))
    workout3.save()
    workout4 = Workout(
        user=user, name=_('Placeholder workout nr {0} for schedule').format(3))
    workout4.save()

    schedule = Schedule()
    schedule.user = user
    schedule.name = _('My cool workout schedule')
    schedule.start_date = datetime.date.today() - datetime.timedelta(weeks=4)
    schedule.is_active = True
    schedule.is_loop = True
    schedule.save()

    # Add the workouts
    step = ScheduleStep()
    step.schedule = schedule
    step.workout = workout2
    step.duration = 2
    step.order = 1
    step.save()

    step = ScheduleStep()
    step.schedule = schedule
    step.workout = workout
    step.duration = 4
    step.order = 2
    step.save()

    step = ScheduleStep()
    step.schedule = schedule
    step.workout = workout3
    step.duration = 1
    step.order = 3
    step.save()

    step = ScheduleStep()
    step.schedule = schedule
    step.workout = workout4
    step.duration = 6
    step.order = 4
    step.save()

    #
    # Add two more schedules, to make the overview more interesting
    schedule = Schedule()
    schedule.user = user
    schedule.name = _('Empty placeholder schedule')
    schedule.start_date = datetime.date.today() - datetime.timedelta(weeks=15)
    schedule.is_active = False
    schedule.is_loop = False
    schedule.save()

    step = ScheduleStep()
    step.schedule = schedule
    step.workout = workout2
    step.duration = 2
    step.order = 1
    step.save()

    schedule = Schedule()
    schedule.user = user
    schedule.name = _('Empty placeholder schedule')
    schedule.start_date = datetime.date.today() - datetime.timedelta(weeks=30)
    schedule.is_active = False
    schedule.is_loop = False
    schedule.save()

    step = ScheduleStep()
    step.schedule = schedule
    step.workout = workout4
    step.duration = 2
    step.order = 1
    step.save()
Example #13
0
def fitbit(request):
    '''
    method driving fitbit integration
    '''

    template_data = {}
    fitbit_id = os.getenv('CLIENT_ID')
    fitbit_secret_key = os.getenv('SECRET_KEY')
    callback_url = os.getenv('CALLBACK_URL')
    fitbit_scope = 'weight'
    url_params = '&response_type=code&scope={}&redirect_uri={}'.format(
        fitbit_scope, callback_url)
    fitbit_url = 'https://www.fitbit.com/oauth2/authorize?client_id={}'.format(
        fitbit_id)
    get_fitbit = fitbit_url + url_params

    if 'code' in request.GET:
        # get the code returned from the
        code = request.GET.get('code', '')
        client_secret = '{}:{}'.format(fitbit_id, fitbit_secret_key)
        # Convert client secret key to bytes then to base64 for fitbit token
        client_secret = client_secret.encode('utf-8')
        b64_code = base64.b64encode(client_secret).decode('utf-8')
        # custom headers for fitbit
        headers = {
            'Authorization': 'Basic {}'.format(b64_code),
            'Content-Type': 'application/x-www-form-urlencoded'
        }
        # parameters for fitbit api request
        params = {
            'client_id': fitbit_id,
            'client_secret': fitbit_secret_key,
            'code': code,
            'grant_type': 'authorization_code',
            'redirect_uri': callback_url
        }
        # retrieve fitbit access_token
        post_fitbit = requests.post('https://api.fitbit.com/oauth2/token',
                                    params,
                                    headers=headers).json()

        if 'access_token' in post_fitbit:
            headers['Authorization'] = 'Bearer {}'.format(
                post_fitbit["access_token"])
            user_id = post_fitbit['user_id']
            period = '1w'
            base_date = datetime.datetime.today().strftime('%Y-%m-%d')
            # get request to retrieve weight data for the user
            get_weight_params = '/body/log/weight/date/{}/{}.json'.format(
                base_date, period)
            get_weight_url = 'https://api.fitbit.com/1/user/{}'.format(user_id)
            get_weight = get_weight_url + get_weight_params
            get_weight_data = requests.get(get_weight, headers=headers).json()
            print('-----wqertyuioertyu', get_weight_data)

            # save fitbit data into the database
            if 'weight' in get_weight_data:
                try:
                    for weight in get_weight_data['weight']:
                        weight_entry = WeightEntry()
                        weight_entry.user = request.user
                        weight_entry.weight = weight['weight']
                        weight_entry.date = weight['date']
                        weight_entry.save()
                        messages.success(request,
                                         _('Successfully added weight data.'))
                except IntegrityError as e:
                    messages.success(request, _('Weight data already added.'))

    template_data.update({'fit_link': get_fitbit})
    return render(request, 'user/fitbit.html', template_data)