I am using python 2.7.6 to write a web crawling program with web2py as the 
user interface. A large amount of UPCs (used to find the items on the 
websites) are stored in an SQLite database, which is then displayed on the 
main html page via the JQuery Datatables plugin. The user can then select 
one of the upcs via the datatables display which uses ajax to upload the 
data to the server (this works perfectly).

Currently, I am trying to set it up to handle multiple datatables 
selections. I believe I have gotten the multi-selection capabilities 
working on the view side, but when I run a debug, only the data from the 
first selected UPC is shown on the server.

Thanks for your time,

Philip

Relevant default.py section and all relevant files are attached:

form_labels = {
   'sku_wb': XML('SKU for WBShop  '),
   'zip_code': XML('Zip Code (5 digits or none)  '),
   'apo': XML('Outside 50 States  '),
   'manual': XML('Manual UPC (Ignores above title selection)  ')
}
 
def getMediaDataTable():
    return TABLE(
        THEAD(TR(
            *[TH(media_table_dict[i_label]['label']) for i_label in 
media_table_names]
        )),
        _id='title_select_table', _class='display', _cellspacing="0", _width
="100%"
    )
def getRequestForm():
    media_list_datatable = getMediaDataTable()
    new_request_form = FORM(
        media_list_datatable, BR(), BR(), BR(),
        TABLE(
            # TR( TD(form_labels['zip_code']),       TD(DIV(zip_code_input, 
_class='zip_code_div')) ),
            # TR( TD(form_labels['apo']),            TD(DIV(apo_input, 
_class='apo_div')) ),
            TR( TD(form_labels['manual']),         TD(DIV(manual_input, 
_class='manual_input_div')) ),
            BR(),
            TR( TD(request_submit, _colspan=2, _align='center') )
        )
    )
    return new_request_form
# GLOBAL vars
zip_code_input = INPUT(_name='zip_code', _value='')
apo_input = INPUT(_name='apo', _type='checkbox', _value='Outside 50 States')
manual_input = INPUT(_name='manual_input', _value='')
 
request_submit = INPUT(_type='submit', _value="Perform Request")
def pricetool():
    request_form = getRequestForm()
    is_init_session = session.is_initialized is None
    if is_init_session:
        session.is_initialized = True
        session.media_list_total = settings.media_list_total
        session.media_list_selection=None
        session.visible_columns=['title', 'upc']
 
    upc_keyword_entry = request.vars['upc']
    selected_entry = session.media_list_selection
    manual_input_entry = request.vars['manual_input']
 
    is_keyword_request = upc_keyword_entry is not None and 
upc_keyword_entry != ''
    is_selected_entry = not is_init_session and selected_entry is not None 
and "row" in selected_entry
    is_manual_input = manual_input_entry is not None and manual_input_entry 
!= ''
    is_form_accepted = request_form.accepts(request, session)
    is_selection = is_form_accepted and is_selected_entry
    is_manual = is_form_accepted and is_manual_input
 
    if is_manual:
        upc_request = manual_input_entry
        title_request = upc_request
    elif is_selection:
        selected_record = media_db(media_table.DT_RowId == selected_entry).
select().first()
        print (selected_record)
        is_record_found = selected_record is not None
        if is_record_found:
            upc_request = selected_record.upc
            title_request = selected_record.title
        else:
            is_form_accepted = False
 
    if is_form_accepted or is_keyword_request:
        zip_entry = request.vars['zip_code']
        apo_entry = request.vars['apo']
        tab_title_entry = request.vars['tab_title']
        is_zip = zip_entry is not None and len(zip_entry) == 5
        is_apo_checked = apo_entry == form_labels['apo']
        is_apo_true = apo_entry == True
        is_tab_title = tab_title_entry is not None and tab_title_entry != ''
        zip_code = zip_entry if is_zip else None
        is_apo = True if is_apo_checked or is_apo_true else None
        tab_title = tab_title_entry if is_tab_title else 'PriceTool'
 
    if is_form_accepted:
        redirect_dict = dict(
            upc=upc_request,
            tab_title=title_request
        )
        if is_zip:
            redirect_dict['zip_code']=zip_code
        if is_apo:
            redirect_dict['apo']=True
        redirect_url = URL(f='pricetool',vars=redirect_dict)
        redirect(redirect_url)
 
    if is_keyword_request:
        session.media_list_selection=None
        results_record = results_db(results_table.upc == upc_keyword_entry).
select().first()
        results_only_entry = request.vars['results_only']
        is_results_only = results_only_entry is not None and 
results_only_entry != '0'
        if is_results_only:
            request_form = DIV(request_form, _hidden='hidden')
        return makeOutput(
            request_form=request_form,
            upc_request=upc_keyword_entry,
            results_record=results_record,
            zip_request=zip_code,
            apo_request=is_apo,
            tab_title=tab_title
        )
    else:
        return makeOutput(request_form=request_form)


-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Title: {{=tab_title}}


{{=tab_title}}

{{=upc_title}}
{{=wb_title}}
{{=item_image}} {{=item_title}}
{{=budget_table}}
{{=results_tables}}
import os
import csv
import datetime
from grabbercreator import GrabberCreator

media_filename = 'storage.media'
media_db = DAL('sqlite://' + media_filename)
media_table_names = [
    'DT_RowId', 'title', 'upc', 'studio', 'status', 'versions', 'broadcast',
    'release_date', 'msrp', 'genre', 'aspect', 'sound', 'is_released', 'rating'
]
media_table_dict = {
    'DT_RowId': {
        'label': XML('DT_RowId'),
        'type': 'text'
    },
    'title': {
        'label': XML('Title'),
        'type': 'text'
    },
    'upc': {
        'label': XML('UPC'),
        'type': 'text'
    },
    'studio': {
        'label': XML('Studio'),
        'type': 'text'
    },
    'status': {
        'label': XML('Status'),
        'type': 'text'
    },
    'versions': {
        'label': XML('Format'),
        'type': 'text'
    },
    'broadcast': {
        'label': XML('Broadcast'),
        'type': 'text'
    },
    'release_date': {
        'label': XML('Release Date'),
        'type': 'text'
    },
    'msrp': {
        'label': XML('MSRP'),
        'type': 'text'
    },
    'genre': {
        'label': XML('Genre'),
        'type': 'text'
    },
    'aspect': {
        'label': XML('Aspect Ratio'),
        'type': 'text'
    },
    'sound': {
        'label': XML('Audio Type'),
        'type': 'text'
    },
    'is_released': {
        'label': XML('Is Released'),
        'type': 'text'
    },
    'rating': {
        'label': XML('Rating'),
        'type': 'text'
    }
}
media_table_fields = [
    Field(
        i_field, 
        label=media_table_dict[i_field]['label'],
        type=media_table_dict[i_field]['type']
    ) 
    for i_field in media_table_names
]
media_table_fields += [Field('title_with_upc', compute=lambda row: row['title'] + "|" + row['upc'])]
media_table_fields += [Field('title_orderby', compute=lambda row: row['title'].upper())]

media_db.define_table(
    'media_table',
    *media_table_fields
)
media_table = media_db.media_table

results_filename = 'storage.results'
results_db = DAL('sqlite://' + results_filename)

results_table_names = ['upc', 'results', 'timestamp']
results_table_dict = {
    'upc': {
        'label': XML('UPC'), 
        'type': 'text'
    },
    'results': {
        'label': XML('Historical Results'), 
        'type': 'json'
    },
    'timestamp': {
        'label': XML('Last Update'),
        'type': 'datetime'
    }
}
results_table_fields = [
    Field(
        i_field, 
        label=results_table_dict[i_field]['label'], 
        type=results_table_dict[i_field]['type']
    )
    for i_field in results_table_names
]
results_db.define_table(
    'results_table',
    *results_table_fields
)
results_table = results_db.results_table

if media_db(media_table.id > 0).isempty():
    dvd_list_filename = os.path.join(request.folder, 'static/dvd_csv.txt')
    dvd_list_labels = [
        'title', 'studio', 'released', 'status', 'sound', 'versions',
        'price', 'rating', 'year', 'genre', 'aspect', 'upc', 'dvdyear'
    ]
    with open(dvd_list_filename, mode='rb') as dvd_list_file:
        rows = csv.reader(dvd_list_file)
        next(rows)
        dvd_list_dicts = [{
            'DT_RowId': "row_" + str(id_num),
            'title': row[dvd_list_labels.index('title')],
            'upc': row[dvd_list_labels.index('upc')],
            'studio': row[dvd_list_labels.index('studio')],
            'status': row[dvd_list_labels.index('status')],
            'versions': row[dvd_list_labels.index('versions')],
            'broadcast': row[dvd_list_labels.index('year')],
            'release_date':
                datetime.datetime.strptime(
                    row[dvd_list_labels.index('dvdyear')],
                    '%Y-%m-%d %H:%M:%S'
                ).date().isoformat() if row[dvd_list_labels.index('dvdyear')] != '' else '',
            'msrp': row[dvd_list_labels.index('price')],
            'genre': row[dvd_list_labels.index('genre')],
            'aspect': row[dvd_list_labels.index('aspect')],
            'sound': row[dvd_list_labels.index('sound')],
            'is_released':
                datetime.datetime.strptime(
                    row[dvd_list_labels.index('released')],
                    '%Y-%m-%d %H:%M:%S'
                ).date().isoformat() if row[dvd_list_labels.index('released')] != '' else 'Released',
            'rating': row[dvd_list_labels.index('rating')]
        } for id_num, row in enumerate(rows)]
    media_db.media_table.bulk_insert(dvd_list_dicts)

settings_db = DAL('sqlite://storage.settings')
settings_db.define_table(
    'settings_table',
    Field('media_list_total', 'integer'),
    Field('update_begin_hour', 'integer')
)
settings_table = settings_db.settings_table
is_settings_record = not settings_db(settings_table.id > 0).isempty()
if not is_settings_record:
    settings_insert = settings_table.insert()
    settings = settings_db(settings_table.id > 0).select().first()
    media_list_total = media_db(media_table.id > 0).count()
    settings.update_record(media_list_total=media_list_total)
    settings.update_record(update_begin_hour=4)
else:
    settings = settings_db(settings_table.id > 0).select().first()


collections_db = DAL('sqlite://storage.collections')
collections_db.define_table(
    'upc_table',
    Field('upc'),
    Field('number_of_titles') # titles of the collection this upc composes (multiple seasons, series, etc)
)
collections_db.define_table(
    'title_table',
    Field('name'),  # from user input title
    Field('upcs', type='list:reference upc_table'),  # comma separated list of participating UPCs for this collection title
)
collections_db.define_table(
    'collections_table',
    Field('name'),
    Field('titles', type='list:reference title_table'), # comma separated list, matches name in title table, user input
)
collections_table = collections_db.collections_table

# stores_db = DAL('sqlite://storage.stores')
# stores_db.define_table(
#     'stores_table',
#     Field('name'),
#     Field('store_icon', 'upload'),
#     Field('platform'),  # if set, establishes defaults for below entries
#     Field('supplier_country'), # for price currency conversion, just USA and CA for now
#     Field('url_address'),
#     Field('price_find'), # for prices, titles, images, or web-page redirections
#     Field('no_result_find'),
#     Field('url_find'),
#     Field('exact_inventory_find'),
#     Field('exact_inventory_break'),
#     Field('inventory_quantity_find'),
#     Field('direct_link', 'boolean'),
#     Field('is_user_agent', 'boolean'),
#     Field('rebate_type'), # establishes defaults by platform, also allows individual settings
#     Field('rebate_percent'),
#     Field('coupon_type'), # Fixed percent, limit-based terms
#     Field('coupon_terms'),
#     Field('shipping_type'), # Fixed, limit based terms, or search terms
#     Field('shipping_terms'),
#     Field('tax_type'), # includes a type that can override local tax rate for state rates given in terms
#     Field('tax_terms') # includes inclusions/exclusions
# )
#
# stores_table = stores_db.stores_table
#
# if stores_db(stores_table.id > 0).isempty():
#     item_upc = "___TEST___UPC___"
#     grabber_creator = GrabberCreator(item_upc, app_dir=os.path.join(request.folder, 'modules/'), is_alt_only=False)
#     grabbers = grabber_creator.grabbers_list
#     alt_grabbers = grabber_creator.alt_grabbers_list

from pricefinder import PriceFinder
import json
import os

form_labels = {
   'sku_wb': XML('SKU for WBShop  '),
   'zip_code': XML('Zip Code (5 digits or none)  '),
   'apo': XML('Outside 50 States  '),
   'manual': XML('Manual UPC (Ignores above title selection)  ')
}

def getMediaDataTable():
    return TABLE(
        THEAD(TR(
            *[TH(media_table_dict[i_label]['label']) for i_label in media_table_names]
        )),
        _id='title_select_table', _class='display', _cellspacing="0", _width="100%"
    )
def getRequestForm():
    media_list_datatable = getMediaDataTable()
    new_request_form = FORM(
        media_list_datatable, BR(), BR(), BR(),
        TABLE(
            # TR( TD(form_labels['zip_code']),       TD(DIV(zip_code_input, _class='zip_code_div')) ),
            # TR( TD(form_labels['apo']),            TD(DIV(apo_input, _class='apo_div')) ),
            TR( TD(form_labels['manual']),         TD(DIV(manual_input, _class='manual_input_div')) ),
            BR(),
            TR( TD(request_submit, _colspan=2, _align='center') )
        )
    )
    return new_request_form
# GLOBAL vars
zip_code_input = INPUT(_name='zip_code', _value='')
apo_input = INPUT(_name='apo', _type='checkbox', _value='Outside 50 States')
manual_input = INPUT(_name='manual_input', _value='')

request_submit = INPUT(_type='submit', _value="Perform Request")
def pricetool():
    request_form = getRequestForm()
    is_init_session = session.is_initialized is None
    if is_init_session:
        session.is_initialized = True
        session.media_list_total = settings.media_list_total
        session.media_list_selection=None
        session.visible_columns=['title', 'upc']

    upc_keyword_entry = request.vars['upc']
    selected_entry = session.media_list_selection
    manual_input_entry = request.vars['manual_input']

    is_keyword_request = upc_keyword_entry is not None and upc_keyword_entry != ''
    is_selected_entry = not is_init_session and selected_entry is not None and "row" in selected_entry
    is_manual_input = manual_input_entry is not None and manual_input_entry != ''
    is_form_accepted = request_form.accepts(request, session)
    is_selection = is_form_accepted and is_selected_entry
    is_manual = is_form_accepted and is_manual_input

    if is_manual:
        upc_request = manual_input_entry
        title_request = upc_request
    elif is_selection:
        selected_record = media_db(media_table.DT_RowId == selected_entry).select().first()
        print (selected_record)
        is_record_found = selected_record is not None
        if is_record_found:
            upc_request = selected_record.upc
            title_request = selected_record.title
        else:
            is_form_accepted = False

    if is_form_accepted or is_keyword_request:
        zip_entry = request.vars['zip_code']
        apo_entry = request.vars['apo']
        tab_title_entry = request.vars['tab_title']
        is_zip = zip_entry is not None and len(zip_entry) == 5
        is_apo_checked = apo_entry == form_labels['apo']
        is_apo_true = apo_entry == True
        is_tab_title = tab_title_entry is not None and tab_title_entry != ''
        zip_code = zip_entry if is_zip else None
        is_apo = True if is_apo_checked or is_apo_true else None
        tab_title = tab_title_entry if is_tab_title else 'PriceTool'

    if is_form_accepted:
        redirect_dict = dict(
            upc=upc_request,
            tab_title=title_request
        )
        if is_zip:
            redirect_dict['zip_code']=zip_code
        if is_apo:
            redirect_dict['apo']=True
        redirect_url = URL(f='pricetool',vars=redirect_dict)
        redirect(redirect_url)

    if is_keyword_request:
        session.media_list_selection=None
        results_record = results_db(results_table.upc == upc_keyword_entry).select().first()
        results_only_entry = request.vars['results_only']
        is_results_only = results_only_entry is not None and results_only_entry != '0'
        if is_results_only:
            request_form = DIV(request_form, _hidden='hidden')
        return makeOutput(
            request_form=request_form,
            upc_request=upc_keyword_entry,
            results_record=results_record,
            zip_request=zip_code,
            apo_request=is_apo,
            tab_title=tab_title
        )
    else:
        return makeOutput(request_form=request_form)
def selectMediaList(select_string, start_pos = 0, max_rows = 250, orderby='title', order_direction='asc', queryby=['title']):
    if select_string != '':
        select_strings = select_string.split()
        if 'title' in queryby and 'upc' in queryby:
            column_to_search = 'title_with_upc'
        elif 'title' in queryby:
            column_to_search = 'title'
        else:
            column_to_search = 'upc'
        query_db = eval(
            'media_table.'
            + column_to_search
            + '.contains(select_strings, all=True)'
        )
    else:
        query_db = media_table
    if orderby == 'title':
        orderby = 'title_orderby'
    if order_direction == 'asc':
        orderby_db = eval('media_table.' + orderby)
    else:
        orderby_db = eval('~media_table.' + orderby)
    selected_rows = media_db(query_db).select(
        limitby=(start_pos,start_pos+max_rows),
        orderby=orderby_db
    )
    num_rows = media_db(query_db).count()
    selected_dict = selected_rows.as_list()
    return selected_dict, num_rows
def selectMediaItem():
    media_list_selection = str(request.vars['selected']).replace("'","").replace('"',"")
    session.media_list_selection=media_list_selection
    return settings
def createMediaDataTable():
    title_entry = request.vars['search[value]']
    if title_entry == 'Media Search':
        title_entry = ''
    draw_echo = int(request.vars['draw'])
    start_pos = int(request.vars['start'])
    max_rows = int(request.vars['length'])
    order_column = request.vars['order[0][column]']
    orderby_name = request.vars['columns[' + order_column + '][data]']
    order_direction = request.vars['order[0][dir]']
    media_data, media_list_num = selectMediaList(
        title_entry,
        start_pos=start_pos,
        max_rows=max_rows,
        orderby=orderby_name,
        order_direction=order_direction,
        queryby=session.visible_columns
    )
    media_data_json = json.dumps(dict(
        media_data=media_data,
        recordsTotal=settings.media_list_total,
        recordsFiltered=media_list_num,
        draw = draw_echo
    ))
    return media_data_json
def initDataTables():
    session.visible_columns=['title', 'upc']
def setColumnVisibility():
    searchable_columns = ['title', 'upc']
    column = media_table_names[int(request.vars['column'])]
    if column in searchable_columns:
        state = request.vars['state']
        if state == 'true':
            visible_columns = session.visible_columns + column
        else:
            visible_columns = session.visible_columns.remove(column)
        session.visible_columns=visible_columns
    return settings
def makeOutput(request_form=None, upc_request=None, results_record=None, zip_request=None, apo_request=False, sku_wb=None, tab_title='PriceTool'):
    upc_db_link = A(
        'Click to add or update UPCs',
        _href=URL(upc_db_update)
    )

    if upc_request is None:
        return dict(
            request_form=request_form,
            upc_title='',
            wb_title='',
            item_title='',
            item_image='',
            results_tables='',
            budget_table='',
            upc_db_link=upc_db_link,
            tab_title=tab_title
        )

    upc_title = "Getting results for UPC: " + upc_request
    skus = [sku_wb] if sku_wb is not None else []
    if sku_wb is None:
        sku_wb = 'SKU not given'
    wb_title = "SKU WB:" + sku_wb

    is_historical_results = results_record is not None
    if is_historical_results:
        historical_results = results_record.results
        time_historical = results_record.timestamp
        time_now = request.now
        time_last_update = time_now.replace(hour=settings.update_begin_hour, minute=0, second=0)
        is_fresh_results = time_historical > time_last_update
    else:
        is_fresh_results = False
    if is_fresh_results:
        item_title = historical_results['item_title']
        image_url = historical_results['image_url']
        results_dtb = encodeResultsXML(historical_results['results_dtb'])
        results_ea = encodeResultsXML(historical_results['results_ea'])
        results_international = encodeResultsXML(historical_results['results_international'])
        results_exclusions = encodeResultsXML(historical_results['results_exclusions'])
        results_budget = historical_results['results_budget']
        header_dtb = historical_results['header_dtb']
        header_ea = historical_results['header_ea']
        header_international = historical_results['header_international']
        header_exclusions = historical_results['header_exclusions']
        header_budget = historical_results['header_budget']
    else:
        price_finder = PriceFinder(
            item_upc=upc_request,
            skus=skus,
            zip_code=zip_request,
            apo=apo_request,
            app_dir=os.path.join(request.folder, 'modules/')
        )
        price_finder.updateAll()
        results_creator = price_finder.results_creator
        results_dtb, header_dtb = results_creator.getResultsDTB()
        results_ea, header_ea = results_creator.getResultsEA()
        results_international, header_international = results_creator.getResultsInternational()
        results_exclusions, header_exclusions = results_creator.getResultsExclusions()
        results_budget, header_budget = results_creator.getResultsBudget()
    
        item_title = results_creator.product_title
        image_url = results_creator.image_url

        historical_results = dict()
        historical_results['item_title'] = item_title
        historical_results['image_url'] = image_url
        historical_results['results_dtb'] = results_dtb
        historical_results['results_ea'] = results_ea
        historical_results['results_international'] = results_international
        historical_results['results_exclusions'] = results_exclusions
        historical_results['results_budget'] = results_budget
        historical_results['header_dtb'] = header_dtb
        historical_results['header_ea'] = header_ea
        historical_results['header_international'] = header_international
        historical_results['header_exclusions'] = header_exclusions
        historical_results['header_budget'] = header_budget
        if is_historical_results:
            results_record.update_record(
                upc=upc_request,
                results=historical_results,
                timestamp=request.now
            )
        else:
            results_table.insert(
                upc=upc_request,
                results=historical_results,
                timestamp=request.now
            )
            results_db.commit()
    if item_title == "":
        item_title = "No title results"
    if image_url != "":
        item_image = IMG(_src=image_url)
    else:
        item_image = "No image results"

    dtb_table = makeTable(
        results_dtb,
        header_dtb,
        table_name="Direct to Buyer",
        table_class_name="dtb_table",
        td_class_name="dtb_td",
        tr_class_names=["odd", "even"]
    )

    ea_table = makeTable(
        results_ea,
        header_ea,
        table_name="To East Aurora",
        table_class_name="ea_table",
        td_class_name="ea_td",
        tr_class_names=["odd", "even"]
    )

    international_table = makeTable(
        results_international,
        header_international,
        table_name="International Suppliers",
        table_class_name="international_table",
        td_class_name="international_td",
        tr_class_names=["odd", "even"]
    )

    exclusions_table = makeTable(
        results_exclusions,
        header_exclusions,
        table_name="Exclusions",
        table_class_name="exclusions_table",
        td_class_name="exclusions_td",
        tr_class_names=["odd", "even"]
    )

    results_tables = TABLE(
        TBODY(
            TR(TD(dtb_table),TD(ea_table),TD(international_table)),
            TR(TD(exclusions_table, _colspan=3, _align='center'))
        ),
        _class="results_table"
    )


    budget_table = makeBudgetTable(results_budget, header_budget)

    return dict(
        request_form=request_form,
        upc_title=upc_title,
        wb_title=wb_title,
        item_title=item_title,
        item_image=item_image,
        results_tables=results_tables,
        budget_table=budget_table,
        upc_db_link=upc_db_link,
        tab_title=tab_title
    )
def encodeResultsXML(
        results
):
    return [[XML(cell) for cell in row] for row in results]
def makeTable(
    results,
    header,
    table_name="",
    table_class_name="",
    td_class_name="",
    tr_class_names=['']
    ):
    return TABLE(
        THEAD(TD(table_name,_class=td_class_name, _colspan=str(len(header))), TR(*TH(header))),
        TBODY(*[TR(*TD(rows),_class=tr_class_names[i_row % len(tr_class_names)]) for i_row, rows in enumerate(results)]),
        _class="display", _id=table_class_name
    )
def makeBudgetTable(results, header):
    return TABLE(
        TBODY(*[TR(TD(i_header), TD(XML(results[0][i_num]))) for i_num, i_header in enumerate(header)]),
        _class = "budgettable"
    )
def getFromForm(form_in, field_name):
    in_request = form_in.vars.getlist(field_name)
    try:
        in_request = in_request[0]
    except:
        in_request = ""
    return in_request
def upc_db_update():
    upc_grid = SQLFORM.grid(media_table, user_signature=False)
    pricetool_link = A(
        'Click to return to PriceTool',
        _href=URL(pricetool)
        )
    return locals()
def stores_db_update():
    stores_grid = SQLFORM.grid(stores_db.stores_table, user_signature=False)
    pricetool_link = A(
        'Click to return to PriceTool',
        _href=URL(pricetool)
        )
    return locals()

Reply via email to