def create_model(self, form): con, trans, session = db.get_session_w_external_trans(self.session) try: model = self.model() form.populate_obj(model) # Ingest project file. project_file = request.files.get('project_file') filename = secure_filename(project_file.filename) tmp_dir1 = tempfile.mkdtemp(prefix="gr1.") tmp_filename = os.path.join(tmp_dir1, filename) project_file.save(tmp_filename) # Unpack the project file. tmp_dir2 = tempfile.mkdtemp(prefix="gr2.") tar = tarfile.open(tmp_filename) tar.extractall(tmp_dir2) tar.close() session.add(model) session.commit() except Exception, ex: flash( gettext('Failed to create model. %(error)s, %(tb)s', error=str(ex), tb=traceback.format_exc()), 'error') trans.rollback() con.close() return False
def delete_model(self, model): """ Delete model. :param model: Model to delete """ con, trans, session = db.get_session_w_external_trans(self.session) # Remove project maplayers. try: model.layers_schema['metadata'].drop_all(bind=session.connection()) except Exception, e: flash(gettext('Could not remove project layer tables. %(error)s', error=str(e)), 'error') trans.rollback() con.close() return False
def create_project(input_path=None, msg_logger=logging.getLogger(), progress_logger=logging.getLogger(), session=None, db_uri=None, **kwargs): """ Create a project from a project bundle file. """ # Get transactional session. if not session: session = db.session() con, trans, session = db.get_session_w_external_trans( session, new_connection=True) try: # Create project model. msg_logger.info("Initializing project...") project = Project() session.add(project) session.commit() progress_logger.info(2) # Create project directories. msg_logger.info("Setting up project directories...") project.data_dir = os.path.join(app.config['DATA_DIR'], 'projects', 'project_' + str(project.id)) os.makedirs(project.data_dir, 0775) project.static_dir = os.path.join(app.static_folder, 'projects', 'project_' + str(project.id)) os.makedirs(project.static_dir, 0775) progress_logger.info(3) # If .zip, unpack project bundle to temp dir. tmp_dir = None if input_path.endswith('.zip'): msg_logger.info("Unpacking project file...") tmp_dir = tempfile.mkdtemp(prefix="gr.prj_%s." % project.id) zfile = ZipFile(input_path, 'r') zfile.extractall(tmp_dir) zfile.close() src_dir = tmp_dir else: src_dir = input_path progress_logger.info(4) # Ingest project static files. msg_logger.info("Ingesting static files...") manage.ingest_static_files(project, src_dir) progress_logger.info(6) # Setup project schema and db. msg_logger.info("Setting up project DB...") manage.ingest_schema(project, src_dir) if not db_uri: db_file = os.path.join(project.data_dir, "db.sqlite") project.db_uri = "sqlite:///%s" % db_file manage.initialize_db(project) os.chmod(db_file, 0775) else: project.db_uri = db_uri manage.initialize_db(project) dao = manage.get_dao(project) dao.create_all() progress_logger.info(8) # Setup ingest msg logger. ingest_msg_logger = logging.getLogger("ingest_msg_%s" % id(project)) formatter = logging.Formatter("Ingesting data..." + ' %(message)s') ingest_msg_log_handler = LoggerLogHandler(msg_logger) ingest_msg_log_handler.setFormatter(formatter) ingest_msg_logger.addHandler(ingest_msg_log_handler) ingest_msg_logger.setLevel(msg_logger.level) # Setup ingest progress logger to scale progress. class ScalingProgressHandler(logging.Handler): def __init__(self, logger=None, min_=0.0, max_=100.0, **kwargs): logging.Handler.__init__(self, **kwargs) self.logger = logger self.max = max_ self.min = min_ self.range = max_ - min_ def emit(self, record): value = float(self.format(record)) scaled_value = self.min + self.range * (value/100.0) self.logger.log(record.levelno, scaled_value) ingest_prg_logger = logging.getLogger("ingest_prg_%s" % id(project)) ingest_prg_log_handler = ScalingProgressHandler(progress_logger, min_=8, max_=99) ingest_prg_logger.addHandler(ingest_prg_log_handler) ingest_prg_logger.setLevel(progress_logger.level) # Ingest data. ingest_kwargs = kwargs.get('ingest_kwargs', {}) manage.ingest_data(project, src_dir, dao, msg_logger=ingest_msg_logger, progress_logger=ingest_prg_logger, **ingest_kwargs) # Clean up tmpdir (if created). if tmp_dir: shutil.rmtree(tmp_dir) session.commit() trans.commit() except Exception as e: msg_logger.exception("Error creating project.") try: pass if project: delete_project_dirs(project) if tmp_dir: shutil.rmtree(tmp_dir) except NameError: pass trans.rollback() raise e msg_logger.info("Project with id '%s' been created." % project.id) progress_logger.info(100) return project