cms.models.placeholdermodel: 113 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/models/placeholdermodel.py

Stats: 0 executed, 99 missed, 14 excluded, 43 ignored

  1. # -*- coding: utf-8 -*-
  2. from cms.utils.helpers import reversion_register
  3. from cms.utils.placeholder import PlaceholderNoAction
  4. from django.core.urlresolvers import reverse
  5. from django.db import models
  6. from django.forms.widgets import Media
  7. from django.utils.translation import ugettext_lazy as _
  8. import operator
  9. class Placeholder(models.Model):
  10. slot = models.CharField(_("slot"), max_length=50, db_index=True, editable=False)
  11. default_width = models.PositiveSmallIntegerField(_("width"), null=True, editable=False)
  12. class Meta:
  13. app_label = 'cms'
  14. def __unicode__(self):
  15. return self.slot
  16. def get_add_url(self):
  17. return self._get_url('add_plugin')
  18. def get_move_url(self):
  19. return self._get_url('move_plugin')
  20. def get_remove_url(self):
  21. return self._get_url('remove_plugin')
  22. def get_changelist_url(self):
  23. return self._get_url('changelist')
  24. def _get_url(self, key):
  25. model = self._get_attached_model()
  26. if not model:
  27. return reverse('admin:cms_page_%s' % key)
  28. else:
  29. app_label = model._meta.app_label
  30. model_name = model.__name__.lower()
  31. return reverse('admin:%s_%s_%s' % (app_label, model_name, key))
  32. def _get_permission(self, request, key):
  33. """
  34. Generic method to check the permissions for a request for a given key,
  35. the key can be: 'add', 'change' or 'delete'.
  36. """
  37. if request.user.is_superuser:
  38. return True
  39. found = False
  40. # check all attached models for change permissions
  41. for model in self._get_attached_models():
  42. opts = model._meta
  43. perm_accessor = getattr(opts, 'get_%s_permission' % key)
  44. perm_code = '%s.%s' % (opts.app_label, perm_accessor())
  45. # if they don't have the permission for this attached model, bail out
  46. if not request.user.has_perm(perm_code):
  47. return False
  48. else:
  49. found = True
  50. return found
  51. def has_change_permission(self, request):
  52. return self._get_permission(request, 'change')
  53. def has_add_permission(self, request):
  54. return self._get_permission(request, 'add')
  55. def has_delete_permission(self, request):
  56. return self._get_permission(request, 'delete')
  57. def render(self, context, width):
  58. from cms.plugin_rendering import render_placeholder
  59. if not 'request' in context:
  60. return '<!-- missing request -->'
  61. width = width or self.default_width
  62. if width:
  63. context.update({'width': width})
  64. return render_placeholder(self, context)
  65. def get_media(self, request, context):
  66. from cms.plugins.utils import get_plugin_media
  67. media_classes = [get_plugin_media(request, context, plugin) for plugin in self.cmsplugin_set.all()]
  68. if media_classes:
  69. return reduce(operator.add, media_classes)
  70. return Media()
  71. def _get_attached_fields(self):
  72. """
  73. Returns an ITERATOR of all non-cmsplugin reverse foreign key related fields.
  74. """
  75. from cms.models import CMSPlugin
  76. for rel in self._meta.get_all_related_objects():
  77. if issubclass(rel.model, CMSPlugin):
  78. continue
  79. field = getattr(self, rel.get_accessor_name())
  80. if field.count():
  81. yield rel.field
  82. def _get_attached_field(self):
  83. from cms.models import CMSPlugin
  84. if not hasattr(self, '_attached_field_cache'):
  85. self._attached_field_cache = None
  86. for rel in self._meta.get_all_related_objects():
  87. if issubclass(rel.model, CMSPlugin):
  88. continue
  89. field = getattr(self, rel.get_accessor_name())
  90. if field.count():
  91. self._attached_field_cache = rel.field
  92. return self._attached_field_cache
  93. def _get_attached_field_name(self):
  94. field = self._get_attached_field()
  95. if field:
  96. return field.name
  97. return None
  98. def _get_attached_model(self):
  99. field = self._get_attached_field()
  100. if field:
  101. return field.model
  102. return None
  103. def _get_attached_models(self):
  104. """
  105. Returns a list of models of attached to this placeholder.
  106. """
  107. return [field.model for field in self._get_attached_fields()]
  108. def page_getter(self):
  109. if not hasattr(self, '_page'):
  110. from cms.models.pagemodel import Page
  111. try:
  112. self._page = Page.objects.get(placeholders=self)
  113. except (Page.DoesNotExist, Page.MultipleObjectsReturned,):
  114. self._page = None
  115. return self._page
  116. def page_setter(self, value):
  117. self._page = value
  118. page = property(page_getter, page_setter)
  119. def get_plugins_list(self):
  120. return list(self.get_plugins())
  121. def get_plugins(self):
  122. return self.cmsplugin_set.all().order_by('tree_id', '-rght')
  123. @property
  124. def actions(self):
  125. if not hasattr(self, '_actions_cache'):
  126. field = self._get_attached_field()
  127. self._actions_cache = getattr(field, 'actions', PlaceholderNoAction())
  128. return self._actions_cache
  129. reversion_register(Placeholder) # follow=["cmsplugin_set"] not following plugins since they are a spechial case