Source code for stoqlib.gui.dialogs.pluginsdialog

# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4

##
## Copyright (C) 2009-2011 Async Open Source <http://www.async.com.br>
## All rights reserved
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU Lesser General Public License for more details.
##
## You should have received a copy of the GNU Lesser General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., or visit: http://www.gnu.org/.
##
## Author(s): Stoq Team <stoq-devel@async.com.br>
##
##
""" Dialogs for payment method management"""

import gtk
from kiwi.ui.objectlist import ObjectList, Column

from stoqlib.api import api
from stoqlib.database.runtime import get_default_store, new_store
from stoqlib.gui.base.dialogs import BasicDialog, run_dialog
from stoqlib.gui.stockicons import STOQ_PLUGIN
from stoqlib.lib.translation import stoqlib_gettext
from stoqlib.lib.message import yesno, info
from stoqlib.lib.pluginmanager import get_plugin_manager

_ = stoqlib_gettext


class _PluginModel(object):
    """Temporary model for plugin objects. This model is a minimal
    representation of the plugin information.

    :attribute name: The plugin name.
    :attribute is_active: True if the plugin is installed, False otherwise.
    """

    def __init__(self, plugin_name, is_active, desc):
        self.name = plugin_name
        self.is_active = is_active
        self.desc = desc
        self.icon = STOQ_PLUGIN

    def can_activate(self):
        return not self.is_active

    @property
    def description(self):
        return '<b>%s</b>\n%s' % (api.escape(self.desc.long_name),
                                  self.desc.description)


[docs]class PluginManagerDialog(BasicDialog): size = (500, 350) title = _(u'Plugin Manager') help_section = 'plugin' def __init__(self, store): header = _(u'Select the plugin you want to activate and click in ' 'the apply button.') BasicDialog.__init__(self, hide_footer=False, size=PluginManagerDialog.size, title=PluginManagerDialog.title, header_text=header) self.store = store self._manager = get_plugin_manager() self._setup_widgets() def _update_widgets(self): selected = self.klist.get_selected() assert selected self.ok_button.set_sensitive(selected.can_activate()) def _setup_widgets(self): self.set_ok_label(_(u'Activate'), gtk.STOCK_APPLY) self.ok_button.set_sensitive(False) plugins = [] for name in sorted(self._manager.available_plugins_names): desc = self._manager.get_description_by_name(name) plugins.append(_PluginModel(name, name in self._manager.installed_plugins_names, desc)) self.klist = ObjectList(self._get_columns(), plugins, gtk.SELECTION_BROWSE) self.klist.set_headers_visible(False) self.klist.connect("selection-changed", self._on_klist__selection_changed) self.main.remove(self.main.get_child()) self.main.add(self.klist) self.klist.show() def _get_columns(self): return [Column('is_active', title=_('Active'), width=20, data_type=bool), Column('icon', data_type=str, width=24, use_stock=True, icon_size=gtk.ICON_SIZE_BUTTON), Column('description', data_type=str, expand=True, use_markup=True)] def _enable_plugin(self, plugin_model): plugin_name = plugin_model.name # This should not really be necessary, but there may be deadlocks when # activating the plugin. See bug 5272 default_store = get_default_store() default_store.commit() with new_store() as store: self._manager.install_plugin(store, plugin_name) self._manager.activate_plugin(plugin_name) info(_("The plugin %s was successfully activated. Please, restart all " "Stoq instances connected to this installation.") % (plugin_name, )) # # BasicDialog #
[docs] def confirm(self): msg = _("Are you sure you want activate this plugin?\n" "Please note that, once activated you will not " "be able to disable it.") response = yesno(msg, gtk.RESPONSE_NO, _("Activate plugin"), _("Not now")) if response: self._enable_plugin(self.klist.get_selected()) self.close()
# # Callbacks # def _on_klist__selection_changed(self, list, data): self._update_widgets()
if __name__ == '__main__': # pragma nocover ec = api.prepare_test() run_dialog(PluginManagerDialog, None, ec.store)