def reset_password(): token = request.args.get('token', '') if token != '': user = User.query.filter_by(password_token=token).first() if user is not None: new_password = utilities.generate_random_string(20) user.password = generate_password_hash(new_password) user.password_token = '' db.session.commit() email_content = Journal.query.filter(Journal.id==122).first().get_journal_content(session['locale']) send_mail([user.email], email_content.title, render_template_string(email_content.content, new_password=new_password)) return render_template("users/reset_password_confirmed.html"), 200 form = ResetPasswordForm(request.form) errors = [] # make sure data are valid, but doesn't validate password is right if form.is_submitted(): is_validated = True if form.email.data.strip() == '': is_validated = False errors.append(gettext('Email is required')) #validate valid email match = re.search(r'^.+@([^.@][^@]+)$', form.email.data.strip()) if not match: is_validated = False errors.append(gettext('Invalid email address')) if is_validated: user = User.query.filter_by(email=form.email.data).first() # @UndefinedVariable if user is None: errors.append(gettext('Account not found')) return render_template("users/reset_password.html", form=form, errors=errors), 404 if user.banned == 1: errors.append(gettext('The account was banned, please contact an admin for more information')) return render_template("users/reset_password.html", form=form, errors=errors), 400 user.password_token = utilities.generate_random_string(50) db.session.commit() # we use werzeug to validate user's password email_content = Journal.query.filter(Journal.id==121).first().get_journal_content(session['locale']) send_mail([user.email], email_content.title, render_template_string(email_content.content, link=url_for('users.reset_password', token=user.password_token, _external=True))) db.session.commit() return render_template("users/reset_password_submited.html"), 200 else: return render_template("users/reset_password.html", form=form, errors=errors), 200 return render_template("users/reset_password.html", form=form, errors=[])
def upload_file(upload_file, stored_directory, generate_filename=True, file_type="image"): original_filename_parts = upload_file.filename.split('.') original_filename = original_filename_parts[0] for i in range(1, len(original_filename_parts) - 1): original_filename += '.' + original_filename_parts[i] file_extension = original_filename_parts[len(original_filename_parts) - 1] file_extension = file_extension.lower() if generate_filename: filename_without_extension = utilities.generate_random_string(50) filename = filename_without_extension + '.' + file_extension else: filename_without_extension = original_filename filename = upload_file.filename filename = secure_filename(filename) #save file full_filename = os.path.join(app_dir, stored_directory, filename) upload_file.save(full_filename) return { 'filename': filename, 'extension': file_extension.lower(), 'original_filename': original_filename, 'full_filename': full_filename, 'filename_without_extension': filename_without_extension }
def __init__(self, name='', data_file='', owner=None, addition_information='', description=''): self.id = utilities.generate_random_string(50) self.name = name self.data_file = data_file self.owner = owner self.addition_information = addition_information self.description = description self.created_time = datetime.datetime.now() self.comment_topic = CommentTopic('Comments for building model id ' + self.id, owner, 'building_model')
def __init__(self, name, owner, addition_information, data_file='', description='', is_public=1): self.id = utilities.generate_random_string(50) self.name = name self.owner = owner self.data_file = data_file self.addition_information = addition_information self.description = description self.is_public = is_public self.created_time = datetime.datetime.now() self.comment_topic = CommentTopic('Comments for scenario id ' + self.id, owner, gettext('scenario'))
def upload_image(): file = request.files["file"] if file is None: return "" # generate filename original_filename_parts = file.filename.split(".") file_extension = original_filename_parts[len(original_filename_parts) - 1] filename = utilities.generate_random_string(50) + "." + file_extension filename = secure_filename(filename) # save file full_filename = os.path.join(config.email_picture_dir, filename) file.save(full_filename) # return link to file return url_for("static", filename="images/email_pictures/" + filename, _external=True)
def upload_image(): file = request.files['file'] if file is None: return '' #generate filename original_filename_parts = file.filename.split('.') file_extension = original_filename_parts[len(original_filename_parts) - 1] filename = utilities.generate_random_string(50) + '.' + file_extension filename = secure_filename(filename) #save file full_filename = os.path.join(config.email_picture_dir, filename) file.save(full_filename) #return link to file return url_for('static', filename='images/email_pictures/' + filename, _external=True)
def add_building_model(): errors = [] if request.method == 'GET': return render_template("users/add_building_model.html", errors=errors) else: addition_information = '' name = request.form.get('name', '') if name.strip() == '': errors.append(gettext('Scenario name is required')) if request.files['data_file'].filename == '': errors.append(gettext('Model file is required')) if len(errors) > 0: return render_template("users/add_building_model.html", errors=errors), 400 uploaded_file = upload_file(request.files['data_file'], 'static/models/building_models', file_type="model") data_file = uploaded_file['filename'] if uploaded_file['extension'] not in config.ALLOWED_FILE_TYPES: errors.append('Unrecognized model file format') try: os.remove(os.path.join(app_dir, 'static/models/building_models', data_file)) except: pass return render_template("users/add_building_model.html", errors=errors), 400 if os.stat(os.path.join(app_dir, 'static/models/building_models', data_file)).st_size >= 1024*1024*10: errors.append('File too big, max file size is 10MB') os.remove(os.path.join(app_dir, 'static/models/building_models', data_file)) return render_template("users/add_building_model.html", errors=errors), 400 #check if file type is zip => unzip it if uploaded_file['extension'] == 'zip': tmp = data_file zip_ref = zipfile.ZipFile(os.path.join(app_dir, 'static/models/building_models', data_file), 'r') zip_ref.extractall(os.path.join(app_dir, 'static/models/building_models', uploaded_file['filename_without_extension'])) zip_ref.close() #os.rename(os.path.join(app_dir, 'static/models/building_models', uploaded_file['original_filename']), os.path.join(app_dir, 'static/models/building_models', uploaded_file['filename_without_extension'])) zipped_dir = os.path.join(app_dir, 'static/models/building_models', uploaded_file['filename_without_extension']) #check if inside of the zip is a dir of contain file, if contain only 1 dir => move file from inside that dir outside tmp_files = os.listdir(zipped_dir) if len(tmp_files) == 1 and not os.path.isfile(os.path.join(zipped_dir, tmp_files[0])): #contain only 1 dir inside_files = os.listdir(os.path.join(zipped_dir, tmp_files[0])) new_name = utilities.generate_random_string(50) os.rename(os.path.join(zipped_dir, tmp_files[0]), os.path.join(zipped_dir, new_name)) for file in inside_files: try: shutil.move(os.path.join(zipped_dir, new_name, file), os.path.join(zipped_dir, file)) except: pass try: shutil.rmtree(os.path.join(zipped_dir, new_name)) #delete unzipped folder except: pass files = [f for f in os.listdir(zipped_dir) if os.path.isfile(os.path.join(zipped_dir, f))] important_file_index = -1 important_file_name = '' file_index = -1 for file in files: filename_parts = file.split('.') current_filename = filename_parts[0] for i in range(1, len(filename_parts)-1): current_filename += '.' + filename_parts[i] extension = filename_parts[len(filename_parts)-1].lower() os.rename(os.path.join(zipped_dir, file), os.path.join(zipped_dir, current_filename+'.'+extension)) if important_file_index < 0: file_index += 1 if extension in ['dae', 'obj']: important_file_name = current_filename important_file_index = file_index file_type = extension if important_file_index < 0: # user uploaded unrecognized file errors.append(gettext('Unrecognized model file format')) os.remove(os.path.join(app_dir, 'static/models/building_models', data_file)) try: shutil.rmtree(os.path.join(app_dir, 'static/models/building_models', uploaded_file['filename_without_extension'])) #delete unzipped folder except: pass return render_template("users/add_building_model.html", errors=errors), 400 if file_type == 'obj': # important file is obj inside a zipped => objmtl file_type = 'objmtl' addition_information = {'original_filename': important_file_name, 'directory': uploaded_file['filename_without_extension'], 'camera_x': 30, 'camera_y': 250, 'camera_z': 350, "camera_lookat_x": 31, "camera_lookat_y": 222, "camera_lookat_z": 366} else: file_type = uploaded_file['extension'] addition_information = {'original_filename': uploaded_file['filename_without_extension'], 'directory': '', 'camera_x': 30, 'camera_y': 250, 'camera_z': 350, "camera_lookat_x": 31, "camera_lookat_y": 222, "camera_lookat_z": 366} building_model = BuildingModel(name, data_file, g.user, addition_information=addition_information) building_model.file_type = file_type building_model.addition_information = json.dumps(addition_information, ensure_ascii=False) db.session.add(building_model) db.session.commit() return redirect(url_for('sketchup.view_building_model', id=building_model.id))
def register(): """ Registration Form """ form = RegisterForm(request.form) errors = [] if form.is_submitted(): is_validated = True if form.name.data.strip() == '': is_validated = False errors.append(gettext('Username is required')) #validate email if form.email.data.strip() == '': is_validated = False errors.append(gettext('Email is required')) #validate valid email match = re.search(r'^.+@([^.@][^@]+)$', form.email.data.strip()) if not match: is_validated = False errors.append(gettext('Invalid email address')) if form.password.data.strip() == '': is_validated = False errors.append(gettext('Password field is required')) if form.confirm.data.strip() == '': is_validated = False errors.append(gettext('You have to confirm your password')) if form.confirm.data != form.password.data: is_validated = False errors.append(gettext('Passwords must match')) if len(form.recaptcha.errors) > 0: is_validated = False errors.append(gettext('Captcha was incorrect')) if is_validated: same_username_user = User.query.filter_by(username=form.name.data).first() same_email_user = User.query.filter_by(email=form.email.data).first() if same_email_user is not None: errors.append(gettext('Duplicate email address')) if same_username_user is not None: errors.append(gettext('Duplicate username')) if len(errors) > 0: return render_template("users/register.html", form=form, errors=errors) # Insert the record in our database and commit it user = User(username=form.name.data.lower(), email=form.email.data, password=generate_password_hash(form.password.data)) user.verification_code = utilities.generate_random_string(50) user.banned = 2 db.session.add(user) db.session.commit() # send confirm email and redirect to confirm page email_activation = Journal.query.filter(Journal.id==120).first().get_journal_content(session['locale']) send_mail([user.email], email_activation.title, render_template_string(email_activation.content, activate_link=url_for('users.verify_account', code=user.verification_code, _external=True))) return render_template("users/register_finish.html", email=user.email) else: return render_template("users/register.html", form=form, errors=errors) return render_template("users/register.html", form=form, errors=[])
def __init__(self, user_id): self.user_id = user_id self.token = utilities.generate_random_string(100) self.generated_time = datetime.datetime.now() self.expired_time = self.generated_time + datetime.timedelta(days=30)
def add_building_model(): errors = [] if request.method == 'GET': return render_template("users/add_building_model.html", errors=errors) else: addition_information = '' name = request.form.get('name', '') if name.strip() == '': errors.append(gettext('Scenario name is required')) if request.files['data_file'].filename == '': errors.append(gettext('Model file is required')) if len(errors) > 0: return render_template("users/add_building_model.html", errors=errors), 400 uploaded_file = upload_file(request.files['data_file'], 'static/models/building_models', file_type="model") data_file = uploaded_file['filename'] if uploaded_file['extension'] not in config.ALLOWED_FILE_TYPES: errors.append('Unrecognized model file format') try: os.remove( os.path.join(app_dir, 'static/models/building_models', data_file)) except: pass return render_template("users/add_building_model.html", errors=errors), 400 if os.stat( os.path.join(app_dir, 'static/models/building_models', data_file)).st_size >= 1024 * 1024 * 10: errors.append('File too big, max file size is 10MB') os.remove( os.path.join(app_dir, 'static/models/building_models', data_file)) return render_template("users/add_building_model.html", errors=errors), 400 #check if file type is zip => unzip it if uploaded_file['extension'] == 'zip': tmp = data_file zip_ref = zipfile.ZipFile( os.path.join(app_dir, 'static/models/building_models', data_file), 'r') zip_ref.extractall( os.path.join(app_dir, 'static/models/building_models', uploaded_file['filename_without_extension'])) zip_ref.close() #os.rename(os.path.join(app_dir, 'static/models/building_models', uploaded_file['original_filename']), os.path.join(app_dir, 'static/models/building_models', uploaded_file['filename_without_extension'])) zipped_dir = os.path.join( app_dir, 'static/models/building_models', uploaded_file['filename_without_extension']) #check if inside of the zip is a dir of contain file, if contain only 1 dir => move file from inside that dir outside tmp_files = os.listdir(zipped_dir) if len(tmp_files) == 1 and not os.path.isfile( os.path.join(zipped_dir, tmp_files[0])): #contain only 1 dir inside_files = os.listdir( os.path.join(zipped_dir, tmp_files[0])) new_name = utilities.generate_random_string(50) os.rename(os.path.join(zipped_dir, tmp_files[0]), os.path.join(zipped_dir, new_name)) for file in inside_files: try: shutil.move(os.path.join(zipped_dir, new_name, file), os.path.join(zipped_dir, file)) except: pass try: shutil.rmtree(os.path.join( zipped_dir, new_name)) #delete unzipped folder except: pass files = [ f for f in os.listdir(zipped_dir) if os.path.isfile(os.path.join(zipped_dir, f)) ] important_file_index = -1 important_file_name = '' file_index = -1 for file in files: filename_parts = file.split('.') current_filename = filename_parts[0] for i in range(1, len(filename_parts) - 1): current_filename += '.' + filename_parts[i] extension = filename_parts[len(filename_parts) - 1].lower() os.rename( os.path.join(zipped_dir, file), os.path.join(zipped_dir, current_filename + '.' + extension)) if important_file_index < 0: file_index += 1 if extension in ['dae', 'obj']: important_file_name = current_filename important_file_index = file_index file_type = extension if important_file_index < 0: # user uploaded unrecognized file errors.append(gettext('Unrecognized model file format')) os.remove( os.path.join(app_dir, 'static/models/building_models', data_file)) try: shutil.rmtree( os.path.join( app_dir, 'static/models/building_models', uploaded_file['filename_without_extension']) ) #delete unzipped folder except: pass return render_template("users/add_building_model.html", errors=errors), 400 if file_type == 'obj': # important file is obj inside a zipped => objmtl file_type = 'objmtl' addition_information = { 'original_filename': important_file_name, 'directory': uploaded_file['filename_without_extension'], 'camera_x': 30, 'camera_y': 250, 'camera_z': 350, "camera_lookat_x": 31, "camera_lookat_y": 222, "camera_lookat_z": 366 } else: file_type = uploaded_file['extension'] addition_information = { 'original_filename': uploaded_file['filename_without_extension'], 'directory': '', 'camera_x': 30, 'camera_y': 250, 'camera_z': 350, "camera_lookat_x": 31, "camera_lookat_y": 222, "camera_lookat_z": 366 } building_model = BuildingModel( name, data_file, g.user, addition_information=addition_information) building_model.file_type = file_type building_model.addition_information = json.dumps(addition_information, ensure_ascii=False) db.session.add(building_model) db.session.commit() return redirect( url_for('sketchup.view_building_model', id=building_model.id))
def reset_password(): token = request.args.get('token', '') if token != '': user = User.query.filter_by(password_token=token).first() if user is not None: new_password = utilities.generate_random_string(20) user.password = generate_password_hash(new_password) user.password_token = '' db.session.commit() email_content = Journal.query.filter( Journal.id == 122).first().get_journal_content( session['locale']) send_mail([user.email], email_content.title, render_template_string(email_content.content, new_password=new_password)) return render_template("users/reset_password_confirmed.html"), 200 form = ResetPasswordForm(request.form) errors = [] # make sure data are valid, but doesn't validate password is right if form.is_submitted(): is_validated = True if form.email.data.strip() == '': is_validated = False errors.append(gettext('Email is required')) #validate valid email match = re.search(r'^.+@([^.@][^@]+)$', form.email.data.strip()) if not match: is_validated = False errors.append(gettext('Invalid email address')) if is_validated: user = User.query.filter_by( email=form.email.data).first() # @UndefinedVariable if user is None: errors.append(gettext('Account not found')) return render_template("users/reset_password.html", form=form, errors=errors), 404 if user.banned == 1: errors.append( gettext( 'The account was banned, please contact an admin for more information' )) return render_template("users/reset_password.html", form=form, errors=errors), 400 user.password_token = utilities.generate_random_string(50) db.session.commit() # we use werzeug to validate user's password email_content = Journal.query.filter( Journal.id == 121).first().get_journal_content( session['locale']) send_mail([user.email], email_content.title, render_template_string(email_content.content, link=url_for( 'users.reset_password', token=user.password_token, _external=True))) db.session.commit() return render_template("users/reset_password_submited.html"), 200 else: return render_template("users/reset_password.html", form=form, errors=errors), 200 return render_template("users/reset_password.html", form=form, errors=[])
def register(): """ Registration Form """ form = RegisterForm(request.form) errors = [] if form.is_submitted(): is_validated = True if form.name.data.strip() == '': is_validated = False errors.append(gettext('Username is required')) #validate email if form.email.data.strip() == '': is_validated = False errors.append(gettext('Email is required')) #validate valid email match = re.search(r'^.+@([^.@][^@]+)$', form.email.data.strip()) if not match: is_validated = False errors.append(gettext('Invalid email address')) if form.password.data.strip() == '': is_validated = False errors.append(gettext('Password field is required')) if form.confirm.data.strip() == '': is_validated = False errors.append(gettext('You have to confirm your password')) if form.confirm.data != form.password.data: is_validated = False errors.append(gettext('Passwords must match')) if len(form.recaptcha.errors) > 0: is_validated = False errors.append(gettext('Captcha was incorrect')) if is_validated: same_username_user = User.query.filter_by( username=form.name.data).first() same_email_user = User.query.filter_by( email=form.email.data).first() if same_email_user is not None: errors.append(gettext('Duplicate email address')) if same_username_user is not None: errors.append(gettext('Duplicate username')) if len(errors) > 0: return render_template("users/register.html", form=form, errors=errors) # Insert the record in our database and commit it user = User(username=form.name.data.lower(), email=form.email.data, password=generate_password_hash(form.password.data)) user.verification_code = utilities.generate_random_string(50) user.banned = 2 db.session.add(user) db.session.commit() # send confirm email and redirect to confirm page email_activation = Journal.query.filter( Journal.id == 120).first().get_journal_content( session['locale']) send_mail([user.email], email_activation.title, render_template_string(email_activation.content, activate_link=url_for( 'users.verify_account', code=user.verification_code, _external=True))) return render_template("users/register_finish.html", email=user.email) else: return render_template("users/register.html", form=form, errors=errors) return render_template("users/register.html", form=form, errors=[])