Ejemplo n.º 1
0
def get_recommended_subjects_route(request):
    db_conn = request['db_conn']
    subjects = get_recommended_subjects(db_conn)
    if not subjects:
        return abort(404, '44bN2oD3TuOWc8wrgRmeeA')
    return 200, {
        'subjects': [deliver_subject(subject) for subject in subjects]
    }
Ejemplo n.º 2
0
def get_subject_versions_route(request, subject_id):
    """
  Get subject versions given an ID. Paginates.
  """

    db_conn = request['db_conn']
    versions = list_one_subject_versions(db_conn, subject_id)
    return 200, {
        'versions':
        [deliver_subject(version, access='view') for version in versions]
    }
Ejemplo n.º 3
0
def get_my_recently_created_subjects_route(request):
    """
  Get the subjects the user most recently created.
  """

    current_user = get_current_user(request)
    if not current_user:
        return abort(401, 'MEnwdloNQLWEVnZNT1YRFg')
    db_conn = request['db_conn']
    subjects = list_my_recently_created_subjects(db_conn, current_user['id'])
    return 200, {
        'subjects': [deliver_subject(subject) for subject in subjects],
    }
Ejemplo n.º 4
0
def list_subjects_route(request):
    """
  Return a collection of subjects by `entity_id`.
  """

    db_conn = request['db_conn']
    entity_ids = request['params'].get('entity_ids')
    if not entity_ids:
        return abort(404, 'COhZEG0GTW6L2bPh6AYsfw')
    entity_ids = entity_ids.split(',')
    subjects = list_latest_accepted_subjects(db_conn, entity_ids)
    if not subjects:
        return abort(404, 'ZlLFtBwdS-Sj49ASUoGPZw')
    return 200, {
        'subjects': [deliver_subject(subject, 'view') for subject in subjects]
    }
Ejemplo n.º 5
0
def get_subject_route(request, subject_id):
    """
  Get a specific subject given an ID.
  """

    db_conn = request['db_conn']
    subject = get_latest_accepted_subject(db_conn, subject_id)
    if not subject:
        return abort(404, 'pY3NrIXFTuaxy2F0dnf7Cg')
    # TODO-2 SPLITUP create new endpoints for these instead
    units = list_units_in_subject_recursive(db_conn, subject)
    return 200, {
        'subject': deliver_subject(subject),
        # TODO-3 subject parameters
        'units': [deliver_unit(unit) for unit in units],
    }
Ejemplo n.º 6
0
def create_new_subject_version_route(request):
    """
  Create a new subject version for a brand new subject.
  """

    current_user = get_current_user(request)
    if not current_user:
        return abort(401, 'TFsImo88TtuYyfYPq4eDwg')
    db_conn = request['db_conn']
    data = deepcopy(request['params'])
    if 'entity_id' in data:
        return abort(403, 'HoZHBw0kTfe87HgWZZJ2tg')
    data['user_id'] = current_user['id']
    subject, errors = insert_subject(db_conn, data)
    if errors:
        return 400, {
            'errors': errors,
            'ref': 'niK3wz6xQn-0pDUzK1T59w',
        }
    return 200, {'version': deliver_subject(subject, 'view')}
Ejemplo n.º 7
0
def get_unit_route(request, unit_id):
    """
  Get a specific unit given an ID.
  """

    db_conn = request['db_conn']
    unit = get_latest_accepted_unit(db_conn, unit_id)
    if not unit:
        return abort(404, '3UyybCLYQwW_kHO1AumIuA')
    # TODO-2 SPLITUP create new endpoints for these instead
    requires = list_required_units(db_conn, unit_id)
    required_by = list_required_by_units(db_conn, unit_id)
    subjects = list_subjects_by_unit_flat(db_conn, unit_id)
    return 200, {
        'unit': deliver_unit(unit),
        # TODO-3 unit parameters
        'requires': [deliver_unit(require) for require in requires],
        'required_by': [deliver_unit(require) for require in required_by],
        'belongs_to': [deliver_subject(subject) for subject in subjects],
    }
Ejemplo n.º 8
0
def create_existing_subject_version_route(request, subject_id):
    """
  Create a new subject version for an existing subject.
  """

    current_user = get_current_user(request)
    if not current_user:
        return abort(401, 'h5Y9A96sThqLJV-4tMuf3A')
    db_conn = request['db_conn']
    next_data = deepcopy(request['params'])
    next_data['entity_id'] = subject_id
    next_data['user_id'] = current_user['id']
    current_data = get_latest_accepted_subject(db_conn, subject_id)
    if not current_data:
        return abort(404, '4upY7gTvQWSKJwgi0rhBQg')
    subject, errors = insert_subject_version(db_conn, current_data, next_data)
    if errors:
        return 400, {
            'errors': errors,
            'ref': 'QYUbgqfTQk2dXMmOC4DBSA',
        }
    return 200, {'version': deliver_subject(subject, 'view')}
Ejemplo n.º 9
0
def list_user_subjects_route(request, user_id):
  """
  Get the list of subjects the user has added.

  NEXT STATE
  GET Choose Subject
    -> POST Choose Subject
  """

  db_conn = request['db_conn']
  current_user = get_current_user(request)
  # Get the user in question
  if current_user and current_user['id'] == convert_slug_to_uuid(user_id):
    user = current_user
  else:
    user = get_user(db_conn, {'id': user_id})
    if not user:
      return abort(404, 'MhNh85CERQe6Zgv-qRO6Zg')
    if user['settings']['view_subjects'] != 'public':
      return abort(403, 'TcKwVsp9Q6WAkJSV-QKuSQ')
  params = request['params']
  user_subjects = list_user_subjects_entity(db_conn, user_id, params)
  response = {
    'subjects': [
      deliver_subject(subject)
      for subject in user_subjects
    ]
  }
  if current_user == user:
    next_ = {
      'method': 'POST',
      'path': '/s/users/{user_id}/subjects/{subject_id}'.format(
        user_id=current_user['id'],
        subject_id='{subject_id}'
      ),
    }
    set_learning_context(current_user, next=next_)
    response['next'] = next_
  return 200, response
Ejemplo n.º 10
0
def get_subject_units_route(request, subject_id):
    """
  Present a small number of units the learner can choose from.

  NEXT STATE
  GET Choose Unit
    -> POST Choose Unit
  """

    db_conn = request['db_conn']
    # TODO-3 simplify this method. should it be part of the models?
    current_user = get_current_user(request)
    if not current_user:
        return abort(401, 'p_wleq0FRQ2HEuHKOJIb7Q')
    context = get_learning_context(current_user)
    next_ = {
        'method':
        'POST',
        'path':
        '/s/subjects/{subject_id}/units/{unit_id}'.format(
            subject_id=context.get('subject', {}).get('entity_id'),
            unit_id='{unit_id}'),
    }
    set_learning_context(current_user, next=next_)
    subject = get_latest_accepted_subject(db_conn, subject_id)
    if not subject:
        return abort(404, '68VOXmd6Shq2cwAAktkFtw')
    # Pull a list of up to 5 units to choose from based on priority.
    buckets = traverse(db_conn, current_user, subject)
    units = buckets['learn'][:5]
    # TODO-3 Time estimates per unit for mastery.
    return 200, {
        'next': next_,
        'units': [deliver_unit(unit) for unit in units],
        # For the menu, it must return the name and ID of the subject
        'subject': deliver_subject(subject),
        'current_unit_id': context.get('unit', {}).get('entity_id'),
    }
Ejemplo n.º 11
0
def get_subject_tree_route(request, subject_id):
    """
  Render the tree of units that exists within a subject.

  Contexts:
  - Search subject, preview units in subject
  - Pre diagnosis
  - Learner view progress in subject
  - Subject complete

  TODO-2 merge with get_subject_units_route
  TODO-2 simplify this method
  """

    db_conn = request['db_conn']
    subject = get_latest_accepted_subject(db_conn, subject_id)
    if not subject:
        return abort(404, '66ejBlFdQ4aYy5MBuP501Q')
    units = list_units_in_subject_recursive(db_conn, subject)
    # For the menu, it must return the name and ID of the subject
    output = {
        'subjects': deliver_subject(subject),
        'units': [deliver_unit(unit) for unit in units],
    }
    current_user = get_current_user(request)
    if not current_user:
        return 200, output
    buckets = traverse(db_conn, current_user, subject)
    output['buckets'] = {
        # 'diagnose': [u['entity_id'] for u in buckets['diagnose']],
        # 'review': [u['entity_id'] for u in buckets['review']],
        'blocked': [u['entity_id'] for u in buckets['blocked']],
        'learn': [u['entity_id'] for u in buckets['learn']],
        'done': [u['entity_id'] for u in buckets['done']],
    }
    return 200, output
Ejemplo n.º 12
0
def test_deliver_subject(db_conn):
  create_subject_test_data(db_conn)
  data = get_subject_version(db_conn, subject_version_a_uuid)
  data = deliver_subject(data, access=None)
  assert data