11from __future__ import annotations
22
33import os
4+ import re
45import warnings
56from datetime import date
6- from functools import cache
7+ from functools import cache , cached_property
78
89from django .core .exceptions import ObjectDoesNotExist
910from django .db import connection , connections , models , router
@@ -202,21 +203,23 @@ def __repr__(self):
202203 return display
203204
204205 def get_plugin_name (self ):
205- from cms .plugin_pool import plugin_pool
206-
207- return plugin_pool .get_plugin (self .plugin_type ).name
206+ return self .plugin_class .name
208207
209208 def get_short_description (self ):
210209 instance = self .get_plugin_instance ()[0 ]
211210 if instance is not None :
212211 return force_str (instance )
213212 return _ ("<Empty>" )
214213
215- def get_plugin_class (self ):
214+ @cached_property
215+ def plugin_class (self ):
216216 from cms .plugin_pool import plugin_pool
217217
218218 return plugin_pool .get_plugin (self .plugin_type )
219219
220+ def get_plugin_class (self ):
221+ return self .plugin_class
222+
220223 def get_plugin_class_instance (self , admin = None ):
221224 plugin_class = self .get_plugin_class ()
222225 # needed so we have the same signature as the original ModelAdmin
@@ -264,7 +267,15 @@ def get_bound_plugin(self):
264267 return self ._inst
265268
266269 def get_plugin_info (self , children = None , parents = None ):
267- plugin_class = self .get_plugin_class ()
270+ plugin_class = self .plugin_class
271+
272+ if not hasattr (CMSPlugin , '_edit_url' ):
273+ CMSPlugin ._edit_url = admin_reverse ('cms_placeholder_edit_plugin' , args = (0 ,))
274+ CMSPlugin ._add_url = admin_reverse ('cms_placeholder_add_plugin' )
275+ CMSPlugin ._delete_url = admin_reverse ('cms_placeholder_delete_plugin' , args = (0 ,))
276+ CMSPlugin ._move_url = admin_reverse ('cms_placeholder_move_plugin' )
277+ CMSPlugin ._copy_url = admin_reverse ('cms_placeholder_copy_plugins' )
278+
268279 return {
269280 'type' : 'plugin' ,
270281 'position' : self .position ,
@@ -278,7 +289,13 @@ def get_plugin_info(self, children=None, parents=None):
278289 'plugin_parent_restriction' : parents or [],
279290 'disable_edit' : plugin_class .disable_edit ,
280291 'disable_child_plugins' : plugin_class .disable_child_plugins ,
281- 'urls' : self .get_action_urls (),
292+ 'urls' : {
293+ 'edit_plugin' : re .sub (r"/0/" , f"/{ self .pk } /" , CMSPlugin ._edit_url ),
294+ 'add_plugin' : CMSPlugin ._add_url ,
295+ 'delete_plugin' : re .sub (r"/0/" , f"/{ self .pk } /" , CMSPlugin ._delete_url ),
296+ 'move_plugin' : CMSPlugin ._move_url ,
297+ 'copy_plugin' : CMSPlugin ._copy_url ,
298+ }
282299 }
283300
284301 def refresh_from_db (self , * args , ** kwargs ):
@@ -449,22 +466,21 @@ def get_action_urls(self, js_compat=True):
449466 # TODO: Remove this condition
450467 # once the javascript files have been refactored
451468 # to use the new naming schema (ending in _url).
452- data = {
469+ return {
453470 'edit_plugin' : admin_reverse ('cms_placeholder_edit_plugin' , args = (self .pk ,)),
454471 'add_plugin' : admin_reverse ('cms_placeholder_add_plugin' ),
455472 'delete_plugin' : admin_reverse ('cms_placeholder_delete_plugin' , args = (self .pk ,)),
456473 'move_plugin' : admin_reverse ('cms_placeholder_move_plugin' ),
457474 'copy_plugin' : admin_reverse ('cms_placeholder_copy_plugins' ),
458475 }
459476 else :
460- data = {
477+ return {
461478 'edit_url' : admin_reverse ('cms_placeholder_edit_plugin' , args = (self .pk ,)),
462479 'add_url' : admin_reverse ('cms_placeholder_add_plugin' ),
463480 'delete_url' : admin_reverse ('cms_placeholder_delete_plugin' , args = (self .pk ,)),
464481 'move_url' : admin_reverse ('cms_placeholder_move_plugin' ),
465482 'copy_url' : admin_reverse ('cms_placeholder_copy_plugins' ),
466483 }
467- return data
468484
469485
470486def get_plugin_media_path (instance , filename ):
0 commit comments