Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
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