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] }
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] }
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], }
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] }
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], }
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')}
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], }
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')}
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
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'), }
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
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