def test_get_default(self): """ Test bauble.meta.get_default() """ # test the object isn't created if it doesn't exist and we # don't pass a default value name = u'name' obj = meta.get_default(name) self.assert_(obj is None) # test that the obj is created if it doesn't exists and that # the default value is set value = u'value' meta.get_default(name, default=value) obj = self.session.query(meta.BaubleMeta).filter_by(name=name).one() self.assert_(obj.value == value) # test that the value isn't changed if it already exists value2 = u'value2' obj = meta.get_default(name, default=value2) self.assert_(obj.value == value) # test that if we pass our own session when we are creating a # new value that the object is added to the session but not committed obj = meta.get_default(u'name2', default=value, session=self.session) self.assert_(obj in self.session.new)
def test_update_meta(self): """ Test bauble.plugins.picasa.update_meta() function. """ email = u'email' album = u'album' token = u'token' picasa.update_meta(email=u'email', album=u'album', token=u'token') self.assert_(email==meta.get_default(picasa.PICASA_EMAIL_KEY).value) self.assert_(album==meta.get_default(picasa.PICASA_ALBUM_KEY).value) self.assert_(token==meta.get_default(picasa.PICASA_TOKEN_KEY).value) album2 = u'album2' picasa.update_meta(album=album2) self.assert_(album2==meta.get_default(picasa.PICASA_ALBUM_KEY).value)
def update(self, row): """ Update the Picasa info page. :param: a Species instance """ self._current_row = row token_meta = meta.get_default(utils.utf8(PICASA_TOKEN_KEY)) if not token_meta: msg = _('Could not login to PicasaWeb account.') self.on_error(msg, species=row) return token = token_meta.value self.gd_client.SetClientLoginToken(token) tag = Species.str(row, markup=False, authors=False) self.set_busy() worker = populate_iconview(self.gd_client, self.iconview, tag) def on_done(*args): if not _exc_queue.empty(): exc = _exc_queue.get() msg = 'Could not retrieve the photos.\n\n' if isinstance(exc, gdata.photos.service.GooglePhotosException): msg += exc.message else: msg += str(exc) gobject.idle_add(self.on_error, msg, row) return self.set_busy(False) model = self.iconview.get_model() if len(model) == 0: gobject.idle_add(self.status_box.set_text, _('No images')) gobject.idle_add(self.show_status_box) else: gobject.idle_add(self.hide_status_box) worker.connect('done', on_done, False)
def test_update_meta(self): """ Test bauble.plugins.picasa.update_meta() function. """ email = u'email' album = u'album' token = u'token' picasa.update_meta(email=u'email', album=u'album', token=u'token') self.assert_(email == meta.get_default(picasa.PICASA_EMAIL_KEY).value) self.assert_(album == meta.get_default(picasa.PICASA_ALBUM_KEY).value) self.assert_(token == meta.get_default(picasa.PICASA_TOKEN_KEY).value) album2 = u'album2' picasa.update_meta(album=album2) self.assert_(album2 == meta.get_default(picasa.PICASA_ALBUM_KEY).value)
def run(self): """ """ response = self.window.run() self.window.hide() if response != gtk.RESPONSE_OK: return response stored_email = meta.get_default(PICASA_EMAIL_KEY).value.strip() email = self.widgets.email_entry.get_text().strip() album = self.widgets.album_entry.get_text().strip() passwd = self.widgets.password_entry.get_text().strip() if stored_email != email or self._changed: try: token = get_auth_token(email, passwd) except Exception, e: debug(e) token = None if not token: utils.message_dialog(_('Could not authorize Google '\ 'account: %s' % email), gtk.MESSAGE_ERROR) return False update_meta(utils.utf8(email), utils.utf8(album), utils.utf8(token))
def run(self): """ """ response = self.window.run() self.window.hide() if response != gtk.RESPONSE_OK: return response stored_email = meta.get_default(PICASA_EMAIL_KEY).value.strip() email = self.widgets.email_entry.get_text().strip() album = self.widgets.album_entry.get_text().strip() passwd = self.widgets.password_entry.get_text().strip() if stored_email != email or self._changed: try: token = get_auth_token(email, passwd) except Exception, e: logger.debug(e) token = None if not token: utils.message_dialog( _('Could not authorize Google ' 'account: %s' % email), gtk.MESSAGE_ERROR) return False update_meta(utils.utf8(email), utils.utf8(album), utils.utf8(token))
def update_meta(email=None, album=None, token=None): """ Update the email, album and authorization token in the bauble meta table. """ # TODO: should we allow setting the values to None session = db.Session() if email: email = utils.utf8(email) meta.get_default(PICASA_EMAIL_KEY, email, session).value = email if album: album = utils.utf8(album) meta.get_default(PICASA_ALBUM_KEY, album, session).value = album if token: token = utils.utf8(token) meta.get_default(PICASA_TOKEN_KEY, token, session).value = token session.commit() session.close() __feed_cache.clear()
def itest_get_photo_feed(self): """ Interactively test picasa.get_photo_feed() """ if self._get_settings() != gtk.RESPONSE_OK: return email = meta.get_default(picasa.PICASA_EMAIL_KEY).value album = meta.get_default(picasa.PICASA_ALBUM_KEY).value token = meta.get_default(picasa.PICASA_TOKEN_KEY).value picasa.update_meta(email, album, utils.utf8(token)) import gdata.photos.service gd_client = gdata.photos.service.PhotosService() gd_client.SetClientLoginToken(token) # this tag is specific to the Plant album on brettatoms account tag = 'Maxillaria variabilis' feed = picasa.get_photo_feed(gd_client, email, album, tag) self.assert_(len(feed.entry) > 0)
def test_get_photo_feed(self): """ Interactively test picasa.get_photo_feed() """ raise SkipTest('Not Implemented') if self._get_settings() != gtk.RESPONSE_OK: return email = meta.get_default(picasa.PICASA_EMAIL_KEY).value album = meta.get_default(picasa.PICASA_ALBUM_KEY).value token = meta.get_default(picasa.PICASA_TOKEN_KEY).value picasa.update_meta(email, album, utils.utf8(token)) import gdata.photos.service gd_client = gdata.photos.service.PhotosService() gd_client.SetClientLoginToken(token) # this tag is specific to the Plant album on brettatoms account tag = 'Maxillaria variabilis' feed = picasa.get_photo_feed(gd_client, email, album, tag) self.assert_(len(feed.entry) > 0)
def __init__(self): widget_path = os.path.join(paths.lib_dir(), 'plugins', 'picasa', 'gui.glade') self.widgets = utils.load_widgets(widget_path) self.window = self.widgets.settings_dialog if bauble.gui: self.window.set_transient_for(bauble.gui.window) self.widgets.password_entry.connect('changed', self.on_changed) email = meta.get_default(PICASA_EMAIL_KEY, '').value self.widgets.email_entry.set_text(email or '') album = meta.get_default(PICASA_ALBUM_KEY, '').value self.widgets.album_entry.set_text(album or '') auth = meta.get_default(PICASA_TOKEN_KEY, '').value if auth: self.widgets.password_entry.set_text('blahblah') self._changed = False
def get_delimiter(cls, refresh=False): """ Get the plant delimiter from the BaubleMeta table. The delimiter is cached the first time it is retrieved. To refresh the delimiter from the database call with refresh=True. """ if cls._delimiter is None or refresh: cls._delimiter = meta.get_default(plant_delimiter_key, default_plant_delimiter).value return cls._delimiter
def _get_feed_worker(worker, gd_client, tag): """ Get the feed and then start new threads to get each one of the images. """ # TODO: we should have to get the feed if its already been fetched # this session, maybe we need some sort of in memory database of # feeds that have been fetched email = meta.get_default(PICASA_EMAIL_KEY).value album = meta.get_default(PICASA_ALBUM_KEY).value if tag in __feed_cache: feed = __feed_cache[tag] else: try: feed = get_photo_feed(gd_client, email, album, tag) except Exception, e: worker.canceled = True _exc_queue.put(e) return __feed_cache[tag] = feed
def _get_feed_worker(worker, gd_client, tag): """ Get the feed and then start new threads to get each one of the images. """ # TODO: we should have to get the feed if it's already been fetched # in this session, maybe we need some sort of in memory database of # feeds that have been fetched email = meta.get_default(PICASA_EMAIL_KEY).value album = meta.get_default(PICASA_ALBUM_KEY).value if tag in __feed_cache: feed = __feed_cache[tag] else: try: feed = get_photo_feed(gd_client, email, album, tag) except Exception, e: worker.canceled = True _exc_queue.put(e) return __feed_cache[tag] = feed
def init(cls): from bauble.plugins.plants import Species mapper_search = search.get_strategy('MapperSearch') from functools import partial mapper_search.add_meta(('accession', 'acc'), Accession, ['code']) SearchView.row_meta[Accession].set( children=partial(db.natsort, "plants"), infobox=AccessionInfoBox, context_menu=acc_context_menu) mapper_search.add_meta(('location', 'loc'), Location, ['name', 'code']) SearchView.row_meta[Location].set( children=partial(db.natsort, 'plants'), infobox=LocationInfoBox, context_menu=loc_context_menu) mapper_search.add_meta(('plant', 'plants'), Plant, ['code']) search.add_strategy(PlantSearch) # special search value strategy #search.add_strategy(SpeciesSearch) # special search value strategy SearchView.row_meta[Plant].set( infobox=PlantInfoBox, context_menu=plant_context_menu) mapper_search.add_meta(('contact', 'contacts', 'person', 'org', 'source'), SourceDetail, ['name']) def sd_kids(detail): session = object_session(detail) results = session.query(Accession).join(Source).\ join(SourceDetail).options(eagerload('species')).\ filter(SourceDetail.id == detail.id).all() return results SearchView.row_meta[SourceDetail].set( children=sd_kids, infobox=SourceDetailInfoBox, context_menu=source_detail_context_menu) mapper_search.add_meta(('collection', 'col', 'coll'), Collection, ['locale']) coll_kids = lambda coll: sorted(coll.source.accession.plants, key=utils.natsort_key) SearchView.row_meta[Collection].set( children=coll_kids, infobox=AccessionInfoBox, context_menu=collection_context_menu) # done here b/c the Species table is not part of this plugin SearchView.row_meta[Species].child = "accessions" if bauble.gui is not None: bauble.gui.add_to_insert_menu(AccessionEditor, _('Accession')) bauble.gui.add_to_insert_menu(PlantEditor, _('Plant')) bauble.gui.add_to_insert_menu(LocationEditor, _('Location')) bauble.gui.add_to_insert_menu(SourceDetailEditor, _('Contact')) # if the plant delimiter isn't in the bauble meta then add the default import bauble.meta as meta meta.get_default(plant_delimiter_key, default_plant_delimiter) institution = Institution() if not institution.name: start_institution_editor()
def init(cls): from bauble.plugins.plants import Species mapper_search = search.get_strategy('MapperSearch') from functools import partial mapper_search.add_meta(('accession', 'acc'), Accession, ['code']) SearchView.row_meta[Accession].set(children=partial( db.natsort, "plants"), infobox=AccessionInfoBox, context_menu=acc_context_menu) mapper_search.add_meta(('location', 'loc'), Location, ['name', 'code']) SearchView.row_meta[Location].set(children=partial( db.natsort, 'plants'), infobox=LocationInfoBox, context_menu=loc_context_menu) mapper_search.add_meta(('plant', 'plants'), Plant, ['code']) search.add_strategy(PlantSearch) # special search value strategy #search.add_strategy(SpeciesSearch) # special search value strategy SearchView.row_meta[Plant].set(infobox=PlantInfoBox, context_menu=plant_context_menu) mapper_search.add_meta( ('contact', 'contacts', 'person', 'org', 'source'), SourceDetail, ['name']) def sd_kids(detail): session = object_session(detail) results = session.query(Accession).join(Source).\ join(SourceDetail).options(eagerload('species')).\ filter(SourceDetail.id == detail.id).all() return results SearchView.row_meta[SourceDetail].set( children=sd_kids, infobox=SourceDetailInfoBox, context_menu=source_detail_context_menu) mapper_search.add_meta(('collection', 'col', 'coll'), Collection, ['locale']) coll_kids = lambda coll: sorted(coll.source.accession.plants, key=utils.natsort_key) SearchView.row_meta[Collection].set( children=coll_kids, infobox=AccessionInfoBox, context_menu=collection_context_menu) # done here b/c the Species table is not part of this plugin SearchView.row_meta[Species].child = "accessions" if bauble.gui is not None: bauble.gui.add_to_insert_menu(AccessionEditor, _('Accession')) bauble.gui.add_to_insert_menu(PlantEditor, _('Plant')) bauble.gui.add_to_insert_menu(LocationEditor, _('Location')) #bauble.gui.add_to_insert_menu(ContactEditor, _('Contact')) # if the plant delimiter isn't in the bauble meta then add the default import bauble.meta as meta meta.get_default(plant_delimiter_key, default_plant_delimiter) institution = Institution() if not institution.name: start_institution_editor()