Exemplo n.º 1
0
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=[])
Exemplo n.º 2
0
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
    }
Exemplo n.º 3
0
 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')
Exemplo n.º 4
0
 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'))
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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))
Exemplo n.º 8
0
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=[])
Exemplo n.º 9
0
 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)
Exemplo n.º 10
0
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))
Exemplo n.º 11
0
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=[])
Exemplo n.º 12
0
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=[])
Exemplo n.º 13
0
 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)