def admin_preview(self, node, icons_only=False): request = get_current_request() template = 'admin/media_tree/filenode/includes/preview.html' if not get_media_backend(): icons_only = True template = 'media_tree/filenode/includes/icon.html' # TODO SPLIT preview.html in two: one that doesn't need media backend! thumb_size_key = get_request_attr(request, 'thumbnail_size') or 'default' preview = render_to_string( template, { 'node': node, 'preview_file': node.get_icon_file() if icons_only else node.get_preview_file(), 'class': 'collapsed' if node.is_folder() else '', 'thumbnail_size': app_settings.MEDIA_TREE_ADMIN_THUMBNAIL_SIZES[thumb_size_key] }) if node.is_folder(): preview += render_to_string( template, { 'node': node, 'preview_file': node.get_preview_file(default_name='_folder_expanded'), 'class': 'expanded' }) return preview
def formfield_for_dbfield(self, db_field, **kwargs): if db_field.name == 'parent' and issubclass(db_field.rel.to, FileNode): # overriding formfield_for_dbfield, thus bypassign both Django's and mptt's # formfield_for_foreignkey method, and also preventing Django from wrapping # field with RelatedFieldWidgetWrapper ("add" button resulting in a file add form) # Issue 25 - Only allow folders registerred in the current site. valid_targets = FileNode.tree.filter(**db_field.rel.limit_choices_to).filter( site=Site.objects.get_current()) request = kwargs['request'] node = get_request_attr(request, 'save_node', None) if node: # Exclude invalid folders, e.g. node cannot be a child of itself # (ripped from mptt.forms.MoveNodeForm) opts = node._mptt_meta valid_targets = valid_targets.exclude(**{ opts.tree_id_attr: getattr(node, opts.tree_id_attr), '%s__gte' % opts.left_attr: getattr(node, opts.left_attr), '%s__lte' % opts.right_attr: getattr(node, opts.right_attr), }) field = FileNodeChoiceField(queryset=valid_targets, label=capfirst(db_field.verbose_name), required=not db_field.blank) return field return super(FileNodeAdmin, self).formfield_for_dbfield(db_field, **kwargs)
def admin_preview(self, node, icons_only=False): request = get_current_request() template = 'admin/media_tree/filenode/includes/preview.html' thumbnail_backend = get_media_backend(handles_media_types=(node.media_type,), supports_thumbnails=True) if not thumbnail_backend: icons_only = True template = 'media_tree/filenode/includes/icon.html' # TODO SPLIT preview.html in two: one that doesn't need media backend! context = { 'node': node, 'preview_file': node.get_icon_file() if icons_only else node.get_preview_file(), 'class': 'collapsed' if node.is_folder() else '', } if not icons_only: thumb_size_key = get_request_attr(request, 'thumbnail_size') or 'default' context['thumbnail_size'] = app_settings.MEDIA_TREE_ADMIN_THUMBNAIL_SIZES[thumb_size_key] thumb = thumbnail_backend.get_thumbnail(context['preview_file'], {'size': context['thumbnail_size']}) context['thumb'] = thumb preview = render_to_string(template, context) if node.is_folder(): preview += render_to_string(template, { 'node': node, 'preview_file': node.get_preview_file(default_name='_folder_expanded'), 'class': 'expanded' }) return preview
def formfield_for_dbfield(self, db_field, **kwargs): if db_field.name == 'parent' and issubclass(db_field.rel.to, FileNode): # overriding formfield_for_dbfield, thus bypassign both Django's and mptt's # formfield_for_foreignkey method, and also preventing Django from wrapping # field with RelatedFieldWidgetWrapper ("add" button resulting in a file add form) valid_targets = FileNode.tree.filter( **db_field.rel.limit_choices_to) request = kwargs['request'] node = get_request_attr(request, 'save_node', None) if node: # Exclude invalid folders, e.g. node cannot be a child of itself # (ripped from mptt.forms.MoveNodeForm) opts = node._mptt_meta valid_targets = valid_targets.exclude( **{ opts.tree_id_attr: getattr(node, opts.tree_id_attr), '%s__gte' % opts.left_attr: getattr(node, opts.left_attr), '%s__lte' % opts.right_attr: getattr(node, opts.right_attr), }) field = FileNodeChoiceField(queryset=valid_targets, label=capfirst(db_field.verbose_name), required=not db_field.blank) return field return super(FileNodeAdmin, self).formfield_for_dbfield(db_field, **kwargs)
def save_model(self, request, obj, form, change): if not change: if not obj.node_type: obj.node_type = get_request_attr(request, 'save_node_type', None) obj.attach_user(request.user, change) super(FileNodeAdmin, self).save_model(request, obj, form, change)
def save_model(self, request, obj, form, change): """ Given a model instance save it to the database. """ if not change: if not obj.node_type: obj.node_type = get_request_attr(request, 'save_node_type', None) super(FileNodeAdmin, self).save_model(request, obj, form, change)
def get_form(self, request, *args, **kwargs): if get_request_attr(request, 'save_node_type', None) == FileNode.FOLDER: self.form = FolderForm else: self.form = FileForm self.fieldsets = self.form.Meta.fieldsets form = super(FileNodeAdmin, self).get_form(request, *args, **kwargs) return form
def save_model(self, request, obj, form, change): """ Given a model instance save it to the database. """ if not change: if not obj.node_type: obj.node_type = get_request_attr(request, 'save_node_type', None) obj.attach_user(request.user, change) super(FileNodeAdmin, self).save_model(request, obj, form, change)
def admin_preview(self, node, icons_only=False): request = get_current_request() template = 'admin/media_tree/filenode/includes/preview.html' thumbnail_backend = get_media_backend( handles_media_types=(node.media_type, ), supports_thumbnails=True) if not thumbnail_backend: icons_only = True template = 'media_tree/filenode/includes/icon.html' # TODO SPLIT preview.html in two: one that doesn't need media backend! context = { 'node': node, 'preview_file': node.get_icon_file() if icons_only else node.get_preview_file(), 'class': 'collapsed' if node.is_folder() else '', } if not icons_only: thumb_size_key = get_request_attr(request, 'thumbnail_size') or 'default' context[ 'thumbnail_size'] = app_settings.MEDIA_TREE_ADMIN_THUMBNAIL_SIZES[ thumb_size_key] thumb = thumbnail_backend.get_thumbnail( context['preview_file'], {'size': context['thumbnail_size']}) context['thumb'] = thumb preview = render_to_string(template, context) if node.is_folder(): preview += render_to_string( template, { 'node': node, 'preview_file': node.get_preview_file(default_name='_folder_expanded'), 'class': 'expanded' }) return preview
def get_results(self, request): """ Temporarily decreases the `level` attribute of all search results in order to prevent indendation when displaying them. """ super(FileNodeChangeList, self).get_results(request) try: reduce_levels = abs(int(get_request_attr( request, 'reduce_levels', 0))) except TypeError: reduce_levels = 0 is_filtered = self.is_filtered(request) if is_filtered or reduce_levels: for item in self.result_list: item.prevent_save() item.actual_level = item.level if is_filtered: item.reduce_levels = item.level item.level = 0 else: item.reduce_levels = reduce_levels item.level = max(0, item.level - reduce_levels)
def get_results(self, request): """ Temporarily decreases the `level` attribute of all search results in order to prevent indendation when displaying them. """ super(MediaTreeChangeList, self).get_results(request) try: reduce_levels = abs(int(get_request_attr(request, 'reduce_levels', 0))) except TypeError: reduce_levels = 0 is_filtered = self.is_filtered(request) if is_filtered or reduce_levels: for item in self.result_list: item.prevent_save() item.actual_level = item.level if is_filtered: item.reduce_levels = item.level item.level = 0 else: item.reduce_levels = reduce_levels item.level = max(0, item.level - reduce_levels)
def admin_preview(self, node, icons_only=False): request = get_current_request() template = 'admin/media_tree/filenode/includes/preview.html' if not get_media_backend(): icons_only = True template = 'media_tree/filenode/includes/icon.html' # TODO SPLIT preview.html in two: one that doesn't need media backend! thumb_size_key = get_request_attr(request, 'thumbnail_size') or 'default' preview = render_to_string(template, { 'node': node, 'preview_file': node.get_icon_file() if icons_only else node.get_preview_file(), 'class': 'collapsed' if node.is_folder() else '', 'thumbnail_size': app_settings.MEDIA_TREE_ADMIN_THUMBNAIL_SIZES[thumb_size_key] }) if node.is_folder(): preview += render_to_string(template, { 'node': node, 'preview_file': node.get_preview_file(default_name='_folder_expanded'), 'class': 'expanded' }) return preview
def get_parent_folder(self, request): return get_request_attr(request, 'parent_folder', None)