def update(self, row): ''' update the expander :param row: the row to get thevalues from ''' syn_box = self.widgets.sp_synonyms_box # remove old labels syn_box.foreach(syn_box.remove) logger.debug(row.synonyms) from sqlalchemy.orm.session import object_session self.session = object_session(row) syn = self.session.query(SpeciesSynonym).filter( SpeciesSynonym.synonym_id == row.id).first() accepted = syn and syn.species logger.debug("species %s is synonym of %s and has synonyms %s" % (row, accepted, row.synonyms)) self.set_label(_("Synonyms")) # reset default value on_label_clicked = lambda l, e, syn: select_in_search_results(syn) if accepted is not None: self.set_label(_("Accepted name")) # create clickable label that will select the synonym # in the search results box = gtk.EventBox() label = gtk.Label() label.set_alignment(0, .5) label.set_markup(Species.str(accepted, markup=True, authors=True)) box.add(label) utils.make_label_clickable(label, on_label_clicked, accepted) syn_box.pack_start(box, expand=False, fill=False) self.show_all() self.set_sensitive(True) self.set_expanded(True) elif len(row.synonyms) == 0: self.set_sensitive(False) self.set_expanded(False) else: # remove all the children syn_box.foreach(syn_box.remove) for syn in row.synonyms: # create clickable label that will select the synonym # in the search results box = gtk.EventBox() label = gtk.Label() label.set_alignment(0, .5) label.set_markup(Species.str(syn, markup=True, authors=True)) box.add(label) utils.make_label_clickable(label, on_label_clicked, syn) syn_box.pack_start(box, expand=False, fill=False) self.show_all() self.set_sensitive(True) # TODO: get expanded state from prefs self.set_expanded(True)
def refresh_fullname_label(self, widget=None): ''' set the value of sp_fullname_label to either '--' if there is a problem or to the name of the string returned by Species.str ''' logger.debug("SpeciesEditorPresenter:refresh_fullname_label %s" % widget) if len(self.problems) > 0 or self.model.genus is None: self.view.set_label('sp_fullname_label', '--') return sp_str = Species.str(self.model, markup=True, authors=True) self.view.set_label('sp_fullname_label', sp_str) if self.model.genus is not None: genus = self.model.genus epithet = self.view.widget_get_value('sp_species_entry') omonym = self.session.query( Species).filter( Species.genus == genus, Species.sp == epithet ).first() logger.debug("looking for %s %s, found %s" % (genus, epithet, omonym)) if omonym in [None, self.model]: ## should not warn, so check warning and remove if self.omonym_box is not None: self.view.remove_box(self.omonym_box) self.omonym_box = None elif self.omonym_box is None: # should warn, but not twice msg = _("This binomial name is already in your collection" ", as %s.\n\n" "Are you sure you want to insert it again?") % \ Species.str(omonym, authors=True) def on_response(button, response): self.view.remove_box(self.omonym_box) self.omonym_box = None if response: logger.warning('yes') else: self.view.widget_set_value('sp_species_entry', '') box = self.omonym_box = ( self.view.add_message_box(utils.MESSAGE_BOX_YESNO)) box.message = msg box.on_response = on_response box.show() self.view.add_box(box)
def on_remove_button_clicked(self, button, data=None): """ removes the currently selected synonym from the list of synonyms for this species """ # TODO: maybe we should only ask 'are you sure' if the selected value # is an instance, this means it will be deleted from the database tree = self.view.widgets.sp_syn_treeview path, col = tree.get_cursor() tree_model = tree.get_model() value = tree_model[tree_model.get_iter(path)][0] s = Species.str(value.synonym, markup=True) msg = ( "Are you sure you want to remove %s as a synonym to the " "current species?\n\n<i>Note: This will not remove the species " "%s from the database.</i>" % (s, s) ) if not utils.yes_no_dialog(msg, parent=self.view.get_window()): return tree_model.remove(tree_model.get_iter(path)) self.model.synonyms.remove(value.synonym) utils.delete_or_expunge(value) # TODO: ** important ** this doesn't respect any unique # contraints on the species for synonyms and allow a # species to have another species as a synonym multiple # times...see below # TODO: using session.flush here with an argument is # deprecated in SA 0.5 and will probably removed in SA # 0.6...but how do we only flush the one value..unless we # create a new session, merge it, commit that session, # close it and then refresh the same object in # self.session # make the change in synonym immediately available so that if # we try to add the same species again we don't break the # SpeciesSynonym UniqueConstraint # tmp_session = db.Session() # tmp_value = tmp.session.merge(value) # tmp.session.commit() # tmp.session.close() # self.session.refresh(value) # self.session.flush([value]) self._dirty = True self.parent_ref().refresh_sensitivity()
def on_remove_button_clicked(self, button, data=None): ''' removes the currently selected synonym from the list of synonyms for this species ''' # TODO: maybe we should only ask 'are you sure' if the selected value # is an instance, this means it will be deleted from the database tree = self.view.widgets.sp_syn_treeview path, col = tree.get_cursor() tree_model = tree.get_model() value = tree_model[tree_model.get_iter(path)][0] s = Species.str(value.synonym, markup=True) msg = 'Are you sure you want to remove %s as a synonym to the ' \ 'current species?\n\n<i>Note: This will not remove the species '\ '%s from the database.</i>' % (s, s) if not utils.yes_no_dialog(msg, parent=self.view.get_window()): return tree_model.remove(tree_model.get_iter(path)) self.model.synonyms.remove(value.synonym) utils.delete_or_expunge(value) # TODO: ** important ** this doesn't respect any unique # contraints on the species for synonyms and allow a # species to have another species as a synonym multiple # times...see below # TODO: using session.flush here with an argument is # deprecated in SA 0.5 and will probably removed in SA # 0.6...but how do we only flush the one value..unless we # create a new session, merge it, commit that session, # close it and then refresh the same object in # self.session # make the change in synonym immediately available so that if # we try to add the same species again we don't break the # SpeciesSynonym UniqueConstraint # tmp_session = db.Session() # tmp_value = tmp.session.merge(value) # tmp.session.commit() # tmp.session.close() # self.session.refresh(value) #self.session.flush([value]) self._dirty = True self.parent_ref().refresh_sensitivity()