cms.forms.utils: 78 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/forms/utils.py

Stats: 0 executed, 67 missed, 11 excluded, 21 ignored

  1. # -*- coding: utf-8 -*-
  2. from cms.models import Page
  3. from cms.models.titlemodels import Title
  4. from cms.utils import i18n
  5. from collections import defaultdict
  6. from django.conf import settings
  7. from django.contrib.sites.models import Site
  8. from django.core.cache import cache
  9. from django.db.models.signals import post_save, post_delete
  10. from django.utils import translation
  11. from django.utils.datastructures import SortedDict
  12. from django.utils.safestring import mark_safe
  13. def update_site_and_page_choices(lang=None):
  14. lang = lang or translation.get_language()
  15. SITE_CHOICES_KEY = get_site_cache_key(lang)
  16. PAGE_CHOICES_KEY = get_page_cache_key(lang)
  17. if settings.CMS_MODERATOR:
  18. title_queryset = Title.objects.filter(page__publisher_is_draft=False)
  19. else:
  20. title_queryset = Title.objects.filter(page__publisher_is_draft=True)
  21. title_queryset = title_queryset.select_related('page', 'page__site').order_by('page__tree_id', 'page__lft', 'page__rght')
  22. pages = defaultdict(SortedDict)
  23. sites = {}
  24. for title in title_queryset:
  25. page = pages[title.page.site.pk].get(title.page.pk, {})
  26. page[title.language] = title
  27. pages[title.page.site.pk][title.page.pk] = page
  28. sites[title.page.site.pk] = title.page.site.name
  29. site_choices = []
  30. page_choices = [('', '----')]
  31. language_order = [lang] + i18n.get_fallback_languages(lang)
  32. for sitepk, sitename in sites.items():
  33. site_choices.append((sitepk, sitename))
  34. site_page_choices = []
  35. for titles in pages[sitepk].values():
  36. title = None
  37. for language in language_order:
  38. title = titles.get(language)
  39. if title:
  40. break
  41. if not title:
  42. continue
  43. indent = u"  " * title.page.level
  44. page_title = mark_safe(u"%s%s" % (indent, title.title))
  45. site_page_choices.append((title.page.pk, page_title))
  46. page_choices.append((sitename, site_page_choices))
  47. # We set it to 1 day here because we actively invalidate this cache.
  48. cache.set(SITE_CHOICES_KEY, site_choices, 86400)
  49. cache.set(PAGE_CHOICES_KEY, page_choices, 86400)
  50. return site_choices, page_choices
  51. def get_site_choices(lang=None):
  52. lang = lang or translation.get_language()
  53. site_choices = cache.get(get_site_cache_key(lang))
  54. if site_choices is None:
  55. site_choices, page_choices = update_site_and_page_choices(lang)
  56. return site_choices
  57. def get_page_choices(lang=None):
  58. lang = lang or translation.get_language()
  59. page_choices = cache.get(get_page_cache_key(lang))
  60. if page_choices is None:
  61. site_choices, page_choices = update_site_and_page_choices(lang)
  62. return page_choices
  63. def _get_key(prefix, lang):
  64. return "%s-%s" % (prefix, lang)
  65. def get_site_cache_key(lang):
  66. return _get_key(settings.CMS_SITE_CHOICES_CACHE_KEY, lang)
  67. def get_page_cache_key(lang):
  68. return _get_key(settings.CMS_PAGE_CHOICES_CACHE_KEY, lang)
  69. def _clean_many(prefix):
  70. keys = []
  71. for lang in [language[0] for language in settings.LANGUAGES]:
  72. keys.append(_get_key(prefix, lang))
  73. cache.delete_many(keys)
  74. def clean_site_choices_cache(sender, **kwargs):
  75. _clean_many(settings.CMS_SITE_CHOICES_CACHE_KEY)
  76. def clean_page_choices_cache(sender, **kwargs):
  77. _clean_many(settings.CMS_PAGE_CHOICES_CACHE_KEY)
  78. post_save.connect(clean_page_choices_cache, sender=Page)
  79. post_save.connect(clean_site_choices_cache, sender=Site)
  80. post_delete.connect(clean_page_choices_cache, sender=Page)
  81. post_delete.connect(clean_site_choices_cache, sender=Site)