Beispiel #1
0
def instance_entities(data):
    """
    Given a kind and some json, call insert on that kind
    and return the results.
    A little safer.
    """

    fields = ('id', 'created', 'modified',
              'entity_id', 'previous_id', 'status', 'available')
    entities = []
    if 'cards' in data:
        for card_data in data['cards']:
            kind = card_data.get('kind')
            if kind in card_map:
                entities.push(
                    card_map[kind](omit(card_data, fields))
                )
    if 'units' in data:
        entities = entities + [
            Unit(omit(unit_data, fields))
            for unit_data in data['units']
        ]
    if 'sets' in data:
        entities = entities + [
            Set(omit(set_data, fields))
            for set_data in data['sets']
        ]
    return entities
Beispiel #2
0
    def get_card_info_from_name(self, name):
        try:
            print(f'Getting card info from name: {name}')
            name = name.replace(' ', '%20')
            url = f'https://db.ygoprodeck.com/api/v6/cardinfo.php?fname={name}'
            results = requests.get(url=url)
            card_info = json.loads(results.content)

            card_sets = []

            if not 'No card matching your query was found in the database' in str(card_info):
                for card_set in card_info:
                    sets = []
                    if 'card_sets' in str(card_set):
                        cs = card_set['card_sets']
                        for s in cs:
                            if len(sets) == 0:
                                sets.append(Set(set_name=s['set_name'],
                                                set_code=s['set_code']).get_dict_sets())
                            else:
                                item_found = False
                                for ss in sets:
                                    if s['set_code'] == ss['set_code']:
                                        item_found = True
                                        break

                                if not item_found:
                                    sets.append(Set(set_name=s['set_name'],
                                                    set_code=s['set_code']).get_dict_sets())

                        sets = sorted(sets, key=lambda k:(len(k['set_code']), k['set_code']))
                        card_sets.append(CardSets(card_name=card_set['name'],
                                                  image=card_set['card_images'][0]['image_url_small'],
                                                  sets=sets).get_dict_card_sets())

            print(f'Card sets: {card_sets}')
            return card_sets
        except Exception as e:
            print(f'TCGP - Occurred the following error trying to get card sets from name: {e}')
            raise Exception(e)
Beispiel #3
0
def instance(data):
    """
    Given a kind and some json, call insert on that kind
    and return the results.
    """

    if 'card' in data:
        return Card(data['card'])
        # TODO-1 This needs to also get the right card kind...
    elif 'unit' in data:
        return Unit(data['unit'])
    elif 'set' in data:
        return Set(data['set'])
Beispiel #4
0
def instance_new_entity(data):
    """
    Save as above, but a little safer.
    """

    fields = ('id', 'created', 'modified', 'entity_id', 'previous_id',
              'status', 'available')
    if 'card' in data:
        return Card(omit(data['card'], fields))
        # TODO-1 This needs to also get the right card kind...
    elif 'unit' in data:
        return Unit(omit(data['unit'], fields))
    elif 'set' in data:
        return Set(omit(data['set'], fields))
Beispiel #5
0
 def create_or_get_set(self, next=True):
     """return current set, create next set automatically if next=True"""
     if self.current_set_number:
         # current set is on going
         return self.sets[self.current_set_number]
     elif next:
         # get next set number
         self.current_set_number = max(
             self.sets.keys()) + 1 if self.sets else 1
         is_deciding_set = self.current_set_number == self._best_of
         self.sets[self.current_set_number] = Set(self,
                                                  self.current_set_number,
                                                  is_deciding_set)
         return self.sets[self.current_set_number]
     else:
         return None
Beispiel #6
0
def instance_new_entity(data):
    """
    Given a kind and some json, call insert on that kind
    and return the results.
    A little safer.
    """

    fields = ('id', 'created', 'modified', 'entity_id', 'previous_id',
              'status', 'available')
    if 'card' in data:
        kind = data['card'].get('kind')
        if kind in card_map:
            return card_map[kind](omit(data['card'], fields))
    elif 'unit' in data:
        return Unit(omit(data['unit'], fields))
    elif 'set' in data:
        return Set(omit(data['set'], fields))
Beispiel #7
0
def respond_to_card_route(request, card_id):
    """
    Record and process a learner's response to a card.

    NEXT STATE
    POST Respond Card
        -> GET Learn Card      ...when not ready
        -> GET Choose Unit     ...when ready, but still units
        -> GET View Set Tree   ...when ready and done
    """

    # TODO-3 simplify this method.
    #      perhaps smaller methods or move to model layer?

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

    card = get_card_by_kind(card_id)
    if not card:
        return abort(404)

    # Make sure the card is the current one
    context = current_user.get_learning_context()
    if context.get('card', {}).get('entity_id') != card['entity_id']:
        return abort(400)

    r = seq_update(current_user, card, request['params'].get('response'))
    errors, response, feedback = (r.get('errors'), r.get('response'),
                                  r.get('feedback'))
    if errors:
        return 400, {
            'errors': errors,
            'ref': 'wtyOJPoy4bh76OIbYp8mS3LP',
        }

    set_ = Set(context.get('set'))
    unit = Unit(context.get('unit'))

    status = judge(unit, current_user)

    # If we are done with this current unit...
    if status == "done":
        buckets = traverse(current_user, set_)

        # If there are units to be diagnosed...
        if buckets['diagnose']:
            unit = buckets['diagnose'][0]
            next_card = choose_card(current_user, unit)
            next_ = {
                'method':
                'GET',
                'path':
                '/s/cards/{card_id}/learn'.format(
                    card_id=next_card['entity_id']),
            }
            current_user.set_learning_context(card=next_card.data,
                                              unit=unit.data,
                                              next=next_)

        # If there are units to be learned or reviewed...
        elif buckets['learn'] or buckets['review']:
            next_ = {
                'method': 'GET',
                'path':
                '/s/sets/{set_id}/units'.format(set_id=set_['entity_id']),
            }
            current_user.set_learning_context(card=None, unit=None, next=next_)

        # If we are out of units...
        else:
            next_ = {
                'method': 'GET',
                'path':
                '/s/sets/{set_id}/tree'.format(set_id=set_['entity_id']),
            }
            current_user.set_learning_context(card=None, unit=None, next=next_)

    # If we are still reviewing, learning or diagnosing this unit...
    else:
        next_card = choose_card(current_user, unit)
        if next_card:
            next_ = {
                'method':
                'GET',
                'path':
                '/s/cards/{card_id}/learn'.format(
                    card_id=next_card['entity_id']),
            }
            current_user.set_learning_context(card=next_card.data, next=next_)
        else:
            next_ = {}
            current_user.set_learning_context(next=next_)

    return 200, {
        'response': response.deliver(),
        'feedback': feedback,
        'next': next_,
    }