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_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)
Exemple #5
0
    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))
Exemple #7
0
    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()
Exemple #9
0
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)
Exemple #11
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)
Exemple #12
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 __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
Exemple #16
0
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
Exemple #17
0
    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)
Exemple #18
0
    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()
Exemple #19
0
    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()