utils/sdv.py

Contains helper functions internally used by django-jinja-knockout. Some of these might be useful in Django project modules.

Class / model helpers

  • get_object_members()
  • get_class_that_defined_method()
  • extend_instance() - allows to dynamically add mixin class to class instance. Can be used to dynamically add different BsTabsMixin ancestors to create context-aware navbar menus.
  • FuncArgs - class which instance may hold args / kwargs which then may be applied to the specified method.
  • get_str_type() - get string of type for the specified object.
  • get_choice_str() - Similar to Django model built-in magic method get_FOO_display() but does not require to have an instance of particular Django model object.

For example:

class Member(models.Model):

    # ... skipped ...
    role = models.IntegerField(choices=ROLES, default=ROLE_MEMBER, verbose_name='Member role')

from .models import Member
from django_jinja_knockout.models import get_choice_str

# ... skipped ...
role_str = sdv.get_choice_str(Member.ROLES, role_val)

Debug logging

dbg() - dumps value into text log file ‘sdv_out.py3’ under name label. To setup log file path specify the LOGPATH value in Django project settings.py like that:

import os
from django_jinja_knockout.utils import sdv

# create log file inside active virtualenv path
sdv.LOGPATH = [os.environ['VIRTUAL_ENV'], 'djk-sample', 'logs']

Then one may use it to log variables in Python code:

from django_jinja_knockout.utils import sdv

class Project(models.Model):

  # ... skipped ...

  def save(self, *args, **kwargs):
      sdv.dbg('self.pk', self.pk)
      # ... skipped ...

When Project.save() method will be executed, ‘sdv_out.py3’ log file will contain lines like this:

# /home/user/work/djk_sample/djk-sample/club-app/models.py::save()::251
# self.pk
9

Where 9 was the value of self.pk.

Iteration

  • reverse_enumerate()
  • iter_enumerate() - enumerates both dicts, lists and tuples of lists (dict-like structures with repeated keys) in unified way.
  • yield_ordered() - ordered enumeration of dicts (Python 3.6+) / OrderedDict / lists.

Nested data structures access

  • get_nested() / set_nested() / nested_values() for nested data with mixed lists / dicts.
  • nested_update() recursive update of Python dict. Used in Datatables extended classes to update super() .get_actions() action dict.

String helpers

  • str_to_numeric - convert string to numeric value, when possible.