def update_all_uniques(): the_members = get_all_members(order=False) logging.info('starting unique cleanup') m_list = [] t_list = [] for m in the_members: ea = m.email_address.lower() if ea != m.email_address: # found an upper-case email # first, make new auth_id and email_addresses Uniques newauth = Unique.create('Member.auth_id:%s' % ea) if newauth is False: logging.error( 'Unable to create unique auth_id for email {0}'.format(ea)) newemail = Unique.create('Member.email_address:%s' % ea) if newemail is False: logging.error( 'Unable to create unique email_address for email {0}'. format(ea)) if newauth and newemail: # delete the old unique values logging.info('deleting old tokens for {0}'.format( m.email_address)) Unique.delete_multi([ 'Member.auth_id:%s' % m.email_address, 'Member.email_address:%s' % m.email_address ]) else: logging.error('did not delete old tokens') m.email_address = ea m.auth_ids = [ea] m_list.append(m) else: # email address is fine, just make sure we have tokens for this guy t_list.append('Member.auth_id:%s' % ea) t_list.append('Member.email_address:%s' % ea) if m_list: ndb.put_multi(m_list) if t_list: Unique.create_multi(t_list) logging.info('unique cleanup done')
def read_feed(): feedparser._HTMLSanitizer.acceptable_elements = [] # cleans up all html tag feeds = feedparser.parse(GOODREADS_RSS_URL) for feed in feeds.entries: clearer_date = datetime.fromtimestamp(mktime(feed.published_parsed)) uniques = ['Quote.link.%s' % feed.link, 'Quote.date.%s' % clearer_date, ] # transactionally create the unique quote based on date and link # https://webapp-improved.appspot.com/_modules/webapp2_extras/appengine/auth/models.html#Unique success, existing = Unique.create_multi(uniques) if success: quote = Quote() quote.date = clearer_date parsed_summary = [a for a in feed.summary.splitlines() if a and a != '-'] quote.text = parsed_summary[0] quote.author = parsed_summary[1] quote.link = feed.link quote.put() logging.info( 'New feed: {}, dated: {} has been inserted into the datastore' .format(feed.link, clearer_date) ) else: logging.debug('Properties %r are not unique.' % existing)
def deleteRelationship(self): success, existing = Unique.create_multi([ 'AreaUser.uniqueAreaUserString.%s:%s' % (self.userKey, self.privateArea) ]) Unique.delete_multi(existing) self.key.delete()
def post(self): """ Get fields from POST dict """ if not self.form.validate(): return self.get() username = self.form.username.data.lower() name = self.form.name.data.strip() last_name = self.form.last_name.data.strip() country = self.form.country.data tz = self.form.tz.data try: user_info = self.user_model.get_by_id(long(self.user_id)) try: message = '' # update username if it has changed and it isn't already taken if username != user_info.username: user_info.unique_properties = ['username', 'email'] uniques = [ 'User.username:%s' % username, 'User.auth_id:own:%s' % username, ] # Create the unique username and auth_id. success, existing = Unique.create_multi(uniques) if success: # free old uniques Unique.delete_multi( ['User.username:%s' % user_info.username, 'User.auth_id:own:%s' % user_info.username]) # The unique values were created, so we can save the user. user_info.username = username user_info.auth_ids[0] = 'own:%s' % username message += _('Your new username is <strong>{}</strong>').format(username) else: message += _( 'The username <strong>{}</strong> is already taken. Please choose another.').format( username) # At least one of the values is not unique. self.add_message(message, 'error') return self.get() user_info.name = name user_info.last_name = last_name user_info.country = country user_info.tz = tz user_info.put() message += " " + _('Thanks, your settings have been saved.') self.add_message(message, 'success') return self.get() except (AttributeError, KeyError, ValueError), e: logging.error('Error updating profile: ' + e) message = _('Unable to update profile. Please try again later.') self.add_message(message, 'error') return self.get() except (AttributeError, TypeError), e: login_error_message = _('Your session has expired.') self.add_message(login_error_message, 'error') self.redirect_to('login')
def set_email_to_pending(self): """ Changes the email address for the current user""" new_email = self.pending_change_email.lower() success = False if new_email != '': success, existing = \ Unique.create_multi(['Member.auth_id:%s'%new_email, 'Member.email_address:%s'%new_email]) if not success: logging.error('Unable to create user for email %s because of \ duplicate keys' % new_email) else: # delete the old unique values Unique.delete_multi(['Member.auth_id:%s'%self.email_address, 'Member.email_address:%s'%self.email_address]) self.email_address=new_email self.auth_ids=[new_email] self.pending_change_email = '' self.put() if success: return new_email else: return None
def post(self): """ Get fields from POST dict """ if not self.form.validate(): return self.get() username = self.form.username.data.lower() name = self.form.name.data.strip() last_name = self.form.last_name.data.strip() country = self.form.country.data try: user_info = models.User.get_by_id(long(self.user_id)) try: message='' # update username if it has changed and it isn't already taken if username != user_info.username: user_info.unique_properties = ['username','email'] uniques = [ 'User.username:%s' % username, 'User.auth_id:own:%s' % username, ] # Create the unique username and auth_id. success, existing = Unique.create_multi(uniques) if success: # free old uniques Unique.delete_multi(['User.username:%s' % user_info.username, 'User.auth_id:own:%s' % user_info.username]) # The unique values were created, so we can save the user. user_info.username=username user_info.auth_ids[0]='own:%s' % username message+= _('Your new username is ') + username + '.' else: message+= _('Username') + ": " + username + " " + _('is already taken. It is not changed.') # At least one of the values is not unique. # Make a list of the property names that failed. props = [name.split(':', 2)[-1] for name in uniques] raise ValueError(_('Properties %r are not unique.' % props)) user_info.name=name user_info.last_name=last_name user_info.country=country user_info.put() message+= " " + _('Your profile has been updated!') self.add_message(message,'success') return self.get() except (AttributeError, KeyError, ValueError), e: message = _('Unable to update profile!') logging.error('Unable to update profile: ' + e) self.add_message(message,'error') return self.get() except (AttributeError, TypeError), e: login_error_message = _('Sorry you are not logged in!') self.add_message(login_error_message,'error') self.redirect_to('login')
def update_all_uniques(): the_members = get_all_members(order=False) logging.info('starting unique cleanup') m_list=[] t_list=[] for m in the_members: ea = m.email_address.lower() if ea != m.email_address: # found an upper-case email # first, make new auth_id and email_addresses Uniques newauth = Unique.create('Member.auth_id:%s'%ea) if newauth is False: logging.error('Unable to create unique auth_id for email {0}'.format(ea)) newemail = Unique.create('Member.email_address:%s'%ea) if newemail is False: logging.error('Unable to create unique email_address for email {0}'.format(ea)) if newauth and newemail: # delete the old unique values logging.info('deleting old tokens for {0}'.format(m.email_address)) Unique.delete_multi(['Member.auth_id:%s'%m.email_address, 'Member.email_address:%s'%m.email_address]) else: logging.error('did not delete old tokens') m.email_address=ea m.auth_ids=[ea] m_list.append(m) else: # email address is fine, just make sure we have tokens for this guy t_list.append('Member.auth_id:%s'%ea) t_list.append('Member.email_address:%s'%ea) if m_list: ndb.put_multi(m_list) if t_list: Unique.create_multi(t_list) logging.info('unique cleanup done')
def Create(cls, lastname, firstname, gender, email, raw_password, phone): uniques = ['%s.%s:%s' % (cls.__name__, 'auth_id', email)] ok, existing = Unique.create_multi(uniques) if ok: password = security.generate_password_hash(raw_password, method='sha1', length=12, pepper=cls.Pepper) user = cls(auth_id=email, email=email, lastname=lastname, firstname=firstname, gender=gender, password=password, phone=phone) user.put() return user else: return None
def post(self, user_id): """ Get fields from POST dict """ user_data = self._data() user_info = models.User.get_by_id(long(user_id)) logging.info(user_data) if not user_info: raise Exception("User not found with id: " + user_id) username = user_data['username'] try: message = '' # update username if it has changed and it isn't already taken user_info.unique_properties = ['username', 'email'] uniques = [ 'User.username:%s' % username, 'User.auth_id:own:%s' % username, ] # Create the unique username and auth_id. success, existing = Unique.create_multi(uniques) if not existing and not success: raise Exception("Error creating user") # free old uniques Unique.delete_multi( ['User.username:%s' % user_info.username, 'User.auth_id:own:%s' % user_info.username]) # The unique values were created, so we can save the user. user_info.username = username user_info.auth_ids[0] = 'own:%s' % username user_info.name = user_data.get('name', None) user_info.last_name = user_data.get('last_name', None) if user_data.get('password', None) is not None: # Password to SHA512 password = utils.hashing(user_data['password'], self.app.config.get('salt')) user_info.password = security.generate_password_hash(password, length=12) user_info.put() return True except (AttributeError, KeyError, ValueError), e: logging.error('Error updating profile: ') logging.exception(e) return False
def Create(cls, lastname, firstname, gender, email, raw_password, phone): uniques = ['%s.%s:%s' % (cls.__name__, 'auth_id', email)] ok, existing = Unique.create_multi(uniques) if ok: password = security.generate_password_hash(raw_password, method='sha1', length=12, pepper=cls.Pepper) user = cls(auth_id=email, email=email, lastname=lastname, firstname=firstname, gender=gender, password=password, phone=phone) user.put() return user else: return None
def post(self): if not self.form.validate(): self.add_message("There were errors in subbitting the form.", "error") return self.get() username = self.form.username.data.lower() name = self.form.name.data.strip() email = self.form.email.data.strip() company = self.form.company.data.strip() country = self.form.country.data.strip() timezone = self.form.timezone.data.strip() user_info = User.get_by_id(long(self.user_id)) try: # update username if it has changed and it isn't already taken if username != user_info.username: user_info.unique_properties = ['username'] uniques = ['User.username:%s' % username] # create the unique username and auth_id success, existing = Unique.create_multi(uniques) if success: # free old uniques and update user Unique.delete_multi( ['User.username:%s' % user_info.username]) user_info.username = username self.add_message( 'Your new username is %s.' % format(username), 'success') else: # username not unique self.add_message( 'The username %s is already in use.' % format(username), 'error') return self.get() # update email if it has changed and it isn't already taken if email != user_info.email: user_info.unique_properties = ['email'] uniques = ['User.email:%s' % email] # create the unique username and auth_id success, existing = Unique.create_multi(uniques) if success: # free old uniques and update user Unique.delete_multi(['User.email:%s' % user_info.email]) user_info.email = email self.add_message('Your new email is %s.' % format(email), 'success') else: # user's email not unique self.add_message('That email address is already in use.', 'error') return self.get() # update database user_info.name = name user_info.company = company user_info.country = country user_info.timezone = timezone user_info.put() self.add_message("Your settings have been saved.", 'success') return self.get() except (AttributeError, KeyError, ValueError), e: logging.error('Error updating profile: ' + e) self.add_message( 'Unable to update profile. Please try again later.', 'error') return self.get()
def get(self): # get info from Google login current_user = users.get_current_user() # handle old and new users try: uid = current_user.user_id() # see if user is in database user_info = User.get_by_uid(uid) # get the destination URL from the next parameter next = self.request.get('next') # create association if user doesn't exist if user_info is None: username = current_user.email().split("@")[0] email = current_user.email() # create entry in db user_info = User(last_login=datetime.now(), uid=str(uid), username=username, email=email, activated=True) # try to create unique username while True: user_info.unique_properties = ['username'] uniques = ['User.username:%s' % user_info.username] success, existing = Unique.create_multi(uniques) # if we already have that username, create a new one and try again if existing: user_info.username = "******" % (username, random.randrange(100)) else: break # write out the user user_info.put() # wait a few seconds for database server to update time.sleep(1) log_message = "new user registered" # slack the new user signup if config.debug: in_dev = " (in development)" else: in_dev = "" slack_data = { 'text': "Woot! New user %s just signed up%s!" % (user_info.username, in_dev), 'username': "******", 'icon_emoji': ":cloud:" } h = httplib2.Http() resp, content = h.request( config.slack_webhook, 'POST', json.dumps(slack_data), headers={'Content-Type': 'application/json'}) else: # existing user logging in - force a2fa check before continuing now_minus_an_hour = datetime.now() + timedelta( 0, -config.session_age) if user_info.tfenabled and (user_info.last_login < now_minus_an_hour): return self.redirect_to('login-tfa', next=next) else: # two factor is disabled, or already complete user_info.last_login = datetime.now() user_info.put() log_message = "user login" # set the user's session self.auth.set_session(self.auth.store.user_to_dict(user_info), remember=True) # log visit log = LogVisit(user=user_info.key, message=log_message, uastring=self.request.user_agent, ip=self.request.remote_addr) log.put() message = "You have successfully logged in!" self.add_message(message, 'success') # take user to whatever page was originally requested, or status if none if next: return self.redirect(str(next)) else: return self.redirect_to('account-status') except Exception as ex: message = "No user authentication information received from Google: %s" % ex self.add_message(message, 'error') return self.redirect_to('home')
def post(self): if not self.form.validate(): self.add_message("There were errors in subbitting the form.", "error") return self.get() username = self.form.username.data.lower() name = self.form.name.data.strip() email = self.form.email.data.strip() company = self.form.company.data.strip() country = self.form.country.data.strip() timezone = self.form.timezone.data.strip() user_info = User.get_by_id(long(self.user_id)) try: # update username if it has changed and it isn't already taken if username != user_info.username: user_info.unique_properties = ['username'] uniques = ['User.username:%s' % username] # create the unique username and auth_id success, existing = Unique.create_multi(uniques) if success: # free old uniques and update user Unique.delete_multi(['User.username:%s' % user_info.username]) user_info.username = username self.add_message('Your new username is %s.' % format(username), 'success') else: # username not unique self.add_message('The username %s is already in use.' % format(username), 'error') return self.get() # update email if it has changed and it isn't already taken if email != user_info.email: user_info.unique_properties = ['email'] uniques = ['User.email:%s' % email] # create the unique username and auth_id success, existing = Unique.create_multi(uniques) if success: # free old uniques and update user Unique.delete_multi(['User.email:%s' % user_info.email]) user_info.email = email self.add_message('Your new email is %s.' % format(email), 'success') else: # user's email not unique self.add_message('That email address is already in use.', 'error') return self.get() # update database user_info.name = name user_info.company = company user_info.country = country user_info.timezone = timezone user_info.put() self.add_message("Your settings have been saved.", 'success') return self.get() except (AttributeError, KeyError, ValueError), e: logging.error('Error updating profile: ' + e) self.add_message('Unable to update profile. Please try again later.', 'error') return self.get()
def get(self): # get info from Google login current_user = users.get_current_user() # handle old and new users try: uid = current_user.user_id() # see if user is in database user_info = User.get_by_uid(uid) # get the destination URL from the next parameter next = self.request.get('next') # create association if user doesn't exist if user_info is None: username = current_user.email().split("@")[0] email = current_user.email() # create entry in db user_info = User( last_login = datetime.now(), uid = str(uid), username = username, email = email, activated = True ) # try to create unique username while True: user_info.unique_properties = ['username'] uniques = ['User.username:%s' % user_info.username] success, existing = Unique.create_multi(uniques) # if we already have that username, create a new one and try again if existing: user_info.username = "******" % (username, random.randrange(100)) else: break # write out the user user_info.put() # wait a few seconds for database server to update time.sleep(1) log_message = "new user registered" # slack the new user signup if config.debug: in_dev = " (in development)" else: in_dev = "" slack_data = { 'text': "Woot! New user %s just signed up%s!" % (user_info.username, in_dev), 'username': "******", 'icon_emoji': ":cloud:" } h = httplib2.Http() resp, content = h.request(config.slack_webhook, 'POST', json.dumps(slack_data), headers={'Content-Type': 'application/json'}) else: # existing user logging in - force a2fa check before continuing now_minus_an_hour = datetime.now() + timedelta(0, -config.session_age) if user_info.tfenabled and (user_info.last_login < now_minus_an_hour): return self.redirect_to('login-tfa', next=next) else: # two factor is disabled, or already complete user_info.last_login = datetime.now() user_info.put() log_message = "user login" # set the user's session self.auth.set_session(self.auth.store.user_to_dict(user_info), remember=True) # log visit log = LogVisit( user = user_info.key, message = log_message, uastring = self.request.user_agent, ip = self.request.remote_addr ) log.put() message = "You have successfully logged in!" self.add_message(message, 'success') # take user to whatever page was originally requested, or status if none if next: return self.redirect(str(next)) else: return self.redirect_to('account-status') except Exception as ex: message = "No user authentication information received from Google: %s" % ex self.add_message(message, 'error') return self.redirect_to('home')
def post(self): """ Get fields from POST dict """ if not self.form.validate(): return self.get() username = self.form.username.data.lower() name = self.form.name.data.strip() last_name = self.form.last_name.data.strip() country = self.form.country.data try: user_info = models.User.get_by_id(long(self.user_id)) try: message = '' # update username if it has changed and it isn't already taken if username != user_info.username: user_info.unique_properties = ['username', 'email'] uniques = [ 'User.username:%s' % username, 'User.auth_id:own:%s' % username, ] # Create the unique username and auth_id. success, existing = Unique.create_multi(uniques) if success: # free old uniques Unique.delete_multi([ 'User.username:%s' % user_info.username, 'User.auth_id:own:%s' % user_info.username ]) # The unique values were created, so we can save the user. user_info.username = username user_info.auth_ids[0] = 'own:%s' % username message += _('Your new username is ' ) + '<strong>' + username + '</strong>.' else: message += _( 'Username' ) + " <strong>" + username + "</strong> " + _( 'is already taken. It is not changed.') # At least one of the values is not unique. self.add_message(message, 'error') return self.get() user_info.name = name user_info.last_name = last_name user_info.country = country user_info.put() message += " " + _('Your profile has been updated!') self.add_message(message, 'success') return self.get() except (AttributeError, KeyError, ValueError), e: message = _('Unable to update profile!') logging.error('Unable to update profile: ' + e) self.add_message(message, 'error') return self.get() except (AttributeError, TypeError), e: login_error_message = _('Sorry you are not logged in!') self.add_message(login_error_message, 'error') self.redirect_to('login')
def deleteRelationship(self): success, existing = Unique.create_multi(['AreaUser.uniqueAreaUserString.%s:%s' % (self.userKey, self.privateArea)]) Unique.delete_multi(existing) self.key.delete();
def post(self): """ Get fields from POST dict """ if not self.form.validate(): return self.get() username = self.form.username.data.lower() name = self.form.name.data.strip() last_name = self.form.last_name.data.strip() country = self.form.country.data.strip() bio = self.form.bio.data.strip() twitter_widget_id = self.form.twitter_widget_id.data.strip() gravatar_url = self.form.gravatar_url.data.strip() google_plus_profile = self.form.google_plus_profile.data.strip() try: user_info = models.User.get_by_id(long(self.user_id)) try: message='' # update username if it has changed and it isn't already taken if username != user_info.username: user_info.unique_properties = ['username','email'] uniques = [ 'User.username:%s' % username, 'User.auth_id:own:%s' % username, ] # Create the unique username and auth_id. success, existing = Unique.create_multi(uniques) if success: # free old uniques Unique.delete_multi(['User.username:%s' % user_info.username, 'User.auth_id:own:%s' % user_info.username]) # The unique values were created, so we can save the user. user_info.username=username user_info.auth_ids[0]='own:%s' % username message+= _('Your new username is %s' % '<strong>{0:>s}</strong>'.format(username) ) else: message+= _('The username %s is already taken. Please choose another.' % '<strong>{0:>s}</strong>'.format(username) ) # At least one of the values is not unique. self.add_message(message, 'error') return self.get() user_info.name=name user_info.last_name=last_name user_info.country=country user_info.bio=bio user_info.twitter_widget_id=twitter_widget_id user_info.gravatar_url=gravatar_url user_info.google_plus_profile=google_plus_profile user_info.put() message+= " " + _('Thanks, your settings have been saved. You may now dance.') self.add_message(message, 'success') return self.get() except (AttributeError, KeyError, ValueError), e: logging.error('Error updating profile: ' + e) message = _('Unable to update profile. Please try again later.') self.add_message(message, 'error') return self.get() except (AttributeError, TypeError), e: login_error_message = _('Sorry you are not logged in.') self.add_message(login_error_message, 'error') self.redirect_to('login')
def post(self): """ Get fields from POST dict """ if not self.form.validate(): return self.get() username = self.form.username.data.lower() name = self.form.name.data.strip() last_name = self.form.last_name.data.strip() country = self.form.country.data.strip() bio = self.form.bio.data.strip() twitter_widget_id = self.form.twitter_widget_id.data.strip() gravatar_url = self.form.gravatar_url.data.strip() google_plus_profile = self.form.google_plus_profile.data.strip() try: user_info = models.User.get_by_id(long(self.user_id)) try: message = '' # update username if it has changed and it isn't already taken if username != user_info.username: user_info.unique_properties = ['username', 'email'] uniques = [ 'User.username:%s' % username, 'User.auth_id:own:%s' % username, ] # Create the unique username and auth_id. success, existing = Unique.create_multi(uniques) if success: # free old uniques Unique.delete_multi([ 'User.username:%s' % user_info.username, 'User.auth_id:own:%s' % user_info.username ]) # The unique values were created, so we can save the user. user_info.username = username user_info.auth_ids[0] = 'own:%s' % username message += _( 'Your new username is %s' % '<strong>{0:>s}</strong>'.format(username)) else: message += _( 'The username %s is already taken. Please choose another.' % '<strong>{0:>s}</strong>'.format(username)) # At least one of the values is not unique. self.add_message(message, 'error') return self.get() user_info.name = name user_info.last_name = last_name user_info.country = country user_info.bio = bio user_info.twitter_widget_id = twitter_widget_id user_info.gravatar_url = gravatar_url user_info.google_plus_profile = google_plus_profile user_info.put() message += " " + _( 'Thanks, your settings have been saved. You may now dance.' ) self.add_message(message, 'success') return self.get() except (AttributeError, KeyError, ValueError), e: logging.error('Error updating profile: ' + e) message = _( 'Unable to update profile. Please try again later.') self.add_message(message, 'error') return self.get() except (AttributeError, TypeError), e: login_error_message = _('Sorry you are not logged in.') self.add_message(login_error_message, 'error') self.redirect_to('login')
def get(self, npid=None): # get our request code back from the social login handler above code = self.request.get('code') # fire up the github auth object scope = 'user:email' github_helper = github.GithubAuth(scope) # retrieve the access token using the code and auth try: access_token = github_helper.get_access_token(code) user_data = github.get_user_info(access_token) except: message = 'Error while tokening with Github.' self.add_message(message, 'error') return self.redirect_to('index') # see if user is in database uid = str(user_data['id']) # github id user_info = User.get_by_uid(uid) # less than ideal way to handle excessive 2FA requests #if not user_info.activated: # self.add_message("This account has been deactivated due to excessive 2FA requests. Please contact us to resolve.", "error") # return self.redirect_to('about') # never seen them, so create user if not user_info: name = user_data['name'] username = user_data['login'] email = user_data['email'] location = user_data['location'] company = user_data['company'] # create entry in db user_info = User(last_login=datetime.now(), uid=str(uid), username=username, name=name, company=company, location=location, email=email, activated=True) # try to create unique username while True: user_info.unique_properties = ['username'] uniques = ['User.username:%s' % user_info.username] success, existing = Unique.create_multi(uniques) # if we already have that username, create a new one and try again if existing: user_info.username = "******" % (username, random.randrange(100)) else: break # write out the user user_info.put() # wait a few seconds for database server to update if config.isdev: time.sleep(1) # seriously? # send to marketo if we have email # if len(email) > 3: try: email_test = len(email) except Exception as ex: slack.slack_message( "New user's email appears to be empty: %s." % ex) email_test = 0 if email_test > 3 and not config.isdev: try: mc = MarketoClient(config.munchkin_id, config.mclient_id, config.mclient_secret) try: first = name.split()[0] except: first = "" try: last = name.split()[1] except: last = "" leads = [{ "email": email, "firstName": first, "lastName": last, "company": company, "leadSource": config.mclient_leadSource }] lead = mc.execute( method='push_lead', leads=leads, lookupField='email', programName=config.mclient_programName, programStatus=config.mclient_programStatus) except Exception as ex: slack.slack_message( "Marketo lead create failed because %s." % ex) # slack the new user signup slack.slack_message("New user signed up: %s|%s|%s|%s|%s" % (name, username, email, location, company)) # check out 2FA status now_minus_age = datetime.now() + timedelta(0, -config.session_age) # load the next destination, if any if npid: np_info = NextPages.get_by_npid(npid) next_page = np_info.url print next_page else: next_page = "" # check if 2FA is on if user_info.tfenabled and (user_info.last_login < now_minus_age): return self.redirect_to('login-tfa', next=next_page, uid=user_info.uid) else: # two factor is disabled, or already complete user_info.last_login = datetime.now() user_info.put() # log the user in self.auth.set_session(self.auth.store.user_to_dict(user_info), remember=True) # log visit log_message = "user logged in" log = LogVisit(user=user_info.key, message=log_message, uastring=self.request.user_agent, ip=self.request.remote_addr) log.put() message = "You have successfully logged in!" self.add_message(message, 'success') # remove the next page if np_info: np_info.key.delete() # get the destination URL from the next cookie if next_page > "": return self.redirect(str(next_page)) else: return self.redirect_to('account-dashboard') try: pass except Exception as ex: message = "User login went wrong: %s" % ex self.add_message(message, 'error') return self.redirect_to('index')