cms.plugins.utils: 44 total statements, 0.0% covered

Generated: Wed 2013-03-13 10:33 CET

Source file: /media/Envs/Envs/filer-gallery/lib/python2.7/site-packages/cms/plugins/utils.py

Stats: 0 executed, 38 missed, 6 excluded, 25 ignored

  1. from collections import defaultdict
  2. import operator
  3. from itertools import groupby
  4. from cms.plugin_pool import plugin_pool
  5. from cms.utils import get_language_from_request
  6. from cms.utils.moderator import get_cmsplugin_queryset
  7. def get_plugins(request, placeholder, lang=None):
  8. if not placeholder:
  9. return []
  10. lang = lang or get_language_from_request(request)
  11. if not hasattr(placeholder, '_%s_plugins_cache' % lang):
  12. assign_plugins(request, [placeholder], lang)
  13. return getattr(placeholder, '_%s_plugins_cache' % lang)
  14. def assign_plugins(request, placeholders, lang=None):
  15. """
  16. Fetch all plugins for the given ``placeholders`` and
  17. cast them down to the concrete instances in one query
  18. per type.
  19. """
  20. placeholders = list(placeholders)
  21. if not placeholders:
  22. return
  23. lang = lang or get_language_from_request(request)
  24. # get all plugins for the given placeholders
  25. qs = get_cmsplugin_queryset(request).filter(placeholder__in=placeholders, language=lang, parent__isnull=True).order_by('placeholder', 'position')
  26. plugin_list = downcast_plugins(qs)
  27. # split the plugins up by placeholder
  28. groups = dict((key, list(plugins)) for key, plugins in groupby(plugin_list, operator.attrgetter('placeholder_id')))
  29. for placeholder in placeholders:
  30. setattr(placeholder, '_%s_plugins_cache' % lang, list(groups.get(placeholder.pk, [])))
  31. def downcast_plugins(queryset, select_placeholder=False):
  32. plugin_types_map = defaultdict(list)
  33. plugin_lookup = {}
  34. # make a map of plugin types, needed later for downcasting
  35. for plugin in queryset:
  36. plugin_types_map[plugin.plugin_type].append(plugin.pk)
  37. for plugin_type, pks in plugin_types_map.iteritems():
  38. cls = plugin_pool.get_plugin(plugin_type)
  39. # get all the plugins of type cls.model
  40. plugin_qs = cls.model.objects.filter(pk__in=pks)
  41. if select_placeholder:
  42. plugin_qs = plugin_qs.select_related('placeholder')
  43. # put them in a map so we can replace the base CMSPlugins with their
  44. # downcasted versions
  45. for instance in plugin_qs:
  46. plugin_lookup[instance.pk] = instance
  47. # make the equivalent list of qs, but with downcasted instances
  48. plugin_list = [plugin_lookup[p.pk] for p in queryset if p.pk in plugin_lookup]
  49. return plugin_list
  50. def get_plugins_for_page(request, page, lang=None):
  51. if not page:
  52. return []
  53. lang = lang or get_language_from_request(request)
  54. if not hasattr(page, '_%s_plugins_cache' % lang):
  55. setattr(page, '_%s_plugins_cache' % lang, get_cmsplugin_queryset(request).filter(
  56. placeholder__page=page, language=lang, parent__isnull=True
  57. ).order_by('placeholder', 'position').select_related())
  58. return getattr(page, '_%s_plugins_cache' % lang)