From ecac728812e2ff2dd2e962d6932c078740eea9ad Mon Sep 17 00:00:00 2001 From: mart-r Date: Tue, 24 Feb 2026 15:50:04 +0000 Subject: [PATCH 01/38] CU-869c8r073: Remove uploaded text model --- medcat-demo-app/webapp/demo/admin.py | 9 --------- medcat-demo-app/webapp/demo/models.py | 6 ------ 2 files changed, 15 deletions(-) diff --git a/medcat-demo-app/webapp/demo/admin.py b/medcat-demo-app/webapp/demo/admin.py index f936542dc..9b6627b63 100644 --- a/medcat-demo-app/webapp/demo/admin.py +++ b/medcat-demo-app/webapp/demo/admin.py @@ -7,14 +7,6 @@ admin.site.register(Downloader) admin.site.register(MedcatModel) -def remove_text(modeladmin, request, queryset): - UploadedText.objects.all().delete() - - -class UploadedTextAdmin(admin.ModelAdmin): - model = UploadedText - actions = [remove_text] - class APIKeyAdmin(admin.ModelAdmin): list_display = ('key_short', 'identifier', 'created_at', 'expires_at', 'is_active', 'is_expired') @@ -66,5 +58,4 @@ def api_key_link(self, obj: APIKey): # Register your models here. -admin.site.register(UploadedText, UploadedTextAdmin) admin.site.register(APIKey, APIKeyAdmin) diff --git a/medcat-demo-app/webapp/demo/models.py b/medcat-demo-app/webapp/demo/models.py index ee0793291..44a95886c 100644 --- a/medcat-demo-app/webapp/demo/models.py +++ b/medcat-demo-app/webapp/demo/models.py @@ -13,12 +13,6 @@ cooldown_days = 14 -# Create your models here. -class UploadedText(models.Model): - text = models.TextField(default="", blank=True) - create_time = models.DateTimeField(auto_now_add=True) - - class Downloader(models.Model): first_name = models.CharField(max_length=20) last_name = models.CharField(max_length=20) From 96f6b2d5a0d62659c6a9a37b793c0051eb968c35 Mon Sep 17 00:00:00 2001 From: mart-r Date: Tue, 24 Feb 2026 15:52:01 +0000 Subject: [PATCH 02/38] CU-869c8r073: Remove demo parts from views --- medcat-demo-app/webapp/demo/views.py | 106 --------------------------- 1 file changed, 106 deletions(-) diff --git a/medcat-demo-app/webapp/demo/views.py b/medcat-demo-app/webapp/demo/views.py index 5f87cb711..9d436f5b5 100644 --- a/medcat-demo-app/webapp/demo/views.py +++ b/medcat-demo-app/webapp/demo/views.py @@ -27,116 +27,10 @@ TEST_CUI = 'C0000005' # harmless, public CUI for validation CONTENT_API_URL = f'https://uts-ws.nlm.nih.gov/rest/content/current/CUI/{TEST_CUI}' -model_pack_path = os.getenv('MODEL_PACK_PATH', 'models/medmen_wstatus_2021_oct.zip') - - -@lru_cache -def get_model_pack(): - return CAT.load_model_pack(model_pack_path) - - TPL_ENT = """ {text} {label}""" TPL_ENTS = """
{content}
""" -def doc2html(doc): - markup = "" - offset = 0 - text = doc.base.text - - for span in list(doc.linked_ents): - start = span.base.start_char_index - end = span.base.end_char_index - fragments = text[offset:start].split("\n") - - for i, fragment in enumerate(fragments): - markup += html.escape(fragment) - if len(fragments) > 1 and i != len(fragments) - 1: - markup += "
" - ent = {'label': '', 'id': span.id, - 'bg': "rgb(74, 154, 239, {})".format( - span.context_similarity * span.context_similarity + 0.12), - 'text': html.escape(span.base.text) - } - # Add the entity - markup += TPL_ENT.format(**ent) - offset = end - markup += html.escape(text[offset:]) - - out = TPL_ENTS.format(content=markup, dir='ltr') - - return out - - -# NOTE: numpy uses np.float32 and those are not json serialisable -# so we need to fix that -def fix_floats(in_dict: dict) -> dict: - for k, v in in_dict.items(): - if isinstance(v, np.float32): - in_dict[k] = float(v) - elif isinstance(v, dict): - fix_floats(v) - return in_dict - - -def get_html_and_json(text): - cat = get_model_pack() - doc = cat(text) - - a = { - "annotations": fix_floats(cat.get_entities(text)['entities']), - "text": text, - } - for id, ent in a['annotations'].items(): - new_ent = {} - for key in ent.keys(): - if key == 'pretty_name': - new_ent['Pretty Name'] = ent[key] - if key == 'icd10': - icd10 = ent.get('icd10', []) - new_ent['ICD-10 Code'] = icd10[-1] if icd10 else '-' - if key == 'cui': - new_ent['Identifier'] = ent[key] - if key == 'types': - new_ent['Type'] = ", ".join(ent[key]) - if key == 'acc': - new_ent['Confidence Score'] = ent[key] - if key == 'start': - new_ent['Start Index'] = ent[key] - if key == 'end': - new_ent['End Index'] = ent[key] - if key == 'id': - new_ent['id'] = ent[key] - if key == 'meta_anns': - meta_anns = ent.get("meta_anns", {}) - if meta_anns: - for meta_ann in meta_anns.keys(): - new_ent[meta_ann] = meta_anns[meta_ann]['value'] - - a['annotations'][id] = new_ent - - doc_json = json.dumps(a) - uploaded_text = UploadedText() - uploaded_text.text = len(str(text))#str(text) no saving of text anymore - uploaded_text.save() - - return doc2html(doc), doc_json - - -def show_annotations(request): - context = {} - context['doc_json'] = '{"msg": "No documents yet"}' - - if request.POST and 'text' in request.POST: - doc_html, doc_json = get_html_and_json(request.POST['text']) - - context['doc_html'] = doc_html - context['doc_json'] = doc_json - context['text'] = request.POST['text'] - context['medcat_version'] = medcat_version - return render(request, 'train_annotations.html', context=context) - - def validate_umls_user(request): ticket = request.GET.get('ticket', '') validate_url = f'{VALIDATION_BASE_URL}?service={AUTH_CALLBACK_SERVICE}&ticket={ticket}' From 4f01650e179d684e30d7dad1bc51402b629c79b5 Mon Sep 17 00:00:00 2001 From: mart-r Date: Tue, 24 Feb 2026 15:53:24 +0000 Subject: [PATCH 03/38] CU-869c8r073: Cleanup imports --- medcat-demo-app/webapp/demo/views.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/medcat-demo-app/webapp/demo/views.py b/medcat-demo-app/webapp/demo/views.py index 9d436f5b5..99156dcc5 100644 --- a/medcat-demo-app/webapp/demo/views.py +++ b/medcat-demo-app/webapp/demo/views.py @@ -1,22 +1,15 @@ import sys sys.path.insert(0, '/home/ubuntu/projects/MedCAT/') import os -import json -import html import requests from django.shortcuts import render from django.http import StreamingHttpResponse, HttpResponse -import numpy as np from wsgiref.util import FileWrapper -from medcat import __version__ as medcat_version -from medcat.cat import CAT -from urllib.request import urlretrieve, urlopen +from urllib.request import urlopen from urllib.error import HTTPError -#from medcat.meta_cat import MetaCAT from .models import * from .forms import DownloaderForm, UMLSApiKeyForm from .decorators import require_valid_api_key -from functools import lru_cache AUTH_CALLBACK_SERVICE = 'https://medcat.rosalind.kcl.ac.uk/auth-callback' VALIDATION_BASE_URL = 'https://uts-ws.nlm.nih.gov/rest/isValidServiceValidate' @@ -31,6 +24,9 @@ TPL_ENTS = """
{content}
""" +medcat_version = "N/A" + + def validate_umls_user(request): ticket = request.GET.get('ticket', '') validate_url = f'{VALIDATION_BASE_URL}?service={AUTH_CALLBACK_SERVICE}&ticket={ticket}' From d87f9db14dcf789d15cde3ce81ec79d29e79067a Mon Sep 17 00:00:00 2001 From: mart-r Date: Tue, 24 Feb 2026 15:53:48 +0000 Subject: [PATCH 04/38] CU-869c8r073: Remove medcat requirement --- medcat-demo-app/webapp/requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/medcat-demo-app/webapp/requirements.txt b/medcat-demo-app/webapp/requirements.txt index 9cc220d12..05847732a 100644 --- a/medcat-demo-app/webapp/requirements.txt +++ b/medcat-demo-app/webapp/requirements.txt @@ -2,5 +2,4 @@ Django==3.2.25 django-dbbackup==4.0.0b0 django-storages[boto3]==1.12.3 django-cron==0.5.1 -medcat[meta-cat,spacy]~=2.2.0 urllib3==1.26.18 From 38d3f841fddfe884f398e017fe1edd4befa8e1ac Mon Sep 17 00:00:00 2001 From: mart-r Date: Tue, 24 Feb 2026 15:56:19 +0000 Subject: [PATCH 05/38] CU-869c8r073: Remove installation of local medcat --- medcat-demo-app/docker-compose-test.yml | 2 -- medcat-demo-app/webapp/Dockerfile | 7 ------- 2 files changed, 9 deletions(-) diff --git a/medcat-demo-app/docker-compose-test.yml b/medcat-demo-app/docker-compose-test.yml index 6b0882cd0..881d6c525 100644 --- a/medcat-demo-app/docker-compose-test.yml +++ b/medcat-demo-app/docker-compose-test.yml @@ -4,8 +4,6 @@ services: medcatweb: build: context: ./webapp - args: - REINSTALL_CORE_FROM_LOCAL: "true" command: > bash -c " python manage.py migrate --noinput && diff --git a/medcat-demo-app/webapp/Dockerfile b/medcat-demo-app/webapp/Dockerfile index e8c0567b2..f3dacdbf7 100644 --- a/medcat-demo-app/webapp/Dockerfile +++ b/medcat-demo-app/webapp/Dockerfile @@ -26,13 +26,6 @@ RUN pip install -U pip && if [ "$USE_CPU_TORCH" = "true" ]; then \ pip install -r /webapp/requirements.txt; \ fi -# NOTE: for test/CI time, this will install medcat based on local path -ARG REINSTALL_CORE_FROM_LOCAL=false -RUN if [ "$REINSTALL_CORE_FROM_LOCAL" = "true" ]; then \ - echo "Reinstalling medcat based on relative path"; \ - SETUPTOOLS_SCM_PRETEND_VERSION="2.4.0-dev0" pip install -e "/webapp/medcat-v2[meta-cat,spacy]"; \ - fi - # Get the spacy model (for later copy) RUN python -m spacy download en_core_web_md From 0e7da75dbeb9e83584677d8cbd1223af23ab0997 Mon Sep 17 00:00:00 2001 From: mart-r Date: Tue, 24 Feb 2026 16:00:03 +0000 Subject: [PATCH 06/38] CU-869c8r073: Update base template for non-demo header --- medcat-demo-app/webapp/demo/templates/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/medcat-demo-app/webapp/demo/templates/base.html b/medcat-demo-app/webapp/demo/templates/base.html index 1c37e4fc8..1abf3e75c 100644 --- a/medcat-demo-app/webapp/demo/templates/base.html +++ b/medcat-demo-app/webapp/demo/templates/base.html @@ -15,7 +15,7 @@