filer.fields.file: 89 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/file.py

Stats: 0 executed, 74 missed, 15 excluded, 49 ignored

  1. #-*- coding: utf-8 -*-
  2. import inspect
  3. from django import forms
  4. from django.conf import settings as globalsettings
  5. from django.contrib.admin.widgets import ForeignKeyRawIdWidget
  6. from django.contrib.admin.sites import site
  7. from django.core.exceptions import ImproperlyConfigured
  8. from django.core.urlresolvers import reverse
  9. from django.db import models
  10. from django.template.loader import render_to_string
  11. from django.utils.safestring import mark_safe
  12. from django.utils.text import truncate_words
  13. from filer.models import File
  14. from filer import settings as filer_settings
  15. import logging
  16. logger = logging.getLogger(__name__)
  17. class AdminFileWidget(ForeignKeyRawIdWidget):
  18. choices = None
  19. def render(self, name, value, attrs=None):
  20. obj = self.obj_for_value(value)
  21. css_id = attrs.get('id', 'id_image_x')
  22. css_id_thumbnail_img = "%s_thumbnail_img" % css_id
  23. css_id_description_txt = "%s_description_txt" % css_id
  24. related_url = None
  25. if value:
  26. try:
  27. file_obj = File.objects.get(pk=value)
  28. related_url = file_obj.logical_folder.\
  29. get_admin_directory_listing_url_path()
  30. except Exception,e:
  31. # catch exception and manage it. We can re-raise it for debugging
  32. # purposes and/or just logging it, provided user configured
  33. # proper logging configuration
  34. if filer_settings.FILER_ENABLE_LOGGING:
  35. logger.error('Error while rendering file widget: %s',e)
  36. if filer_settings.FILER_DEBUG:
  37. raise e
  38. if not related_url:
  39. related_url = reverse('admin:filer-directory_listing-last')
  40. params = self.url_parameters()
  41. if params:
  42. lookup_url = '?' + '&'.join(
  43. ['%s=%s' % (k, v) for k, v in params.items()])
  44. else:
  45. lookup_url = ''
  46. if not 'class' in attrs:
  47. # The JavaScript looks for this hook.
  48. attrs['class'] = 'vForeignKeyRawIdAdminField'
  49. # rendering the super for ForeignKeyRawIdWidget on purpose here because
  50. # we only need the input and none of the other stuff that
  51. # ForeignKeyRawIdWidget adds
  52. hidden_input = super(ForeignKeyRawIdWidget, self).render(
  53. name, value, attrs)
  54. filer_static_prefix = filer_settings.FILER_STATICMEDIA_PREFIX
  55. if not filer_static_prefix[-1] == '/':
  56. filer_static_prefix += '/'
  57. context = {
  58. 'hidden_input': hidden_input,
  59. 'lookup_url': '%s%s' % (related_url, lookup_url),
  60. 'thumb_id': css_id_thumbnail_img,
  61. 'span_id': css_id_description_txt,
  62. 'object': obj,
  63. 'lookup_name': name,
  64. 'filer_static_prefix': filer_static_prefix,
  65. 'clear_id': '%s_clear' % css_id,
  66. 'id': css_id,
  67. }
  68. html = render_to_string('admin/filer/widgets/admin_file.html', context)
  69. return mark_safe(html)
  70. def label_for_value(self, value):
  71. obj = self.obj_for_value(value)
  72. return '&nbsp;<strong>%s</strong>' % truncate_words(obj, 14)
  73. def obj_for_value(self, value):
  74. try:
  75. key = self.rel.get_related_field().name
  76. obj = self.rel.to._default_manager.get(**{key: value})
  77. except:
  78. obj = None
  79. return obj
  80. class Media:
  81. js = (filer_settings.FILER_STATICMEDIA_PREFIX + 'js/popup_handling.js',)
  82. class AdminFileFormField(forms.ModelChoiceField):
  83. widget = AdminFileWidget
  84. def __init__(self, rel, queryset, to_field_name, *args, **kwargs):
  85. self.rel = rel
  86. self.queryset = queryset
  87. self.to_field_name = to_field_name
  88. self.max_value = None
  89. self.min_value = None
  90. other_widget = kwargs.pop('widget', None)
  91. if 'admin_site' in inspect.getargspec(self.widget.__init__)[0]: # Django 1.4
  92. widget_instance = self.widget(rel, site)
  93. else: # Django <= 1.3
  94. widget_instance = self.widget(rel)
  95. forms.Field.__init__(self, widget=widget_instance, *args, **kwargs)
  96. def widget_attrs(self, widget):
  97. widget.required = self.required
  98. return {}
  99. class FilerFileField(models.ForeignKey):
  100. default_form_class = AdminFileFormField
  101. default_model_class = File
  102. def __init__(self, **kwargs):
  103. # we call ForeignKey.__init__ with the Image model as parameter...
  104. # a FilerImageFiled can only be a ForeignKey to a Image
  105. return super(FilerFileField, self).__init__(
  106. self.default_model_class, **kwargs)
  107. def formfield(self, **kwargs):
  108. # This is a fairly standard way to set up some defaults
  109. # while letting the caller override them.
  110. defaults = {
  111. 'form_class': self.default_form_class,
  112. 'rel': self.rel,
  113. }
  114. defaults.update(kwargs)
  115. return super(FilerFileField, self).formfield(**defaults)
  116. def south_field_triple(self):
  117. "Returns a suitable description of this field for South."
  118. # We'll just introspect ourselves, since we inherit.
  119. from south.modelsinspector import introspector
  120. field_class = "django.db.models.fields.related.ForeignKey"
  121. args, kwargs = introspector(self)
  122. # That's our definition!
  123. return (field_class, args, kwargs)