From 5f645ab6ae26b456f5b11b9e764da7e9c5367f1d Mon Sep 17 00:00:00 2001 From: Brandon King Date: Mon, 13 Jul 2009 23:37:10 +0000 Subject: [PATCH] Prototype of bcmagic search plugin. * Works for inventory item object. --- htsworkflow/frontend/bcmagic/plugin.py | 18 +++++++++++++- htsworkflow/frontend/bcmagic/views.py | 29 ++++++++++++++++++++++- htsworkflow/frontend/inventory/bcmagic.py | 26 ++++++++++++++++++++ htsworkflow/frontend/inventory/models.py | 3 +++ htsworkflow/frontend/inventory/views.py | 4 ++++ 5 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 htsworkflow/frontend/inventory/bcmagic.py diff --git a/htsworkflow/frontend/bcmagic/plugin.py b/htsworkflow/frontend/bcmagic/plugin.py index 6653fd9..d701cf3 100644 --- a/htsworkflow/frontend/bcmagic/plugin.py +++ b/htsworkflow/frontend/bcmagic/plugin.py @@ -2,6 +2,7 @@ #BCM_PLUGINS = {'cmd_move_sample': bcm_cmds.cmd_move_sample} +_SEARCH_FUNCTIONS = {} def bcm_plugin_processor(keyword, text, bcm_mode): """ @@ -15,4 +16,19 @@ def bcm_plugin_processor(keyword, text, bcm_mode): d['status'] = 'bcm_mode plugin called "%s" was not found' % (bcm_mode) return d - return BCM_PLUGINS[bcm_mode](keyword, text, bcm_mode) \ No newline at end of file + return BCM_PLUGINS[bcm_mode](keyword, text, bcm_mode) + + +def register_search_plugin(label, search_function): + """ + Registers a group label and search_function + + search_function(search_string) --> (text_display, obj_url) + """ + + if label in _SEARCH_FUNCTIONS: + msg = "search function for label (%s) already registered." % (label) + raise ValueError, msg + + _SEARCH_FUNCTIONS[label] = search_function + \ No newline at end of file diff --git a/htsworkflow/frontend/bcmagic/views.py b/htsworkflow/frontend/bcmagic/views.py index 9d145b6..f9fb793 100644 --- a/htsworkflow/frontend/bcmagic/views.py +++ b/htsworkflow/frontend/bcmagic/views.py @@ -6,6 +6,7 @@ from django.core.exceptions import ObjectDoesNotExist from htsworkflow.frontend.bcmagic import models from htsworkflow.frontend.bcmagic.utils import report_error, redirect_to_url from htsworkflow.frontend.bcmagic.plugin import bcm_plugin_processor +from htsworkflow.frontend.bcmagic import plugin #from htsworkflow.util.jsonutil import encode_json try: @@ -27,6 +28,31 @@ def index(request): context_instance=RequestContext(request)) +def __plugin_search(text): + """ + Runs registered plugins to search for results + """ + + hits = [] + for label, search_func in plugin._SEARCH_FUNCTIONS.items(): + result = search_func(text) + if result is not None: + hits.extend(result) + + n = len(hits) + if n == 0: + msg = 'No hits found for: %s' % (text) + return report_error(msg) + elif n == 1: + return redirect_to_url(hits[0][1]) + else: + msg = "%d hits found for (%s); multi-hit not implemented yet." % (n, text) + return report_error(msg) + + + #return json.dumps(hits) + + def __magic_process(text): """ Based on scanned text, check to see if there is map object to use @@ -37,7 +63,8 @@ def __magic_process(text): # There should always be at least one | in a valid scan. if len(split_text) <= 1: - return report_error('Invalid text: %s' % (text)) + #return report_error('Invalid text: %s' % (text)) + return __plugin_search(text) # Keyword is the first element in the list keyword = split_text[0] diff --git a/htsworkflow/frontend/inventory/bcmagic.py b/htsworkflow/frontend/inventory/bcmagic.py new file mode 100644 index 0000000..9d275c1 --- /dev/null +++ b/htsworkflow/frontend/inventory/bcmagic.py @@ -0,0 +1,26 @@ +from htsworkflow.frontend.inventory.models import Item + +from django.core.exceptions import ObjectDoesNotExist + +def item_search(search): + """ + Searches + """ + hits = [] + try: + item = Item.objects.get(uuid=search) + except ObjectDoesNotExist: + item = None + + if item is not None: + hits.append((str(item), item.get_absolute_url())) + + try: + item = Item.objects.get(barcode_id=search) + except ObjectDoesNotExist: + item = None + + if item is not None: + hits.append((str(item), item.get_absolute_url())) + + return hits diff --git a/htsworkflow/frontend/inventory/models.py b/htsworkflow/frontend/inventory/models.py index 456db7c..444d3c5 100644 --- a/htsworkflow/frontend/inventory/models.py +++ b/htsworkflow/frontend/inventory/models.py @@ -123,6 +123,9 @@ class Item(models.Model): else: return u"invb|%s" % (self.barcode_id) + def get_absolute_url(self): + return '/inventory/%s/' % (self.uuid) + pre_save.connect(_assign_uuid, sender=Item) diff --git a/htsworkflow/frontend/inventory/views.py b/htsworkflow/frontend/inventory/views.py index 65040a1..027c4aa 100644 --- a/htsworkflow/frontend/inventory/views.py +++ b/htsworkflow/frontend/inventory/views.py @@ -1,4 +1,6 @@ from htsworkflow.frontend.inventory.models import Item, LongTermStorage +from htsworkflow.frontend.inventory.bcmagic import item_search +from htsworkflow.frontend.bcmagic.plugin import register_search_plugin from htsworkflow.frontend.experiments.models import FlowCell from htsworkflow.frontend.bcmagic.forms import BarcodeMagicForm from htsworkflow.frontend.bcprinter.util import print_zpl_socket @@ -12,6 +14,8 @@ from django.template import RequestContext from django.template.loader import get_template from django.contrib.auth.decorators import login_required +register_search_plugin('Inventory Item', item_search) + try: import json except ImportError, e: -- 2.30.2