OSX comes a os utility called say example:
$ say hello world speaks better than me. On Mar 6, 4:10 pm, rochacbruno <rochacbr...@gmail.com> wrote: > What did you use for the voice sintetization? > > Enviado via iPhone > > Em 06/03/2011, às 14:57, Massimo Di Pierro <massimo.dipie...@gmail.com> > escreveu: > > > > > > > > >http://www.youtube.com/watch?v=xW5xOdDk-BE > > > Here are the steps: > > > # let us go into our web2py folder > > cd /Users/mdipierro/Desktop/demo/web2py > > > # and we create a new app called pos (point of sale) > > cd applications > > mkdir pos > > rm -r pos/* > > > # we make it a clone of the scaffolding application > > cp -r welcome/* pos/ > > cd pos > > > openhttp://127.0.0.1:8000/admin/default/design/welcome > > > # lets get janrain working! > > edit models/db.py > > # -*- coding: utf-8 -*- > > # this file is released under public domain and you can use without > > limitations > > > ######################################################################### > > ## This scaffolding model makes your app work on Google App Engine too > > ######################################################################### > > > if request.env.web2py_runtime_gae: # if running on Google > > App Engine > > db = DAL('gae') # connect to Google > > BigTable > > # optional DAL('gae:// > > namespace') > > session.connect(request, response, db = db) # and store sessions > > and tickets there > > ### or use the following lines to store sessions in Memcache > > # from gluon.contrib.memdb import MEMDB > > # from google.appengine.api.memcache import Client > > # session.connect(request, response, db = MEMDB(Client())) > > else: # else use a normal > > relational database > > db = DAL('sqlite://storage.sqlite') # if not, use SQLite or > > other DB > > ## if no need for session > > # session.forget() > > > ######################################################################### > > ## Here is sample code if you need for > > ## - email capabilities > > ## - authentication (registration, login, logout, ... ) > > ## - authorization (role based authorization) > > ## - services (xml, csv, json, xmlrpc, jsonrpc, amf, rss) > > ## - crud actions > > ## (more options discussed in gluon/tools.py) > > ######################################################################### > > > from gluon.tools import * > > mail = Mail() # mailer > > auth = Auth(globals(),db) # authentication/ > > authorization > > crud = Crud(globals(),db) # for CRUD helpers > > using auth > > service = Service(globals()) # for json, xml, > > jsonrpc, xmlrpc, amfrpc > > plugins = PluginManager() > > > mail.settings.server = 'logging' or 'smtp.gmail.com:587' # your SMTP > > server > > mail.settings.sender = '...@gmail.com' # your email > > mail.settings.login = 'username:password' # your credentials or > > None > > > auth.settings.hmac_key = '<your secret key>' # before > > define_tables() > > auth.define_tables() # creates all needed > > tables > > auth.settings.mailer = mail # for user email > > verification > > auth.settings.registration_requires_verification = False > > auth.settings.registration_requires_approval = False > > auth.messages.verify_email = 'Click on the link > > http://'+request.env.http_host+URL('default','user',args=['verify_email'])+ > > '/%(key)s > > to verify your email' > > auth.settings.reset_password_requires_verification = True > > auth.messages.reset_password = 'Click on the link > > http://'+request.env.http_host+URL('default','user',args=['reset_password'] > > )+'/%(key)s > > to reset your password' > > > ######################################################################### > > ## If you need to use OpenID, Facebook, MySpace, Twitter, Linkedin, > > etc. > > ## register with janrain.com, uncomment and customize following > > from gluon.contrib.login_methods.rpx_account import RPXAccount > > auth.settings.actions_disabled=['register','change_password','request_reset > > _password'] > > api_key = open('/Users/mdipierro/ > > janrain_api_key.txt','r').read().strip() > > auth.settings.login_form = RPXAccount(request, > > api_key=api_key,domain='web2py', > > url = "http://localhost:8000/%s/default/user/login" % > > request.application) > > ## other login methods are in gluon/contrib/login_methods > > ######################################################################### > > > crud.settings.auth = None # =auth to enforce > > authorization on crud > > @@END@@ > > > openhttp://127.0.0.1:8000/admin/default/peek/welcome/models/db.py > > > # then we create a custom model > > edit models/db_pos.py > > # we need a table to store products > > db.define_table('product', > > Field('name',notnull=True,unique=True), > > Field('price','double'), > > Field('description','text'), > > Field('image','upload'), > > Field('sortable','integer'), > > auth.signature, > > format='%(name)s') > > > # and one table to store sales of products to users > > db.define_table('sale', > > Field('invoice'), > > Field('creditcard'), > > Field('buyer',db.auth_user), > > Field('product',db.product), > > Field('quantity','integer'), > > Field('price','double'), > > Field('shipped','boolean',default=False), > > auth.signature), > > > # we also make a session cart, just in case > > session.cart = session.cart or {} > > @@END@@ > > > # we can now already access the model via app-admin > > # try create some products > > openhttp://127.0.0.1:8000/pos/appadmin > > > # we can also create prducts programmatically here is one way > > mkdir private > > cd private > > # let's get an image > > wgethttp://www.clker.com/cliparts/5/1/9/a/11954319101307220149molumen_car... > > sh:convert 11954319101307220149molumen_cardboard_box.svg.med.png > > box.jpg > > open box.jpg > > cd .. > > edit private/script.py > > import os > > > # find the box > > path = os.path.join(request.folder,'private','box.jpg') > > > # insert it in a database record > > id = db.product.insert(name='Box',price=2.99,description='the best > > box', > > > image=db.product.image.store(open(path,'rb'),path)) > > print 'record created, id=',id > > > # and do not forget to commit > > db.commit() > > @@END@@ > > > # now let's run it > > cd ../.. > > python web2py.py -S pos -M -N -R applications/pos/private/script.py > > cd applications/pos > > > # let us write a controller with the actions we need > > rm controllers/default.py > > edit controllers/default.py > > # list of products > > def index(): > > products = db(db.product).select(orderby=db.product.sortable) > > return locals() > > > # login, registration, etcetera > > def user(): > > return dict(form=auth()) > > > # an action to download uploaded images > > def download(): > > return response.download(request,db) > > > # an action to expose web services > > def call(): > > session.forget() > > return service() > > @@END@@ > > > # let us try listing the products we created > > openhttp://127.0.0.1:8000/pos/default/index > > > # let us make this better by creating a view > > rm views/default/index.html > > edit views/default/index.html > > {{extend 'layout.html'}} > > <h1>Products</h1> > > {{for p in products:}} > > <div> > > <h2>{{=p.name}} - ${{=p.price}}</h2> > > <img src="{{=URL('download',args=p.image)}}" align="right"/> > > {{=MARKMIN(p.description)}} > > </div> > > {{pass}} > > @@END@@ > > > openhttp://127.0.0.1:8000/pos/default/index > > > # and we make a simple menu > > edit models/menu.py > > response.menu=[ > > (T('Home'),False,URL('default','index')), > > (T('Cart'),False,URL('default','cart')), > > (T('Buy'),False,URL('default','buy')), > > ] > > @@END@@ > > > openhttp://127.0.0.1:8000/pos/default/index > > > # now we create some more logic for our app > > edit controllers/default.py > > # list of products > > def index(): > > products = db(db.product).select(orderby=db.product.sortable) > > return locals() > > > # login, registration, etcetera > > def user(): > > return dict(form=auth()) > > > # an action to download uploaded images > > def download(): > > return response.download(request,db) > > > # an action to expose web services > > def call(): > > session.forget() > > return service() > > > # an action to see and process a shopping cart > > @auth.requires_login() > > def cart(): > > return dict(cart=session.cart) > > > # this is for paying > > @auth.requires_login() > > def pay(): > > form = SQLFORM.factory(Field('creditcard')) > > if form.accepts(request,session): > > for key, value in session.cart.items(): > > db.sale.insert(buyer=auth.user.id, > > product = key, > > quantity = value, > > price = db.product(key).price, > > creditcard = form.vars.creditcard) > > session.cart.clear() > > session.flash = 'Thank you for your order' > > redirect(URL('index')) > > return dict(cart=session.cart,form=form) > > > # an action to add and remove items from the shopping cart > > def cart_callback(): > > id = int(request.vars.id) > > if request.vars.action == 'add': > > session.cart[id]=session.cart.get(id,0)+1 > > if request.vars.action == 'sub': > > session.cart[id]=max(0,session.cart.get(id,0)-1) > > return str(session.cart[id]) > > @@END@@ > > > # we add a button from the index page > > edit views/default/index.html > > {{extend 'layout.html'}} > > <h1>Products</h1> > > {{for p in products:}} > > <div> > > <h2>{{=p.name}} - ${{=p.price}}</h2> > > <img src="{{=URL('download',args=p.image)}}" align="right"/> > > {{=MARKMIN(p.description)}} > > <span id="item{{=p.id}}">{{=session.cart.get(p.id,0)}}</span> in > > cart - <button > > onclick="ajax('{{=URL('cart_callback',vars=dict(id=p.id,action='add'))}}', > > [],'item{{=p.id}}')">add to cart</button> > > </div> > > {{pass}} > > @@END@@ > > > # and a view for the cart so visitors can see their products > > edit views/default/cart.html > > {{extend 'layout.html'}} > > <h1>Your Shopping Cart</h1> > > <table width="100%"> > > {{for id, qty in cart.items():}}{{p=db.product(id)}} > > <tr> > > <td>{{=p.name}}</td> > > <td>${{=p.price}}</td> > > <td id="item{{=id}}">{{=qty}}</td> > > <td><button... > > read more »