def get_card_route(request, card_id): """ Get a specific card given an ID. Show all relevant data, but not used for the learning interface. """ db_conn = request['db_conn'] card = get_latest_accepted_card(db_conn, card_id) if not card: return abort(404, 'fPebfwqfRNmOiSWqWISeaA') unit = get_latest_accepted_unit(db_conn, card['unit_id']) if not unit: return abort(404, 'IKSqfvHvRK6hbSAIOkQuLg') # TODO-2 SPLITUP create new endpoints for these instead requires = list_required_cards(db_conn, card_id) required_by = list_required_by_cards(db_conn, card_id) params = get_card_parameters(db_conn, {'entity_id': card_id}) return 200, { 'card': deliver_card(card, access='view'), 'card_parameters': (get_card_parameters_values(params) if params else None), 'unit': deliver_unit(unit), 'requires': [deliver_card(require) for require in requires], 'required_by': [deliver_card(require) for require in required_by], }
def test_deliver_card(db_conn): create_card_test_data(db_conn) card = get_latest_accepted_card(db_conn, entity_id=card_a_uuid) # a bad kind card['kind'] = 'eraser' assert deliver_card(card, access=None) card['kind'] = 'video' # for real assert deliver_card(card, access=None) # access = learn, kind = choice, order = random # ... and max_options_to_show < total options card = get_latest_accepted_card(db_conn, entity_id=card_b_uuid) card['data']['order'] = 'random' card['data']['max_options_to_show'] = 1 result = deliver_card(card, access='learn') assert result assert result['kind'] == 'choice' assert result['data']['options'][0].get('feedback') is None assert result['data']['options'][0].get('correct') is None assert len(result['data']['options']) == 1
def get_card_versions_route(request, card_id): """ Get versions card given an ID. Paginates. """ db_conn = request['db_conn'] versions = list_one_card_versions(db_conn, card_id) return 200, { 'versions': [deliver_card(version, access='view') for version in versions] }
def list_cards_route(request): """ Return a collection of cards by `entity_id`. """ db_conn = request['db_conn'] entity_ids = request['params'].get('entity_ids') if not entity_ids: return abort(404, 'ESKDY5E7QA6tIpAv9i6WMw') entity_ids = entity_ids.split(',') cards = list_latest_accepted_cards(db_conn, entity_ids) if not cards: return abort(404, 's0uGKuNDSJK00pJs-x1AAQ') return 200, {'cards': [deliver_card(card, 'view') for card in cards]}
def create_new_card_version_route(request): """ Create a new card version for a brand new card. """ current_user = get_current_user(request) if not current_user: return abort(401, '_YQNk1foSXyDwrnuxnThNw') db_conn = request['db_conn'] data = deepcopy(request['params']) if 'entity_id' in data: return abort(403, 'sdXoDQ-tRweCUg35MUcUEA') data['user_id'] = current_user['id'] card, errors = insert_card(db_conn, data) if errors: return 400, { 'errors': errors, 'ref': '8X-cJFZPQIyyAJJWmfiS7A', } return 200, {'version': deliver_card(card, 'view')}
def learn_card_route(request, card_id): """ Render the card's data, ready for learning. NEXT STATE GET Learn Card -> POST Respond Card """ db_conn = request['db_conn'] current_user = get_current_user(request) if not current_user: return abort(401, 'WBv3UeikTLu5AAwG9A0QZg') card = get_latest_accepted_card(db_conn, card_id) if not card: return abort(404, 'UgQHXzx4SSaHgJzHpRaL9g') # Make sure the current unit id matches the card context = get_learning_context(current_user) context_unit_id = context.get('unit', {}).get('entity_id') if context_unit_id != convert_uuid_to_slug(card['unit_id']): return 400, { 'errors': [{ 'name': 'unit_id', 'message': 'card not in current unit.', 'ref': 'd6rhaoCuRdW0f9j8AlMXBQ', }], } next_ = { 'method': 'POST', 'path': '/s/cards/{card_id}/responses'.format( card_id=convert_uuid_to_slug(card['entity_id'])) } set_learning_context(current_user, card=card, next=next_) return 200, { 'card': deliver_card(card, access='learn'), 'subject': context.get('subject'), 'unit': context.get('unit'), 'next': next_, }
def create_existing_card_version_route(request, card_id): """ Create a new card version for an existing card. """ current_user = get_current_user(request) if not current_user: return abort(401, 'a3vXGVFCRpWwf8WEkqtBgQ') db_conn = request['db_conn'] next_data = deepcopy(request['params']) next_data['entity_id'] = card_id next_data['user_id'] = current_user['id'] current_data = get_latest_accepted_card(db_conn, card_id) if not current_data: return abort(404, 'dQvoI_OjQY2U-GeyP8fsTA') card, errors = insert_card_version(db_conn, current_data, next_data) if errors: return 400, { 'errors': errors, 'ref': 'DyKLB28gT6CYGdyQ9smOKQ', } return 200, {'version': deliver_card(card, 'view')}