diff --git a/weblate/formats/convert.py b/weblate/formats/convert.py index 3a92214c370a..469a427d99ab 100644 --- a/weblate/formats/convert.py +++ b/weblate/formats/convert.py @@ -18,14 +18,12 @@ from django.utils.translation import gettext_lazy from translate.convert.po2html import po2html from translate.convert.po2idml import translate_idml, write_idml -from translate.convert.po2md import MarkdownTranslator from translate.convert.po2rc import rerc from translate.convert.po2txt import po2txt from translate.convert.rc2po import rc2po from translate.convert.xliff2odf import translate_odf, write_odf from translate.storage.html import htmlfile from translate.storage.idml import INLINE_ELEMENTS, NO_TRANSLATE_ELEMENTS, open_idml -from translate.storage.markdown import MarkdownFile from translate.storage.odf_io import open_odf from translate.storage.odf_shared import inline_elements, no_translate_content_elements from translate.storage.po import pofile @@ -315,12 +313,18 @@ class MarkdownFormat(ConvertFormat): check_flags = ("safe-html", "strict-same", "md-text") def convertfile(self, storefile, template_store): + # Lazy import as mistletoe is expensive + from translate.storage.markdown import MarkdownFile + # Fake input file with a blank filename mdparser = MarkdownFile(inputfile=NamedBytesIO("", storefile.read())) return self.convert_to_po(mdparser, template_store, use_location=False) def save_content(self, handle) -> None: """Store content to file.""" + # Lazy import as mistletoe is expensive + from translate.convert.po2md import MarkdownTranslator + converter = MarkdownTranslator( inputstore=self.store, includefuzzy=True, outputthreshold=None, maxlength=80 ) diff --git a/weblate/memory/models.py b/weblate/memory/models.py index a48ed7ec69ad..e10e610e2c1d 100644 --- a/weblate/memory/models.py +++ b/weblate/memory/models.py @@ -15,8 +15,6 @@ from django.db.models.functions import MD5 from django.utils.encoding import force_str from django.utils.translation import gettext, pgettext -from jsonschema import validate -from jsonschema.exceptions import ValidationError from translate.misc.xml_helpers import getXMLlang, getXMLspace from translate.storage.tmx import tmxfile from weblate_schemas import load_schema @@ -170,6 +168,10 @@ def import_file( def import_json( self, request: AuthenticatedHttpRequest, fileobj, origin=None, **kwargs ): + # Lazily import as this is expensive + from jsonschema import validate + from jsonschema.exceptions import ValidationError + content = fileobj.read() try: data = json.loads(force_str(content)) diff --git a/weblate/utils/request.py b/weblate/utils/request.py index 3367a839fb04..ccfe03490180 100644 --- a/weblate/utils/request.py +++ b/weblate/utils/request.py @@ -5,8 +5,6 @@ from typing import TYPE_CHECKING -import user_agents - if TYPE_CHECKING: from weblate.auth.models import AuthenticatedHttpRequest @@ -30,6 +28,9 @@ def get_user_agent_raw(request: AuthenticatedHttpRequest) -> str: def get_user_agent(request: AuthenticatedHttpRequest, max_length: int = 200) -> str: """Return formatted user agent for request.""" + # Lazily import as this is expensive + import user_agents + raw = get_user_agent_raw(request) if not raw: return ""