From 57e6389eeba2abf836d872a39c451f2370feacc3 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:13:26 -0700 Subject: [PATCH 1/5] Reorder logic to improve static analysis --- modules/ui_extra_networks.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index 17a1c5b7e..2888e97a9 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -8,7 +8,6 @@ import html import base64 import urllib.parse import threading -from typing import TYPE_CHECKING from types import SimpleNamespace from pathlib import Path from html.parser import HTMLParser @@ -881,11 +880,10 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): from modules import images page, item = get_item(state, params) is_style = (page is not None) and (page.title == 'Style') - is_valid = (item is not None) and hasattr(item, 'name') and hasattr(item, 'filename') + is_valid = False - if is_valid: - if TYPE_CHECKING: - assert item is not None # Part of the definition of "is_valid" + if (item is not None) and hasattr(item, 'name') and hasattr(item, 'filename'): + is_valid = True stat_size, stat_mtime = modelstats.stat(item.filename) if hasattr(item, 'size') and item.size > 0: stat_size = item.size From ba889d6f1bd9b5eddf4f8ef883b926c11cad9e5e Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:16:21 -0700 Subject: [PATCH 2/5] Remove old now-unreachable code --- modules/ui_extra_networks.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index 2888e97a9..ee49f95ac 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -890,14 +890,9 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): if hasattr(item, 'mtime') and item.mtime is not None: stat_mtime = item.mtime desc = item.description - fullinfo = shared.readfile(os.path.splitext(item.filename)[0] + '.json', silent=True, as_type="dict") - if 'modelVersions' in fullinfo: # sanitize massive objects - fullinfo['modelVersions'] = [] - info = fullinfo - if isinstance(info, list): - item.filename = None - log.warning('Network: show details not supported for compound item') - info = None + info = shared.readfile(os.path.splitext(item.filename)[0] + '.json', silent=True, as_type="dict") + if 'modelVersions' in info: # sanitize massive objects + info['modelVersions'] = [] if prompt is not None and len(prompt) > 0: item.prompt = prompt if negative is not None and len(negative) > 0: From ab4e284ef5a8eadd8ea11c131ec21e3ab5bbf83e Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:34:30 -0700 Subject: [PATCH 3/5] Minor typing updates --- modules/ui_extra_networks.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index ee49f95ac..a913dcd89 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -133,7 +133,7 @@ class DateTimeEncoder(json.JSONEncoder): class ExtraNetworksPage: - def __init__(self, title): + def __init__(self, title: str): self.title = title self.name = title.lower() self.allow_negative_prompt = False @@ -197,7 +197,7 @@ class ExtraNetworksPage: errors.display(e, 'Network version') return all_versions[0] - def link_preview(self, filename): + def link_preview(self, filename: str): quoted_filename = urllib.parse.quote(filename.replace('\\', '/')) mtime = os.path.getmtime(filename) if os.path.exists(filename) else 0 preview = f"{shared.opts.subpath}/sdapi/v1/network/thumb?filename={quoted_filename}&mtime={mtime}" @@ -255,7 +255,7 @@ class ExtraNetworksPage: log.info(f'Network thumbnails: type={self.name} created={created}') self.missing_thumbs.clear() - def create_items(self, tabname): + def create_items(self, tabname: str): if self.refresh_time is not None and self.refresh_time > refresh_time: # cached results return t0 = time.time() @@ -275,7 +275,7 @@ class ExtraNetworksPage: debug(f'EN create-items: page={self.name} items={len(self.items)} time={t1-t0:.2f}') self.list_time += t1-t0 - def create_page(self, tabname, skip = False): + def create_page(self, tabname: str, skip = False): debug(f'EN create-page: {self.name}') if self.page_time > refresh_time and len(self.html) > 0: # cached page return self.patch(self.html, tabname) @@ -387,7 +387,7 @@ class ExtraNetworksPage: def allowed_directories_for_previews(self): return [] - def create_html(self, item, tabname): + def create_html(self, item, tabname: str): def random_bright_color(): r = random.randint(100, 255) g = random.randint(100, 255) @@ -428,7 +428,7 @@ class ExtraNetworksPage: errors.display(e, 'Networks') return "" - def find_preview_file(self, path): + def find_preview_file(self, path: str | None): if path is None: return 'html/missing.png' if os.path.join('models', 'Reference') in path: @@ -449,7 +449,7 @@ class ExtraNetworksPage: return file return 'html/missing.png' - def find_preview(self, filename): + def find_preview(self, filename: str): t0 = time.time() preview_file = self.find_preview_file(filename) self.preview_time += time.time() - t0 @@ -502,7 +502,7 @@ class ExtraNetworksPage: debug(f'EN missing-preview: {item["name"]}') self.preview_time += time.time() - t0 - def find_description(self, path, info=None): + def find_description(self, path: str | None, info=None): t0 = time.time() class HTMLFilter(HTMLParser): text = "" @@ -534,7 +534,7 @@ class ExtraNetworksPage: self.desc_time += t1-t0 return f.text - def find_info(self, path): + def find_info(self, path: str | None): data = {} if shared.cmd_opts.no_metadata: return data @@ -593,7 +593,7 @@ def register_pages(): register_page(ExtraNetworksPageTextualInversion()) -def get_pages(title=None): +def get_pages(title: str | None = None): visible = shared.opts.extra_networks pages: list[ExtraNetworksPage] = [] if 'All' in visible or visible == []: # default en sort order @@ -645,7 +645,7 @@ class ExtraNetworksUi: self.state: gr.State = None -def create_ui(container, button_parent, tabname, skip_indexing = False): +def create_ui(container, button_parent: gr.Button, tabname: str, skip_indexing = False): if 'networks' in shared.opts.ui_disabled: return None debug(f'EN create-ui: {tabname}') From 609e679c553a7d1c2fe943e605d2263080aac13e Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Thu, 16 Apr 2026 22:54:09 -0700 Subject: [PATCH 4/5] Update Civit AI linking - Minor adjustment to avoid type mixing --- modules/ui_extra_networks.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index a913dcd89..277079223 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -969,8 +969,10 @@ def create_ui(container, button_parent: gr.Button, tabname: str, skip_indexing = url = item.name.replace('Diffusers/', '') url = f'https://huggingface.co/models/{url}' if url is not None else 'N/A' else: - url = info.get('id', None) if info is not None else None - url = f'civitai.com/models/{url}' if url is not None else 'N/A' + info_id = info.get('id', None) + nsfw = info.get('nsfw', False) if info_id is not None else False + tld = "red" if nsfw else "com" + url = f'civitai.{tld}/models/{info_id}' if info_id is not None else 'N/A' text = f'''