def get(self, tag): # To allow a join action to redirect to OAuth and smoothly redirect # back here to finish the action, the join action is a GET request. if self.request.get('join'): # Add a tag to the member, and also update the member's location. self.require_member() self.verify_signature() now = datetime.datetime.utcnow() duration = int(self.request.get('duration')) stop_time = now + datetime.timedelta(0, duration) self.member.set_location(utils.get_location(self.member), now) model.Member.join(self.user, tag, stop_time) # Ensure that a TagStat entity exists, to be later updated. model.TagStat.get_or_insert(key_name=tag) # Schedule a task to update the stats now. taskqueue.add( method='GET', url='/_update_tagstats', params={'tag': tag}) # Schedule a task to promptly update the stats upon expiry. taskqueue.add( method='GET', countdown=duration + 1, url='/_update_tagstats', params={'tag': tag}) # Redirect to avoid adding the join action to the browser history. raise utils.Redirect('/' + tag) # Generate the tag viewing page. now = datetime.datetime.utcnow() user_id = self.user and self.user.user_id() join_time = '' members = [] for member in model.Member.get_for_tag(tag, now): if member.location: if member.user.user_id() == user_id: join_time = utils.describe_delta( member.get_stop_time(tag) - now) else: members.append(self.get_member_info(member)) members.sort(key=lambda m: (m.get('distance', 0), m['nickname'])) if join_time: members.insert(0, self.get_member_info(self.member)) members[0]['is_self'] = 1 if self.user: self.set_signature() # to prevent XSRF self.render('templates/tag.html', vars=self.vars, tag=tag, join_time=join_time, members=simplejson.dumps(members))
def get(self): self.require_user() nickname = self.request.get('nickname', '') next = self.request.get('next', '') duration = utils.describe_delta( datetime.timedelta(0, int(self.request.get('duration', '0')))) if not nickname: self.render('templates/register.html', next=next, duration=duration, nickname=self.user.nickname().split('@')[0]) else: # Then proceed to the OAuth authorization page. parameters = { 'scope': latitude.LatitudeOAuthClient.SCOPE, 'domain': model.Config.get('oauth_consumer_key'), 'granularity': 'best', 'location': 'current' } callback_url = self.request.host_url + '/_oauth_callback?' + \ utils.urlencode(nickname=nickname, next=next) oauth_webapp.redirect_to_authorization_page( self, latitude.LatitudeOAuthClient(utils.oauth_consumer), callback_url, parameters)