Beispiel #1
0
def make_observable(
        cls,
        exclude=['modified'],
        auto_subscriber_fields=['parent', 'owner', 'author', 'created_by']):
    """Adds Observable mix-in to the given class.

    Should be placed before every other signal connection for the given class.

    @param cls The object class which needs to be observed.
    @param exclude The list of fields to not track in changes.
    @param auto_subscriber_fields The list of fields which should be automatically
                                  added as subscribers.
    """
    cls = get_model(cls)
    if not issubclass(cls, Observable):

        class _Observable(Observable):
            __change_exclude = exclude
            __subscriber_fields = auto_subscriber_fields

        _Observable.__name__ = cls.__name__ + str("Observable")

        setattr(sys.modules[__name__], _Observable.__name__, _Observable)

        cls.__bases__ += (_Observable, )

        models.signals.pre_delete.connect(_cache_followers,
                                          sender=cls,
                                          dispatch_uid="%s_cache_followers" %
                                          cls.__name__)
        models.signals.post_save.connect(_notify_changes,
                                         sender=cls,
                                         dispatch_uid="%s_notify_changes" %
                                         cls.__name__)
Beispiel #2
0
def make_default_notifier(
        cls,
        exclude=['modified'],
        auto_subscriber_fields=['parent', 'owner', 'author', 'created_by']):
    """Makes the class observable and notify creation, changing and deletion.
    
    This implicitly adds Observable to "cls".

    @param cls The object class which should automatically post notifies.
    @param exclude The list of fields that should not be notified on changes.
    @param auto_subscriber_fields The list of fields which should be automatically
                                  added as subscribers.
    """
    cls = get_model(cls)
    make_observable(cls, exclude, auto_subscriber_fields)
    models.signals.post_save.connect(notify_object_created,
                                     sender=cls,
                                     dispatch_uid="%s_created" % cls.__name__)
    post_change.connect(notify_object_changed,
                        sender=cls,
                        dispatch_uid="%s_changed" % cls.__name__)
    models.signals.m2m_changed.connect(notify_m2m_changed,
                                       sender=cls,
                                       dispatch_uid="%s_m2m_changed" %
                                       cls.__name__)
    models.signals.post_delete.connect(notify_object_deleted,
                                       sender=cls,
                                       dispatch_uid="%s_deleted" %
                                       cls.__name__)
Beispiel #3
0
def make_observable(cls, exclude=['modified'], auto_subscriber_fields=['parent', 'owner', 'author', 'created_by']):
    """Adds Observable mix-in to the given class.

    Should be placed before every other signal connection for the given class.

    @param cls The object class which needs to be observed.
    @param exclude The list of fields to not track in changes.
    @param auto_subscriber_fields The list of fields which should be automatically
                                  added as subscribers.
    """
    cls = get_model(cls)        
    if not issubclass(cls, Observable):

        class _Observable(Observable):
            __change_exclude = exclude
            __subscriber_fields = auto_subscriber_fields

        _Observable.__name__ = cls.__name__ + str("Observable")

        setattr(sys.modules[__name__], _Observable.__name__, _Observable)

        cls.__bases__ += (_Observable,)

        models.signals.pre_delete.connect(_cache_followers, sender=cls, dispatch_uid="%s_cache_followers" % cls.__name__)
        models.signals.post_save.connect(_notify_changes, sender=cls, dispatch_uid="%s_notify_changes" % cls.__name__)
Beispiel #4
0
def manage_bookmarks(cls, enabled=True):
    """Connects handlers for bookmarks management.
    
    This handler could be used to automatically create a related bookmark list
    on given model class instance creation. i.e.:
    
    >> manage_bookmarks(User)
        
    It will auto generate a bookmark list associated to each new User's instance.
    
    To disconnect:
    
    >> manage_bookmarks(User, False)
    """
    cls = get_model(cls)
    cls_name = cls.__name__.lower()
    create_dispatch_uid = "create_%s_bookmarks" % cls_name
    delete_dispatch_uid = "delete_%s_bookmarks" % cls_name
    
    if enabled:
        post_save.connect(_create_bookmarks, cls, dispatch_uid=create_dispatch_uid)
        pre_delete.connect(_delete_bookmarks, cls, dispatch_uid=delete_dispatch_uid)
        
    else:
        post_save.disconnect(_create_bookmarks, cls, dispatch_uid=create_dispatch_uid)
        pre_delete.disconnect(_delete_bookmarks, cls, dispatch_uid=delete_dispatch_uid)
Beispiel #5
0
def make_notification_target(cls):
    """Adds NotificationTarget mix-in to the given class.

    @param cls The object class.
    """
    cls = get_model(cls)
    if not issubclass(cls, NotificationTarget):
        cls.__bases__ += (NotificationTarget, )
Beispiel #6
0
def make_notification_target(cls):
    """Adds NotificationTarget mix-in to the given class.

    @param cls The object class.
    """
    cls = get_model(cls)
    if not issubclass(cls, NotificationTarget):
        cls.__bases__ += (NotificationTarget,)
Beispiel #7
0
def raw_model_name(obj):
    """Returns the raw model name for the given instance.

    Example usage: {{ object|raw_model_name }}
    """
    try:
        mk = get_model(obj)
        return mk.__name__.lower()
    except:
        pass
    return ""
Beispiel #8
0
def model_name_plural(obj):
    """Returns the pluralized model name for the given instance.

    Example usage: {{ object|model_name_plural }}
    """
    try:
        mk = get_model(obj)
        return force_text(mk._meta.verbose_name_plural)
    except:
        pass
    return ""
Beispiel #9
0
def raw_model_name(obj):
    """Returns the raw model name for the given instance.

    Example usage: {{ object|raw_model_name }}
    """
    try:
        mk = get_model(obj)
        return mk.__name__.lower()
    except:
        pass
    return ""
Beispiel #10
0
def model_name_plural(obj):
    """Returns the pluralized model name for the given instance.

    Example usage: {{ object|model_name_plural }}
    """
    try:
        mk = get_model(obj)
        return force_text(mk._meta.verbose_name_plural)
    except:
        pass
    return ""
Beispiel #11
0
def manage_dashboard(cls, default_title=_("Dashboard")):
    """Connects handlers for dashboard management.
    
    This handler could be used to automatically create a related dashboard on
    given model class instance creation. i.e.:
    
    >> manage_dashboard(Project, _("Project's dashboard"))
        
    It will auto generate a dashboard associated to each new Project's instance
    with title "Project's dashboard". If no title is passed, default title will
    be used ("Dashboard").
    """
    cls = get_model(cls)
    global _dashboard_registry
    _dashboard_registry.manage_dashboard(cls, default_title)
Beispiel #12
0
def manage_dashboard(cls, default_title=_("Dashboard")):
    """Connects handlers for dashboard management.
    
    This handler could be used to automatically create a related dashboard on
    given model class instance creation. i.e.:
    
    >> manage_dashboard(Project, _("Project's dashboard"))
        
    It will auto generate a dashboard associated to each new Project's instance
    with title "Project's dashboard". If no title is passed, default title will
    be used ("Dashboard").
    """
    cls = get_model(cls)
    global _dashboard_registry
    _dashboard_registry.manage_dashboard(cls, default_title)
Beispiel #13
0
def make_default_notifier(cls, exclude=['modified'], auto_subscriber_fields=['parent', 'owner', 'author', 'created_by']):
    """Makes the class observable and notify creation, changing and deletion.
    
    This implicitly adds Observable to "cls".

    @param cls The object class which should automatically post notifies.
    @param exclude The list of fields that should not be notified on changes.
    @param auto_subscriber_fields The list of fields which should be automatically
                                  added as subscribers.
    """
    cls = get_model(cls)
    make_observable(cls, exclude, auto_subscriber_fields)
    models.signals.post_save.connect(notify_object_created, sender=cls, dispatch_uid="%s_created" % cls.__name__)
    post_change.connect(notify_object_changed, sender=cls, dispatch_uid="%s_changed" % cls.__name__)
    models.signals.m2m_changed.connect(notify_m2m_changed, sender=cls, dispatch_uid="%s_m2m_changed" % cls.__name__)
    models.signals.post_delete.connect(notify_object_deleted, sender=cls, dispatch_uid="%s_deleted" % cls.__name__)