Exemple #1
0
 def test_sms_reply_in(self):
     if not settings.TEST_SMS: return
     
     user, event, smsuser = self.prep_for_response_sms()
     
     att = Attendant.get({u'user': user[u'id'], u'event': event[u'id']})
     self.assertEqual(att[u'status'], status.INVITED, 'user is invited')
     
     response = self.post('/extras/SMS/', args={'From': smsuser[u'number'],
                                                'To': settings.TWILIO_NUMBERS[0],
                                                'Body': '#in'})
     self.assertEqual(response.status, 200)
     
     att = Attendant.get({u'user': user[u'id'], u'event': event[u'id']})
     self.assertEqual(att[u'status'], status.ATTENDING, 'user is attending')
 def get(self, event_id):
     event = Event.get({u'id': event_id})
     if not event: raise HTTPError(404)
     
     if not event.user_can_access(self.get_user()):
         raise HTTPError(401)
     self.output({u'attendants': Attendant.find({u'event': 
                                     event_id}).serializable(name=True)})
 def user_can_access(self, user):
     if user[u'username'] == self[u'creator']:
         return True
     if not self[u'broadcast']:
         att = Attendant.get({u'event': self[u'id'], 
                              u'user': user[u'id']})
         return att is not None
     return True
 def post(self, event_id):
     '''
     Updates an invitee's attendance
     '''
     body = self.body_dict()
     username = self.get_session()[u'username']
     user = User.get({u'username': username})
     #make sure the event exists
     event = Event.get(event_id)
     if not event: raise HTTPError(404)
     
     #try to grab the user's existing attendance status
     att = Attendant.get({u'event': event[u'id'],
                          u'user': user[u'id']})
     
     #if the user isn't invited, we need to error out if broadcast is off
     if att is None:
         if event[u'broadcast']:
             att = Attendant(user=user[u'id'], event=event[u'id'])
         else:
             raise HTTPError(403)
     
     # create a list of acceptable statuses
     valid_statuses = [v for k, v in status.__dict__.iteritems() if k[0] != '_']
     
     #make sure status is present and a correct value
     if body.get(u'status') not in valid_statuses:
         raise HTTPError(400)
     
     notify = (att[u'status'] == status.INVITED 
               and body[u'status'] == status.ATTENDING)
     
     att[u'status'] = body[u'status']
     att.save()
     
     if notify:
         #Send out the attendant notifications
         for uname in Attendant.to_notify(event, skip=[username]):
             notifications.send(uname, {u'type': 'attendant',
                                        u'event_revision': event[u'revision'],
                                        u'event_id': event[u'id'],
                                        u'attendant': username})
 def test_auto_invite(self):
     user = self.get_user()
     user2 = self.make_user()
     
     self.follow(user2, user)
     
     response = self.post('/events/', {
         u'broadcast': True,
         u'what': 'Testin event creation',
     })
     self.assertEqual(response.status, 201, 'new event 201')
     event = json.loads(response.read())
     
     att = Attendant.get({u'event': event[u'id'], u'user': user2[u'id']})
     
     self.assertNotEqual(att, None, 'user auto-invited')
    def get(self, revision):
        '''
        TODO - enforce user restrictions
        '''
        #grab the event from the database
        event = Event.get({u'revision': revision})
        if event is None: raise HTTPError(404)
        
        if not event.user_can_access(self.get_user()):
            raise HTTPError(401)
        
        response = {'event': event.serializable()}

        #give the user the attendance info if they asked for it
        if self.request.arguments.get('attendants'):
            response['attendants'] = Attendant.find({u'event': 
                                         event[u'id']}).serializable(name=True)
        self.output(response)
 def post(self, event_id):
     #make sure the event exists
     event = Event.get(event_id)
     if not event: raise HTTPError(404)
     
     #grab the data
     body = self.body_dict()
     #comment body is required, and must have content
     if not u'comment' in body or len(body[u'comment']) == 0:
         raise HTTPError(400)
     
     #nonce is optional
     if u'nonce' in body:
         #if another comment exists with this nonce, it's a double-post
         if Comment.get({u'nonce': body[u'nonce'],
                         u'event': event[u'id'], 
                         u'user': self.get_session()[u'username']}):
             raise HTTPError(409)
     
     commenter = self.get_session()[u'username']
     
     #create the comment
     Comment(**{
         u'comment': body[u'comment'],
         u'event': event[u'id'],
         u'username': commenter,
     }).save()
     
     #Send out the comment notifications
     usernames = Attendant.to_notify(event, skip=[commenter])
     for username in usernames:
         notifications.send(username, {u'type': 'comment',
                                       u'event_revision': event[u'revision'],
                                       u'event_id': event[u'id'],
                                       u'comment': body[u'comment'],
                                       u'commenter': commenter})
    def get(self):
        '''
        Gets a list of events
        '''
        #store username for later use
        username = self.get_session()[u'username']
        user = User.get({u'username': username})

        #grab the sorting/filtering types from the args
        #funky names avoid conflict with python builtins
        q_sort = self.get_argument(u'sort', u'soon')
        q_filter = self.get_argument(u'filter', u'invited')
        category = self.get_argument(u'category', None)
        
        if not q_filter in (u'invited', u'creator', u'public'):
            raise HTTPError(404)

        #prep the geospatial info
        lat = self.get_argument('lat', None)
        lng = self.get_argument('lng', None)
        if lat is not None and lng is not None:
            where = [float(lat), float(lng)]
        elif q_sort == u'nearby':
            raise HTTPError(403)

        events_invited = [ObjectId(att[u'event']) for att in 
                          Attendant.find({u'user': user[u'id']})]
        #prep filtering
        if q_filter == 'invited':
            q_filter = {'$or': [
                            {u'creator': username},
                            {u'_id': {'$in': events_invited}},
                            {
                                u'broadcast': True, 
                                u'creator': {'$in': user.following()}
                            }
                        ]}
        elif q_filter == u'creator':
            q_filter = {u'creator': self.get_argument(u'username', username),
                        u'$or': [{u'_id': {'$in': events_invited}},
                                 {u'broadcast': True},
                                 {u'broadcast': False, u'creator': username}]}
        elif q_filter == u'public':
            q_filter = {u'broadcast': True}
            if category is not None:
                q_filter[u'category'] = category 
        
        # This can be uncommented when mongogb gets support for $and
#        # Limit to nearby times
#        q_filter.update({'$or': [{u'when': {u'$lt': timestamp() + UNTIL_LIMIT,
#                                            u'$gt': timestamp() - SINCE_LIMIT}},
#                                 {u'when': None}]})
        
        # Handle geo sorting
        if q_sort == u'nearby':
            #set the sort
            q_filter.update({u'posted_from': {u'$near': where}})
            #use 'soon' as a secondary sort
            q_sort = u'soon'
        
        # Run the query
        events = db.objects.event.find(q_filter, limit=30)

        #perform the required sorting
        if q_sort == u'created':
            events.sort(u'created', direction=DESCENDING)
        elif q_sort == u'soon':
            events.sort(u'when', direction=DESCENDING)
            events.sort(u'created', direction=DESCENDING)

        #output the results
        result = {u'events': [e[u'revision'] for e in events]}
        self.write(result)