Actually your questions gave me some ideas on how to simplify the
web2py syntax in using components. With the code in trunk you can now
rewrite the component

{{=LOAD('rsvp','rsvp',ajax=True)}}

as follows:

def rsvp():
 
"""
    self contained component to handle RSVP requests and
notificaitons
    """
    rsvp = db.rsvp(event=request.args(0),attendee=auth.user_id)
    if not rsvp and not auth.user:
        return A('login to
rsvp',_href=URL('default','user',args='login'))
    elif request.args(1)=='yes' and not rsvp:
        db.rsvp.insert(event=request.args(0),attendee=auth.user_id)
        response.js='jQuery("#%s").hide().fadeIn("slow")' %
request.cid
        return 'Thanks for RSVPing for this event'
    elif rsvp:
        return 'You are registered for this event'
    else:
        return A('You are not registered for this event, click to
RSVP',
 
_href=URL(args=(request.args(0),'yes')),cid=request.cid)

Notice how:
- request.cid is the ID of the <div>...</div> that contains the
component and it is assigned automatically
- If A(...,cid=request.cid) is set the target of the link stays in the
component
- response.js sets the JS to be executed after component response

All component logic stays in one function. This function could have
its own view but in this case it is not needed.

REQUIRES TRUNK!

On Aug 8, 1:20 pm, mdipierro <[email protected]> wrote:
> I would do this (on top of the scaffolding app)
>
> 1) model/db_rsvp.py
>
> db.define_table('event',
>    Field('name',requires=IS_NOT_EMPTY()),
>    Field('start_time','datetime'),
>    Field('location'),
>
> Field('posted_by',db.auth_user,default=auth.user_id,writable=False))
> db.define_table('rsvp',
>    Field('attendee',db.auth_user),
>    Field('event',db.event))
>
> 2) controllers/srvp.py
>
> def events():
>
> """
>     List future events and allow to create new events if logged-
> in
>     """
>     form = auth.user and crud.create(db.event)
>     events = db(db.event.start_time>request.now).select()
>     return dict(events=events,form=form)
>
> @auth.requires_login()
> def show():
>
> """
>     Show info avout event id==arg(0), list attendees and allow rsvp
> via load
>     Also allow event owner to edit
> event
>     """
>     event = db.event(request.args(0),posted_by=auth.user_id)
>     form = event and crud.update(db.event,event)
>     rsvps = db(db.rsvp.event==event.id).select()
>     attendees = db(db.auth_user.id.belongs(r.attendee for r in
> rsvps)).select()
>     return dict(event=event,attendees=attendees,form=form)
>
> 3) views/rsvp/events.html
>
> {{extend 'layout.html'}}
> {{for event in events:}}
>   {{=event.start_time}}
> {{=A(event.name,_href=URL('show',args=event.id))}}<br/>
> {{pass}}
> {{=form or A('login to post a new
> event',_href=URL('download','user',args='login'))}}
>
> 4) views/rsvp/show.html
>
> {{extend 'layout.html'}}
> <h1>{{=event.name}}</h1>
> <h2>{{=event.location}} @ {{=prettydate(event.start_time)}}</h2>
> {{=LOAD('rsvp','rsvp',args=event.id,ajax=True)}}
> <h3>Registered Attendees</h3>
> {{for attendee in attendees:}}
>  {{='%(first_name)s %(last_name)s' % attendee}}<br/>
> {{pass}}
>
> 5) ajax callback that handles RSVP component:
>
> def rsvp():
>
> """
>     self contained component to handle RSVP requests and
> notificaitons
>     """
>     component_url = URL(r=request,args=(request.args(0),'yes'))
>     component_id = request.env.http_web2py_component_element
>     rsvp = db.rsvp(event=request.args(0),attendee=auth.user_id)
>     if not rsvp and not auth.user:
>         return A('login to
> rsvp',_href=URL('default','user',args='login'))
>     elif request.args(1)=='yes' and not rsvp:
>         db.rsvp.insert(event=request.args(0),attendee=auth.user_id)
>         response.headers['web2py-component-
> command']='alert("Thanks!");'
>         return SPAN('Thanks for RSVPing for this event')
>     elif rsvp:
>         return SPAN('You are registered for this event')
>     else:
>         return SPAN('You are not registered for this event ',
>                     A('click here to RSVP',
>
> _onclick='web2py_ajax_page("GET","%s",null,"%s");return false' % \
>                           (component_url,component_id)))
>
> perhaps can simplify the API a bit.

Reply via email to