def __init__(self, parent, model, view, session):
        '''
        :param model: an instance of class Propagation
        :param view: an instance of PropagationEditorView
        '''
        super(SeedPresenter, self).__init__(model, view)
        self._dirty = False
        self.parent_ref = weakref.ref(parent)
        self.session = session

        self.propagation = self.model
        if not self.propagation._seed:
            self.propagation._seed = PropSeed()
        self.model = self.model._seed

        # TODO: if % germinated is not entered and nseeds and #
        # germinated are then automatically calculate the % germinated

        widgets = self.view.widgets
        distinct = lambda c: utils.get_distinct_values(c, self.session)
        # TODO: should also setup a completion on the entry
        utils.setup_text_combobox(self.view.widgets.seed_media_comboentry,
                                  distinct(PropSeed.media))
        utils.setup_text_combobox(self.view.widgets.seed_container_comboentry,
                                  distinct(PropSeed.container))
        utils.setup_text_combobox(self.view.widgets.seed_location_comboentry,
                                  distinct(PropSeed.location))

        self.refresh_view()

        self.assign_simple_handler('seed_pretreatment_textview',
                                   'pretreatment',
                                   editor.UnicodeOrNoneValidator())
        # TODO: this should validate to an integer
        self.assign_simple_handler('seed_nseeds_entry', 'nseeds',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_sown_entry', 'date_sown',
                                   editor.DateValidator())
        utils.setup_date_button(self.view, 'seed_sown_entry',
                                'seed_sown_button')
        self.assign_simple_handler('seed_container_comboentry', 'container',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_media_comboentry', 'media',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_location_comboentry', 'location',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_mvdfrom_entry', 'moved_from',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_mvdto_entry', 'moved_to',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_germdate_entry', 'germ_date',
                                   editor.DateValidator())
        utils.setup_date_button(self.view, 'seed_germdate_entry',
                                'seed_germdate_button')
        self.assign_simple_handler('seed_ngerm_entry', 'nseedlings')
        self.assign_simple_handler('seed_pctgerm_entry', 'germ_pct')
        self.assign_simple_handler('seed_date_planted_entry', 'date_planted',
                                   editor.DateValidator())
        utils.setup_date_button(self.view, 'seed_date_planted_entry',
                                'seed_date_planted_button')
    def __init__(self, parent, model, view, session):
        '''
        :param model: an instance of class Propagation
        :param view: an instance of PropagationEditorView
        '''
        super(SeedPresenter, self).__init__(model, view)
        self._dirty = False
        self.parent_ref = weakref.ref(parent)
        self.session = session

        self.propagation = self.model
        if not self.propagation._seed:
            self.propagation._seed = PropSeed()
        self.model = self.model._seed

        # TODO: if % germinated is not entered and nseeds and #
        # germinated are then automatically calculate the % germinated

        widgets = self.view.widgets
        distinct = lambda c: utils.get_distinct_values(c, self.session)
        # TODO: should also setup a completion on the entry
        utils.setup_text_combobox(self.view.widgets.seed_media_comboentry,
                                  distinct(PropSeed.media))
        utils.setup_text_combobox(self.view.widgets.seed_container_comboentry,
                                  distinct(PropSeed.container))
        utils.setup_text_combobox(self.view.widgets.seed_location_comboentry,
                                  distinct(PropSeed.location))

        self.refresh_view()

        self.assign_simple_handler('seed_pretreatment_textview',
                                   'pretreatment',
                                   editor.UnicodeOrNoneValidator())
        # TODO: this should validate to an integer
        self.assign_simple_handler('seed_nseeds_entry', 'nseeds',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_sown_entry', 'date_sown',
                                   editor.DateValidator())
        utils.setup_date_button(self.view, 'seed_sown_entry',
                                'seed_sown_button')
        self.assign_simple_handler('seed_container_comboentry', 'container',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_media_comboentry', 'media',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_location_comboentry', 'location',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_mvdfrom_entry', 'moved_from',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_mvdto_entry', 'moved_to',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('seed_germdate_entry', 'germ_date',
                                   editor.DateValidator())
        utils.setup_date_button(self.view, 'seed_germdate_entry',
                                'seed_germdate_button')
        self.assign_simple_handler('seed_ngerm_entry', 'nseedlings')
        self.assign_simple_handler('seed_pctgerm_entry', 'germ_pct')
        self.assign_simple_handler('seed_date_planted_entry', 'date_planted',
                                   editor.DateValidator())
        utils.setup_date_button(self.view, 'seed_date_planted_entry',
                                'seed_date_planted_button')
    def __init__(self, parent, model, view, session):
        '''
        :param model: an instance of class Propagation
        :param view: an instance of PropagationEditorView
        '''
        super(CuttingPresenter, self).__init__(model, view)
        self.parent_ref = weakref.ref(parent)
        self.session = session
        self._dirty = False

        # make the model for the presenter a PropCutting instead of a
        # Propagation
        self.propagation = self.model
        if not self.propagation._cutting:
            self.propagation._cutting = PropCutting()
        self.model = self.model._cutting

        init_combo = self.view.init_translatable_combo
        init_combo('cutting_type_combo', cutting_type_values,
                   editor.UnicodeOrNoneValidator())
        init_combo('cutting_length_unit_combo', length_unit_values)
        init_combo('cutting_tip_combo', tip_values)
        init_combo('cutting_leaves_combo', leaves_values)
        init_combo('cutting_buds_combo', flower_buds_values)
        init_combo('cutting_wound_combo', wound_values)
        init_combo('cutting_heat_unit_combo', bottom_heat_unit_values)

        widgets = self.view.widgets

        distinct = lambda c: utils.get_distinct_values(c, self.session)
        utils.setup_text_combobox(widgets.cutting_hormone_comboentry,
                                  distinct(PropCutting.hormone))
        utils.setup_text_combobox(widgets.cutting_cover_comboentry,
                                  distinct(PropCutting.cover))
        utils.setup_text_combobox(widgets.cutting_fungal_comboentry,
                                  distinct(PropCutting.fungicide))
        utils.setup_text_combobox(widgets.cutting_location_comboentry,
                                  distinct(PropCutting.location))
        utils.setup_text_combobox(widgets.cutting_container_comboentry,
                                  distinct(PropCutting.container))
        utils.setup_text_combobox(widgets.cutting_media_comboentry,
                                  distinct(PropCutting.media))

        # set default units
        units = prefs.prefs[prefs.units_pref]
        if units == u'imperial':
            self.model.length_unit = u'in'
            self.model.bottom_heat_unit = u'F'
        else:
            self.model.length_unit = u'mm'
            self.model.bottom_heat_unit = u'C'

        self.refresh_view()

        self.assign_simple_handler('cutting_type_combo', 'cutting_type')
        self.assign_simple_handler('cutting_length_entry', 'length')
        self.assign_simple_handler('cutting_length_unit_combo', 'length_unit')
        self.assign_simple_handler('cutting_tip_combo', 'tip')
        self.assign_simple_handler('cutting_leaves_combo', 'leaves')
        self.assign_simple_handler('cutting_lvs_reduced_entry',
                                   'leaves_reduced_pct')

        self.assign_simple_handler('cutting_media_comboentry', 'media',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('cutting_container_comboentry', 'container',
                                   editor.UnicodeOrNoneValidator())

        self.assign_simple_handler('cutting_buds_combo', 'flower_buds')
        self.assign_simple_handler('cutting_wound_combo', 'wound')
        self.assign_simple_handler('cutting_fungal_comboentry', 'fungicide',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('cutting_hormone_comboentry', 'hormone',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('cutting_location_comboentry', 'location',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('cutting_cover_comboentry', 'cover',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('cutting_heat_entry', 'bottom_heat_temp')
        self.assign_simple_handler('cutting_heat_unit_combo',
                                   'bottom_heat_unit')
        self.assign_simple_handler('cutting_rooted_pct_entry', 'rooted_pct')

        model = gtk.ListStore(object)
        self.view.widgets.rooted_treeview.set_model(model)

        def _rooted_data_func(column, cell, model, treeiter, prop):
            v = model[treeiter][0]
            cell.set_property('text', getattr(v, prop))

        cell = self.view.widgets.rooted_date_cell
        cell.props.editable = True
        self.view.connect(cell, 'edited', self.on_rooted_cell_edited, 'date')
        self.view.widgets.rooted_date_column.\
            set_cell_data_func(cell, _rooted_data_func, 'date')

        cell = self.view.widgets.rooted_quantity_cell
        cell.props.editable = True
        self.view.connect(cell, 'edited', self.on_rooted_cell_edited,
                          'quantity')
        self.view.widgets.rooted_quantity_column.\
            set_cell_data_func(cell, _rooted_data_func, 'quantity')

        self.view.connect('rooted_add_button', "clicked",
                          self.on_rooted_add_clicked)
        self.view.connect('rooted_remove_button', "clicked",
                          self.on_rooted_remove_clicked)
    def __init__(self, parent, model, view, session):
        '''
        :param model: an instance of class Propagation
        :param view: an instance of PropagationEditorView
        '''
        super(CuttingPresenter, self).__init__(model, view)
        self.parent_ref = weakref.ref(parent)
        self.session = session
        self._dirty = False

        # make the model for the presenter a PropCutting instead of a
        # Propagation
        self.propagation = self.model
        if not self.propagation._cutting:
            self.propagation._cutting = PropCutting()
        self.model = self.model._cutting

        init_combo = self.view.init_translatable_combo
        init_combo('cutting_type_combo', cutting_type_values,
                   editor.UnicodeOrNoneValidator())
        init_combo('cutting_length_unit_combo', length_unit_values)
        init_combo('cutting_tip_combo', tip_values)
        init_combo('cutting_leaves_combo', leaves_values)
        init_combo('cutting_buds_combo', flower_buds_values)
        init_combo('cutting_wound_combo', wound_values)
        init_combo('cutting_heat_unit_combo', bottom_heat_unit_values)

        widgets = self.view.widgets

        distinct = lambda c: utils.get_distinct_values(c, self.session)
        utils.setup_text_combobox(widgets.cutting_hormone_comboentry,
                                  distinct(PropCutting.hormone))
        utils.setup_text_combobox(widgets.cutting_cover_comboentry,
                                  distinct(PropCutting.cover))
        utils.setup_text_combobox(widgets.cutting_fungal_comboentry,
                                  distinct(PropCutting.fungicide))
        utils.setup_text_combobox(widgets.cutting_location_comboentry,
                                  distinct(PropCutting.location))
        utils.setup_text_combobox(widgets.cutting_container_comboentry,
                                  distinct(PropCutting.container))
        utils.setup_text_combobox(widgets.cutting_media_comboentry,
                                  distinct(PropCutting.media))

        # set default units
        units = prefs.prefs[prefs.units_pref]
        if units == u'imperial':
            self.model.length_unit = u'in'
            self.model.bottom_heat_unit = u'F'
        else:
            self.model.length_unit = u'mm'
            self.model.bottom_heat_unit = u'C'

        self.refresh_view()

        self.assign_simple_handler('cutting_type_combo', 'cutting_type')
        self.assign_simple_handler('cutting_length_entry', 'length')
        self.assign_simple_handler('cutting_length_unit_combo', 'length_unit')
        self.assign_simple_handler('cutting_tip_combo', 'tip')
        self.assign_simple_handler('cutting_leaves_combo', 'leaves')
        self.assign_simple_handler('cutting_lvs_reduced_entry',
                                   'leaves_reduced_pct')

        self.assign_simple_handler('cutting_media_comboentry', 'media',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('cutting_container_comboentry', 'container',
                                   editor.UnicodeOrNoneValidator())

        self.assign_simple_handler('cutting_buds_combo', 'flower_buds')
        self.assign_simple_handler('cutting_wound_combo', 'wound')
        self.assign_simple_handler('cutting_fungal_comboentry', 'fungicide',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('cutting_hormone_comboentry', 'hormone',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('cutting_location_comboentry', 'location',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('cutting_cover_comboentry', 'cover',
                                   editor.UnicodeOrNoneValidator())
        self.assign_simple_handler('cutting_heat_entry', 'bottom_heat_temp')
        self.assign_simple_handler('cutting_heat_unit_combo',
                                   'bottom_heat_unit')
        self.assign_simple_handler('cutting_rooted_pct_entry',
                                   'rooted_pct')

        model = gtk.ListStore(object)
        self.view.widgets.rooted_treeview.set_model(model)

        def _rooted_data_func(column, cell, model, treeiter, prop):
            v = model[treeiter][0]
            cell.set_property('text', getattr(v, prop))

        cell = self.view.widgets.rooted_date_cell
        cell.props.editable = True
        self.view.connect(cell, 'edited', self.on_rooted_cell_edited, 'date')
        self.view.widgets.rooted_date_column.\
            set_cell_data_func(cell, _rooted_data_func, 'date')

        cell = self.view.widgets.rooted_quantity_cell
        cell.props.editable = True
        self.view.connect(cell, 'edited', self.on_rooted_cell_edited,
                          'quantity')
        self.view.widgets.rooted_quantity_column.\
            set_cell_data_func(cell, _rooted_data_func, 'quantity')

        self.view.connect('rooted_add_button', "clicked",
                          self.on_rooted_add_clicked)
        self.view.connect('rooted_remove_button', "clicked",
                          self.on_rooted_remove_clicked)
Example #5
0
    def __init__(self, parent, model, view, session):
        """
        :param model: an instance of class Propagation
        :param view: an instance of PropagationEditorView
        """
        super(CuttingPresenter, self).__init__(model, view)
        self.parent_ref = weakref.ref(parent)
        self.session = session
        self._dirty = False

        # make the model for the presenter a PropCutting instead of a
        # Propagation
        self.propagation = self.model
        if not self.propagation._cutting:
            self.propagation._cutting = PropCutting()
        self.model = self.model._cutting

        init_combo = self.view.init_translatable_combo
        init_combo("cutting_type_combo", cutting_type_values, editor.UnicodeOrNoneValidator())
        init_combo("cutting_length_unit_combo", length_unit_values)
        init_combo("cutting_tip_combo", tip_values)
        init_combo("cutting_leaves_combo", leaves_values)
        init_combo("cutting_buds_combo", flower_buds_values)
        init_combo("cutting_wound_combo", wound_values)
        init_combo("cutting_heat_unit_combo", bottom_heat_unit_values)

        widgets = self.view.widgets

        distinct = lambda c: utils.get_distinct_values(c, self.session)
        utils.setup_text_combobox(widgets.cutting_hormone_comboentry, distinct(PropCutting.hormone))
        utils.setup_text_combobox(widgets.cutting_cover_comboentry, distinct(PropCutting.cover))
        utils.setup_text_combobox(widgets.cutting_fungal_comboentry, distinct(PropCutting.fungicide))
        utils.setup_text_combobox(widgets.cutting_location_comboentry, distinct(PropCutting.location))
        utils.setup_text_combobox(widgets.cutting_container_comboentry, distinct(PropCutting.container))
        utils.setup_text_combobox(widgets.cutting_media_comboentry, distinct(PropCutting.media))

        # set default units
        units = prefs.prefs[prefs.units_pref]
        if units == u"imperial":
            self.model.length_unit = u"in"
            self.model.bottom_heat_unit = u"F"
        else:
            self.model.length_unit = u"mm"
            self.model.bottom_heat_unit = u"C"

        self.refresh_view()

        self.assign_simple_handler("cutting_type_combo", "cutting_type")
        self.assign_simple_handler("cutting_length_entry", "length")
        self.assign_simple_handler("cutting_length_unit_combo", "length_unit")
        self.assign_simple_handler("cutting_tip_combo", "tip")
        self.assign_simple_handler("cutting_leaves_combo", "leaves")
        self.assign_simple_handler("cutting_lvs_reduced_entry", "leaves_reduced_pct")

        self.assign_simple_handler("cutting_media_comboentry", "media", editor.UnicodeOrNoneValidator())
        self.assign_simple_handler("cutting_container_comboentry", "container", editor.UnicodeOrNoneValidator())

        self.assign_simple_handler("cutting_buds_combo", "flower_buds")
        self.assign_simple_handler("cutting_wound_combo", "wound")
        self.assign_simple_handler("cutting_fungal_comboentry", "fungicide", editor.UnicodeOrNoneValidator())
        self.assign_simple_handler("cutting_hormone_comboentry", "hormone", editor.UnicodeOrNoneValidator())
        self.assign_simple_handler("cutting_location_comboentry", "location", editor.UnicodeOrNoneValidator())
        self.assign_simple_handler("cutting_cover_comboentry", "cover", editor.UnicodeOrNoneValidator())
        self.assign_simple_handler("cutting_heat_entry", "bottom_heat_temp")
        self.assign_simple_handler("cutting_heat_unit_combo", "bottom_heat_unit")
        self.assign_simple_handler("cutting_rooted_pct_entry", "rooted_pct")

        model = gtk.ListStore(object)
        self.view.widgets.rooted_treeview.set_model(model)

        def _rooted_data_func(column, cell, model, treeiter, prop):
            v = model[treeiter][0]
            cell.set_property("text", getattr(v, prop))

        cell = self.view.widgets.rooted_date_cell
        cell.props.editable = True
        self.view.connect(cell, "edited", self.on_rooted_cell_edited, "date")
        self.view.widgets.rooted_date_column.set_cell_data_func(cell, _rooted_data_func, "date")

        cell = self.view.widgets.rooted_quantity_cell
        cell.props.editable = True
        self.view.connect(cell, "edited", self.on_rooted_cell_edited, "quantity")
        self.view.widgets.rooted_quantity_column.set_cell_data_func(cell, _rooted_data_func, "quantity")

        self.view.connect("rooted_add_button", "clicked", self.on_rooted_add_clicked)
        self.view.connect("rooted_remove_button", "clicked", self.on_rooted_remove_clicked)
        def __init__(self, presenter, model=None):
            super(NotesPresenter.NoteBox, self).__init__()

            # open the glade file and extract the markup that the
            # expander will use
            filename = os.path.join(paths.lib_dir(), 'notes.glade')
            xml = etree.parse(filename)
            el = xml.find("//object[@id='notes_box']")
            builder = gtk.Builder()
            s = '<interface>%s</interface>' % etree.tostring(el)
            if sys.platform == 'win32':
                # NOTE: PyGTK for Win32 is broken so we have to include
                # this little hack
                #
                # TODO: is this only a specific set of version of
                # PyGTK/GTK...it was only tested with PyGTK 2.12
                builder.add_from_string(s, -1)
            else:
                builder.add_from_string(s)
            self.widgets = utils.BuilderWidgets(builder)

            notes_box = self.widgets.notes_box
            self.widgets.remove_parent(notes_box)
            self.pack_start(notes_box, expand=True, fill=True)

            self.session = object_session(presenter.model)
            self.presenter = presenter
            if model:
                self.model = model
            else:
                self.model = presenter.note_cls()

            self.widgets.notes_expander.props.use_markup = True
            self.widgets.notes_expander.props.label = ''
            self.widgets.notes_expander.props.label_widget.\
                ellipsize = pango.ELLIPSIZE_END

            # set the model values on the widgets
            mapper = object_mapper(self.model)
            values = utils.get_distinct_values(mapper.c['category'],
                                               self.session)
            utils.setup_text_combobox(self.widgets.category_comboentry, values)
            utils.set_widget_value(self.widgets.category_comboentry,
                                   self.model.category or '')
            utils.setup_date_button(None, self.widgets.date_entry,
                                    self.widgets.date_button)
            date_str = utils.today_str()
            if self.model.date:
                format = prefs.prefs[prefs.date_format_pref]
                date_str = self.model.date.strftime(format)
            utils.set_widget_value(self.widgets.date_entry, date_str)
            utils.set_widget_value(self.widgets.user_entry,
                                   self.model.user or '')
            buff = gtk.TextBuffer()
            self.widgets.note_textview.set_buffer(buff)
            utils.set_widget_value(self.widgets.note_textview,
                                   self.model.note or '')

            # connect the signal handlers
            self.widgets.date_entry.connect('changed',
                                            self.on_date_entry_changed)
            self.widgets.user_entry.connect('changed',
                                            self.on_user_entry_changed)
            # connect category comboentry widget and child entry
            self.widgets.category_comboentry.connect('changed',
                                             self.on_category_combo_changed)
            self.widgets.category_comboentry.child.connect('changed',
                                             self.on_category_entry_changed)
            buff.connect('changed', self.on_note_buffer_changed)
            self.widgets.notes_remove_button.connect('clicked',
                                             self.on_notes_remove_button)

            self.update_label()
            self.show_all()