def get(self, subject_id=None):
     '''
     GET /subjects/ -> get all subjects
     GET /subjects/{id}/ -> get subject with id=id
     '''
     if subject_id is not None:
         try:
             return Subject.get(id=subject_id).json()
         except:
             abort(404)
     else:
         return [
             subject.json()
             for subject in Subject.get()
         ]
示例#2
0
文件: entity.py 项目: stevegt/sagefy
def get_version(db_conn, kind, id_):
    if kind == 'card':
        card = Card.get(db_conn, id=id_)
        return flip_card_into_kind(card)
    elif kind == 'unit':
        return Unit.get(db_conn, id=id_)
    elif kind == 'subject':
        return Subject.get(db_conn, id=id_)
def test_traverse(db_conn, units_table, users_table, responses_table,
                  subjects_table):
    """
    Expect to take a list of units and traverse them correctly.
    Basic test.
    """

    add_test_subject(db_conn,
                     users_table, units_table, responses_table, subjects_table)

    subject = Subject.get(db_conn, entity_id='subject')
    user = get_user({'id': 'user'}, db_conn)
    buckets = traverse(db_conn, user, subject)
    assert buckets['diagnose'][0]['entity_id'] == 'divide'
    assert buckets['learn'][0]['entity_id'] == 'multiply'
    assert buckets['review'][0]['entity_id'] == 'subtract'
示例#4
0
def add_subject_route(request, user_id, subject_id):
    """
    Add a subject to the learner's list of subjects.
    """

    db_conn = request['db_conn']

    current_user = get_current_user(request)
    if not current_user:
        return abort(401)

    if user_id != current_user['id']:
        return abort(403)

    subject = Subject.get(db_conn, entity_id=subject_id)
    if not subject:
        return abort(404)

    user_subject = get_user_subjects(user_id, db_conn)
    if user_subject and subject_id in user_subject['subject_ids']:
        return 400, {
            'errors': [{
                'name': 'subject_id',
                'message': 'Subject is already added.',
            }],
            'ref':
            'kPZ95zM3oxFDGGl8vBdR3J3o',
        }

    # TODO-2 move some of this logic to the database file
    if user_subject:
        user_subject, errors = append_user_subjects(user_id, subject_id,
                                                    db_conn)
    else:
        user_subject, errors = insert_user_subjects(
            {
                'user_id': user_id,
                'subject_ids': [subject_id],
            }, db_conn)

    if errors:
        return 400, {'errors': errors, 'ref': 'zCFUbLBTg9n2DnTkQYbqO4X9'}

    return 200, {'subjects': user_subject['subject_ids']}
示例#5
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

    NEXT STATE
    GET View Subject Tree
        -> GET Choose Subject ...when subject is complete
        -> GET Choose Unit    ...when in learn or review mode
        -> GET Learn Card     ...when in diagnosis
            (Unit auto chosen)

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

    db_conn = request['db_conn']

    subject = Subject.get(db_conn, entity_id=subject_id)

    if not subject:
        return abort(404)

    units = subject.list_units(db_conn)

    # For the menu, it must return the name and ID of the subject
    output = {
        'subjects': subject.deliver(),
        'units': [u.deliver() for u in units],
    }

    current_user = get_current_user(request)

    if not current_user:
        return 200, output

    context = get_learning_context(current_user) if current_user else {}
    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']],
        'learn': [u['entity_id'] for u in buckets['learn']],
        'done': [u['entity_id'] for u in buckets['done']],
    }

    # If we are just previewing, don't update anything
    if subject_id != context.get('subject', {}).get('entity_id'):
        return 200, output

    # When in diagnosis, choose the unit and card automagically.
    if buckets['diagnose']:
        unit = buckets['diagnose'][0]
        card = choose_card(db_conn, current_user, unit)
        next_ = {
            'method': 'GET',
            'path':
            '/s/cards/{card_id}/learn'.format(card_id=card['entity_id']),
        }
        set_learning_context(current_user,
                             next=next_,
                             unit=unit.data,
                             card=card.data)

    # When in learn or review mode, lead me to choose a unit.
    elif buckets['review'] or buckets['learn']:
        next_ = {
            'method': 'GET',
            'path':
            '/s/subjects/{subject_id}/units'.format(subject_id=subject_id),
        }
        set_learning_context(current_user, next=next_)

    # If the subject is complete, lead the learner to choose another subject.
    else:
        next_ = {
            'method':
            'GET',
            'path':
            '/s/users/{user_id}/subjects'.format(user_id=current_user['id']),
        }
        set_learning_context(current_user, next=next_, unit=None, subject=None)

    output['next'] = next_
    return 200, output
示例#6
0
def test_list_units(db_conn, units_table, subjects_table):
    """
    Expect to get a list of units contained within the subject.
    Recursive.
    """

    units_table.insert([{
        'entity_id': 'B',
        'name': 'B',
        'created': r.now(),
        'modified': r.now(),
        'status': 'accepted',
        'require_ids': ['A', 'N']
    }, {
        'entity_id': 'V',
        'name': 'V',
        'created': r.now(),
        'modified': r.now(),
        'status': 'accepted',
        'require_ids': ['Q']
    }, {
        'entity_id': 'Q',
        'name': 'Q',
        'created': r.now(),
        'modified': r.now(),
        'status': 'accepted',
    }, {
        'entity_id': 'A',
        'name': 'A',
        'created': r.now(),
        'modified': r.now(),
        'status': 'accepted',
    }, {
        'entity_id': 'N',
        'name': 'N',
        'created': r.now(),
        'modified': r.now(),
        'status': 'accepted',
        'require_ids': ['Q', 'A']
    }]).run(db_conn)

    subjects_table.insert([{
        'entity_id':
        'T',
        'name':
        'TRex',
        'body':
        'TRex',
        'created':
        r.now(),
        'modified':
        r.now(),
        'status':
        'accepted',
        'members': [{
            'kind': 'unit',
            'id': 'B',
        }, {
            'kind': 'unit',
            'id': 'V',
        }]
    }, {
        'entity_id':
        'S',
        'name':
        'Saurus',
        'body':
        'Saurus',
        'created':
        r.now(),
        'modified':
        r.now(),
        'status':
        'accepted',
        'members': [{
            'kind': 'subject',
            'id': 'T',
        }, {
            'kind': 'unit',
            'id': 'Q',
        }]
    }]).run(db_conn)

    subject = Subject.get(db_conn, entity_id='S')
    cards = subject.list_units(db_conn)
    card_ids = set(card['entity_id'] for card in cards)
    assert card_ids == {'B', 'V', 'Q', 'N'}