filer.fields.folder: 88 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/filer/fields/folder.py

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

  1. #-*- coding: utf-8 -*-
  2. from django.template.loader import render_to_string
  3. import inspect
  4. from django import forms
  5. from django.conf import settings
  6. from django.contrib.admin.widgets import ForeignKeyRawIdWidget
  7. from django.contrib.admin.sites import site
  8. from django.core.urlresolvers import reverse
  9. from django.db import models
  10. from django.utils.safestring import mark_safe
  11. from django.utils.text import truncate_words
  12. from django.utils.translation import ugettext as _
  13. from filer.models import Folder
  14. from filer.settings import FILER_STATICMEDIA_PREFIX
  15. class AdminFolderWidget(ForeignKeyRawIdWidget):
  16. choices = None
  17. input_type = 'hidden'
  18. is_hidden = True
  19. def render(self, name, value, attrs=None):
  20. obj = self.obj_for_value(value)
  21. css_id = attrs.get('id')
  22. css_id_folder = "%s_folder" % css_id
  23. css_id_description_txt = "%s_description_txt" % css_id
  24. required = self.attrs
  25. if attrs is None:
  26. attrs = {}
  27. related_url = None
  28. if value:
  29. try:
  30. folder = Folder.objects.get(pk=value)
  31. related_url = folder.get_admin_directory_listing_url_path()
  32. except Exception:
  33. pass
  34. if not related_url:
  35. related_url = reverse('admin:filer-directory_listing-last')
  36. params = self.url_parameters()
  37. params['select_folder'] = 1
  38. if params:
  39. url = '?' + '&'.join(
  40. ['%s=%s' % (k, v) for k, v in params.items()])
  41. else:
  42. url = ''
  43. if not 'class' in attrs:
  44. # The JavaScript looks for this hook.
  45. attrs['class'] = 'vForeignKeyRawIdAdminField'
  46. super_attrs = attrs.copy()
  47. hidden_input = super(ForeignKeyRawIdWidget, self).render(
  48. name, value, super_attrs)
  49. # TODO: "id_" is hard-coded here. This should instead use the correct
  50. # API to determine the ID dynamically.
  51. context = {
  52. 'hidden_input': hidden_input,
  53. 'lookup_url': '%s%s' % (related_url, url),
  54. 'lookup_name': name,
  55. 'span_id': css_id_description_txt,
  56. 'object': obj,
  57. 'clear_id': '%s_clear' % css_id,
  58. 'descid': css_id_description_txt,
  59. 'noimg': '%sicons/nofile_32x32.png' % FILER_STATICMEDIA_PREFIX,
  60. 'foldid': css_id_folder,
  61. 'id': css_id,
  62. }
  63. html = render_to_string('admin/filer/widgets/admin_folder.html', context)
  64. return mark_safe(html)
  65. def label_for_value(self, value):
  66. obj = self.obj_for_value(value)
  67. return '&nbsp;<strong>%s</strong>' % truncate_words(obj, 14)
  68. def obj_for_value(self, value):
  69. try:
  70. key = self.rel.get_related_field().name
  71. obj = self.rel.to._default_manager.get(**{key: value})
  72. except:
  73. obj = None
  74. return obj
  75. class Media:
  76. js = (FILER_STATICMEDIA_PREFIX + 'js/popup_handling.js',)
  77. class AdminFolderFormField(forms.ModelChoiceField):
  78. widget = AdminFolderWidget
  79. def __init__(self, rel, queryset, to_field_name, *args, **kwargs):
  80. self.rel = rel
  81. self.queryset = queryset
  82. self.to_field_name = to_field_name
  83. self.max_value = None
  84. self.min_value = None
  85. kwargs.pop('widget', None)
  86. if 'admin_site' in inspect.getargspec(self.widget.__init__)[0]: # Django 1.4
  87. widget_instance = self.widget(rel, site)
  88. else: # Django <= 1.3
  89. widget_instance = self.widget(rel)
  90. forms.Field.__init__(self, widget=widget_instance, *args, **kwargs)
  91. def widget_attrs(self, widget):
  92. widget.required = self.required
  93. return {}
  94. class FilerFolderField(models.ForeignKey):
  95. default_form_class = AdminFolderFormField
  96. default_model_class = Folder
  97. def __init__(self, **kwargs):
  98. return super(FilerFolderField, self).__init__(Folder, **kwargs)
  99. def formfield(self, **kwargs):
  100. # This is a fairly standard way to set up some defaults
  101. # while letting the caller override them.
  102. defaults = {
  103. 'form_class': self.default_form_class,
  104. 'rel': self.rel,
  105. }
  106. defaults.update(kwargs)
  107. return super(FilerFolderField, self).formfield(**defaults)
  108. def south_field_triple(self):
  109. "Returns a suitable description of this field for South."
  110. # We'll just introspect ourselves, since we inherit.
  111. from south.modelsinspector import introspector
  112. field_class = "django.db.models.fields.related.ForeignKey"
  113. args, kwargs = introspector(self)
  114. # That's our definition!
  115. return (field_class, args, kwargs)