def test_cutting_editor(self): loc = Location(name=u'name', code=u'code') plant = Plant(accession=self.accession, location=loc, code=u'1', quantity=1) propagation = Propagation() plant.propagations.append(propagation) self.editor = PropagationEditor(model=propagation) widgets = self.editor.presenter.view.widgets view = self.editor.presenter.view view.set_widget_value('prop_type_combo', u'UnrootedCutting') view.set_widget_value('prop_date_entry', utils.today_str()) cutting_presenter = self.editor.presenter._cutting_presenter for widget, attr in cutting_presenter.widget_to_field_map.iteritems(): #debug('%s=%s' % (widget, default_cutting_values[attr])) view.set_widget_value(widget, default_cutting_values[attr]) update_gui() self.editor.handle_response(gtk.RESPONSE_OK) self.editor.commit_changes() model = self.editor.model s = object_session(model) s.expire(model) self.assert_(model.prop_type == u'UnrootedCutting') for attr, value in default_cutting_values.iteritems(): v = getattr(model._cutting, attr) self.assert_(v==value, '%s = %s(%s)' % (attr, value, v)) self.editor.session.close()
def on_rooted_add_clicked(self, button, *args): """ """ tree = self.view.widgets.rooted_treeview model = tree.get_model() rooted = PropRooted() rooted.cutting = self.model rooted.date = utils.today_str() treeiter = model.insert(0, [rooted]) path = model.get_path(treeiter) column = tree.get_column(0) tree.set_cursor(path, column, start_editing=True)
def test_accession_source_editor(self, accession=None): acc = self.create(Accession, species=self.species, code=u'parent') plant = self.create(Plant, accession=acc, quantity=1, location=Location(name=u'site', code=u'STE'), code=u'1') # creating a dummy propagtion without a related seed/cutting prop = self.create(Propagation, prop_type='Seed') plant.propagations.append(prop) self.session.commit() plant_prop_id = prop.id assert plant_prop_id # assert we got a valid id after the commit acc = Accession(code=u'code', species=self.species) self.editor = AccessionEditor(acc) # normally called by editor.presenter.start() but we don't call it here self.editor.presenter.source_presenter.start() widgets = self.editor.presenter.view.widgets update_gui() # set the date so the presenter will be "dirty" widgets.acc_date_recvd_entry.props.text = utils.today_str() # set the source type as "Garden Propagation" widgets.acc_source_comboentry.child.props.text = \ SourcePresenter.garden_prop_str assert not self.editor.presenter.problems # set the source plant widgets.source_prop_plant_entry.props.text = str(plant) update_gui() comp = widgets.source_prop_plant_entry.get_completion() comp.emit('match-selected', comp.get_model(), comp.get_model().get_iter_first()) # assert that the propagations were added to the treevide treeview = widgets.source_prop_treeview assert treeview.get_model() # select the first/only propagation in the treeview toggle_cell = widgets.prop_toggle_cell.emit('toggled', 0) # commit the changes and cleanup import gtk self.editor.handle_response(gtk.RESPONSE_OK) self.editor.session.close() # open a seperate session and make sure everything committed session = db.Session() acc = session.query(Accession).filter_by(code=u'code')[0] parent = session.query(Accession).filter_by(code=u'parent')[0] assert acc.source.plant_propagation_id == plant_prop_id
def __init__(self, model, view): ''' :param model: an instance of class Propagation :param view: an instance of PropagationEditorView ''' super(PropagationPresenter, self).__init__(model, view) self.session = object_session(model) # initialize the propagation type combo and set the initial value self.view.connect('prop_type_combo', 'changed', self.on_prop_type_changed) if self.model.prop_type: self.view.widget_set_value('prop_type_combo', self.model.prop_type) self._cutting_presenter = CuttingPresenter(self, self.model, self.view, self.session) self._seed_presenter = SeedPresenter(self, self.model, self.view, self.session) if not self.model.prop_type: view.widgets.prop_details_box.props.visible = False if self.model.date: format = prefs.prefs[prefs.date_format_pref] date = self.model.date.strftime(format) self.view.widget_set_value(self.view.widgets.prop_date_entry, date) else: self.view.widget_set_value(self.view.widgets.prop_date_entry, utils.today_str()) self.view.widget_set_value(self.view.widgets.notes_textview, self.model.notes) self._dirty = False utils.setup_date_button(self.view, 'prop_date_entry', 'prop_date_button') self.assign_simple_handler('prop_date_entry', 'date', editor.DateValidator()) self.assign_simple_handler('notes_textview', 'notes', editor.UnicodeOrNoneValidator()) def on_expanded(*args): if self.model.prop_type == u'Other': # i don't really understand why setting the expanded # property to false here cause the notes_expander to # always stay expanded but it works self.view.widgets.notes_expander.props.expanded = False self.view.connect('notes_expander', 'activate', on_expanded)
def __init__(self, model, view): ''' :param model: an instance of class Propagation :param view: an instance of PropagationEditorView ''' super(PropagationPresenter, self).__init__(model, view) self.session = object_session(model) # initialize the propagation type combo and set the initial value self.view.connect('prop_type_combo', 'changed', self.on_prop_type_changed) if self.model.prop_type: self.view.set_widget_value('prop_type_combo', self.model.prop_type) self._cutting_presenter = CuttingPresenter(self, self.model, self.view, self.session) self._seed_presenter = SeedPresenter(self, self.model, self.view, self.session) if not self.model.prop_type: view.widgets.prop_details_box.props.visible = False if self.model.date: format = prefs.prefs[prefs.date_format_pref] date = self.model.date.strftime(format) self.view.set_widget_value(self.view.widgets.prop_date_entry, date) else: self.view.set_widget_value(self.view.widgets.prop_date_entry, utils.today_str()) self.view.set_widget_value(self.view.widgets.notes_textview, self.model.notes) self._dirty = False utils.setup_date_button(self.view, 'prop_date_entry', 'prop_date_button') self.assign_simple_handler('prop_date_entry', 'date', editor.DateValidator()) self.assign_simple_handler('notes_textview', 'notes', editor.UnicodeOrNoneValidator()) def on_expanded(*args): if self.model.prop_type == u'Other': # i don't really understand why setting the expanded # property to false here cause the notes_expander to # always stay expanded but it works self.view.widgets.notes_expander.props.expanded = False self.view.connect('notes_expander', 'activate', on_expanded)
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()