def _add_qc0_to_merge(self):
     try:
         self.main_app.update_help_information(
             'Adding QC0 information to merge file...', bg='red')
         manage = tavastland.ManageTavastlandFiles(self._get_qc_directory())
         manage.add_qc0_info_to_nodc_column_file()
         self.main_app.update_help_information(
             'QC0 information added to merge file!', bg='green')
     except Exception as e:
         main_gui.show_internal_error(e)
 def _add_qc_columns(self):
     try:
         self.main_app.update_help_information(
             'Adding QC columns to file...', bg='red')
         manage = tavastland.ManageTavastlandFiles(self._get_qc_directory())
         manage.add_nodc_qc_columns()
         self.main_app.update_help_information('QC columns added!',
                                               bg='green')
     except Exception as e:
         main_gui.show_internal_error(e)
 def _create_qc0_file(self):
     try:
         self.main_app.update_help_information('Creating QC0 file...',
                                               bg='red')
         manage = tavastland.ManageTavastlandFiles(self._get_qc_directory())
         manage.create_qc0_file()
         self.main_app.update_help_information('QC0 file created!',
                                               bg='green')
     except Exception as e:
         main_gui.show_internal_error(e)
    def _inspect_files(self):
        """
        Create tavastland.FileHandler and loads import directories. Fills the table with information.
        :return:
        """
        try:
            mit_directory = self.directory_widget_mit.get_directory()
            co2_directory = self.directory_widget_co2.get_directory()
            if not all([
                    mit_directory, co2_directory,
                    os.path.exists(mit_directory),
                    os.path.exists(co2_directory)
            ]):
                main_gui.show_information('Invalid directories',
                                          'Please check inport directories!')
                return

            self.main_app.update_help_information(
                'Inspecting MIT and CO2 files. Please wait...', bg='red')

            # Initiate handler
            try:
                self.handler = tavastland.FileHandler(
                    mit_directory=mit_directory,
                    co2_directory=co2_directory,
                    log_info=dict(name='gismo_gui'))
            except tavastland.TavastlandException as e:
                self.logger.debug('Tavastland error: {}'.format(e.message))
                main_gui.show_information('Tavastland error', e.message)
                self.main_app.update_help_information(
                    'Could not inspect files!')
            else:
                self.table_widget_mit.reset_table()
                self.table_widget_co2.reset_table()

                # Update tables
                mit_data, mit_error_data = self._get_table_data_from_df(
                    self.handler.dfs['mit'], 'mit')
                self.table_widget_mit.set_table(mit_data)
                co2_data, co2_error_data = self._get_table_data_from_df(
                    self.handler.dfs['co2'], 'co2')
                self.table_widget_co2.set_table(co2_data)
                self.main_app.update_help_information(
                    'MIT and/or CO2 files have been updated')

                error_data = mit_error_data + co2_error_data
                self.table_widget_err.set_table(error_data)

                # Update time widgets
                from_time, to_time = self.handler.get_min_and_max_time()
                now = datetime.datetime.now()
                if to_time > now:
                    to_time = now
                self.time_widget_start.set_valid_time_span(from_time, to_time)
                self.time_widget_end.set_valid_time_span(from_time, to_time)
                main_gui.communicate.sync_user_and_time_widgets(
                    user_sub_object=self.user.tavastland,
                    time_widget_start=self.time_widget_start,
                    time_widget_end=self.time_widget_end,
                    source='user')
            self._toggle_use_time_span()
        except Exception as e:
            main_gui.show_internal_error(e)
    def _export_data(self):
        directory = self.directory_widget_save_merge.get_value()
        if not directory:
            try:
                gui.show_information(
                    'Missing input', 'Missing export directory. '
                    'Export canceled!')
            except:
                main_gui.show_information(
                    'Missing input', 'Missing export directory. '
                    'Export canceled!')
            return

        try:
            # file_path = self.handler.save_merge_data(directory=directory, co2_types=selected_types)

            # changed method name? @Johannes
            # file_path = self.handler._save_merge_data(directory=directory, co2_types=selected_types)
            # directory = self.directory_widget_save_merge.get_value()

            if not directory:
                main_gui.show_information(
                    'Missing input',
                    'Missing export directory. Export canceled!')
                return

            self.main_app.update_help_information(
                'Exporting merge data. Please wait...', bg='red')
            # Save data

            deselected_types = self.handler.exclude_co2_types[:]
            all_types = self.handler.get_types_in_merge_data()
            selected_types = [''] + [
                t for t in all_types if t not in deselected_types
            ]
            try:
                try:
                    save_directory = self.handler.save_data(
                        directory=directory, co2_types=selected_types)
                except FileExistsError:
                    if not messagebox.askyesno(
                            'Save merge data',
                            'Merge data already exist. Do you want to overwrite files?'
                    ):
                        return
                    save_directory = self.handler.save_data(
                        directory=directory,
                        co2_types=selected_types,
                        overwrite=True)

                self.user.tavastland.set('deselected_types', deselected_types)

                self.main_app.update_help_information('Export done!',
                                                      bg='green')

                self.directory_widget_qc.set_value(self.handler.save_dir)
            except PermissionError as e:
                main_gui.show_error('PermissionError', e)
            else:
                main_gui.show_information(
                    'Export data',
                    f'Merged data has been exported:\n{save_directory}')
        except Exception as e:
            main_gui.show_internal_error(e)
    def _merge_data(self):
        """
        Merge data and export.
        :return:
        """
        try:
            source = self.use_widget.get_value()
            if 'time' in source:
                time_start = self.time_widget_start.get_time_object()
                time_end = self.time_widget_end.get_time_object()
                # Have to add the day as well
                time_end = time_end + datetime.timedelta(
                    days=1) - datetime.timedelta(seconds=1)

                if not all([time_start, time_end]):
                    main_gui.show_information(
                        'Missing input',
                        'You have not made all required options to merge data. '
                        'Merge canceled!')
                    return

                # Check time span
                selected_time_delta = time_end - time_start
                nr_days = self.user_manager.get_default_user_settings(
                    'tavastland', 'alert_t_delta_days')
                if not nr_days:
                    nr_days = 60
                if selected_time_delta.days > self.user.tavastland.setdefault(
                        'alert_t_delta_days', nr_days):
                    if not messagebox.askyesno(
                            'Time span warning!',
                            'Your selected time is {} days. '
                            'This might take som time to merge. '
                            'Do you want to continue?'.format(
                                selected_time_delta.days)):
                        self.main_app.update_help_information(
                            'Merge canceled by user do to long time span.')
                        return
                # Set time range to work with
                self.handler.set_time_range(time_start=time_start,
                                            time_end=time_end)
            elif 'month' in source:
                year, month = self.month_widget.get()  # year and month as int
                time_start = datetime.datetime(year, month, 1)
                time_end = datetime.datetime(year, month + 1,
                                             1) - datetime.timedelta(seconds=1)
                # Set time range to work with
                self.handler.set_time_range(time_start=time_start,
                                            time_end=time_end)

            time_delta_seconds = self.time_widget_tolerance.get_value()
            if not all([time_delta_seconds]):
                main_gui.show_information(
                    'Missing input',
                    'You have not made all required options to merge data. '
                    'Merge canceled!')
                return

            self.main_app.update_help_information(
                'Merging data. Please wait...', bg='red')

            # Set timedelta
            self.handler.set_time_delta(seconds=int(time_delta_seconds))
            # Load data within time range
            try:
                self.handler.load_data()
            except tavastland.TavastlandExceptionNoCO2data:
                self.logger.debug('No CO2 data matches the given time!')
                try:
                    gui.show_information(
                        'No match', 'No CO2 data matches the given time!')
                except:
                    main_gui.show_information(
                        'No match', 'No CO2 data matches the given time!')
                self.main_app.update_help_information('No co2 data found!')
                return

            # Merge data
            self.handler.merge_data()
            # Calculate pCO2
            self.handler.calculate_pCO2()

            all_types = self.handler.get_types_in_merge_data()
            exclude_types = self.handler.exclude_co2_types
            include_types = [t for t in all_types if t not in exclude_types]

            self.stringvar_exclude_types.set(exclude_types)
            self.stringvar_include_types.set(include_types)

            self._enable_and_disable()

        except tavastland.TavastlandExceptionNoMatchWhenMerging as e:
            self.main_app.update_help_information(
                'No match between mit and co2 files!')
            main_gui.show_error('No match!', e.message)

        except tavastland.TavastlandException as e:
            self.main_app.update_help_information('Merge failed!')
            main_gui.show_error('Could not merge data!', e.message)
        except Exception as e:
            main_gui.show_internal_error(e)
        #     self.main_app.update_help_information('Merge failed!')
        #     main_gui.show_error('Internal Error!', e)
        #     raise

        else:
            self.main_app.update_help_information('Merge done!', bg='green')
        finally:
            self._save_time_to_user()
Exemplo n.º 7
0
    def _load_file(self):
        def load_file(data_file_path, **kwargs):
            self.main_app.update_help_information('')
            self.button_load_file.configure(state='disabled')

            settings_file = self.combobox_widget_settings_file.get_value()
            sampling_type = self.combobox_widget_sampling_type.get_value()

            self.session.load_file(
                sampling_type=sampling_type,
                data_file_path=data_file_path,
                settings_file=settings_file,
                # settings_file_path=settings_file_path,
                reload=False,
                root_directory=self.root_directory,
                **kwargs)

        # self.reset_help_information()
        data_file_path = self.stringvar_data_file.get()
        settings_file = self.combobox_widget_settings_file.get_value()
        settings_file_path = self.settings_files.get_path(settings_file)

        # sampling_type = self.combobox_widget_sampling_type.get_value()

        if not all([data_file_path, settings_file_path]):
            self.main_app.update_help_information('No file selected!',
                                                  fg='red')
            return

        data_file_path = self.stringvar_data_file.get()
        if ';' in data_file_path:
            data_file_list = []
            directory = None
            for k, file_name in enumerate(data_file_path.split(';')):
                file_name = file_name.strip()
                if k == 0:
                    directory = os.path.dirname(file_name)
                    data_file_list.append(file_name)
                else:
                    data_file_list.append(os.path.join(directory, file_name))
        else:
            data_file_list = [data_file_path]

        for file_path in data_file_list:
            # Load file
            try:
                load_file(file_path)
                # self.run_progress(load_file, message='Loading file...please wait...')
            except GISMOExceptionMissingPath as e:
                self.logger.debug(e)
                main_gui.show_information(
                    'Invalid path',
                    'The path "{}" given in i settings file "{} can not be found'
                    .format(e.message, settings_file_path))
                self.main_app.update_help_information(
                    'Please try again with a different settings file.')

            except GISMOExceptionMissingInputArgument as e:
                self.logger.debug(e)
                if 'depth' in e.message:
                    platform_depth = self.entry_widget_platform_depth.get_value(
                    )
                    if not platform_depth:
                        main_gui.show_information(
                            'No depth found!',
                            'You need to provide platform depth for this sampling type!'
                        )
                        return
                    load_file(file_path, depth=platform_depth)
            except GISMOExceptionInvalidParameter as e:
                self.logger.debug(e)
                main_gui.show_information(
                    'Invalid parameter',
                    f'Could not find parameter {e}. Settings file might have wrong information.'
                )
                return
            except GISMOExceptionQCfieldError:
                main_gui.show_error(
                    'QC field error',
                    f'Something is wrong with the qf columns in file: {file_path}'
                )
                return
            except Exception as e:
                self.logger.debug(e)
                main_gui.show_internal_error(e)
                return

        self.stringvar_data_file.set('')

        self._update_loaded_files_widget()
        self.update_all()
        self.button_load_file.configure(state='normal')

        self.main_app.update_help_information('File loaded! Please continue.',
                                              bg='green')