'Return a list of video, exercise, and quiz log PlaylistProgressDetail
objects associated with a specific user and playlist ID.'

@classmethod
def user_progress_detail(cls, user_id, playlist_id, language=None):

    user = FacilityUser.objects.get(id=user_id)
    playlist = get_topic_node(content_id=playlist_id)
    (pl_video_ids, pl_exercise_ids) = cls.get_playlist_entry_ids(playlist)
    (user_vid_logs, user_ex_logs) = cls.get_user_logs(user, pl_video_ids, pl_exercise_ids)
    progress_details = list()
    for leaf_node in get_topic_nodes(parent=playlist_id, language=language):
        entity_id = leaf_node.get('id')
        kind = leaf_node.get('kind')
        status = 'notstarted'
        score = 0
        if (kind == 'Video'):
            vid_log = next((vid_log for vid_log in user_vid_logs if (vid_log['video_id'] == entity_id)), None)
            if vid_log:
                if vid_log.get('complete'):
                    status = 'complete'
                elif vid_log.get('total_seconds_watched'):
                    status = 'inprogress'
                score = int(((float(vid_log.get('points')) / float(750)) * 100))
        elif (kind == 'Exercise'):
            ex_log = next((ex_log for ex_log in user_ex_logs if (ex_log['exercise_id'] == entity_id)), None)
            if ex_log:
                if ex_log.get('struggling'):
                    status = 'struggling'
                elif ex_log.get('complete'):
                    status = 'complete'
                elif ex_log.get('attempts'):
                    status = 'inprogress'
                score = ex_log.get('streak_progress')
        progress_details.append(PlaylistProgressDetail(id=entity_id, title=leaf_node['title'], kind=kind, status=status, score=score, path=leaf_node['path']))
    return progress_details
