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
Example #2
0
    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)
Example #5
0
 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)
Example #9
0
    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
Example #10
0
    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)
Example #12
0
 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)
 def get_parent_folder(self, request):
     return get_request_attr(request, 'parent_folder', None)
 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)