Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions djangocms_link/cms_plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,16 @@ def render(self, context, instance, placeholder):
)
return super().render(context, instance, placeholder)

def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)

if obj:
language = getattr(obj, "language", None)
else:
language = request.GET.get("plugin_language", None)
for widget in self.fields["link"].widget.widgets:
widget.language = language
return form


plugin_pool.register_plugin(LinkPlugin)
37 changes: 22 additions & 15 deletions djangocms_link/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@


class LinkAutoCompleteWidget(AutocompleteSelect):
def __init__(self, attrs: dict | None = None):
def __init__(self, attrs: dict | None = None, language: str | None = None):
super().__init__(None, None, attrs)
self.language = language

def get_internal_obj(self, values: list[str | None]) -> list[models.Model | None]:
internal_obj = []
Expand Down Expand Up @@ -68,7 +69,10 @@ def optgroups(self, name: str, value: str, attr: str | None = None):
return groups

def get_url(self):
return admin_reverse("djangocms_link_link_urls")
reverse = admin_reverse("djangocms_link_link_urls")
if self.language:
return f"{reverse}?language={self.language}"
return reverse

def build_attrs(self, base_attrs: dict, extra_attrs: dict | None = None) -> dict:
"""
Expand Down Expand Up @@ -233,7 +237,7 @@ class Media:
js = ("djangocms_link/link-widget.js",)
css = {"all": ("djangocms_link/link-widget.css",)}

def __init__(self, site_selector: bool | None = None):
def __init__(self, site_selector: bool | None = None, language: str | None = None):
if site_selector is None:
site_selector = LinkWidget.default_site_selector

Expand All @@ -242,22 +246,24 @@ def __init__(self, site_selector: bool | None = None):
for key, widget in _available_widgets.items()
if key == "always" or _mapping[key] in link_types
]
if site_selector and "internal_link" in allowed_link_types:
if "internal_link" in allowed_link_types:
index = next(
i
for i, widget in enumerate(widgets)
if widget.attrs.get("widget") == "internal_link"
)
widgets.insert(
index,
SiteAutocompleteSelect(
attrs={
"class": "js-link-site-widget",
"widget": "site",
"data-placeholder": _("Select site"),
},
),
) # Site selector
widgets[index].language = language # Pass on language to the internal link widget
if site_selector:
widgets.insert(
index,
SiteAutocompleteSelect(
attrs={
"class": "js-link-site-widget",
"widget": "site",
"data-placeholder": _("Select site"),
},
),
) # Site selector

# Remember which widget expets its content at which position
self.data_pos = {
Expand Down Expand Up @@ -287,7 +293,6 @@ def get_context(self, name: str, value: str | None, attrs: dict) -> dict:


class LinkFormField(Field):
widget = LinkWidget
external_link_validators = [
ExtendedURLValidator(allowed_link_types=allowed_link_types)
]
Expand All @@ -302,6 +307,7 @@ def __init__(self, *args, **kwargs):
kwargs.setdefault("initial", {})
kwargs.pop("encoder", None) # Passed from LinkField's JSONField parent class
kwargs.pop("decoder", None) # but not needed
self.widget = LinkWidget(language=kwargs.pop("language", None))
super().__init__(*args, **kwargs)
if isinstance(self.initial, dict):
self.initial = self.prepare_value(self.initial)
Expand Down Expand Up @@ -366,6 +372,7 @@ def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

def formfield(self, **kwargs):
print("LinkField.formfield", kwargs)
kwargs.setdefault("form_class", LinkFormField)
return super().formfield(**kwargs)

Expand Down
Loading