def test_get_table_list_data(client):
    table = 'marketplace_categories'
    attrs = {'cat_title': 'Furniture'}
    result = helpers.table_fetch(table, attrs=attrs)
    assert len(result) == 1  # only one result

    table = 'marketplace_items'
    fields = ['item_price', 'item_title']
    attrs = {'cat_id': 1}
    result = helpers.table_fetch(table, fields=fields, attrs=attrs)
    assert result == [{'item_price': Decimal('5.99'), 'item_title': 'A table'}]
def test_marketplace_manage(client):
    rv = client.get(flask.url_for('marketplace.manage'))
    assert rv.status_code == 302
    assert rv.location == flask.url_for('auth.login')

    with client.session_transaction() as sess:
        sess['username'] = '******'
    rv = client.get(flask.url_for('marketplace.manage'))
    assert rv.status_code == 200
    assert b'Your listings' in rv.data

    rv = client.get(flask.url_for('marketplace.archive', item_id=3))
    assert rv.status_code == 302
    assert rv.location == flask.url_for('marketplace.manage')
    assert not helpers.table_fetch('marketplace_items',
                                   one=True,
                                   fields=['item_active'],
                                   attrs={'item_id': 3})

    rv = client.get(flask.url_for('marketplace.view_item', item_id=3))
    assert rv.status_code == 200
    assert b'This item has been archived!' in rv.data

    rv = client.get(flask.url_for('marketplace.unarchive', item_id=3))
    assert rv.status_code == 302
    assert rv.location == flask.url_for('marketplace.manage')
    assert helpers.table_fetch('marketplace_items',
                               one=True,
                               fields=['item_active'],
                               attrs={'item_id': 3})

    rv = client.get(flask.url_for('marketplace.view_item', item_id=3))
    assert rv.status_code == 200
    assert b'This item has been archived!' not in rv.data

    # Manage should fail if permissions are missing
    with client.session_transaction() as sess:
        sess['username'] = '******'
    rv = client.get(flask.url_for('marketplace.archive', item_id=3))
    assert rv.status_code == 302
    assert rv.location == flask.url_for('marketplace.marketplace')
    assert helpers.table_fetch('marketplace_items',
                               one=True,
                               fields=['item_active'],
                               attrs={'item_id': 3})
    rv = client.get(flask.url_for('marketplace.unarchive', item_id=3))
    assert rv.status_code == 302
    assert rv.location == flask.url_for('marketplace.marketplace')
def test_archive(client):
    item_id = helpers.create_new_listing({
        'user_id': 3,
        'cat_id': 1,
        'item_title': 'Thing',
        'item_condition': 'Good',
        'item_details': '',
        'item_price': '1.23',
        'images': []
    })
    assert helpers.table_fetch('marketplace_items',
                               one=True,
                               fields=('item_active', ),
                               attrs={'item_id': item_id})
    helpers.set_active_status(item_id, False)
    assert not helpers.table_fetch('marketplace_items',
                                   one=True,
                                   fields=('item_active', ),
                                   attrs={'item_id': item_id})
    helpers.set_active_status(item_id, True)
    assert helpers.table_fetch('marketplace_items',
                               one=True,
                               fields=('item_active', ),
                               attrs={'item_id': item_id})
Beispiel #4
0
def view_item(item_id):
    """View additional details about item <item_id>"""

    if not is_caltech_user():
        return login_redirect()

    item = helpers.table_fetch(
        """
            marketplace_items NATURAL LEFT JOIN
            marketplace_textbooks NATURAL JOIN
            marketplace_categories
        """,
        one=True,
        fields=VIEW_FIELDS,
        attrs={'item_id': item_id})

    # Make sure the item_id is a valid item, i.e. data is nonempty
    if item is None:
        flask.abort(404)

    # Display textbook edition
    edition = item['textbook_edition']
    if edition:
        item['textbook_edition'] = helpers.process_edition(edition)

    # Grab the stored image links
    image_links = helpers.get_image_links(item_id)

    # Notify if the item is inactive
    if not item['item_active']:
        flask.flash('This item has been archived!')

    return helpers.render_with_top_marketplace_bar(
        'view_item.html',
        item_id=item_id,
        item=item,
        image_links=image_links,
        user=get_name_and_email(item['user_id']),
        can_edit=helpers.can_manage(item))
def test_update_listing(client):
    helpers.update_current_listing(
        3, {
            'cat_id':
            1,
            'item_title':
            'A chair',
            'item_condition':
            'Terrible',
            'item_details':
            'Lots of deets',
            'item_price':
            '1.11',
            'images':
            ['https://i.imgur.com/new1.png', 'https://i.imgur.com/new2.jpg']
        })
    item = helpers.table_fetch('marketplace_items',
                               one=True,
                               fields=None,
                               attrs={'item_id': 3})
    del item['item_timestamp']
    assert item == {
        'item_id': 3,
        'cat_id': 1,
        'user_id': 3,
        'item_title': 'A chair',
        'item_details': 'Lots of deets',
        'item_condition': 'Terrible',
        'item_price': Decimal('1.11'),
        'item_active': 1,
        'textbook_id': None,
        'textbook_edition': None,
        'textbook_isbn': None
    }
    assert helpers.get_image_links(3) == [
        'https://i.imgur.com/new1.png', 'https://i.imgur.com/new2.jpg'
    ]
Beispiel #6
0
def sell():
    username = flask.session.get('username')
    if username is None:
        # They're not logged in, kick them out
        return login_redirect()

    # Extract item id
    item_id = helpers.try_int(flask.request.args.get('item_id'))

    # STATES
    # ------
    # new (default): making a new listing
    # edit: editing an old listing

    state = flask.request.args.get('state', 'new')
    if state not in ALLOWED_SELL_STATES:
        flask.flash('Invalid state')
        return flask.redirect(flask.url_for('.sell'))

    saving = flask.request.method == 'POST'
    editing = state == 'edit'
    if saving:
        form = flask.request.form
        item = {
            'cat_id': helpers.try_int(form.get('cat')),
            'textbook_id': helpers.try_int(form.get('textbook_id')),
            'textbook_title': form.get('textbook_title'),
            'textbook_author': form.get('textbook_author'),
            'textbook_edition': form.get('textbook_edition'),
            'textbook_isbn': form.get('textbook_isbn'),
            'item_title': form.get('item_title'),
            'item_condition': form.get('item_condition'),
            'item_price': form.get('item_price'),
            'item_details': form.get('item_details'),
            'images': [image for image in form.getlist('images') if image]
        }
    elif editing:
        item = helpers.table_fetch(
            'marketplace_items',
            one=True,
            fields=SELL_FIELDS,
            attrs={'item_id': item_id})
        if not item:
            # No data? the item_id must be wrong
            flask.flash('Invalid item')
            return flask.redirect(flask.url_for('.marketplace'))

        item['images'] = helpers.get_image_links(item_id)
    else:
        item = {'images': []}

    # Make sure the current user is the one who posted the item
    if editing and not helpers.can_manage(item_id):
        flask.flash('You do not have permission to edit this item')
        return flask.redirect(flask.url_for('.marketplace'))

    # This route is used for both GET and POST;
    # only try to create/update the item if this is a POST
    if saving:
        errors = []  # collect all validation errors
        cat_title = helpers.get_category_name_from_id(item['cat_id'])
        if not cat_title:
            errors.append('Invalid category')
        is_textbook = cat_title == 'Textbooks'
        if is_textbook:
            textbook_id = item['textbook_id']
            if textbook_id:
                textbook = helpers.table_fetch(
                    'marketplace_textbooks',
                    one=True,
                    attrs={'textbook_id': textbook_id})
                if not textbook:
                    errors.append('Invalid textbook')
            else:
                if not item['textbook_title']:
                    errors.append('Missing textbook title')
                if not item['textbook_author']:
                    errors.append('Missing textbook author')
            edition = item['textbook_edition']
            if edition and not helpers.validate_edition(edition):
                errors.append('Invalid textbook edition')
            isbn = item['textbook_isbn']
            if isbn:
                if helpers.validate_isbn(isbn):
                    item['textbook_isbn'] = isbn.replace('-', '')
                else:
                    errors.append('Invalid textbook ISBN')
            item['item_title'] = None
        else:
            if not item['item_title']:
                errors.append('Missing item title')
            item['textbook_id'] = None
            item['textbook_edition'] = None
            item['textbook_isbn'] = None
        if not item['item_condition']:
            errors.append('Missing condition')
        price = item['item_price']
        if not (price and helpers.validate_price(price)):
            errors.append('Invalid price')
        images = item['images']
        for i, image in enumerate(images):
            image = helpers.validate_image(image)
            if image:
                images[i] = image
            else:
                errors.append('Invalid image')

        if errors:
            # Display all errors and don't submit
            for error in errors:
                flask.flash(error)
        else:
            if is_textbook and not textbook_id:
                item['textbook_id'] = helpers.add_textbook(
                    item['textbook_title'], item['textbook_author'])
            if editing:
                helpers.update_current_listing(item_id, item)
                flask.flash('Updated!')
            else:
                item['user_id'] = get_user_id(username)
                item_id = helpers.create_new_listing(item)
                flask.flash('Posted!')
            return flask.redirect(flask.url_for('.view_item', item_id=item_id))

    # Otherwise, they have not submitted anything, so render the form
    item['images'] += [''] * (MAX_IMAGES - len(item['images']))

    categories = helpers.table_fetch('marketplace_categories')
    textbooks_cat, = (cat['cat_id'] for cat in categories
                      if cat['cat_title'] == 'Textbooks')
    textbooks = helpers.table_fetch('marketplace_textbooks')
    return helpers.render_with_top_marketplace_bar(
        'sell.html',
        state=state,
        item_id=item_id,
        item=item,
        MAX_IMAGES=MAX_IMAGES,
        imgur_id=flask.current_app.config['IMGUR_API']['id'],
        categories=categories,
        textbooks=textbooks,
        textbooks_cat=textbooks_cat,
        conditions=CONDITIONS)
def test_search_table(client):
    furniture = helpers.generate_search_table({'cat_id': 1}, '')
    for item in furniture:
        del item['item_timestamp']
    furniture = sorted(furniture, key=lambda item: item['item_id'])
    assert furniture == [{
        'item_id': 1,
        'cat_title': 'Furniture',
        'item_title': 'A table',
        'textbook_title': None,
        'item_price': Decimal('5.99'),
        'user_id': 1,
        'user_url': 'http://127.0.0.1/1/users/1',
        'user_name': 'David Qu',
        'url': 'http://127.0.0.1/marketplace/view_item/1'
    }, {
        'item_id': 2,
        'cat_title': 'Furniture',
        'item_title': 'Thing',
        'textbook_title': None,
        'item_price': Decimal('1.23'),
        'user_id': 3,
        'user_url': 'http://127.0.0.1/1/users/3',
        'user_name': 'Belac Sander',
        'url': 'http://127.0.0.1/marketplace/view_item/2'
    }]
    assert not helpers.generate_search_table({'cat_id': 2}, '')
    tables = helpers.generate_search_table({'cat_id': 1}, 'table')
    for item in tables:
        del item['item_timestamp']
    assert tables == [{
        'item_id': 1,
        'cat_title': 'Furniture',
        'item_title': 'A table',
        'textbook_title': None,
        'item_price': Decimal('5.99'),
        'user_id': 1,
        'textbook_author': None,
        'textbook_isbn': None,
        'user_url': 'http://127.0.0.1/1/users/1',
        'user_name': 'David Qu',
        'url': 'http://127.0.0.1/marketplace/view_item/1'
    }]
    assert helpers.create_new_listing({
        'user_id':
        3,
        'cat_id':
        2,
        'item_condition':
        'New',
        'item_details':
        None,
        'item_price':
        '.99',
        'textbook_id':
        helpers.add_textbook('Algebra', 'Serge Lang'),
        'textbook_edition':
        '3',
        'textbook_isbn':
        '9780387953854',
        'images': ['https://i.imgur.com/az1234.gif']
    }) == 3
    algebras = helpers.generate_search_table({}, 'algebra')
    for item in algebras:
        del item['item_timestamp']
    assert algebras == [{
        'item_id': 3,
        'cat_title': 'Textbooks',
        'item_title': 'Algebra',
        'textbook_title': 'Algebra',
        'item_price': Decimal('0.99'),
        'user_id': 3,
        'textbook_author': 'Serge Lang',
        'textbook_isbn': '9780387953854',
        'user_url': 'http://127.0.0.1/1/users/3',
        'user_name': 'Belac Sander',
        'url': 'http://127.0.0.1/marketplace/view_item/3'
    }]
    item = helpers.table_fetch('marketplace_items',
                               one=True,
                               fields=None,
                               attrs={'item_id': 3})
    del item['item_timestamp']
    assert item == {
        'item_id': 3,
        'cat_id': 2,
        'user_id': 3,
        'item_title': None,
        'item_details': None,
        'item_condition': 'New',
        'item_price': Decimal('0.99'),
        'item_active': 1,
        'textbook_id': 4,
        'textbook_edition': '3',
        'textbook_isbn': '9780387953854'
    }
    assert helpers.get_image_links(3) == ['https://i.imgur.com/az1234.gif']