def post(self): jinja = jinja2.get_jinja2(app=self.app) # Retrieve the fields written in the sign in form email = self.request.get("s_email", "") # New user email email = email.encode("utf8") password1 = self.request.get("s_password", "") # New user password password1 = password1.encode("utf8") password2 = self.request.get("rs_password", "") # New user password password2 = password2.encode("utf8") name = self.request.get("s_name", "") # New user name name = name.encode("utf8") genre = self.request.get("s_genre", "not_defined") # New user genre genre = genre.encode("utf8") # Set the default language of the app lang = get_default_language() # Get the default language of the app # Set the language strings dictionary if lang == "spa": lang = spa # Spanish strings elif lang == "eng": lang = eng # English strings # Default values to be sent to the HTML page values = { "lang": lang, # Strings } # Check if the email or password fields are empty (HTML shouldn't allow this). Show an error message if they are empty if len(email) == 0 or len(password1) == 0 or len(password2) == 0: # Values to be sent to the HTML page values["error_message"] = lang[ "needs_email_pass"] # Error message (Email and password required) del email, password1, password2, name, genre # Delete variables to free memory self.response.write(jinja.render_template( "index.html", **values)) # Go to the login page # If not empty else: # Check if the user already exists user = User.query(User.email == email) # If the user exists, show an error message if user and user.count() > 0: # Values to be sent to the HTML page values["error_message"] = lang[ "user_already_exists"] # Error message (This user already exists) del user, email, password1, password2, name, genre # Delete variables to free memory self.response.write( jinja.render_template("index.html", **values)) # Go the login page # If the user doesn't exist, create a new user else: # Check if the username already exists username = User.query(User.name == name) # If the username already exists, shows an error message if username.count() > 0: # Values to be sent to the HTML page values["error_message"] = lang[ "username_already_exists"] # Error message (Username already used by other) del username # Delete variable to free memory self.response.write( jinja.render_template( "index.html", **values)) # Go to the login page # If the username doesn't exist else: # If the passwords are equals if self.check_passwords(password1, password1): # Create an username if the user didn't write one if len(name) == 0: pos = email.find("@") name = email[:pos] # Check if the new user name already exists aux_user = User.query(User.name == name).fetch() aux_name = name while len(aux_user) > 0: aux_name = name + str(random.randint(0, 999)) aux_user = User.query( User.name == aux_name).fetch() name = aux_name # Setting the new user name del pos, aux_user, aux_name # Delete variables to free memory # Codify the password hash = encryptPassword(password1) # Check the genre if genre != "male" and genre != "female" and genre != "female": genre = "not_defined" # Get the default language idiom = get_default_language() # Create the user and put it in in the database user = User(email=email, password=hash, name=name, genre=genre, role="client", language=idiom) aux = user.put() time.sleep(1) # It the user was successfully added if aux is not None: # Setting the session variables self.session[ 'session_name'] = user.name # User name self.session[ 'session_role'] = user.role # User role self.session[ 'session_idiom'] = user.language # User language self.session[ 'session_genre'] = user.genre # User genre self.session[ 'num_elems_page'] = 10 # Number of elements per page self.session[ 'current_number_page'] = 1 # Current number page self.session['pages'] = list( ) # Pages for the pagination self.session['last_page'] = 1 # Last page number self.session[ 'pages_to_show'] = 3 # Number of pages that shows the pagination self.session[ 'page_name'] = "" # Name of the current page in wich user is # Create a welcome email message = mail.EmailMessage( sender= "*****@*****.**", # Email sender, it has to be a Google account subject=lang["welcome_subject"] ) # Email subject message.to = email # Email receiver message.body = lang["welcome_mail"] # Email body # Send the email message.send() del user, email, password1, password2, name, genre, hash, username, idiom, message, aux # Delete variables to free memory self.redirect("/home") # Redirect to the home page # Else show an error message else: # Variables to be sent to the HTML page values["error_message"] = lang[ "error_sign_in"] # Error message (The client couldn't be added) del user, email, password1, password2, name, genre, hash, username, idiom, aux # Delete variables to free memory self.response.write( jinja.render_template( "index.html", **values)) # Go to the login page # If password not equals else: # Variables to be sent to the HTML page values["error_message"] = lang[ "invalid_password"] # Error message (Password not equals) del user, email, password1, password2, name, genre, username # Delete variables to free memory self.response.write( jinja.render_template( "index.html", **values)) # Go to the login page
def post(self): jinja = jinja2.get_jinja2(app=self.app) # Check if the admin is logged in if self.session.get('session_role') == 'admin': # If it's logged in, get the session variables, show the home page # Get the user attributes email = self.request.get("email", "") # User email email = email.encode("utf8") password1 = self.request.get("password", "") # User password password1 = password1.encode("utf8") password2 = self.request.get("r_password", "") # User password password2 = password2.encode("utf8") name = self.request.get("username", "") # User name name = name.encode("utf8") genre = self.request.get("genre", "") # User genre genre = genre.encode("utf8") role = self.request.get("role", "") # User role role = role.encode("utf8") picture = self.request.get("picture", "") # User picture keys_page_list = self.request.get( "keys_page_list", "") # User keys (only Users in the current page) aux_all_keys = self.request.get( "all_keys", "") # All the user keys (for the order field) # Initialize variables all_keys = list() # All the user keys (for the order field) all_users = list() # All users (for the search field) aux = list() # Support list aux3 = list() # Support list offset = ( self.session.get('current_number_page') - 1 ) * self.session.get( 'num_elems_page') # Number of elements to ignore in the query # If the current page isn't empty if len(keys_page_list) > 2: # Transform the HTML string in a list aux_all_keys = self.transform_keys(aux_all_keys) users = User.query() all_users = copy.copy( users) # ALL users (for the search field) all_users = all_users.fetch() for user in users: # Get ALL the keys aux.append(user.key.urlsafe()) del user for key in aux_all_keys: # Compare the "list" given by HTML with aux for making the new all keys list (all_keys) for key2 in aux: if key == str(key2): key2 = ndb.Key(urlsafe=key) aux3.append(key2) all_keys.append(key2.urlsafe()) break del key2 del key # Get db users users = User.query(User.key.IN(aux3)).fetch( self.session.get('num_elems_page'), offset=offset) # If empty else: users = list() # Set the default language of the app if self.session['session_idiom'] == "spa": lang = spa # Spanish strings elif self.session['session_idiom'] == "eng": lang = eng # English strings else: lang = eng # Default english keys_page_list = list() # Variables to be sent to the HTML page values = { "lang": lang, # Language strings "session_name": self.session.get('session_name'), # User name "session_role": self.session.get('session_role'), # User role "session_picture": self.get_session_image( self.session.get('session_name')), # User picture "session_genre": self.session.get('session_genre'), # User genre "users": users, # Users "current_number_page": self.session.get('current_number_page'), # Current number page "pages": self.session.get('pages'), # Pages for the pagination "last_page": self.session.get('last_page'), # Last page number "keys_page_list": keys_page_list, # User keys that are currently in the page "all_keys": all_keys, # All user keys "all_users": all_users # ALL user (for the search field) } # If the user enters all the attributes (the database can have more than one user with the same name) if len(email) > 0 and self.check_passwords( password1, password2) and len(role) > 0: user = User.query( ndb.OR(User.email == email, User.name == name)).fetch() # If an user already exists, show an error message if len(user) == 0: # Check the user attributes if len( name ) == 0: # Create an username if the user didn't write one pos = email.find("@") name = email[:pos] # Check if the new user name already exists aux_user = User.query(User.name == name).fetch() aux_name = name while len(aux_user) > 0: aux_name = name + str(random.randint(0, 999)) aux_user = User.query( User.name == aux_name).fetch() print(aux_name) name = aux_name # Setting the new user name del pos, aux_user, aux_name # Delete variables to free memory elif len(name) > 20: name = name[0:20] if role != "admin" and role != "client": role = "client" if len(genre ) == 0 and genre != "male" and genre != "female": genre = "not_defined" if picture != "": picture = images.resize(picture, 250, 250) else: picture = None # Add the new user to the home page user = User(email=email, password=encryptPassword(password1), name=name, genre=genre, role=role, picture=picture) aux2 = user.put() time.sleep(1) # If the user was successfully added if aux2 is not None: # Adding the new user and its key to the lists aux3.append(user.key) all_keys.append(user.key.urlsafe()) all_users.append(user) # Setting pagination ############################################################################################## pages_to_show = self.session.get( 'pages_to_show' ) # Number of pages that shows the pagination pages = list( ) # Pages for the pagination (it's a list because of django for templates) # Get all db users (Limited to the number given by the session variable [10 by default]) users = User.query(User.key.IN(aux3)).fetch( self.session.get('num_elems_page'), offset=offset) # Setting the new keys list for the users currently in the page (allows to use the "Delete page" button) for user in users: keys_page_list.append(user.key.urlsafe()) del user num_total = len(all_users) # Total number of elements # If the total number of elements is above 0 do the pagination if num_total > 0: # Get the number of pages for the pagination num_elems_page = self.session.get( 'num_elems_page' ) # Number of elements (users) per page num_pages = num_total / num_elems_page # Number of pages # If there are less elements than session["num_elems_page"] if num_pages == 0: num_pages = 1 # At least one page # Else else: # If the rest of the division is above 0 if (num_total % num_elems_page) > 0: num_pages = ( num_total / num_elems_page ) + 1 # It's necessary other page else: num_pages = ( num_total / num_elems_page ) # It doesn't need other page self.session['last_page'] = num_pages # Last page # Set the pages for the pagination for i in range(1, num_pages + 1): pages.append(i) # Set number of pages for the pagination (pagination only shows 3 pages) current_number_page = self.session.get( 'current_number_page') # If the current page is 1 if current_number_page == 1: pages = pages[ 0:pages_to_show] # Shows pages 1,2,3 # If the current page is the final page elif current_number_page == num_pages: # Shows the last three pages if (num_pages - pages_to_show) >= 0: pages = pages[(num_pages - pages_to_show):] else: pages = pages[0:pages_to_show] # Else else: pages = pages[(current_number_page - 2):( current_number_page + 1 )] # Show the current, last and next pages self.session[ 'pages'] = pages # Pages for the pagination # Variables to be sent to the HTML page values["users"] = users # Users values["pages"] = self.session.get( 'pages') # Pages for the pagination values["last_page"] = self.session.get( 'last_page') # Last page number del num_elems_page, num_pages, current_number_page # Delete variables to free memory ########################################################################################### # Variables to be sent to the HTML page values["ok_message"] = lang[ "user_added_successfully"] # Ok message (user added successfully) values[ "keys_page_list"] = keys_page_list # Users keys that are currently in the page values["all_keys"] = all_keys # All user keys values[ "all_users"] = all_users # ALL user (for the search field) del pages_to_show, pages, users, num_total # Delete variables to free memory # If wasn't successfully added else: del user, aux2 # Delete variables to free memory # Variables to be sent to the HTML page values["error_message"] = lang[ "error_add"] # Error message (The addition failed) # If not exists else: del user # Delete variables to free memory # Variables to be sent to the HTML page values["error_message"] = lang[ "user_already_exists"] # Error message (User already exists) # Else show an error message else: # Values to be sent to the HTML page values["error_message"] = lang[ "must_insert_all_user_attributes"] # Error message (You must enter all user data) del lang, name, offset, keys_page_list, aux_all_keys, all_keys, all_users, aux, aux3, email, \ password1, password2, genre, role, picture # Delete variables to free memory self.session_store.save_sessions(self.response) # Save sessions self.response.write( jinja.render_template("/users/default.html", **values)) # Go to the users home page # If it isn't logged in, redirect to the login page else: self.redirect("/login")