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