From f7884af3afd175ecbe7c2b0c39d4966ce860e769 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 3 Oct 2023 17:05:46 -0300 Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=90=9B=20fix(manager.py):=20migrate?= =?UTF-8?q?=20flows=20to=20default=20superuser=20if=20they=20don't=20have?= =?UTF-8?q?=20a=20user=20id=20associated=20with=20them=20when=20auto=5Flog?= =?UTF-8?q?in=20is=20enabled=20=F0=9F=90=9B=20fix(utils.py):=20handle=20ca?= =?UTF-8?q?se=20when=20superuser=20already=20exists=20during=20creation=20?= =?UTF-8?q?to=20prevent=20UNIQUE=20constraint=20violation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../langflow/services/database/manager.py | 19 +++++++++++++++++++ src/backend/langflow/services/utils.py | 15 ++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/backend/langflow/services/database/manager.py b/src/backend/langflow/services/database/manager.py index 3a388f694..0521ef583 100644 --- a/src/backend/langflow/services/database/manager.py +++ b/src/backend/langflow/services/database/manager.py @@ -58,6 +58,25 @@ class DatabaseService(Service): with Session(self.engine) as session: yield session + def migrate_flows_if_auto_login(self): + # if auto_login is enabled, we need to migrate the flows + # to the default superuser if they don't have a user id + # associated with them + settings_service = get_settings_service() + if settings_service.auth_settings.AUTO_LOGIN: + with Session(self.engine) as session: + flows = ( + session.query(models.Flow).filter(models.Flow.user_id == None).all() + ) + if flows: + logger.debug("Migrating flows to default superuser") + username = settings_service.auth_settings.SUPERUSER + user = get_user_by_username(session, username) + for flow in flows: + flow.user_id = user.id + session.commit() + logger.debug("Flows migrated successfully") + def check_schema_health(self) -> bool: inspector = inspect(self.engine) diff --git a/src/backend/langflow/services/utils.py b/src/backend/langflow/services/utils.py index 20c23f8c0..86cfed92e 100644 --- a/src/backend/langflow/services/utils.py +++ b/src/backend/langflow/services/utils.py @@ -7,7 +7,7 @@ from langflow.services.settings.constants import ( DEFAULT_SUPERUSER_PASSWORD, ) from sqlmodel import Session -from .getters import get_session, get_settings_service +from .getters import get_db_service, get_session, get_settings_service from loguru import logger @@ -54,8 +54,12 @@ def get_or_create_super_user(session: Session, username, password, is_default): logger.debug("Creating default superuser.") else: logger.debug("Creating superuser.") - - return create_super_user(username, password, db=session) + try: + return create_super_user(username, password, db=session) + except Exception as exc: + if "UNIQUE constraint failed: user.username" in str(exc): + logger.debug("Superuser already exists.") + return None def setup_superuser(settings_service, session: Session): @@ -193,3 +197,8 @@ def initialize_services(): setup_superuser( service_manager.get(ServiceType.SETTINGS_SERVICE), next(get_session()) ) + try: + get_db_service().migrate_flows_if_auto_login() + except Exception as exc: + logger.error(f"Error migrating flows: {exc}") + raise RuntimeError("Error migrating flows") from exc From 65c65165757406dd4c57561b59bd6c8b905b2642 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 3 Oct 2023 17:05:59 -0300 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=94=80=20chore(constants.py):=20updat?= =?UTF-8?q?e=20import=20statements=20to=20use=20the=20correct=20module=20p?= =?UTF-8?q?aths=20for=20PromptTemplate=20=F0=9F=94=80=20chore(utils.py):?= =?UTF-8?q?=20update=20import=20statements=20to=20use=20the=20correct=20mo?= =?UTF-8?q?dule=20paths=20for=20PromptTemplate=20=F0=9F=94=80=20chore(test?= =?UTF-8?q?=5Fcustom=5Fcomponent.py):=20update=20import=20statements=20to?= =?UTF-8?q?=20use=20the=20correct=20module=20paths=20for=20PromptTemplate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/interface/custom/constants.py | 4 ++-- src/backend/langflow/interface/importing/utils.py | 2 +- tests/test_custom_component.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/langflow/interface/custom/constants.py b/src/backend/langflow/interface/custom/constants.py index f5911198e..58ecef637 100644 --- a/src/backend/langflow/interface/custom/constants.py +++ b/src/backend/langflow/interface/custom/constants.py @@ -1,4 +1,4 @@ -from langchain import PromptTemplate +from langchain.prompts import PromptTemplate from langchain.chains.base import Chain from langchain.document_loaders.base import BaseLoader from langchain.schema.embeddings import Embeddings @@ -45,7 +45,7 @@ DEFAULT_CUSTOM_COMPONENT_CODE = """from langflow import CustomComponent from langchain.llms.base import BaseLLM from langchain.chains import LLMChain -from langchain import PromptTemplate +from langchain.prompts import PromptTemplate from langchain.schema import Document import requests diff --git a/src/backend/langflow/interface/importing/utils.py b/src/backend/langflow/interface/importing/utils.py index 000eed205..44d72df42 100644 --- a/src/backend/langflow/interface/importing/utils.py +++ b/src/backend/langflow/interface/importing/utils.py @@ -3,7 +3,7 @@ import importlib from typing import Any, Type -from langchain import PromptTemplate +from langchain.prompts import PromptTemplate from langchain.agents import Agent from langchain.base_language import BaseLanguageModel from langchain.chains.base import Chain diff --git a/tests/test_custom_component.py b/tests/test_custom_component.py index 1695cfd38..47c9cbfb2 100644 --- a/tests/test_custom_component.py +++ b/tests/test_custom_component.py @@ -21,7 +21,7 @@ from langflow.interface.custom.custom_component import CustomComponent from langchain.llms.base import BaseLLM from langchain.chains import LLMChain -from langchain import PromptTemplate +from langchain.prompts import PromptTemplate from langchain.schema import Document import requests From ad406541f2b948d422f371121020c8d4d2278de0 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 3 Oct 2023 17:08:38 -0300 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=90=9B=20fix(manager.py):=20improve?= =?UTF-8?q?=20readability=20by=20splitting=20a=20long=20line=20into=20mult?= =?UTF-8?q?iple=20lines=20=F0=9F=90=9B=20fix(utils.py):=20add=20comment=20?= =?UTF-8?q?to=20explain=20the=20reason=20for=20the=20check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/langflow/services/database/manager.py | 4 +++- src/backend/langflow/services/utils.py | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/backend/langflow/services/database/manager.py b/src/backend/langflow/services/database/manager.py index 0521ef583..8b9dde7bd 100644 --- a/src/backend/langflow/services/database/manager.py +++ b/src/backend/langflow/services/database/manager.py @@ -66,7 +66,9 @@ class DatabaseService(Service): if settings_service.auth_settings.AUTO_LOGIN: with Session(self.engine) as session: flows = ( - session.query(models.Flow).filter(models.Flow.user_id == None).all() + session.query(models.Flow) + .filter(models.Flow.user_id == None) # noqa + .all() ) if flows: logger.debug("Migrating flows to default superuser") diff --git a/src/backend/langflow/services/utils.py b/src/backend/langflow/services/utils.py index 86cfed92e..b7d93184f 100644 --- a/src/backend/langflow/services/utils.py +++ b/src/backend/langflow/services/utils.py @@ -58,6 +58,9 @@ def get_or_create_super_user(session: Session, username, password, is_default): return create_super_user(username, password, db=session) except Exception as exc: if "UNIQUE constraint failed: user.username" in str(exc): + # This is to deal with workers running this + # at startup and trying to create the superuser + # at the same time. logger.debug("Superuser already exists.") return None From fd02e2b869af1ffe0dcd10bdcd085138fafc3b9c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 3 Oct 2023 17:09:06 -0300 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=94=96=20chore(pyproject.toml):=20bum?= =?UTF-8?q?p=20version=20from=200.5.0a4=20to=200.5.0a5=20for=20package=20r?= =?UTF-8?q?elease?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a24d3e4f4..aabbe24a8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "langflow" -version = "0.5.0a4" +version = "0.5.0a5" description = "A Python package with a built-in web application" authors = ["Logspace "] maintainers = [