Beispiel #1
0
    def createWidgets(self, parent):
        self.searchableList = SearchableList(parent, list_height=150, list_width=150, ignore_case=True, order_editable=True)
        self.addWidget(self.searchableList)
        self.connect(self.searchableList, QtCore.SIGNAL('currentItemChanged(QListWidgetItem, QListWidgetItem)'),
                     self.changeParameter)
        self.connect(self.searchableList, QtCore.SIGNAL('addItem(list)'), self.addItem)
        self.connect(self.searchableList, QtCore.SIGNAL('removeItem(list)'), self.removeItem)
        self.connect(self.searchableList, QtCore.SIGNAL('orderChanged(list)'), self.forwardModelChanged)


        self.forward_model_panel = ert_gui.widgets.util.createEmptyPanel()

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)


        self.forward_model_args = StringBox(self, "", "config/simulation/forward_model_arguments")
        self.forward_model_args.initialize = ContentModel.emptyInitializer
        self.forward_model_args.setter = self.setArguments
        self.forward_model_args.getter = lambda model: self.forward_model_job.arguments

        layout.addRow("Arguments:", self.forward_model_args)

        layout.addRow(ert_gui.widgets.util.createSpace(20))

        self.help_text = QtGui.QLabel()
        self.help_text.setText("")

        layout.addRow(ert_gui.widgets.util.centeredWidget(self.help_text))

        self.forward_model_panel.setLayout(layout)
        self.modelConnect('jobListChanged()', self.fetchContent)
Beispiel #2
0
    def createWidgets(self, parent):
        self.searchableList = SearchableList(parent,
                                             list_height=150,
                                             list_width=150,
                                             ignore_case=True)
        self.addWidget(self.searchableList)
        self.connect(
            self.searchableList,
            QtCore.SIGNAL(
                'currentItemChanged(QListWidgetItem, QListWidgetItem)'),
            self.changeParameter)
        self.connect(self.searchableList, QtCore.SIGNAL('addItem(list)'),
                     self.addItem)
        self.connect(self.searchableList, QtCore.SIGNAL('removeItem(list)'),
                     self.removeItem)

        self.run_template_panel = ert_gui.widgets.util.createEmptyPanel()

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)

        self.run_template_file = PathChooser(
            self, "", "config/simulation/run_template_file", show_files=True)
        self.run_template_file.initialize = ContentModel.emptyInitializer
        self.run_template_file.setter = self.setTemplateFile
        self.run_template_file.getter = lambda model: self.run_template.template_file

        self.run_template_target = PathChooser(
            self, "", "config/simulation/run_template_target", show_files=True)
        self.run_template_target.initialize = ContentModel.emptyInitializer
        self.run_template_target.setter = self.setTargetFile
        self.run_template_target.getter = lambda model: self.run_template.target_file

        self.run_template_args = StringBox(
            self, "", "config/simulation/run_template_arguments")
        self.run_template_args.initialize = ContentModel.emptyInitializer
        self.run_template_args.setter = self.setArguments
        self.run_template_args.getter = lambda model: self.run_template.arguments

        layout.addRow("Template file:", self.run_template_file)
        layout.addRow("Target file:", self.run_template_target)
        layout.addRow("Arguments:", self.run_template_args)

        layout.addRow(ert_gui.widgets.util.createSpace(20))

        self.run_template_panel.setLayout(layout)
Beispiel #3
0
    def createWidgets(self, parent):
        self.searchableList = SearchableList(parent,
                                             list_height=150,
                                             list_width=150,
                                             ignore_case=True,
                                             order_editable=True)
        self.addWidget(self.searchableList)
        self.connect(
            self.searchableList,
            QtCore.SIGNAL(
                'currentItemChanged(QListWidgetItem, QListWidgetItem)'),
            self.changeParameter)
        self.connect(self.searchableList, QtCore.SIGNAL('addItem(list)'),
                     self.addItem)
        self.connect(self.searchableList, QtCore.SIGNAL('removeItem(list)'),
                     self.removeItem)
        self.connect(self.searchableList, QtCore.SIGNAL('orderChanged(list)'),
                     self.forwardModelChanged)

        self.forward_model_panel = ert_gui.widgets.util.createEmptyPanel()

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)

        self.forward_model_args = StringBox(
            self, "", "config/simulation/forward_model_arguments")
        self.forward_model_args.initialize = ContentModel.emptyInitializer
        self.forward_model_args.setter = self.setArguments
        self.forward_model_args.getter = lambda model: self.forward_model_job.arguments

        layout.addRow("Arguments:", self.forward_model_args)

        layout.addRow(ert_gui.widgets.util.createSpace(20))

        self.help_text = QtGui.QLabel()
        self.help_text.setText("")

        layout.addRow(ert_gui.widgets.util.centeredWidget(self.help_text))

        self.forward_model_panel.setLayout(layout)
        self.modelConnect('jobListChanged()', self.fetchContent)
Beispiel #4
0
    def createWidgets(self, parent):
        self.searchableList = SearchableList(parent, list_height=150, list_width=150, ignore_case=True)
        self.addWidget(self.searchableList)
        self.connect(self.searchableList, QtCore.SIGNAL('currentItemChanged(QListWidgetItem, QListWidgetItem)'),
                     self.changeParameter)
        self.connect(self.searchableList, QtCore.SIGNAL('addItem(list)'), self.addItem)
        self.connect(self.searchableList, QtCore.SIGNAL('removeItem(list)'), self.removeItem)


        self.run_template_panel = ert_gui.widgets.util.createEmptyPanel()

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)

        self.run_template_file = PathChooser(self, "", "config/simulation/run_template_file", show_files=True)
        self.run_template_file.initialize = ContentModel.emptyInitializer
        self.run_template_file.setter = self.setTemplateFile
        self.run_template_file.getter = lambda model: self.run_template.template_file

        self.run_template_target = PathChooser(self, "", "config/simulation/run_template_target", show_files=True)
        self.run_template_target.initialize = ContentModel.emptyInitializer
        self.run_template_target.setter = self.setTargetFile
        self.run_template_target.getter = lambda model: self.run_template.target_file

        self.run_template_args = StringBox(self, "", "config/simulation/run_template_arguments")
        self.run_template_args.initialize = ContentModel.emptyInitializer
        self.run_template_args.setter = self.setArguments
        self.run_template_args.getter = lambda model: self.run_template.arguments

        layout.addRow("Template file:", self.run_template_file)
        layout.addRow("Target file:", self.run_template_target)
        layout.addRow("Arguments:", self.run_template_args)

        layout.addRow(ert_gui.widgets.util.createSpace(20))

        self.run_template_panel.setLayout(layout)
Beispiel #5
0
class RunTemplatePanel(HelpedWidget):
    """
    Widget for adding, removing and editing run templates.
    """
    def __init__(self, parent=None):
        HelpedWidget.__init__(self, parent, "",
                              "config/simulation/run_template")

        self.run_template = RunTemplate("undefined", "", "", "")

        self.createWidgets(parent)

        self.emptyPanel = ert_gui.widgets.util.createEmptyPanel()

        self.pagesWidget = QtGui.QStackedWidget()
        self.pagesWidget.addWidget(self.emptyPanel)
        self.pagesWidget.addWidget(self.run_template_panel)
        self.addWidget(self.pagesWidget)

        self.addHelpButton()

    def createWidgets(self, parent):
        self.searchableList = SearchableList(parent,
                                             list_height=150,
                                             list_width=150,
                                             ignore_case=True)
        self.addWidget(self.searchableList)
        self.connect(
            self.searchableList,
            QtCore.SIGNAL(
                'currentItemChanged(QListWidgetItem, QListWidgetItem)'),
            self.changeParameter)
        self.connect(self.searchableList, QtCore.SIGNAL('addItem(list)'),
                     self.addItem)
        self.connect(self.searchableList, QtCore.SIGNAL('removeItem(list)'),
                     self.removeItem)

        self.run_template_panel = ert_gui.widgets.util.createEmptyPanel()

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)

        self.run_template_file = PathChooser(
            self, "", "config/simulation/run_template_file", show_files=True)
        self.run_template_file.initialize = ContentModel.emptyInitializer
        self.run_template_file.setter = self.setTemplateFile
        self.run_template_file.getter = lambda model: self.run_template.template_file

        self.run_template_target = PathChooser(
            self, "", "config/simulation/run_template_target", show_files=True)
        self.run_template_target.initialize = ContentModel.emptyInitializer
        self.run_template_target.setter = self.setTargetFile
        self.run_template_target.getter = lambda model: self.run_template.target_file

        self.run_template_args = StringBox(
            self, "", "config/simulation/run_template_arguments")
        self.run_template_args.initialize = ContentModel.emptyInitializer
        self.run_template_args.setter = self.setArguments
        self.run_template_args.getter = lambda model: self.run_template.arguments

        layout.addRow("Template file:", self.run_template_file)
        layout.addRow("Target file:", self.run_template_target)
        layout.addRow("Arguments:", self.run_template_args)

        layout.addRow(ert_gui.widgets.util.createSpace(20))

        self.run_template_panel.setLayout(layout)

    def setArguments(self, model, arguments):
        self.run_template.setArguments(arguments)
        self.runTemplateChanged()

    def setTemplateFile(self, model, template_file):
        self.run_template.setTemplateFile(template_file)
        self.runTemplateChanged()

    def setTargetFile(self, model, target_file):
        self.run_template.setTargetFile(target_file)
        self.runTemplateChanged()

    def fetchContent(self):
        """
        Retrieves data from the model and inserts it into the widget.
        List of tuples: (name, template_file, target_file, arguments)
        """
        data = self.getFromModel()

        self.searchableList.list.clear()
        for item in data:
            jobitem = QtGui.QListWidgetItem()
            jobitem.setText(item[0])
            run_template = RunTemplate(item[0], item[1], item[2], item[3])

            jobitem.setData(QtCore.Qt.UserRole, run_template)
            jobitem.setToolTip(item[0])
            self.searchableList.list.addItem(jobitem)

    def setRunTemplate(self, run_template):
        """Set the current visible run template"""
        self.run_template = run_template
        self.run_template_args.fetchContent()
        self.run_template_file.fetchContent()
        self.run_template_target.fetchContent()

    def changeParameter(self, current, previous):
        """Switch between run templates. Selection from the list"""
        if current is None:
            self.pagesWidget.setCurrentWidget(self.emptyPanel)
        else:
            self.pagesWidget.setCurrentWidget(self.run_template_panel)
            self.setRunTemplate(current.data(QtCore.Qt.UserRole).toPyObject())

    def runTemplateChanged(self):
        """
        Called whenever the run template is changed. (adding, removing)
        The data submitted to the updateContent() (from ContentModel) is a list of tuples (name, template_file, target_file, arguments)
        """
        items = self.searchableList.getItems()
        currentRow = self.searchableList.list.currentRow()
        run_templates = []
        for item in items:
            r_t = item.data(QtCore.Qt.UserRole).toPyObject()
            run_template_tuple = (r_t.name, r_t.template_file, r_t.target_file,
                                  r_t.arguments)
            run_templates.append(run_template_tuple)

        self.updateContent(run_templates)
        self.fetchContent()
        self.searchableList.list.setCurrentRow(currentRow)

    def addToList(self, list, name):
        """Adds a new run template to the list"""
        param = QtGui.QListWidgetItem()
        param.setText(name)

        new_job = RunTemplate(name)
        param.setData(QtCore.Qt.UserRole, new_job)

        list.addItem(param)
        list.setCurrentItem(param)
        return param

    def addItem(self, list):
        """Called by the add button to insert a new run template"""
        uniqueNames = []
        for index in range(list.count()):
            uniqueNames.append(str(list.item(index).text()))

        pd = ValidatedDialog(self, "New run template",
                             "Enter name of new run template:", uniqueNames)
        if pd.exec_():
            self.addToList(list, pd.getName())
            self.runTemplateChanged()

    def removeItem(self, list):
        """Called by the remove button to remove a selected job"""
        currentRow = list.currentRow()

        if currentRow >= 0:
            title = "Delete run template?"
            msg = "Are you sure you want to delete the run template?"
            btns = QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
            doDelete = QtGui.QMessageBox.question(self, title, msg, btns)

            if doDelete == QtGui.QMessageBox.Yes:
                list.takeItem(currentRow)
                self.runTemplateChanged()
Beispiel #6
0
class ForwardModelPanel(HelpedWidget):
    """
    Widget for adding, removing and editing forward models.
    Only uses the setter and getter hooks.
    The panel expects remove to return True or False based on the success of the removal.
    """

    def __init__(self, parent=None):
        HelpedWidget.__init__(self, parent, "Forward Model", "config/simulation/forward_model")

        self.forward_model_job = ForwardModelJob("undefined")

        self.createWidgets(parent)

        self.emptyPanel = ert_gui.widgets.util.createEmptyPanel()

        self.pagesWidget = QtGui.QStackedWidget()
        self.pagesWidget.addWidget(self.emptyPanel)
        self.pagesWidget.addWidget(self.forward_model_panel)
        self.addWidget(self.pagesWidget)

        self.addHelpButton()

    def createWidgets(self, parent):
        self.searchableList = SearchableList(parent, list_height=150, list_width=150, ignore_case=True, order_editable=True)
        self.addWidget(self.searchableList)
        self.connect(self.searchableList, QtCore.SIGNAL('currentItemChanged(QListWidgetItem, QListWidgetItem)'),
                     self.changeParameter)
        self.connect(self.searchableList, QtCore.SIGNAL('addItem(list)'), self.addItem)
        self.connect(self.searchableList, QtCore.SIGNAL('removeItem(list)'), self.removeItem)
        self.connect(self.searchableList, QtCore.SIGNAL('orderChanged(list)'), self.forwardModelChanged)


        self.forward_model_panel = ert_gui.widgets.util.createEmptyPanel()

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)


        self.forward_model_args = StringBox(self, "", "config/simulation/forward_model_arguments")
        self.forward_model_args.initialize = ContentModel.emptyInitializer
        self.forward_model_args.setter = self.setArguments
        self.forward_model_args.getter = lambda model: self.forward_model_job.arguments

        layout.addRow("Arguments:", self.forward_model_args)

        layout.addRow(ert_gui.widgets.util.createSpace(20))

        self.help_text = QtGui.QLabel()
        self.help_text.setText("")

        layout.addRow(ert_gui.widgets.util.centeredWidget(self.help_text))

        self.forward_model_panel.setLayout(layout)
        self.modelConnect('jobListChanged()', self.fetchContent)

    def setArguments(self, model, arguments):
        """Set the arguments of the current forward model job."""
        self.forward_model_job.setArguments(arguments)
        self.forwardModelChanged()

    def fetchContent(self):
        """
        Retrieves data from the model and inserts it into the widget.
        Expects a hash containing these two keys: available_jobs and forward_model.
        available_jobs=list of names
        forward_model)list of tuples containing(name, arguments, help_text)
        """
        data = self.getFromModel()

        self.available_jobs = data['available_jobs']

        forward_model = data['forward_model']
        self.searchableList.list.clear()
        for job in forward_model:
            jobitem = QtGui.QListWidgetItem()
            jobitem.setText(job[0])
            forward_model_job = ForwardModelJob(job[0])
            forward_model_job.setArguments(job[1])
            forward_model_job.setHelpText(job[2])

            jobitem.setData(QtCore.Qt.UserRole, forward_model_job)
            jobitem.setToolTip(job[0])
            self.searchableList.list.addItem(jobitem)

    def setForwardModelJob(self, forward_model_job):
        """Set the current visible forward model job"""
        self.forward_model_job = forward_model_job
        self.help_text.setText(forward_model_job.help_text)
        self.forward_model_args.fetchContent()

    def changeParameter(self, current, previous):
        """Switch between forward models. Selection from the list"""
        if current is None:
            self.pagesWidget.setCurrentWidget(self.emptyPanel)
        else:
            self.pagesWidget.setCurrentWidget(self.forward_model_panel)
            self.setForwardModelJob(current.data(QtCore.Qt.UserRole).toPyObject())

    def forwardModelChanged(self):
        """
        Called whenever the forward model is changed. (reordering, adding, removing)
        The data submitted to the updateContent() (from ContentModel) is a list of tuples (name, arguments)
        """
        items = self.searchableList.getItems()
        currentRow = self.searchableList.list.currentRow()
        forward_model = []
        for item in items:
            forward_model_job = item.data(QtCore.Qt.UserRole).toPyObject()
            forward_model.append((forward_model_job.name, forward_model_job.arguments))

        self.updateContent(forward_model)
        self.fetchContent()
        self.searchableList.list.setCurrentRow(currentRow)

    def addToList(self, list, name):
        """Adds a new job to the list"""
        param = QtGui.QListWidgetItem()
        param.setText(name)

        new_job = ForwardModelJob(name)
        param.setData(QtCore.Qt.UserRole, new_job)

        list.addItem(param)
        list.setCurrentItem(param)
        return param

    def addItem(self, list):
        """Called by the add button to insert a new job"""

        pd = ValidatedDialog(self, "New forward model job", "Select a job:", self.available_jobs, True)
        if pd.exec_():
            self.addToList(list, pd.getName())
            self.forwardModelChanged()

    def removeItem(self, list):
        """Called by the remove button to remove a selected job"""
        currentRow = list.currentRow()

        if currentRow >= 0:
            title = "Delete forward model job?"
            msg = "Are you sure you want to delete the job from the forward model?"
            btns = QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
            doDelete = QtGui.QMessageBox.question(self, title, msg, btns)

            if doDelete == QtGui.QMessageBox.Yes:
                list.takeItem(currentRow)
                self.forwardModelChanged()
Beispiel #7
0
class RunTemplatePanel(HelpedWidget):
    """
    Widget for adding, removing and editing run templates.
    """

    def __init__(self, parent=None):
        HelpedWidget.__init__(self, parent, "", "config/simulation/run_template")

        self.run_template = RunTemplate("undefined", "", "", "")

        self.createWidgets(parent)

        self.emptyPanel = ert_gui.widgets.util.createEmptyPanel()

        self.pagesWidget = QtGui.QStackedWidget()
        self.pagesWidget.addWidget(self.emptyPanel)
        self.pagesWidget.addWidget(self.run_template_panel)
        self.addWidget(self.pagesWidget)

        self.addHelpButton()

    def createWidgets(self, parent):
        self.searchableList = SearchableList(parent, list_height=150, list_width=150, ignore_case=True)
        self.addWidget(self.searchableList)
        self.connect(self.searchableList, QtCore.SIGNAL('currentItemChanged(QListWidgetItem, QListWidgetItem)'),
                     self.changeParameter)
        self.connect(self.searchableList, QtCore.SIGNAL('addItem(list)'), self.addItem)
        self.connect(self.searchableList, QtCore.SIGNAL('removeItem(list)'), self.removeItem)


        self.run_template_panel = ert_gui.widgets.util.createEmptyPanel()

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)

        self.run_template_file = PathChooser(self, "", "config/simulation/run_template_file", show_files=True)
        self.run_template_file.initialize = ContentModel.emptyInitializer
        self.run_template_file.setter = self.setTemplateFile
        self.run_template_file.getter = lambda model: self.run_template.template_file

        self.run_template_target = PathChooser(self, "", "config/simulation/run_template_target", show_files=True)
        self.run_template_target.initialize = ContentModel.emptyInitializer
        self.run_template_target.setter = self.setTargetFile
        self.run_template_target.getter = lambda model: self.run_template.target_file

        self.run_template_args = StringBox(self, "", "config/simulation/run_template_arguments")
        self.run_template_args.initialize = ContentModel.emptyInitializer
        self.run_template_args.setter = self.setArguments
        self.run_template_args.getter = lambda model: self.run_template.arguments

        layout.addRow("Template file:", self.run_template_file)
        layout.addRow("Target file:", self.run_template_target)
        layout.addRow("Arguments:", self.run_template_args)

        layout.addRow(ert_gui.widgets.util.createSpace(20))

        self.run_template_panel.setLayout(layout)

    def setArguments(self, model, arguments):
        self.run_template.setArguments(arguments)
        self.runTemplateChanged()

    def setTemplateFile(self, model, template_file):
        self.run_template.setTemplateFile(template_file)
        self.runTemplateChanged()

    def setTargetFile(self, model, target_file):
        self.run_template.setTargetFile(target_file)
        self.runTemplateChanged()


    def fetchContent(self):
        """
        Retrieves data from the model and inserts it into the widget.
        List of tuples: (name, template_file, target_file, arguments)
        """
        data = self.getFromModel()

        self.searchableList.list.clear()
        for item in data:
            jobitem = QtGui.QListWidgetItem()
            jobitem.setText(item[0])
            run_template = RunTemplate(item[0], item[1], item[2], item[3])

            jobitem.setData(QtCore.Qt.UserRole, run_template)
            jobitem.setToolTip(item[0])
            self.searchableList.list.addItem(jobitem)

    def setRunTemplate(self, run_template):
        """Set the current visible run template"""
        self.run_template = run_template
        self.run_template_args.fetchContent()
        self.run_template_file.fetchContent()
        self.run_template_target.fetchContent()

    def changeParameter(self, current, previous):
        """Switch between run templates. Selection from the list"""
        if current is None:
            self.pagesWidget.setCurrentWidget(self.emptyPanel)
        else:
            self.pagesWidget.setCurrentWidget(self.run_template_panel)
            self.setRunTemplate(current.data(QtCore.Qt.UserRole).toPyObject())

    def runTemplateChanged(self):
        """
        Called whenever the run template is changed. (adding, removing)
        The data submitted to the updateContent() (from ContentModel) is a list of tuples (name, template_file, target_file, arguments)
        """
        items = self.searchableList.getItems()
        currentRow = self.searchableList.list.currentRow()
        run_templates = []
        for item in items:
            r_t = item.data(QtCore.Qt.UserRole).toPyObject()
            run_template_tuple = (r_t.name, r_t.template_file, r_t.target_file, r_t.arguments)
            run_templates.append(run_template_tuple)

        self.updateContent(run_templates)
        self.fetchContent()
        self.searchableList.list.setCurrentRow(currentRow)

    def addToList(self, list, name):
        """Adds a new run template to the list"""
        param = QtGui.QListWidgetItem()
        param.setText(name)

        new_job = RunTemplate(name)
        param.setData(QtCore.Qt.UserRole, new_job)

        list.addItem(param)
        list.setCurrentItem(param)
        return param

    def addItem(self, list):
        """Called by the add button to insert a new run template"""
        uniqueNames = []
        for index in range(list.count()):
            uniqueNames.append(str(list.item(index).text()))

        pd = ValidatedDialog(self, "New run template", "Enter name of new run template:", uniqueNames)
        if pd.exec_():
            self.addToList(list, pd.getName())
            self.runTemplateChanged()

    def removeItem(self, list):
        """Called by the remove button to remove a selected job"""
        currentRow = list.currentRow()

        if currentRow >= 0:
            title = "Delete run template?"
            msg = "Are you sure you want to delete the run template?"
            btns = QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
            doDelete = QtGui.QMessageBox.question(self, title, msg, btns)

            if doDelete == QtGui.QMessageBox.Yes:
                list.takeItem(currentRow)
                self.runTemplateChanged()
Beispiel #8
0
    def __init__(self, parent=None):
        ConfigPanel.__init__(self, parent)

        self.initialized = False

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)

        def jid(ert):
            """Returns the pointer to the current job (self.job)"""
            jl = ert.enkf.site_config_get_installed_jobs(ert.site_config)
            return ert.job_queue.ext_joblist_get_job(jl, self.job.name)

        self.stdin = PathChooser(self,
                                 "",
                                 "config/systemenv/install_job_stdin",
                                 show_files=True,
                                 must_be_set=False,
                                 must_exist=True)
        self.stdin.setter = lambda ert, value: ert.job_queue.ext_job_set_stdin_file(
            jid(ert), value)
        self.stdin.getter = lambda ert: ert.job_queue.ext_job_get_stdin_file(
            jid(ert))

        self.stdout = PathChooser(self,
                                  "",
                                  "config/systemenv/install_job_stdout",
                                  show_files=True,
                                  must_be_set=True,
                                  must_exist=False)
        self.stdout.setter = lambda ert, value: ert.job_queue.ext_job_set_stdout_file(
            jid(ert), value)
        self.stdout.getter = lambda ert: ert.job_queue.ext_job_get_stdout_file(
            jid(ert))

        self.stderr = PathChooser(self,
                                  "",
                                  "config/systemenv/install_job_stderr",
                                  show_files=True,
                                  must_be_set=True,
                                  must_exist=False)
        self.stderr.setter = lambda ert, value: ert.job_queue.ext_job_set_stderr_file(
            jid(ert), value)
        self.stderr.getter = lambda ert: ert.job_queue.ext_job_get_stderr_file(
            jid(ert))

        self.target_file = PathChooser(
            self,
            "",
            "config/systemenv/install_job_target_file",
            show_files=True,
            must_be_set=False,
            must_exist=False)
        self.target_file.setter = lambda ert, value: ert.job_queue.ext_job_set_target_file(
            jid(ert), value)
        self.target_file.getter = lambda ert: ert.job_queue.ext_job_get_target_file(
            jid(ert))

        self.executable = PathChooser(
            self,
            "",
            "config/systemenv/install_job_executable",
            show_files=True,
            must_be_set=True,
            must_exist=True,
            is_executable_file=True)
        self.executable.setter = lambda ert, value: ert.job_queue.ext_job_set_executable(
            jid(ert), value)
        self.executable.getter = lambda ert: ert.job_queue.ext_job_get_executable(
            jid(ert))

        def setEnv(ert, value):
            job = jid(ert)
            ert.job_queue.ext_job_clear_environment(job)

            for env in value:
                ert.job_queue.ext_job_add_environment(job, env[0], env[1])

        self.env = KeywordTable(self,
                                "",
                                "config/systemenv/install_job_env",
                                colHead1="Variable",
                                colHead2="Value")
        self.env.setter = setEnv
        self.env.getter = lambda ert: ert.getHash(
            ert.job_queue.ext_job_get_environment(jid(ert)))

        self.arglist = StringBox(self, "",
                                 "config/systemenv/install_job_arglist")
        self.arglist.setter = lambda ert, value: ert.job_queue.ext_job_set_private_args_from_string(
            jid(ert), value)
        self.arglist.getter = lambda ert: ert.job_queue.ext_job_get_private_args_as_string(
            jid(ert))

        self.max_running = IntegerSpinner(
            self, "", "config/systemenv/install_job_max_running", 0, 10000)
        self.max_running.setter = lambda ert, value: ert.job_queue.ext_job_set_max_running(
            jid(ert), value)
        self.max_running.getter = lambda ert: ert.job_queue.ext_job_get_max_running(
            jid(ert))

        self.max_running_minutes = IntegerSpinner(
            self, "", "config/systemenv/install_job_max_running_minutes", 0,
            10000)
        self.max_running_minutes.setter = lambda ert, value: ert.job_queue.ext_job_set_max_running_minutes(
            jid(ert), value)
        self.max_running_minutes.getter = lambda ert: ert.job_queue.ext_job_get_max_running_minutes(
            jid(ert))

        self.startPage("Standard")
        self.add("Executable.:", self.executable)
        self.add("Stdout:", self.stdout)
        self.add("Stderr:", self.stderr)
        self.add("Target file:", self.target_file)
        self.add("Arglist.:", self.arglist)
        self.endPage()

        self.startPage("Advanced")
        self.add("Stdin:", self.stdin)
        self.add("Max running:", self.max_running)
        self.max_running.setInfo("(0=unlimited)")
        self.add("Max running minutes:", self.max_running_minutes)
        self.max_running_minutes.setInfo("(0=unlimited)")
        self.add("Env.:", self.env)
        self.endPage()
Beispiel #9
0
class JobConfigPanel(ConfigPanel):
    def __init__(self, parent=None):
        ConfigPanel.__init__(self, parent)

        self.initialized = False

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)

        def jid(ert):
            """Returns the pointer to the current job (self.job)"""
            jl = ert.enkf.site_config_get_installed_jobs(ert.site_config)
            return ert.job_queue.ext_joblist_get_job(jl, self.job.name)

        self.stdin = PathChooser(self,
                                 "",
                                 "config/systemenv/install_job_stdin",
                                 show_files=True,
                                 must_be_set=False,
                                 must_exist=True)
        self.stdin.setter = lambda ert, value: ert.job_queue.ext_job_set_stdin_file(
            jid(ert), value)
        self.stdin.getter = lambda ert: ert.job_queue.ext_job_get_stdin_file(
            jid(ert))

        self.stdout = PathChooser(self,
                                  "",
                                  "config/systemenv/install_job_stdout",
                                  show_files=True,
                                  must_be_set=True,
                                  must_exist=False)
        self.stdout.setter = lambda ert, value: ert.job_queue.ext_job_set_stdout_file(
            jid(ert), value)
        self.stdout.getter = lambda ert: ert.job_queue.ext_job_get_stdout_file(
            jid(ert))

        self.stderr = PathChooser(self,
                                  "",
                                  "config/systemenv/install_job_stderr",
                                  show_files=True,
                                  must_be_set=True,
                                  must_exist=False)
        self.stderr.setter = lambda ert, value: ert.job_queue.ext_job_set_stderr_file(
            jid(ert), value)
        self.stderr.getter = lambda ert: ert.job_queue.ext_job_get_stderr_file(
            jid(ert))

        self.target_file = PathChooser(
            self,
            "",
            "config/systemenv/install_job_target_file",
            show_files=True,
            must_be_set=False,
            must_exist=False)
        self.target_file.setter = lambda ert, value: ert.job_queue.ext_job_set_target_file(
            jid(ert), value)
        self.target_file.getter = lambda ert: ert.job_queue.ext_job_get_target_file(
            jid(ert))

        self.executable = PathChooser(
            self,
            "",
            "config/systemenv/install_job_executable",
            show_files=True,
            must_be_set=True,
            must_exist=True,
            is_executable_file=True)
        self.executable.setter = lambda ert, value: ert.job_queue.ext_job_set_executable(
            jid(ert), value)
        self.executable.getter = lambda ert: ert.job_queue.ext_job_get_executable(
            jid(ert))

        def setEnv(ert, value):
            job = jid(ert)
            ert.job_queue.ext_job_clear_environment(job)

            for env in value:
                ert.job_queue.ext_job_add_environment(job, env[0], env[1])

        self.env = KeywordTable(self,
                                "",
                                "config/systemenv/install_job_env",
                                colHead1="Variable",
                                colHead2="Value")
        self.env.setter = setEnv
        self.env.getter = lambda ert: ert.getHash(
            ert.job_queue.ext_job_get_environment(jid(ert)))

        self.arglist = StringBox(self, "",
                                 "config/systemenv/install_job_arglist")
        self.arglist.setter = lambda ert, value: ert.job_queue.ext_job_set_private_args_from_string(
            jid(ert), value)
        self.arglist.getter = lambda ert: ert.job_queue.ext_job_get_private_args_as_string(
            jid(ert))

        self.max_running = IntegerSpinner(
            self, "", "config/systemenv/install_job_max_running", 0, 10000)
        self.max_running.setter = lambda ert, value: ert.job_queue.ext_job_set_max_running(
            jid(ert), value)
        self.max_running.getter = lambda ert: ert.job_queue.ext_job_get_max_running(
            jid(ert))

        self.max_running_minutes = IntegerSpinner(
            self, "", "config/systemenv/install_job_max_running_minutes", 0,
            10000)
        self.max_running_minutes.setter = lambda ert, value: ert.job_queue.ext_job_set_max_running_minutes(
            jid(ert), value)
        self.max_running_minutes.getter = lambda ert: ert.job_queue.ext_job_get_max_running_minutes(
            jid(ert))

        self.startPage("Standard")
        self.add("Executable.:", self.executable)
        self.add("Stdout:", self.stdout)
        self.add("Stderr:", self.stderr)
        self.add("Target file:", self.target_file)
        self.add("Arglist.:", self.arglist)
        self.endPage()

        self.startPage("Advanced")
        self.add("Stdin:", self.stdin)
        self.add("Max running:", self.max_running)
        self.max_running.setInfo("(0=unlimited)")
        self.add("Max running minutes:", self.max_running_minutes)
        self.max_running_minutes.setInfo("(0=unlimited)")
        self.add("Env.:", self.env)
        self.endPage()

    def add(self, label, widget):
        self.addRow(widget, label)

    def setJob(self, job):
        self.job = job

        self.initialize(self.stdin.getModel())

        self.cmproxy = ContentModelProxy(
        )  #Since only the last change matters and no insert and remove is done
        self.cmproxy.proxify(self.stdin, self.stdout, self.stderr,
                             self.target_file, self.executable, self.env,
                             self.arglist, self.max_running,
                             self.max_running_minutes)

        self.stdin.fetchContent()
        self.stdout.fetchContent()
        self.stderr.fetchContent()
        self.target_file.fetchContent()
        self.executable.fetchContent()
        self.env.fetchContent()
        self.arglist.fetchContent()
        self.max_running.fetchContent()
        self.max_running_minutes.fetchContent()

    def saveJob(self):
        if self.executable.isValid() and self.stderr.isValid(
        ) and self.stdout.isValid():
            self.cmproxy.apply()

            ert = self.stdin.getModel()
            jl = ert.enkf.site_config_get_installed_jobs(ert.site_config)
            jid = ert.job_queue.ext_joblist_get_job(jl, self.job.name)
            ert.job_queue.ext_job_save(jid)
            return None
        else:
            return "These fields are required: executable, stdout and stderr!"
Beispiel #10
0
class ForwardModelPanel(HelpedWidget):
    """
    Widget for adding, removing and editing forward models.
    Only uses the setter and getter hooks.
    The panel expects remove to return True or False based on the success of the removal.
    """
    def __init__(self, parent=None):
        HelpedWidget.__init__(self, parent, "Forward Model",
                              "config/simulation/forward_model")

        self.forward_model_job = ForwardModelJob("undefined")

        self.createWidgets(parent)

        self.emptyPanel = ert_gui.widgets.util.createEmptyPanel()

        self.pagesWidget = QtGui.QStackedWidget()
        self.pagesWidget.addWidget(self.emptyPanel)
        self.pagesWidget.addWidget(self.forward_model_panel)
        self.addWidget(self.pagesWidget)

        self.addHelpButton()

    def createWidgets(self, parent):
        self.searchableList = SearchableList(parent,
                                             list_height=150,
                                             list_width=150,
                                             ignore_case=True,
                                             order_editable=True)
        self.addWidget(self.searchableList)
        self.connect(
            self.searchableList,
            QtCore.SIGNAL(
                'currentItemChanged(QListWidgetItem, QListWidgetItem)'),
            self.changeParameter)
        self.connect(self.searchableList, QtCore.SIGNAL('addItem(list)'),
                     self.addItem)
        self.connect(self.searchableList, QtCore.SIGNAL('removeItem(list)'),
                     self.removeItem)
        self.connect(self.searchableList, QtCore.SIGNAL('orderChanged(list)'),
                     self.forwardModelChanged)

        self.forward_model_panel = ert_gui.widgets.util.createEmptyPanel()

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)

        self.forward_model_args = StringBox(
            self, "", "config/simulation/forward_model_arguments")
        self.forward_model_args.initialize = ContentModel.emptyInitializer
        self.forward_model_args.setter = self.setArguments
        self.forward_model_args.getter = lambda model: self.forward_model_job.arguments

        layout.addRow("Arguments:", self.forward_model_args)

        layout.addRow(ert_gui.widgets.util.createSpace(20))

        self.help_text = QtGui.QLabel()
        self.help_text.setText("")

        layout.addRow(ert_gui.widgets.util.centeredWidget(self.help_text))

        self.forward_model_panel.setLayout(layout)
        self.modelConnect('jobListChanged()', self.fetchContent)

    def setArguments(self, model, arguments):
        """Set the arguments of the current forward model job."""
        self.forward_model_job.setArguments(arguments)
        self.forwardModelChanged()

    def fetchContent(self):
        """
        Retrieves data from the model and inserts it into the widget.
        Expects a hash containing these two keys: available_jobs and forward_model.
        available_jobs=list of names
        forward_model)list of tuples containing(name, arguments, help_text)
        """
        data = self.getFromModel()

        self.available_jobs = data['available_jobs']

        forward_model = data['forward_model']
        self.searchableList.list.clear()
        for job in forward_model:
            jobitem = QtGui.QListWidgetItem()
            jobitem.setText(job[0])
            forward_model_job = ForwardModelJob(job[0])
            forward_model_job.setArguments(job[1])
            forward_model_job.setHelpText(job[2])

            jobitem.setData(QtCore.Qt.UserRole, forward_model_job)
            jobitem.setToolTip(job[0])
            self.searchableList.list.addItem(jobitem)

    def setForwardModelJob(self, forward_model_job):
        """Set the current visible forward model job"""
        self.forward_model_job = forward_model_job
        self.help_text.setText(forward_model_job.help_text)
        self.forward_model_args.fetchContent()

    def changeParameter(self, current, previous):
        """Switch between forward models. Selection from the list"""
        if current is None:
            self.pagesWidget.setCurrentWidget(self.emptyPanel)
        else:
            self.pagesWidget.setCurrentWidget(self.forward_model_panel)
            self.setForwardModelJob(
                current.data(QtCore.Qt.UserRole).toPyObject())

    def forwardModelChanged(self):
        """
        Called whenever the forward model is changed. (reordering, adding, removing)
        The data submitted to the updateContent() (from ContentModel) is a list of tuples (name, arguments)
        """
        items = self.searchableList.getItems()
        currentRow = self.searchableList.list.currentRow()
        forward_model = []
        for item in items:
            forward_model_job = item.data(QtCore.Qt.UserRole).toPyObject()
            forward_model.append(
                (forward_model_job.name, forward_model_job.arguments))

        self.updateContent(forward_model)
        self.fetchContent()
        self.searchableList.list.setCurrentRow(currentRow)

    def addToList(self, list, name):
        """Adds a new job to the list"""
        param = QtGui.QListWidgetItem()
        param.setText(name)

        new_job = ForwardModelJob(name)
        param.setData(QtCore.Qt.UserRole, new_job)

        list.addItem(param)
        list.setCurrentItem(param)
        return param

    def addItem(self, list):
        """Called by the add button to insert a new job"""

        pd = ValidatedDialog(self, "New forward model job", "Select a job:",
                             self.available_jobs, True)
        if pd.exec_():
            self.addToList(list, pd.getName())
            self.forwardModelChanged()

    def removeItem(self, list):
        """Called by the remove button to remove a selected job"""
        currentRow = list.currentRow()

        if currentRow >= 0:
            title = "Delete forward model job?"
            msg = "Are you sure you want to delete the job from the forward model?"
            btns = QtGui.QMessageBox.Yes | QtGui.QMessageBox.No
            doDelete = QtGui.QMessageBox.question(self, title, msg, btns)

            if doDelete == QtGui.QMessageBox.Yes:
                list.takeItem(currentRow)
                self.forwardModelChanged()
Beispiel #11
0
def createQueueSystemPage(configPanel, parent):
    configPanel.startPage("Queue System")

    r = configPanel.addRow(
        ComboChoice(parent, ["LSF", "RSH", "LOCAL"], "Queue system",
                    "config/queue_system/queue_system"))
    r.getter = lambda ert: ert.enkf.site_config_get_queue_name(ert.site_config)
    r.setter = lambda ert, value: ert.enkf.site_config_set_job_queue(
        ert.site_config, str(value))

    internalPanel = ConfigPanel(parent)

    internalPanel.startPage("LSF")

    r = internalPanel.addRow(
        StringBox(parent, "LSF Queue", "config/queue_system/lsf_queue"))
    r.getter = lambda ert: ert.enkf.site_config_get_lsf_queue(ert.site_config)
    r.setter = lambda ert, value: ert.enkf.site_config_set_lsf_queue(
        ert.site_config, str(value))

    r = internalPanel.addRow(
        IntegerSpinner(parent, "Max running",
                       "config/queue_system/max_running_lsf", 1, 1000))
    r.getter = lambda ert: ert.enkf.site_config_get_max_running_lsf(
        ert.site_config)
    r.setter = lambda ert, value: ert.enkf.site_config_set_max_running_lsf(
        ert.site_config, value)

    r = internalPanel.addRow(
        StringBox(parent, "Resources", "config/queue_system/lsf_resources"))
    r.getter = lambda ert: ert.enkf.site_config_get_lsf_request(ert.site_config
                                                                )
    r.setter = lambda ert, value: ert.enkf.site_config_set_lsf_request(
        ert.site_config, str(value))

    internalPanel.endPage()

    internalPanel.startPage("RSH")

    r = internalPanel.addRow(
        PathChooser(parent,
                    "Command",
                    "config/queue_system/rsh_command",
                    show_files=True,
                    must_exist=True,
                    is_executable_file=True))
    r.getter = lambda ert: ert.enkf.site_config_get_rsh_command(ert.site_config
                                                                )
    r.setter = lambda ert, value: ert.enkf.site_config_set_rsh_command(
        ert.site_config, str(value))

    r = internalPanel.addRow(
        IntegerSpinner(parent, "Max running",
                       "config/queue_system/max_running_rsh", 1, 1000))
    r.getter = lambda ert: ert.enkf.site_config_get_max_running_rsh(
        ert.site_config)
    r.setter = lambda ert, value: ert.enkf.site_config_set_max_running_rsh(
        ert.site_config, value)

    r = internalPanel.addRow(
        KeywordTable(parent, "Host List", "config/queue_system/rsh_host_list",
                     "Host", "Number of jobs"))
    r.getter = lambda ert: ert.getHash(
        ert.enkf.site_config_get_rsh_host_list(ert.site_config), True)

    def add_rsh_host(ert, listOfKeywords):
        ert.enkf.site_config_clear_rsh_host_list(ert.site_config)

        for keyword in listOfKeywords:
            if keyword[1].strip() == "":
                max_running = 1
            else:
                max_running = int(keyword[1])

            ert.enkf.site_config_add_rsh_host(ert.site_config, keyword[0],
                                              max_running)

    r.setter = add_rsh_host

    internalPanel.endPage()

    internalPanel.startPage("LOCAL")

    r = internalPanel.addRow(
        IntegerSpinner(parent, "Max running",
                       "config/queue_system/max_running_local", 1, 1000))
    r.getter = lambda ert: ert.enkf.site_config_get_max_running_local(
        ert.site_config)
    r.setter = lambda ert, value: ert.enkf.site_config_set_max_running_local(
        ert.site_config, value)

    internalPanel.endPage()
    configPanel.addRow(internalPanel)

    configPanel.endPage()
Beispiel #12
0
    def __init__(self, parent=None):
        ConfigPanel.__init__(self, parent)

        self.initialized = False

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)

        def jid(ert):
            """Returns the pointer to the current job (self.job)"""
            jl = ert.enkf.site_config_get_installed_jobs(ert.site_config)
            return ert.job_queue.ext_joblist_get_job(jl, self.job.name)

        self.stdin = PathChooser(
            self, "", "config/systemenv/install_job_stdin", show_files=True, must_be_set=False, must_exist=True
        )
        self.stdin.setter = lambda ert, value: ert.job_queue.ext_job_set_stdin_file(jid(ert), value)
        self.stdin.getter = lambda ert: ert.job_queue.ext_job_get_stdin_file(jid(ert))

        self.stdout = PathChooser(
            self, "", "config/systemenv/install_job_stdout", show_files=True, must_be_set=True, must_exist=False
        )
        self.stdout.setter = lambda ert, value: ert.job_queue.ext_job_set_stdout_file(jid(ert), value)
        self.stdout.getter = lambda ert: ert.job_queue.ext_job_get_stdout_file(jid(ert))

        self.stderr = PathChooser(
            self, "", "config/systemenv/install_job_stderr", show_files=True, must_be_set=True, must_exist=False
        )
        self.stderr.setter = lambda ert, value: ert.job_queue.ext_job_set_stderr_file(jid(ert), value)
        self.stderr.getter = lambda ert: ert.job_queue.ext_job_get_stderr_file(jid(ert))

        self.target_file = PathChooser(
            self, "", "config/systemenv/install_job_target_file", show_files=True, must_be_set=False, must_exist=False
        )
        self.target_file.setter = lambda ert, value: ert.job_queue.ext_job_set_target_file(jid(ert), value)
        self.target_file.getter = lambda ert: ert.job_queue.ext_job_get_target_file(jid(ert))

        self.executable = PathChooser(
            self,
            "",
            "config/systemenv/install_job_executable",
            show_files=True,
            must_be_set=True,
            must_exist=True,
            is_executable_file=True,
        )
        self.executable.setter = lambda ert, value: ert.job_queue.ext_job_set_executable(jid(ert), value)
        self.executable.getter = lambda ert: ert.job_queue.ext_job_get_executable(jid(ert))

        def setEnv(ert, value):
            job = jid(ert)
            ert.job_queue.ext_job_clear_environment(job)

            for env in value:
                ert.job_queue.ext_job_add_environment(job, env[0], env[1])

        self.env = KeywordTable(self, "", "config/systemenv/install_job_env", colHead1="Variable", colHead2="Value")
        self.env.setter = setEnv
        self.env.getter = lambda ert: ert.getHash(ert.job_queue.ext_job_get_environment(jid(ert)))

        self.arglist = StringBox(self, "", "config/systemenv/install_job_arglist")
        self.arglist.setter = lambda ert, value: ert.job_queue.ext_job_set_private_args_from_string(jid(ert), value)
        self.arglist.getter = lambda ert: ert.job_queue.ext_job_get_private_args_as_string(jid(ert))

        self.max_running = IntegerSpinner(self, "", "config/systemenv/install_job_max_running", 0, 10000)
        self.max_running.setter = lambda ert, value: ert.job_queue.ext_job_set_max_running(jid(ert), value)
        self.max_running.getter = lambda ert: ert.job_queue.ext_job_get_max_running(jid(ert))

        self.max_running_minutes = IntegerSpinner(
            self, "", "config/systemenv/install_job_max_running_minutes", 0, 10000
        )
        self.max_running_minutes.setter = lambda ert, value: ert.job_queue.ext_job_set_max_running_minutes(
            jid(ert), value
        )
        self.max_running_minutes.getter = lambda ert: ert.job_queue.ext_job_get_max_running_minutes(jid(ert))

        self.startPage("Standard")
        self.add("Executable.:", self.executable)
        self.add("Stdout:", self.stdout)
        self.add("Stderr:", self.stderr)
        self.add("Target file:", self.target_file)
        self.add("Arglist.:", self.arglist)
        self.endPage()

        self.startPage("Advanced")
        self.add("Stdin:", self.stdin)
        self.add("Max running:", self.max_running)
        self.max_running.setInfo("(0=unlimited)")
        self.add("Max running minutes:", self.max_running_minutes)
        self.max_running_minutes.setInfo("(0=unlimited)")
        self.add("Env.:", self.env)
        self.endPage()
Beispiel #13
0
class JobConfigPanel(ConfigPanel):
    def __init__(self, parent=None):
        ConfigPanel.__init__(self, parent)

        self.initialized = False

        layout = QtGui.QFormLayout()
        layout.setLabelAlignment(QtCore.Qt.AlignRight)

        def jid(ert):
            """Returns the pointer to the current job (self.job)"""
            jl = ert.enkf.site_config_get_installed_jobs(ert.site_config)
            return ert.job_queue.ext_joblist_get_job(jl, self.job.name)

        self.stdin = PathChooser(
            self, "", "config/systemenv/install_job_stdin", show_files=True, must_be_set=False, must_exist=True
        )
        self.stdin.setter = lambda ert, value: ert.job_queue.ext_job_set_stdin_file(jid(ert), value)
        self.stdin.getter = lambda ert: ert.job_queue.ext_job_get_stdin_file(jid(ert))

        self.stdout = PathChooser(
            self, "", "config/systemenv/install_job_stdout", show_files=True, must_be_set=True, must_exist=False
        )
        self.stdout.setter = lambda ert, value: ert.job_queue.ext_job_set_stdout_file(jid(ert), value)
        self.stdout.getter = lambda ert: ert.job_queue.ext_job_get_stdout_file(jid(ert))

        self.stderr = PathChooser(
            self, "", "config/systemenv/install_job_stderr", show_files=True, must_be_set=True, must_exist=False
        )
        self.stderr.setter = lambda ert, value: ert.job_queue.ext_job_set_stderr_file(jid(ert), value)
        self.stderr.getter = lambda ert: ert.job_queue.ext_job_get_stderr_file(jid(ert))

        self.target_file = PathChooser(
            self, "", "config/systemenv/install_job_target_file", show_files=True, must_be_set=False, must_exist=False
        )
        self.target_file.setter = lambda ert, value: ert.job_queue.ext_job_set_target_file(jid(ert), value)
        self.target_file.getter = lambda ert: ert.job_queue.ext_job_get_target_file(jid(ert))

        self.executable = PathChooser(
            self,
            "",
            "config/systemenv/install_job_executable",
            show_files=True,
            must_be_set=True,
            must_exist=True,
            is_executable_file=True,
        )
        self.executable.setter = lambda ert, value: ert.job_queue.ext_job_set_executable(jid(ert), value)
        self.executable.getter = lambda ert: ert.job_queue.ext_job_get_executable(jid(ert))

        def setEnv(ert, value):
            job = jid(ert)
            ert.job_queue.ext_job_clear_environment(job)

            for env in value:
                ert.job_queue.ext_job_add_environment(job, env[0], env[1])

        self.env = KeywordTable(self, "", "config/systemenv/install_job_env", colHead1="Variable", colHead2="Value")
        self.env.setter = setEnv
        self.env.getter = lambda ert: ert.getHash(ert.job_queue.ext_job_get_environment(jid(ert)))

        self.arglist = StringBox(self, "", "config/systemenv/install_job_arglist")
        self.arglist.setter = lambda ert, value: ert.job_queue.ext_job_set_private_args_from_string(jid(ert), value)
        self.arglist.getter = lambda ert: ert.job_queue.ext_job_get_private_args_as_string(jid(ert))

        self.max_running = IntegerSpinner(self, "", "config/systemenv/install_job_max_running", 0, 10000)
        self.max_running.setter = lambda ert, value: ert.job_queue.ext_job_set_max_running(jid(ert), value)
        self.max_running.getter = lambda ert: ert.job_queue.ext_job_get_max_running(jid(ert))

        self.max_running_minutes = IntegerSpinner(
            self, "", "config/systemenv/install_job_max_running_minutes", 0, 10000
        )
        self.max_running_minutes.setter = lambda ert, value: ert.job_queue.ext_job_set_max_running_minutes(
            jid(ert), value
        )
        self.max_running_minutes.getter = lambda ert: ert.job_queue.ext_job_get_max_running_minutes(jid(ert))

        self.startPage("Standard")
        self.add("Executable.:", self.executable)
        self.add("Stdout:", self.stdout)
        self.add("Stderr:", self.stderr)
        self.add("Target file:", self.target_file)
        self.add("Arglist.:", self.arglist)
        self.endPage()

        self.startPage("Advanced")
        self.add("Stdin:", self.stdin)
        self.add("Max running:", self.max_running)
        self.max_running.setInfo("(0=unlimited)")
        self.add("Max running minutes:", self.max_running_minutes)
        self.max_running_minutes.setInfo("(0=unlimited)")
        self.add("Env.:", self.env)
        self.endPage()

    def add(self, label, widget):
        self.addRow(widget, label)

    def initialize(self, ert):
        if not self.initialized:
            ert.prototype("long site_config_get_installed_jobs(long)")
            ert.prototype("char* ext_job_get_stdin_file(long)", lib=ert.job_queue)
            ert.prototype("void ext_job_set_stdin_file(long, char*)", lib=ert.job_queue)
            ert.prototype("char* ext_job_get_stdout_file(long)", lib=ert.job_queue)
            ert.prototype("void ext_job_set_stdout_file(long, char*)", lib=ert.job_queue)
            ert.prototype("char* ext_job_get_stderr_file(long)", lib=ert.job_queue)
            ert.prototype("void ext_job_set_stderr_file(long, char*)", lib=ert.job_queue)
            ert.prototype("char* ext_job_get_target_file(long)", lib=ert.job_queue)
            ert.prototype("void ext_job_set_target_file(long, char*)", lib=ert.job_queue)
            ert.prototype("char* ext_job_get_executable(long)", lib=ert.job_queue)
            ert.prototype("void ext_job_set_executable(long, char*)", lib=ert.job_queue)
            ert.prototype("char* ext_job_get_private_args_as_string(long)", lib=ert.job_queue)
            ert.prototype("void ext_job_set_private_args_from_string(long, char*)", lib=ert.job_queue)
            ert.prototype("int ext_job_get_max_running(long)", lib=ert.job_queue)
            ert.prototype("void ext_job_set_max_running(long, int)", lib=ert.job_queue)
            ert.prototype("int ext_job_get_max_running_minutes(long)", lib=ert.job_queue)
            ert.prototype("void ext_job_set_max_running_minutes(long, int)", lib=ert.job_queue)
            ert.prototype("long ext_job_get_environment(long)", lib=ert.job_queue)
            ert.prototype("void ext_job_add_environment(long, char*, char*)", lib=ert.job_queue)
            ert.prototype("void ext_job_clear_environment(long)", lib=ert.job_queue)
            ert.prototype("void ext_job_save(long)", lib=ert.job_queue)
            ert.prototype("long ext_joblist_get_job(long, char*)", lib=ert.job_queue)

            self.initialized = True

    def setJob(self, job):
        self.job = job

        self.initialize(self.stdin.getModel())

        self.cmproxy = ContentModelProxy()  # Since only the last change matters and no insert and remove is done
        self.cmproxy.proxify(
            self.stdin,
            self.stdout,
            self.stderr,
            self.target_file,
            self.executable,
            self.env,
            self.arglist,
            self.max_running,
            self.max_running_minutes,
        )

        self.stdin.fetchContent()
        self.stdout.fetchContent()
        self.stderr.fetchContent()
        self.target_file.fetchContent()
        self.executable.fetchContent()
        self.env.fetchContent()
        self.arglist.fetchContent()
        self.max_running.fetchContent()
        self.max_running_minutes.fetchContent()

    def saveJob(self):
        if self.executable.isValid() and self.stderr.isValid() and self.stdout.isValid():
            self.cmproxy.apply()

            ert = self.stdin.getModel()
            jl = ert.enkf.site_config_get_installed_jobs(ert.site_config)
            jid = ert.job_queue.ext_joblist_get_job(jl, self.job.name)
            ert.job_queue.ext_job_save(jid)
            return None
        else:
            return "These fields are required: executable, stdout and stderr!"