Skip to content

Commit

Permalink
Embedders widget - field for a custom server URL
Browse files Browse the repository at this point in the history
  • Loading branch information
PrimozGodec committed Sep 18, 2018
1 parent 4114499 commit 255341b
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 11 deletions.
5 changes: 4 additions & 1 deletion orangecontrib/imageanalytics/http2_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ class Http2Client(object):

def __init__(self, server_url):
self._server_url = getenv('ORANGE_EMBEDDING_API_URL', server_url)
self._server_connection = self._connect_to_server()
try:
self._server_connection = self._connect_to_server()
except:
raise ConnectionError
self._max_concurrent_streams = self._read_max_concurrent_streams()

def reconnect_to_server(self):
Expand Down
49 changes: 39 additions & 10 deletions orangecontrib/imageanalytics/widgets/owimageembedding.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
from AnyQt.QtWidgets import QLayout, QPushButton, QStyle

from Orange.data import Table
from Orange.widgets.gui import hBox
from Orange.widgets.gui import hBox, lineEdit, checkBox
from Orange.widgets.gui import widgetBox, widgetLabel, comboBox, auto_commit
from Orange.widgets.settings import Setting
from Orange.widgets.utils import concurrent as qconcurrent
from Orange.widgets.utils.itemmodels import VariableListModel
from Orange.widgets.widget import OWWidget, Default
from Orange.widgets.widget import OWWidget, Default, Msg

from orangecontrib.imageanalytics.image_embedder import ImageEmbedder
from orangecontrib.imageanalytics.image_embedder import MODELS as EMBEDDERS_INFO
Expand Down Expand Up @@ -46,10 +46,21 @@ class OWImageEmbedding(OWWidget):
(_Output.SKIPPED_IMAGES, Table)
]

class Error(OWWidget.Error):
cant_connect = Msg(
"Not connected. Check internet connection or URL.")

class Info(OWWidget.Information):
connected_info = Msg("Connected to server")

cb_image_attr_current_id = Setting(default=0)
cb_embedder_current_id = Setting(default=0)

_NO_DATA_INFO_TEXT = "No data on input."
SERVER_URL_DEFAULT = "api.garaza.io:443"

custom_server = Setting(default=False)
server_url = Setting(default="")

def __init__(self):
super().__init__()
Expand Down Expand Up @@ -105,6 +116,15 @@ def _setup_layout(self):
EMBEDDERS_INFO[current_embedder]['description']
)

advanced_box = widgetBox(self.controlArea, 'Advanced settings')
self.use_custom_server_cb = checkBox(
advanced_box, self, 'custom_server', "User custom server",
callback=self.changed_server_url)
self.server_url_box = lineEdit(
advanced_box, self, 'server_url', label="Server URL: ",
tooltip='The url of the server for calculating image embeddings',
orientation=Qt.Horizontal, callback=self.changed_server_url)

self.auto_commit_widget = auto_commit(
widget=self.controlArea,
master=self,
Expand All @@ -124,11 +144,16 @@ def _setup_layout(self):

def _init_server_connection(self):
self.setBlocking(False)
self._image_embedder = ImageEmbedder(
model=self.embedders[self.cb_embedder_current_id],
layer='penultimate'
)
url = self.server_url if self.custom_server else self.SERVER_URL_DEFAULT
try:
self._image_embedder = ImageEmbedder(
model=self.embedders[self.cb_embedder_current_id],
layer='penultimate', server_url=url
)
except ConnectionError:
self._image_embedder = None
self._set_server_info(
self._image_embedder is not None and
self._image_embedder.is_connected_to_server()
)

Expand Down Expand Up @@ -165,6 +190,10 @@ def set_data(self, data):
def _cb_image_attr_changed(self):
self.commit()

def changed_server_url(self):
self._init_server_connection()
self.server_url_box.setReadOnly(not self.custom_server)

def _cb_embedder_changed(self):
current_embedder = self.embedders[self.cb_embedder_current_id]
self._image_embedder = ImageEmbedder(
Expand Down Expand Up @@ -320,12 +349,12 @@ def _send_output_signals(self, embeddings):
len(self._input_data), num_skipped))

def _set_server_info(self, connected):
self.clear_messages()
self.Error.clear()
self.Info.clear()
if connected:
self.connection_info.setText("Connected to server.")
self.Info.connected_info()
else:
self.connection_info.setText("No connection with server.")
self.warning("Click Apply to try again.")
self.Error.cant_connect()

def onDeleteWidget(self):
self.cancel()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,22 @@ def test_none_data(self):
table = Table("iris")[:0]
self.send_signal("Images", table)
self.send_signal("Images", None)

def test_url_changed(self):
"""
This test set if the urls are changed correctly
The test may fail if default url will be changed
"""
w = self.widget

w.use_custom_server_cb.setChecked(False)
self.assertEqual(w._image_embedder._server_url, w.SERVER_URL_DEFAULT)

w.use_custom_server_cb.setChecked(True)
w.server_url_box.setText("")
w.changed_server_url()

w.use_custom_server_cb.setChecked(True)
w.server_url_box.setText(w.SERVER_URL_DEFAULT)
w.changed_server_url()
self.assertEqual(w._image_embedder._server_url, w.SERVER_URL_DEFAULT)

0 comments on commit 255341b

Please sign in to comment.