Search code examples
django-cms

How to update djangocms-blog post extensions fields position?


I have some post extensions adding new fields in my Posts objects.

I created the migration, launched my website, and I thought that maybe customizing the fieldsets would allow me to customize the position of the post extensions fieldset too.

That didn't seems to be the case. I created a new SmallIntegerField named my_new_field in a PostExtension class that I registered using blog_admin.register_extension(PostExtensionInline) (I also created the PostExtensionInline class by following the doc).

I added a breakpoint in my update_fields function that I'm using to update the order of the fields of my posts (see this SO question and its answer for more infos on this), and I can't find any mention to my_new_field in the fgets arg:

Quit the server with CONTROL-C.
> /home/me/my-test-app/my_test_app/update_fields.py(3)update_fields()
-> return fsets
(Pdb) l
  1     def update_fields(fsets, request, obj):
  2         breakpoint()
  3  ->     return fsets
[EOF]
(Pdb) fsets
[(None, {'fields': ['title', 'subtitle', 'slug', 'publish', 'categories', 'abstract', 'sites', 'author']}), ('Info', {'fields': [['tags', 'related'], ['date_published', 'date_published_end', 'date_featured'], 'app_config', 'enable_comments'], 'classes': ('collapse',)}), ('Images', {'fields': [['main_image', 'main_image_thumbnail', 'main_image_full']], 'classes': ('collapse',)}), ('SEO', {'fields': [['meta_description', 'meta_title', 'meta_keywords']], 'classes': ('collapse',)})]

How can I update my field position? (see edit below)


edit: I can't think of a way to tweak the order of the post extension fields. But I realized that my real problem (yeah yeah that's a case of XYproblem) is that I want conditional inline (only include the post extension for a certain apphook that's using a defined BlogConfig instance.

How to conditionally add the inline post extension form/fields to my admin create form based on the BlogConfig instance?


Solution

  • So I figured it out (and it's not pretty, but it works).

    I added those lines in my admin.py:

    # replace PostAdmin get_inlines function in order to hide event_date on regular blog posts
    from djangocms_blog.admin import PostAdmin
    from .misc import get_inline_instances as patched_get_inline_instances
    PostAdmin.get_inline_instances = patched_get_inline_instances
    

    And here's my code on misc.py:

    def get_inline_instances(self, request, obj=None):
        from djangocms_blog.cms_appconfig import BlogConfig
        from djangocms_blog.admin import PostAdmin
        from json import loads
    
        inline_instances = super(PostAdmin, self).get_inline_instances(request, obj)
    
        if "app_config" in request.GET:
            # get blog config instance from request
            blog_config = BlogConfig.objects.filter(pk=request.GET["app_config"])
            # get config from saved json
            config = loads(blog_config.values()[0]["app_data"])
            # get template_prefix from config
    
            if config:
                template_prefix = config['config']['template_prefix']
                if template_prefix == "djangocms_blog_agenda":
                    return inline_instances
        return []
    

    I used the template_prefix value in a BlogConfig instance of djangocms_blog to update the code based on the request:

    • If we have "djangocms_blog_agenda" in the template_prefix, then return the inline instances.
    • If we don't have this (default BlogConfig, another BlogConfig that do not need my current post extension fields), return an empty list.

    The result can be viewed here:

    blog screenshot

    Blog posts list screenshot, we can see that the articles are displayed by most recent "published date" first.


    select blog config screenshot

    We can select our blog config after a click on "Blog > Add Post...".


    agenda screenshot

    Agenda post creation screenshot, we can see that there's a post extension named "event date" (not present in Blog post creation screenshot).


    agenda list screenshot

    Agenda list screenshot, we can see that the "events" are displayed by nearest future "event date" date.