{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Goal is to display all workouts\n",
    "#### * Query database\n",
    "#### * Transform models into viewmodels\n",
    "#### * Display data to user"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sqlite3\n",
    "import json\n",
    "from datetime import datetime"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "DATABASE = 'workout.db'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Define function to query database"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def query_db(query, args=(), one=False):\n",
    "    conn = sqlite3.connect(DATABASE)\n",
    "    conn.row_factory = sqlite3.Row\n",
    "    cur = conn.execute(query, args)\n",
    "    rv = cur.fetchall()\n",
    "    conn.commit()\n",
    "    cur.close()\n",
    "    return (rv[0] if rv else None) if one else rv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Query all workouts & topsets completed by Gabe(PersonId=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WorkoutId: 35, PersonId: 1 Person:Gabe, StartDate: 2022-01-13, TopSetId: 61, ExerciseId: 2, Exercise: Bench, Repetitions: 8, Weight: 50kg\n",
      "WorkoutId: 36, PersonId: 1 Person:Gabe, StartDate: 2022-01-18, TopSetId: 62, ExerciseId: 1, Exercise: Squat, Repetitions: 7, Weight: 55kg\n",
      "WorkoutId: 36, PersonId: 1 Person:Gabe, StartDate: 2022-01-18, TopSetId: 63, ExerciseId: 4, Exercise: Hotep, Repetitions: 4, Weight: 25kg\n",
      "WorkoutId: 37, PersonId: 1 Person:Gabe, StartDate: 2022-02-08, TopSetId: 64, ExerciseId: 2, Exercise: Bench, Repetitions: 5, Weight: 55kg\n",
      "WorkoutId: 37, PersonId: 1 Person:Gabe, StartDate: 2022-02-08, TopSetId: 65, ExerciseId: 3, Exercise: Deadlift, Repetitions: 6, Weight: 95kg\n",
      "WorkoutId: 38, PersonId: 1 Person:Gabe, StartDate: 2022-02-15, TopSetId: 66, ExerciseId: 1, Exercise: Squat, Repetitions: 3, Weight: 65kg\n",
      "WorkoutId: 38, PersonId: 1 Person:Gabe, StartDate: 2022-02-15, TopSetId: 67, ExerciseId: 4, Exercise: Hotep, Repetitions: 6, Weight: 25kg\n",
      "WorkoutId: 39, PersonId: 1 Person:Gabe, StartDate: 2022-02-17, TopSetId: 68, ExerciseId: 2, Exercise: Bench, Repetitions: 2, Weight: 60kg\n",
      "WorkoutId: 39, PersonId: 1 Person:Gabe, StartDate: 2022-02-17, TopSetId: 69, ExerciseId: 3, Exercise: Deadlift, Repetitions: 8, Weight: 105kg\n",
      "WorkoutId: 40, PersonId: 1 Person:Gabe, StartDate: 2022-03-01, TopSetId: 70, ExerciseId: 1, Exercise: Squat, Repetitions: 3, Weight: 75kg\n",
      "WorkoutId: 40, PersonId: 1 Person:Gabe, StartDate: 2022-03-01, TopSetId: 71, ExerciseId: 4, Exercise: Hotep, Repetitions: 4, Weight: 30kg\n",
      "WorkoutId: 41, PersonId: 1 Person:Gabe, StartDate: 2022-03-10, TopSetId: 72, ExerciseId: 2, Exercise: Bench, Repetitions: 11, Weight: 50kg\n",
      "WorkoutId: 42, PersonId: 1 Person:Gabe, StartDate: 2022-03-15, TopSetId: 73, ExerciseId: 1, Exercise: Squat, Repetitions: 5, Weight: 75kg\n",
      "WorkoutId: 42, PersonId: 1 Person:Gabe, StartDate: 2022-03-15, TopSetId: 74, ExerciseId: 4, Exercise: Hotep, Repetitions: 5, Weight: 30kg\n",
      "WorkoutId: 43, PersonId: 1 Person:Gabe, StartDate: 2022-03-22, TopSetId: 75, ExerciseId: 2, Exercise: Bench, Repetitions: 4, Weight: 60kg\n",
      "WorkoutId: 43, PersonId: 1 Person:Gabe, StartDate: 2022-03-22, TopSetId: 76, ExerciseId: 3, Exercise: Deadlift, Repetitions: 4, Weight: 110kg\n",
      "WorkoutId: 44, PersonId: 1 Person:Gabe, StartDate: 2022-04-07, TopSetId: 77, ExerciseId: 1, Exercise: Squat, Repetitions: 6, Weight: 75kg\n",
      "WorkoutId: 44, PersonId: 1 Person:Gabe, StartDate: 2022-04-07, TopSetId: 78, ExerciseId: 4, Exercise: Hotep, Repetitions: 2, Weight: 35kg\n",
      "WorkoutId: 45, PersonId: 1 Person:Gabe, StartDate: 2022-04-21, TopSetId: 79, ExerciseId: 2, Exercise: Bench, Repetitions: 10, Weight: 45kg\n",
      "WorkoutId: 45, PersonId: 1 Person:Gabe, StartDate: 2022-04-21, TopSetId: 80, ExerciseId: 3, Exercise: Deadlift, Repetitions: 10, Weight: 100kg\n",
      "WorkoutId: 46, PersonId: 1 Person:Gabe, StartDate: 2022-04-26, TopSetId: 81, ExerciseId: 1, Exercise: Squat, Repetitions: 3, Weight: 80kg\n",
      "WorkoutId: 47, PersonId: 1 Person:Gabe, StartDate: 2022-04-28, TopSetId: 82, ExerciseId: 2, Exercise: Bench, Repetitions: 2, Weight: 60kg\n",
      "WorkoutId: 47, PersonId: 1 Person:Gabe, StartDate: 2022-04-28, TopSetId: 83, ExerciseId: 3, Exercise: Deadlift, Repetitions: 5, Weight: 100kg\n",
      "WorkoutId: 48, PersonId: 1 Person:Gabe, StartDate: 2022-05-03, TopSetId: 84, ExerciseId: 2, Exercise: Bench, Repetitions: 4, Weight: 55kg\n",
      "WorkoutId: 48, PersonId: 1 Person:Gabe, StartDate: 2022-05-03, TopSetId: 85, ExerciseId: 3, Exercise: Deadlift, Repetitions: 7, Weight: 95kg\n",
      "WorkoutId: 49, PersonId: 1 Person:Gabe, StartDate: 2022-05-05, TopSetId: 86, ExerciseId: 2, Exercise: Bench, Repetitions: 4, Weight: 55kg\n",
      "WorkoutId: 49, PersonId: 1 Person:Gabe, StartDate: 2022-05-05, TopSetId: 87, ExerciseId: 3, Exercise: Deadlift, Repetitions: 7, Weight: 110kg\n",
      "WorkoutId: 50, PersonId: 1 Person:Gabe, StartDate: 2022-05-17, TopSetId: 88, ExerciseId: 1, Exercise: Squat, Repetitions: 3, Weight: 60kg\n",
      "WorkoutId: 50, PersonId: 1 Person:Gabe, StartDate: 2022-05-17, TopSetId: 89, ExerciseId: 4, Exercise: Hotep, Repetitions: 4, Weight: 27kg\n",
      "WorkoutId: 51, PersonId: 1 Person:Gabe, StartDate: 2022-05-19, TopSetId: 90, ExerciseId: 2, Exercise: Bench, Repetitions: 1, Weight: 65kg\n",
      "WorkoutId: 51, PersonId: 1 Person:Gabe, StartDate: 2022-05-19, TopSetId: 91, ExerciseId: 3, Exercise: Deadlift, Repetitions: 4, Weight: 125kg\n",
      "WorkoutId: 52, PersonId: 1 Person:Gabe, StartDate: 2022-06-07, TopSetId: 92, ExerciseId: 2, Exercise: Bench, Repetitions: 4, Weight: 55kg\n",
      "WorkoutId: 52, PersonId: 1 Person:Gabe, StartDate: 2022-06-07, TopSetId: 93, ExerciseId: 3, Exercise: Deadlift, Repetitions: 5, Weight: 100kg\n",
      "WorkoutId: 53, PersonId: 1 Person:Gabe, StartDate: 2022-06-14, TopSetId: 94, ExerciseId: 1, Exercise: Squat, Repetitions: 2, Weight: 75kg\n",
      "WorkoutId: 53, PersonId: 1 Person:Gabe, StartDate: 2022-06-14, TopSetId: 95, ExerciseId: 4, Exercise: Hotep, Repetitions: 4, Weight: 31kg\n",
      "WorkoutId: 54, PersonId: 1 Person:Gabe, StartDate: 2022-06-29, TopSetId: 96, ExerciseId: 2, Exercise: Bench, Repetitions: 11, Weight: 40kg\n",
      "WorkoutId: 55, PersonId: 1 Person:Gabe, StartDate: 2022-07-07, TopSetId: 97, ExerciseId: 1, Exercise: Squat, Repetitions: 5, Weight: 65kg\n",
      "WorkoutId: 55, PersonId: 1 Person:Gabe, StartDate: 2022-07-07, TopSetId: 98, ExerciseId: 4, Exercise: Hotep, Repetitions: 6, Weight: 30kg\n",
      "WorkoutId: 56, PersonId: 1 Person:Gabe, StartDate: 2022-07-12, TopSetId: 99, ExerciseId: 2, Exercise: Bench, Repetitions: 4, Weight: 60kg\n",
      "WorkoutId: 56, PersonId: 1 Person:Gabe, StartDate: 2022-07-12, TopSetId: 100, ExerciseId: 3, Exercise: Deadlift, Repetitions: 9, Weight: 100kg\n",
      "WorkoutId: 57, PersonId: 1 Person:Gabe, StartDate: 2022-07-15, TopSetId: 101, ExerciseId: 1, Exercise: Squat, Repetitions: 6, Weight: 75kg\n",
      "WorkoutId: 57, PersonId: 1 Person:Gabe, StartDate: 2022-07-15, TopSetId: 102, ExerciseId: 4, Exercise: Hotep, Repetitions: 3, Weight: 35kg\n"
     ]
    }
   ],
   "source": [
    "topsets = query_db(\"\"\"\n",
    "    SELECT \n",
    "        P.PersonId, \n",
    "        P.Name AS PersonName, \n",
    "        W.WorkoutId, \n",
    "        W.StartDate, \n",
    "        T.TopSetId, \n",
    "        E.ExerciseId, \n",
    "        E.Name AS ExerciseName, \n",
    "        T.Repetitions, \n",
    "        T.Weight\n",
    "    FROM Person P\n",
    "         LEFT JOIN Workout W ON P.PersonId=W.PersonId\n",
    "         LEFT JOIN TopSet T ON W.WorkoutId=T.WorkoutId\n",
    "         LEFT JOIN Exercise E ON T.ExerciseId=E.ExerciseId\n",
    "    WHERE P.PersonId=?\"\"\", [1])\n",
    "\n",
    "for topset in topsets:\n",
    "    print(f'WorkoutId: {topset[\"WorkoutId\"]}, PersonId: {topset[\"PersonId\"]} Person:{topset[\"PersonName\"]}, StartDate: {topset[\"StartDate\"]}, TopSetId: {topset[\"TopSetId\"]}, ExerciseId: {topset[\"ExerciseId\"]}, Exercise: {topset[\"ExerciseName\"]}, Repetitions: {topset[\"Repetitions\"]}, Weight: {topset[\"Weight\"]}kg')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Transform entity to view model with the following schema\n",
    "<pre>\n",
    "{   \"PersonId\": 1,\n",
    "    \"PersonName\": \"Gabe\",  \n",
    "    \"Exercises\": [{\"ExerciseIs\": 1, \"ExerciseName\": \"Squat\"}, {\"ExerciseIs\": 2, \"ExerciseName\": \"Bench\"}]  \n",
    "    \"Workouts\": [  \n",
    "        {  \n",
    "            \"WorkoutId\": 1,\n",
    "            \"StartDate\": \"2022-06-29 00:00:00.000\",  \n",
    "            \"TopSets\": [  \n",
    "                {  \n",
    "                    \"ExerciseId\": 1,\n",
    "                    \"ExerciseName\": \"Squat\",  \n",
    "                    \"Weight\": 80,  \n",
    "                    \"Repetitions\": 8  \n",
    "                },  \n",
    "                {  \n",
    "                    \"ExerciseId\": 2,\n",
    "                    \"ExerciseName\": \"Bench\",  \n",
    "                    \"Weight\": 60,  \n",
    "                    \"Repetitions\": 4  \n",
    "                }  \n",
    "            ]  \n",
    "        },  \n",
    "        {\n",
    "            \"WorkoutId\": 2,\n",
    "            \"StartDate\": \"2022-07-01 00:00:00.000\",  \n",
    "            \"TopSets\": [  \n",
    "                {  \n",
    "                    \"ExerciseId\": 1,\n",
    "                    \"ExerciseName\": \"Squat\",  \n",
    "                    \"Weight\": 85,  \n",
    "                    \"Repetitions\": 4  \n",
    "                },  \n",
    "                {  \n",
    "                    \"ExerciseId\": 2,\n",
    "                    \"ExerciseName\": \"Bench\",  \n",
    "                    \"Weight\": 65,  \n",
    "                    \"Repetitions\": 5  \n",
    "                }  \n",
    "            ]  \n",
    "        }  \n",
    "    ]  \n",
    "} \n",
    "</pre>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1. Extract name from rows"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Gabe'"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def get_name(topsets):\n",
    "    return topsets[0]['PersonName']\n",
    "\n",
    "get_name(topsets)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2. Group rows into workouts using WorkoutId column"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_workouts(topsets):\n",
    "    # Get all unique workout_ids (No duplicates)\n",
    "    workout_ids = set([t['WorkoutId'] for t in topsets])\n",
    "\n",
    "    # Group topsets into workouts\n",
    "    workouts = []\n",
    "    for workout_id in workout_ids:\n",
    "        topsets_in_workout = [t for t in topsets if t['WorkoutId'] == workout_id]\n",
    "        workouts.append({\n",
    "            'WorkoutId': workout_id,\n",
    "            'StartDate': topsets_in_workout[0]['StartDate'],\n",
    "            'TopSets': [{\"TopSetId\": t['TopSetId'], \"ExerciseId\": t['ExerciseId'], \"ExerciseName\": t['ExerciseName'], \"Weight\": t['Weight'], \"Repetitions\": t['Repetitions'] } for t in topsets_in_workout]\n",
    "        })\n",
    "    return workouts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[\n",
      "  {\n",
      "    \"WorkoutId\": 35,\n",
      "    \"StartDate\": \"2022-01-13\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 61,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 50,\n",
      "        \"Repetitions\": 8\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 36,\n",
      "    \"StartDate\": \"2022-01-18\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 62,\n",
      "        \"ExerciseId\": 1,\n",
      "        \"ExerciseName\": \"Squat\",\n",
      "        \"Weight\": 55,\n",
      "        \"Repetitions\": 7\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 63,\n",
      "        \"ExerciseId\": 4,\n",
      "        \"ExerciseName\": \"Hotep\",\n",
      "        \"Weight\": 25,\n",
      "        \"Repetitions\": 4\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 37,\n",
      "    \"StartDate\": \"2022-02-08\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 64,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 55,\n",
      "        \"Repetitions\": 5\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 65,\n",
      "        \"ExerciseId\": 3,\n",
      "        \"ExerciseName\": \"Deadlift\",\n",
      "        \"Weight\": 95,\n",
      "        \"Repetitions\": 6\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 38,\n",
      "    \"StartDate\": \"2022-02-15\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 66,\n",
      "        \"ExerciseId\": 1,\n",
      "        \"ExerciseName\": \"Squat\",\n",
      "        \"Weight\": 65,\n",
      "        \"Repetitions\": 3\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 67,\n",
      "        \"ExerciseId\": 4,\n",
      "        \"ExerciseName\": \"Hotep\",\n",
      "        \"Weight\": 25,\n",
      "        \"Repetitions\": 6\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 39,\n",
      "    \"StartDate\": \"2022-02-17\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 68,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 60,\n",
      "        \"Repetitions\": 2\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 69,\n",
      "        \"ExerciseId\": 3,\n",
      "        \"ExerciseName\": \"Deadlift\",\n",
      "        \"Weight\": 105,\n",
      "        \"Repetitions\": 8\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 40,\n",
      "    \"StartDate\": \"2022-03-01\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 70,\n",
      "        \"ExerciseId\": 1,\n",
      "        \"ExerciseName\": \"Squat\",\n",
      "        \"Weight\": 75,\n",
      "        \"Repetitions\": 3\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 71,\n",
      "        \"ExerciseId\": 4,\n",
      "        \"ExerciseName\": \"Hotep\",\n",
      "        \"Weight\": 30,\n",
      "        \"Repetitions\": 4\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 41,\n",
      "    \"StartDate\": \"2022-03-10\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 72,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 50,\n",
      "        \"Repetitions\": 11\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 42,\n",
      "    \"StartDate\": \"2022-03-15\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 73,\n",
      "        \"ExerciseId\": 1,\n",
      "        \"ExerciseName\": \"Squat\",\n",
      "        \"Weight\": 75,\n",
      "        \"Repetitions\": 5\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 74,\n",
      "        \"ExerciseId\": 4,\n",
      "        \"ExerciseName\": \"Hotep\",\n",
      "        \"Weight\": 30,\n",
      "        \"Repetitions\": 5\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 43,\n",
      "    \"StartDate\": \"2022-03-22\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 75,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 60,\n",
      "        \"Repetitions\": 4\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 76,\n",
      "        \"ExerciseId\": 3,\n",
      "        \"ExerciseName\": \"Deadlift\",\n",
      "        \"Weight\": 110,\n",
      "        \"Repetitions\": 4\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 44,\n",
      "    \"StartDate\": \"2022-04-07\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 77,\n",
      "        \"ExerciseId\": 1,\n",
      "        \"ExerciseName\": \"Squat\",\n",
      "        \"Weight\": 75,\n",
      "        \"Repetitions\": 6\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 78,\n",
      "        \"ExerciseId\": 4,\n",
      "        \"ExerciseName\": \"Hotep\",\n",
      "        \"Weight\": 35,\n",
      "        \"Repetitions\": 2\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 45,\n",
      "    \"StartDate\": \"2022-04-21\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 79,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 45,\n",
      "        \"Repetitions\": 10\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 80,\n",
      "        \"ExerciseId\": 3,\n",
      "        \"ExerciseName\": \"Deadlift\",\n",
      "        \"Weight\": 100,\n",
      "        \"Repetitions\": 10\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 46,\n",
      "    \"StartDate\": \"2022-04-26\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 81,\n",
      "        \"ExerciseId\": 1,\n",
      "        \"ExerciseName\": \"Squat\",\n",
      "        \"Weight\": 80,\n",
      "        \"Repetitions\": 3\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 47,\n",
      "    \"StartDate\": \"2022-04-28\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 82,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 60,\n",
      "        \"Repetitions\": 2\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 83,\n",
      "        \"ExerciseId\": 3,\n",
      "        \"ExerciseName\": \"Deadlift\",\n",
      "        \"Weight\": 100,\n",
      "        \"Repetitions\": 5\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 48,\n",
      "    \"StartDate\": \"2022-05-03\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 84,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 55,\n",
      "        \"Repetitions\": 4\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 85,\n",
      "        \"ExerciseId\": 3,\n",
      "        \"ExerciseName\": \"Deadlift\",\n",
      "        \"Weight\": 95,\n",
      "        \"Repetitions\": 7\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 49,\n",
      "    \"StartDate\": \"2022-05-05\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 86,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 55,\n",
      "        \"Repetitions\": 4\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 87,\n",
      "        \"ExerciseId\": 3,\n",
      "        \"ExerciseName\": \"Deadlift\",\n",
      "        \"Weight\": 110,\n",
      "        \"Repetitions\": 7\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 50,\n",
      "    \"StartDate\": \"2022-05-17\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 88,\n",
      "        \"ExerciseId\": 1,\n",
      "        \"ExerciseName\": \"Squat\",\n",
      "        \"Weight\": 60,\n",
      "        \"Repetitions\": 3\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 89,\n",
      "        \"ExerciseId\": 4,\n",
      "        \"ExerciseName\": \"Hotep\",\n",
      "        \"Weight\": 27,\n",
      "        \"Repetitions\": 4\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 51,\n",
      "    \"StartDate\": \"2022-05-19\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 90,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 65,\n",
      "        \"Repetitions\": 1\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 91,\n",
      "        \"ExerciseId\": 3,\n",
      "        \"ExerciseName\": \"Deadlift\",\n",
      "        \"Weight\": 125,\n",
      "        \"Repetitions\": 4\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 52,\n",
      "    \"StartDate\": \"2022-06-07\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 92,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 55,\n",
      "        \"Repetitions\": 4\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 93,\n",
      "        \"ExerciseId\": 3,\n",
      "        \"ExerciseName\": \"Deadlift\",\n",
      "        \"Weight\": 100,\n",
      "        \"Repetitions\": 5\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 53,\n",
      "    \"StartDate\": \"2022-06-14\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 94,\n",
      "        \"ExerciseId\": 1,\n",
      "        \"ExerciseName\": \"Squat\",\n",
      "        \"Weight\": 75,\n",
      "        \"Repetitions\": 2\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 95,\n",
      "        \"ExerciseId\": 4,\n",
      "        \"ExerciseName\": \"Hotep\",\n",
      "        \"Weight\": 31,\n",
      "        \"Repetitions\": 4\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 54,\n",
      "    \"StartDate\": \"2022-06-29\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 96,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 40,\n",
      "        \"Repetitions\": 11\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 55,\n",
      "    \"StartDate\": \"2022-07-07\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 97,\n",
      "        \"ExerciseId\": 1,\n",
      "        \"ExerciseName\": \"Squat\",\n",
      "        \"Weight\": 65,\n",
      "        \"Repetitions\": 5\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 98,\n",
      "        \"ExerciseId\": 4,\n",
      "        \"ExerciseName\": \"Hotep\",\n",
      "        \"Weight\": 30,\n",
      "        \"Repetitions\": 6\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 56,\n",
      "    \"StartDate\": \"2022-07-12\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 99,\n",
      "        \"ExerciseId\": 2,\n",
      "        \"ExerciseName\": \"Bench\",\n",
      "        \"Weight\": 60,\n",
      "        \"Repetitions\": 4\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 100,\n",
      "        \"ExerciseId\": 3,\n",
      "        \"ExerciseName\": \"Deadlift\",\n",
      "        \"Weight\": 100,\n",
      "        \"Repetitions\": 9\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"WorkoutId\": 57,\n",
      "    \"StartDate\": \"2022-07-15\",\n",
      "    \"TopSets\": [\n",
      "      {\n",
      "        \"TopSetId\": 101,\n",
      "        \"ExerciseId\": 1,\n",
      "        \"ExerciseName\": \"Squat\",\n",
      "        \"Weight\": 75,\n",
      "        \"Repetitions\": 6\n",
      "      },\n",
      "      {\n",
      "        \"TopSetId\": 102,\n",
      "        \"ExerciseId\": 4,\n",
      "        \"ExerciseName\": \"Hotep\",\n",
      "        \"Weight\": 35,\n",
      "        \"Repetitions\": 3\n",
      "      }\n",
      "    ]\n",
      "  }\n",
      "]\n"
     ]
    }
   ],
   "source": [
    "print(json.dumps(get_workouts(topsets), indent=2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'ExerciseId': 1, 'ExerciseName': 'Squat'},\n",
       " {'ExerciseId': 2, 'ExerciseName': 'Bench'},\n",
       " {'ExerciseId': 3, 'ExerciseName': 'Deadlift'},\n",
       " {'ExerciseId': 4, 'ExerciseName': 'Hotep'}]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def get_all_exercises_from_topsets(topsets):\n",
    "    exercise_ids = set([t['ExerciseId'] for t in topsets])\n",
    "    exercises = []\n",
    "    for exercise_id in exercise_ids:\n",
    "        exercises.append({\n",
    "            'ExerciseId': exercise_id,\n",
    "            'ExerciseName': next((t['ExerciseName'] for t in topsets if t['ExerciseId'] == exercise_id), 'Unknown')\n",
    "        })\n",
    "    return exercises\n",
    "\n",
    "get_all_exercises_from_topsets(topsets)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Compose functions together to acheive final model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def convert_to_view_model(topsets):\n",
    "    return {\n",
    "        'PersonId': next((t['PersonId'] for t in topsets), -1),\n",
    "        'PersonName': next((t['PersonName'] for t in topsets), -1),\n",
    "        'Exercises': get_all_exercises_from_topsets(topsets),\n",
    "        'Workouts': get_workouts(topsets)\n",
    "    }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\n",
      "  \"PersonId\": 1,\n",
      "  \"PersonName\": \"Gabe\",\n",
      "  \"Exercises\": [\n",
      "    {\n",
      "      \"ExerciseId\": 1,\n",
      "      \"ExerciseName\": \"Squat\"\n",
      "    },\n",
      "    {\n",
      "      \"ExerciseId\": 2,\n",
      "      \"ExerciseName\": \"Bench\"\n",
      "    },\n",
      "    {\n",
      "      \"ExerciseId\": 3,\n",
      "      \"ExerciseName\": \"Deadlift\"\n",
      "    },\n",
      "    {\n",
      "      \"ExerciseId\": 4,\n",
      "      \"ExerciseName\": \"Hotep\"\n",
      "    }\n",
      "  ],\n",
      "  \"Workouts\": [\n",
      "    {\n",
      "      \"WorkoutId\": 35,\n",
      "      \"StartDate\": \"2022-01-13\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 61,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 50,\n",
      "          \"Repetitions\": 8\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 36,\n",
      "      \"StartDate\": \"2022-01-18\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 62,\n",
      "          \"ExerciseId\": 1,\n",
      "          \"ExerciseName\": \"Squat\",\n",
      "          \"Weight\": 55,\n",
      "          \"Repetitions\": 7\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 63,\n",
      "          \"ExerciseId\": 4,\n",
      "          \"ExerciseName\": \"Hotep\",\n",
      "          \"Weight\": 25,\n",
      "          \"Repetitions\": 4\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 37,\n",
      "      \"StartDate\": \"2022-02-08\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 64,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 55,\n",
      "          \"Repetitions\": 5\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 65,\n",
      "          \"ExerciseId\": 3,\n",
      "          \"ExerciseName\": \"Deadlift\",\n",
      "          \"Weight\": 95,\n",
      "          \"Repetitions\": 6\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 38,\n",
      "      \"StartDate\": \"2022-02-15\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 66,\n",
      "          \"ExerciseId\": 1,\n",
      "          \"ExerciseName\": \"Squat\",\n",
      "          \"Weight\": 65,\n",
      "          \"Repetitions\": 3\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 67,\n",
      "          \"ExerciseId\": 4,\n",
      "          \"ExerciseName\": \"Hotep\",\n",
      "          \"Weight\": 25,\n",
      "          \"Repetitions\": 6\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 39,\n",
      "      \"StartDate\": \"2022-02-17\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 68,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 60,\n",
      "          \"Repetitions\": 2\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 69,\n",
      "          \"ExerciseId\": 3,\n",
      "          \"ExerciseName\": \"Deadlift\",\n",
      "          \"Weight\": 105,\n",
      "          \"Repetitions\": 8\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 40,\n",
      "      \"StartDate\": \"2022-03-01\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 70,\n",
      "          \"ExerciseId\": 1,\n",
      "          \"ExerciseName\": \"Squat\",\n",
      "          \"Weight\": 75,\n",
      "          \"Repetitions\": 3\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 71,\n",
      "          \"ExerciseId\": 4,\n",
      "          \"ExerciseName\": \"Hotep\",\n",
      "          \"Weight\": 30,\n",
      "          \"Repetitions\": 4\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 41,\n",
      "      \"StartDate\": \"2022-03-10\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 72,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 50,\n",
      "          \"Repetitions\": 11\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 42,\n",
      "      \"StartDate\": \"2022-03-15\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 73,\n",
      "          \"ExerciseId\": 1,\n",
      "          \"ExerciseName\": \"Squat\",\n",
      "          \"Weight\": 75,\n",
      "          \"Repetitions\": 5\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 74,\n",
      "          \"ExerciseId\": 4,\n",
      "          \"ExerciseName\": \"Hotep\",\n",
      "          \"Weight\": 30,\n",
      "          \"Repetitions\": 5\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 43,\n",
      "      \"StartDate\": \"2022-03-22\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 75,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 60,\n",
      "          \"Repetitions\": 4\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 76,\n",
      "          \"ExerciseId\": 3,\n",
      "          \"ExerciseName\": \"Deadlift\",\n",
      "          \"Weight\": 110,\n",
      "          \"Repetitions\": 4\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 44,\n",
      "      \"StartDate\": \"2022-04-07\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 77,\n",
      "          \"ExerciseId\": 1,\n",
      "          \"ExerciseName\": \"Squat\",\n",
      "          \"Weight\": 75,\n",
      "          \"Repetitions\": 6\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 78,\n",
      "          \"ExerciseId\": 4,\n",
      "          \"ExerciseName\": \"Hotep\",\n",
      "          \"Weight\": 35,\n",
      "          \"Repetitions\": 2\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 45,\n",
      "      \"StartDate\": \"2022-04-21\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 79,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 45,\n",
      "          \"Repetitions\": 10\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 80,\n",
      "          \"ExerciseId\": 3,\n",
      "          \"ExerciseName\": \"Deadlift\",\n",
      "          \"Weight\": 100,\n",
      "          \"Repetitions\": 10\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 46,\n",
      "      \"StartDate\": \"2022-04-26\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 81,\n",
      "          \"ExerciseId\": 1,\n",
      "          \"ExerciseName\": \"Squat\",\n",
      "          \"Weight\": 80,\n",
      "          \"Repetitions\": 3\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 47,\n",
      "      \"StartDate\": \"2022-04-28\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 82,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 60,\n",
      "          \"Repetitions\": 2\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 83,\n",
      "          \"ExerciseId\": 3,\n",
      "          \"ExerciseName\": \"Deadlift\",\n",
      "          \"Weight\": 100,\n",
      "          \"Repetitions\": 5\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 48,\n",
      "      \"StartDate\": \"2022-05-03\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 84,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 55,\n",
      "          \"Repetitions\": 4\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 85,\n",
      "          \"ExerciseId\": 3,\n",
      "          \"ExerciseName\": \"Deadlift\",\n",
      "          \"Weight\": 95,\n",
      "          \"Repetitions\": 7\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 49,\n",
      "      \"StartDate\": \"2022-05-05\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 86,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 55,\n",
      "          \"Repetitions\": 4\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 87,\n",
      "          \"ExerciseId\": 3,\n",
      "          \"ExerciseName\": \"Deadlift\",\n",
      "          \"Weight\": 110,\n",
      "          \"Repetitions\": 7\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 50,\n",
      "      \"StartDate\": \"2022-05-17\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 88,\n",
      "          \"ExerciseId\": 1,\n",
      "          \"ExerciseName\": \"Squat\",\n",
      "          \"Weight\": 60,\n",
      "          \"Repetitions\": 3\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 89,\n",
      "          \"ExerciseId\": 4,\n",
      "          \"ExerciseName\": \"Hotep\",\n",
      "          \"Weight\": 27,\n",
      "          \"Repetitions\": 4\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 51,\n",
      "      \"StartDate\": \"2022-05-19\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 90,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 65,\n",
      "          \"Repetitions\": 1\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 91,\n",
      "          \"ExerciseId\": 3,\n",
      "          \"ExerciseName\": \"Deadlift\",\n",
      "          \"Weight\": 125,\n",
      "          \"Repetitions\": 4\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 52,\n",
      "      \"StartDate\": \"2022-06-07\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 92,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 55,\n",
      "          \"Repetitions\": 4\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 93,\n",
      "          \"ExerciseId\": 3,\n",
      "          \"ExerciseName\": \"Deadlift\",\n",
      "          \"Weight\": 100,\n",
      "          \"Repetitions\": 5\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 53,\n",
      "      \"StartDate\": \"2022-06-14\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 94,\n",
      "          \"ExerciseId\": 1,\n",
      "          \"ExerciseName\": \"Squat\",\n",
      "          \"Weight\": 75,\n",
      "          \"Repetitions\": 2\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 95,\n",
      "          \"ExerciseId\": 4,\n",
      "          \"ExerciseName\": \"Hotep\",\n",
      "          \"Weight\": 31,\n",
      "          \"Repetitions\": 4\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 54,\n",
      "      \"StartDate\": \"2022-06-29\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 96,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 40,\n",
      "          \"Repetitions\": 11\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 55,\n",
      "      \"StartDate\": \"2022-07-07\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 97,\n",
      "          \"ExerciseId\": 1,\n",
      "          \"ExerciseName\": \"Squat\",\n",
      "          \"Weight\": 65,\n",
      "          \"Repetitions\": 5\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 98,\n",
      "          \"ExerciseId\": 4,\n",
      "          \"ExerciseName\": \"Hotep\",\n",
      "          \"Weight\": 30,\n",
      "          \"Repetitions\": 6\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 56,\n",
      "      \"StartDate\": \"2022-07-12\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 99,\n",
      "          \"ExerciseId\": 2,\n",
      "          \"ExerciseName\": \"Bench\",\n",
      "          \"Weight\": 60,\n",
      "          \"Repetitions\": 4\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 100,\n",
      "          \"ExerciseId\": 3,\n",
      "          \"ExerciseName\": \"Deadlift\",\n",
      "          \"Weight\": 100,\n",
      "          \"Repetitions\": 9\n",
      "        }\n",
      "      ]\n",
      "    },\n",
      "    {\n",
      "      \"WorkoutId\": 57,\n",
      "      \"StartDate\": \"2022-07-15\",\n",
      "      \"TopSets\": [\n",
      "        {\n",
      "          \"TopSetId\": 101,\n",
      "          \"ExerciseId\": 1,\n",
      "          \"ExerciseName\": \"Squat\",\n",
      "          \"Weight\": 75,\n",
      "          \"Repetitions\": 6\n",
      "        },\n",
      "        {\n",
      "          \"TopSetId\": 102,\n",
      "          \"ExerciseId\": 4,\n",
      "          \"ExerciseName\": \"Hotep\",\n",
      "          \"Weight\": 35,\n",
      "          \"Repetitions\": 3\n",
      "        }\n",
      "      ]\n",
      "    }\n",
      "  ]\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "print(json.dumps(convert_to_view_model(topsets), indent=2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Dashboard page"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "all_topsets =query_db(\"\"\"\n",
    "    SELECT \n",
    "        P.PersonId, \n",
    "        P.Name AS PersonName, \n",
    "        W.WorkoutId, \n",
    "        W.StartDate, \n",
    "        T.TopSetId, \n",
    "        E.ExerciseId, \n",
    "        E.Name AS ExerciseName, \n",
    "        T.Repetitions, \n",
    "        T.Weight\n",
    "    FROM Person P\n",
    "         LEFT JOIN Workout W ON P.PersonId=W.PersonId\n",
    "         LEFT JOIN TopSet T ON W.WorkoutId=T.WorkoutId\n",
    "         LEFT JOIN Exercise E ON T.ExerciseId=E.ExerciseId\"\"\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_people(topsets):\n",
    "    # Get all unique workout_ids (No duplicates)\n",
    "    people_ids = set([t['PersonId'] for t in topsets])\n",
    "\n",
    "    # Group topsets into workouts\n",
    "    people = []\n",
    "    for person_id in people_ids:\n",
    "        workouts_for_person = [t for t in topsets if t['PersonId'] == person_id]\n",
    "        people.append({\n",
    "            'PersonId': person_id,\n",
    "            'PersonName': workouts_for_person[0]['PersonName'],\n",
    "            'Workouts': get_workouts(workouts_for_person)\n",
    "        })\n",
    "    return people"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[\n",
      "  {\n",
      "    \"PersonId\": 1,\n",
      "    \"PersonName\": \"Gabe\",\n",
      "    \"Workouts\": [\n",
      "      {\n",
      "        \"WorkoutId\": 35,\n",
      "        \"StartDate\": \"2022-01-13\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 61,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 50,\n",
      "            \"Repetitions\": 8\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 36,\n",
      "        \"StartDate\": \"2022-01-18\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 62,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 7\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 63,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 25,\n",
      "            \"Repetitions\": 4\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 37,\n",
      "        \"StartDate\": \"2022-02-08\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 64,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 5\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 65,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 95,\n",
      "            \"Repetitions\": 6\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 38,\n",
      "        \"StartDate\": \"2022-02-15\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 66,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 65,\n",
      "            \"Repetitions\": 3\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 67,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 25,\n",
      "            \"Repetitions\": 6\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 39,\n",
      "        \"StartDate\": \"2022-02-17\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 68,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 60,\n",
      "            \"Repetitions\": 2\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 69,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 105,\n",
      "            \"Repetitions\": 8\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 40,\n",
      "        \"StartDate\": \"2022-03-01\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 70,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 75,\n",
      "            \"Repetitions\": 3\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 71,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 30,\n",
      "            \"Repetitions\": 4\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 41,\n",
      "        \"StartDate\": \"2022-03-10\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 72,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 50,\n",
      "            \"Repetitions\": 11\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 42,\n",
      "        \"StartDate\": \"2022-03-15\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 73,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 75,\n",
      "            \"Repetitions\": 5\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 74,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 30,\n",
      "            \"Repetitions\": 5\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 43,\n",
      "        \"StartDate\": \"2022-03-22\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 75,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 60,\n",
      "            \"Repetitions\": 4\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 76,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 110,\n",
      "            \"Repetitions\": 4\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 44,\n",
      "        \"StartDate\": \"2022-04-07\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 77,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 75,\n",
      "            \"Repetitions\": 6\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 78,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 35,\n",
      "            \"Repetitions\": 2\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 45,\n",
      "        \"StartDate\": \"2022-04-21\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 79,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 45,\n",
      "            \"Repetitions\": 10\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 80,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 100,\n",
      "            \"Repetitions\": 10\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 46,\n",
      "        \"StartDate\": \"2022-04-26\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 81,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 80,\n",
      "            \"Repetitions\": 3\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 47,\n",
      "        \"StartDate\": \"2022-04-28\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 82,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 60,\n",
      "            \"Repetitions\": 2\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 83,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 100,\n",
      "            \"Repetitions\": 5\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 48,\n",
      "        \"StartDate\": \"2022-05-03\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 84,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 4\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 85,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 95,\n",
      "            \"Repetitions\": 7\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 49,\n",
      "        \"StartDate\": \"2022-05-05\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 86,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 4\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 87,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 110,\n",
      "            \"Repetitions\": 7\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 50,\n",
      "        \"StartDate\": \"2022-05-17\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 88,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 60,\n",
      "            \"Repetitions\": 3\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 89,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 27,\n",
      "            \"Repetitions\": 4\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 51,\n",
      "        \"StartDate\": \"2022-05-19\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 90,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 65,\n",
      "            \"Repetitions\": 1\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 91,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 125,\n",
      "            \"Repetitions\": 4\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 52,\n",
      "        \"StartDate\": \"2022-06-07\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 92,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 4\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 93,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 100,\n",
      "            \"Repetitions\": 5\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 53,\n",
      "        \"StartDate\": \"2022-06-14\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 94,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 75,\n",
      "            \"Repetitions\": 2\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 95,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 31,\n",
      "            \"Repetitions\": 4\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 54,\n",
      "        \"StartDate\": \"2022-06-29\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 96,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 40,\n",
      "            \"Repetitions\": 11\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 55,\n",
      "        \"StartDate\": \"2022-07-07\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 97,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 65,\n",
      "            \"Repetitions\": 5\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 98,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 30,\n",
      "            \"Repetitions\": 6\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 56,\n",
      "        \"StartDate\": \"2022-07-12\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 99,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 60,\n",
      "            \"Repetitions\": 4\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 100,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 100,\n",
      "            \"Repetitions\": 9\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 57,\n",
      "        \"StartDate\": \"2022-07-15\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 101,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 75,\n",
      "            \"Repetitions\": 6\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 102,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 35,\n",
      "            \"Repetitions\": 3\n",
      "          }\n",
      "        ]\n",
      "      }\n",
      "    ]\n",
      "  },\n",
      "  {\n",
      "    \"PersonId\": 2,\n",
      "    \"PersonName\": \"Michael\",\n",
      "    \"Workouts\": [\n",
      "      {\n",
      "        \"WorkoutId\": 10,\n",
      "        \"StartDate\": \"2022-01-13\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 13,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 45,\n",
      "            \"Repetitions\": 7\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 14,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 115,\n",
      "            \"Repetitions\": 5\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 11,\n",
      "        \"StartDate\": \"2022-01-18\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 15,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 10\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 16,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 30,\n",
      "            \"Repetitions\": 10\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 12,\n",
      "        \"StartDate\": \"2022-01-20\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 17,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 50,\n",
      "            \"Repetitions\": 3\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 18,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 115,\n",
      "            \"Repetitions\": 10\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 13,\n",
      "        \"StartDate\": \"2022-01-25\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 19,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 6,\n",
      "            \"Repetitions\": 65\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 20,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 35,\n",
      "            \"Repetitions\": 7\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 15,\n",
      "        \"StartDate\": \"2022-01-27\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 21,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 1\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 22,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 125,\n",
      "            \"Repetitions\": 5\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 16,\n",
      "        \"StartDate\": \"2022-02-01\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 23,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 75,\n",
      "            \"Repetitions\": 5\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 24,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 40,\n",
      "            \"Repetitions\": 5\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 17,\n",
      "        \"StartDate\": \"2022-02-03\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 25,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 2\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 26,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 135,\n",
      "            \"Repetitions\": 3\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 18,\n",
      "        \"StartDate\": \"2022-02-08\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 27,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 80,\n",
      "            \"Repetitions\": 2\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 28,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 50,\n",
      "            \"Repetitions\": 3\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 19,\n",
      "        \"StartDate\": \"2022-02-15\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 29,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 80,\n",
      "            \"Repetitions\": 5\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 30,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 45,\n",
      "            \"Repetitions\": 3\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 20,\n",
      "        \"StartDate\": \"2022-02-17\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 31,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 60,\n",
      "            \"Repetitions\": 1\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 32,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 150,\n",
      "            \"Repetitions\": 2\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 21,\n",
      "        \"StartDate\": \"2022-03-01\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 33,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 75,\n",
      "            \"Repetitions\": 7\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 34,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 45,\n",
      "            \"Repetitions\": 4\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 22,\n",
      "        \"StartDate\": \"2022-03-10\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 35,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 45,\n",
      "            \"Repetitions\": 10\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 36,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 100,\n",
      "            \"Repetitions\": 10\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 23,\n",
      "        \"StartDate\": \"2022-03-15\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 37,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 2\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 38,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 120,\n",
      "            \"Repetitions\": 2\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 24,\n",
      "        \"StartDate\": \"2022-03-22\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 39,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 60,\n",
      "            \"Repetitions\": 5\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 40,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 40,\n",
      "            \"Repetitions\": 5\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 25,\n",
      "        \"StartDate\": \"2022-04-12\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 41,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 1\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 42,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 130,\n",
      "            \"Repetitions\": 1\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 26,\n",
      "        \"StartDate\": \"2022-04-21\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 43,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 60,\n",
      "            \"Repetitions\": 4\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 44,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 50,\n",
      "            \"Repetitions\": 3\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 27,\n",
      "        \"StartDate\": \"2022-04-26\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 45,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 2\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 46,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 125,\n",
      "            \"Repetitions\": 1\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 28,\n",
      "        \"StartDate\": \"2022-04-28\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 47,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 80,\n",
      "            \"Repetitions\": 2\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 48,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 42,\n",
      "            \"Repetitions\": 2\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 29,\n",
      "        \"StartDate\": \"2022-05-03\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 49,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 47,\n",
      "            \"Repetitions\": 3\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 50,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 130,\n",
      "            \"Repetitions\": 2\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 30,\n",
      "        \"StartDate\": \"2022-05-05\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 51,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 80,\n",
      "            \"Repetitions\": 5\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 52,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 44,\n",
      "            \"Repetitions\": 4\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 31,\n",
      "        \"StartDate\": \"2022-05-17\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 53,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 3\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 54,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 140,\n",
      "            \"Repetitions\": 2\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 32,\n",
      "        \"StartDate\": \"2022-05-19\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 55,\n",
      "            \"ExerciseId\": 2,\n",
      "            \"ExerciseName\": \"Bench\",\n",
      "            \"Weight\": 55,\n",
      "            \"Repetitions\": 2\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 56,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 100,\n",
      "            \"Repetitions\": 5\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 33,\n",
      "        \"StartDate\": \"2022-06-07\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 57,\n",
      "            \"ExerciseId\": 1,\n",
      "            \"ExerciseName\": \"Squat\",\n",
      "            \"Weight\": 85,\n",
      "            \"Repetitions\": 3\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 58,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 45,\n",
      "            \"Repetitions\": 5\n",
      "          }\n",
      "        ]\n",
      "      },\n",
      "      {\n",
      "        \"WorkoutId\": 34,\n",
      "        \"StartDate\": \"2022-06-14\",\n",
      "        \"TopSets\": [\n",
      "          {\n",
      "            \"TopSetId\": 59,\n",
      "            \"ExerciseId\": 3,\n",
      "            \"ExerciseName\": \"Deadlift\",\n",
      "            \"Weight\": 120,\n",
      "            \"Repetitions\": 6\n",
      "          },\n",
      "          {\n",
      "            \"TopSetId\": 60,\n",
      "            \"ExerciseId\": 4,\n",
      "            \"ExerciseName\": \"Hotep\",\n",
      "            \"Weight\": 45,\n",
      "            \"Repetitions\": 5\n",
      "          }\n",
      "        ]\n",
      "      }\n",
      "    ]\n",
      "  }\n",
      "]\n"
     ]
    }
   ],
   "source": [
    "print(json.dumps(get_people(all_topsets), indent=2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "gabe_topsts = [t for t in topsets if t['PersonId'] == 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "gabe_exercises = get_all_exercises_from_topsets(gabe_topsts)\n",
    "gabe_rep_maxes = []\n",
    "for e in gabe_exercises:\n",
    "    exercise_topsets = [t for t in gabe_topsts if t['ExerciseId'] == e['ExerciseId']]\n",
    "    set_reps = set([t['Repetitions'] for t in exercise_topsets])\n",
    "\n",
    "    topsets_for_exercise = []\n",
    "    for rep in set_reps:\n",
    "        reps = [t for t in exercise_topsets if t['Repetitions'] == rep]\n",
    "        max_weight = max([t['Weight'] for t in reps])\n",
    "        max_topset_for_rep = [t for t in reps if t['Weight'] == max_weight]\n",
    "        topsets_for_exercise.append({\n",
    "            'StartDate': max_topset_for_rep[0]['StartDate'],\n",
    "            'Repetitions': rep,\n",
    "            'Weight': max_weight\n",
    "        })\n",
    "    \n",
    "    topsets_for_exercise.sort(key=lambda x: datetime.strptime(x['StartDate'],\"%Y-%m-%d\"))\n",
    "    \n",
    "    gabe_rep_maxes.append({\n",
    "            'ExerciseId': e['ExerciseId'],\n",
    "            'ExerciseName': e['ExerciseName'],\n",
    "            'RepMaxes': topsets_for_exercise,\n",
    "        })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_rep_maxes_for_person(person_topsets):\n",
    "    person_exercises = get_all_exercises_from_topsets(person_topsets)\n",
    "\n",
    "    rep_maxes_in_exercises = []\n",
    "    for e in person_exercises:\n",
    "        exercise_topsets = [\n",
    "            t for t in person_topsets if t['ExerciseId'] == e['ExerciseId']]\n",
    "        set_reps = set([t['Repetitions'] for t in exercise_topsets])\n",
    "\n",
    "        topsets_for_exercise = []\n",
    "        for rep in set_reps:\n",
    "            reps = [t for t in exercise_topsets if t['Repetitions'] == rep]\n",
    "            max_weight = max([t['Weight'] for t in reps])\n",
    "            max_topset_for_rep = [t for t in reps if t['Weight'] == max_weight]\n",
    "            topsets_for_exercise.append({\n",
    "                'StartDate': max_topset_for_rep[0]['StartDate'],\n",
    "                'Repetitions': rep,\n",
    "                'Weight': max_weight\n",
    "            })\n",
    "\n",
    "        topsets_for_exercise.sort(\n",
    "            key=lambda x: datetime.strptime(x['StartDate'], \"%Y-%m-%d\"))\n",
    "\n",
    "        rep_maxes_in_exercises.append({\n",
    "            'ExerciseId': e['ExerciseId'],\n",
    "            'ExerciseName': e['ExerciseName'],\n",
    "            'RepMaxes': topsets_for_exercise,\n",
    "        })\n",
    "    return rep_maxes_in_exercises\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'ExerciseId': 1,\n",
       "  'ExerciseName': 'Squat',\n",
       "  'RepMaxes': [{'StartDate': '2022-01-18', 'Repetitions': 7, 'Weight': 55},\n",
       "   {'StartDate': '2022-03-15', 'Repetitions': 5, 'Weight': 75},\n",
       "   {'StartDate': '2022-04-07', 'Repetitions': 6, 'Weight': 75},\n",
       "   {'StartDate': '2022-04-26', 'Repetitions': 3, 'Weight': 80},\n",
       "   {'StartDate': '2022-06-14', 'Repetitions': 2, 'Weight': 75}]},\n",
       " {'ExerciseId': 2,\n",
       "  'ExerciseName': 'Bench',\n",
       "  'RepMaxes': [{'StartDate': '2022-01-13', 'Repetitions': 8, 'Weight': 50},\n",
       "   {'StartDate': '2022-02-08', 'Repetitions': 5, 'Weight': 55},\n",
       "   {'StartDate': '2022-02-17', 'Repetitions': 2, 'Weight': 60},\n",
       "   {'StartDate': '2022-03-10', 'Repetitions': 11, 'Weight': 50},\n",
       "   {'StartDate': '2022-03-22', 'Repetitions': 4, 'Weight': 60},\n",
       "   {'StartDate': '2022-04-21', 'Repetitions': 10, 'Weight': 45},\n",
       "   {'StartDate': '2022-05-19', 'Repetitions': 1, 'Weight': 65}]},\n",
       " {'ExerciseId': 3,\n",
       "  'ExerciseName': 'Deadlift',\n",
       "  'RepMaxes': [{'StartDate': '2022-02-08', 'Repetitions': 6, 'Weight': 95},\n",
       "   {'StartDate': '2022-02-17', 'Repetitions': 8, 'Weight': 105},\n",
       "   {'StartDate': '2022-04-21', 'Repetitions': 10, 'Weight': 100},\n",
       "   {'StartDate': '2022-04-28', 'Repetitions': 5, 'Weight': 100},\n",
       "   {'StartDate': '2022-05-05', 'Repetitions': 7, 'Weight': 110},\n",
       "   {'StartDate': '2022-05-19', 'Repetitions': 4, 'Weight': 125},\n",
       "   {'StartDate': '2022-07-12', 'Repetitions': 9, 'Weight': 100}]},\n",
       " {'ExerciseId': 4,\n",
       "  'ExerciseName': 'Hotep',\n",
       "  'RepMaxes': [{'StartDate': '2022-03-15', 'Repetitions': 5, 'Weight': 30},\n",
       "   {'StartDate': '2022-04-07', 'Repetitions': 2, 'Weight': 35},\n",
       "   {'StartDate': '2022-06-14', 'Repetitions': 4, 'Weight': 31},\n",
       "   {'StartDate': '2022-07-07', 'Repetitions': 6, 'Weight': 30},\n",
       "   {'StartDate': '2022-07-15', 'Repetitions': 3, 'Weight': 35}]}]"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_rep_maxes_for_person(gabe_topsts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_people_and_exercise_rep_maxes(topsets):\n",
    "    # Get all unique workout_ids (No duplicates)\n",
    "    people_ids = set([t['PersonId'] for t in topsets])\n",
    "\n",
    "    # Group topsets into workouts\n",
    "    people = []\n",
    "    for person_id in people_ids:\n",
    "        workouts_for_person = [t for t in topsets if t['PersonId'] == person_id]\n",
    "        people.append({\n",
    "            'PersonId': person_id,\n",
    "            'PersonName': workouts_for_person[0]['PersonName'],\n",
    "            'Exercises': get_rep_maxes_for_person(workouts_for_person)\n",
    "        })\n",
    "    return people"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'PersonId': 1,\n",
       "  'PersonName': 'Gabe',\n",
       "  'Exercises': [{'ExerciseId': 1,\n",
       "    'ExerciseName': 'Squat',\n",
       "    'RepMaxes': [{'StartDate': '2022-01-18', 'Repetitions': 7, 'Weight': 55},\n",
       "     {'StartDate': '2022-03-15', 'Repetitions': 5, 'Weight': 75},\n",
       "     {'StartDate': '2022-04-07', 'Repetitions': 6, 'Weight': 75},\n",
       "     {'StartDate': '2022-04-26', 'Repetitions': 3, 'Weight': 80},\n",
       "     {'StartDate': '2022-06-14', 'Repetitions': 2, 'Weight': 75}]},\n",
       "   {'ExerciseId': 2,\n",
       "    'ExerciseName': 'Bench',\n",
       "    'RepMaxes': [{'StartDate': '2022-01-13', 'Repetitions': 8, 'Weight': 50},\n",
       "     {'StartDate': '2022-02-08', 'Repetitions': 5, 'Weight': 55},\n",
       "     {'StartDate': '2022-02-17', 'Repetitions': 2, 'Weight': 60},\n",
       "     {'StartDate': '2022-03-10', 'Repetitions': 11, 'Weight': 50},\n",
       "     {'StartDate': '2022-03-22', 'Repetitions': 4, 'Weight': 60},\n",
       "     {'StartDate': '2022-04-21', 'Repetitions': 10, 'Weight': 45},\n",
       "     {'StartDate': '2022-05-19', 'Repetitions': 1, 'Weight': 65}]},\n",
       "   {'ExerciseId': 3,\n",
       "    'ExerciseName': 'Deadlift',\n",
       "    'RepMaxes': [{'StartDate': '2022-02-08', 'Repetitions': 6, 'Weight': 95},\n",
       "     {'StartDate': '2022-02-17', 'Repetitions': 8, 'Weight': 105},\n",
       "     {'StartDate': '2022-04-21', 'Repetitions': 10, 'Weight': 100},\n",
       "     {'StartDate': '2022-04-28', 'Repetitions': 5, 'Weight': 100},\n",
       "     {'StartDate': '2022-05-05', 'Repetitions': 7, 'Weight': 110},\n",
       "     {'StartDate': '2022-05-19', 'Repetitions': 4, 'Weight': 125},\n",
       "     {'StartDate': '2022-07-12', 'Repetitions': 9, 'Weight': 100}]},\n",
       "   {'ExerciseId': 4,\n",
       "    'ExerciseName': 'Hotep',\n",
       "    'RepMaxes': [{'StartDate': '2022-03-15', 'Repetitions': 5, 'Weight': 30},\n",
       "     {'StartDate': '2022-04-07', 'Repetitions': 2, 'Weight': 35},\n",
       "     {'StartDate': '2022-06-14', 'Repetitions': 4, 'Weight': 31},\n",
       "     {'StartDate': '2022-07-07', 'Repetitions': 6, 'Weight': 30},\n",
       "     {'StartDate': '2022-07-15', 'Repetitions': 3, 'Weight': 35}]}]},\n",
       " {'PersonId': 2,\n",
       "  'PersonName': 'Michael',\n",
       "  'Exercises': [{'ExerciseId': 1,\n",
       "    'ExerciseName': 'Squat',\n",
       "    'RepMaxes': [{'StartDate': '2022-01-18', 'Repetitions': 10, 'Weight': 55},\n",
       "     {'StartDate': '2022-01-25', 'Repetitions': 65, 'Weight': 6},\n",
       "     {'StartDate': '2022-02-08', 'Repetitions': 2, 'Weight': 80},\n",
       "     {'StartDate': '2022-02-15', 'Repetitions': 5, 'Weight': 80},\n",
       "     {'StartDate': '2022-03-01', 'Repetitions': 7, 'Weight': 75},\n",
       "     {'StartDate': '2022-04-21', 'Repetitions': 4, 'Weight': 60},\n",
       "     {'StartDate': '2022-06-07', 'Repetitions': 3, 'Weight': 85}]},\n",
       "   {'ExerciseId': 2,\n",
       "    'ExerciseName': 'Bench',\n",
       "    'RepMaxes': [{'StartDate': '2022-01-13', 'Repetitions': 7, 'Weight': 45},\n",
       "     {'StartDate': '2022-02-03', 'Repetitions': 2, 'Weight': 55},\n",
       "     {'StartDate': '2022-02-17', 'Repetitions': 1, 'Weight': 60},\n",
       "     {'StartDate': '2022-03-10', 'Repetitions': 10, 'Weight': 45},\n",
       "     {'StartDate': '2022-03-22', 'Repetitions': 5, 'Weight': 40},\n",
       "     {'StartDate': '2022-05-17', 'Repetitions': 3, 'Weight': 55}]},\n",
       "   {'ExerciseId': 3,\n",
       "    'ExerciseName': 'Deadlift',\n",
       "    'RepMaxes': [{'StartDate': '2022-01-20', 'Repetitions': 10, 'Weight': 115},\n",
       "     {'StartDate': '2022-01-27', 'Repetitions': 5, 'Weight': 125},\n",
       "     {'StartDate': '2022-02-03', 'Repetitions': 3, 'Weight': 135},\n",
       "     {'StartDate': '2022-02-17', 'Repetitions': 2, 'Weight': 150},\n",
       "     {'StartDate': '2022-04-12', 'Repetitions': 1, 'Weight': 130},\n",
       "     {'StartDate': '2022-06-14', 'Repetitions': 6, 'Weight': 120}]},\n",
       "   {'ExerciseId': 4,\n",
       "    'ExerciseName': 'Hotep',\n",
       "    'RepMaxes': [{'StartDate': '2022-01-18', 'Repetitions': 10, 'Weight': 30},\n",
       "     {'StartDate': '2022-01-25', 'Repetitions': 7, 'Weight': 35},\n",
       "     {'StartDate': '2022-02-15', 'Repetitions': 3, 'Weight': 45},\n",
       "     {'StartDate': '2022-03-01', 'Repetitions': 4, 'Weight': 45},\n",
       "     {'StartDate': '2022-04-28', 'Repetitions': 2, 'Weight': 42},\n",
       "     {'StartDate': '2022-06-07', 'Repetitions': 5, 'Weight': 45}]}]}]"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "get_people_and_exercise_rep_maxes(all_topsets)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.9.6 64-bit",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "63076e477759601ac1c90dd52b6ecb6aedfcfea91f89ed7c8d6b0b077f7912d7"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
