def getSubscription(self, principal=None):
        if principal is None:
            principal = getPrincipal().id

        try:
            return getUtility(ISubscriptions).search(
                object = self.context, principal={'any_of': (principal,)},
                visibility = None, type = {'any_of': (self.type,)})[0]
        except IndexError:
            return None
    def isSubscribedInParents(self, context=None, principal=None):
        if principal is None:
            principal = getPrincipal().id

        ids = getUtility(IIntIds)

        if context is None:
            context = self.context

        contexts = INotificationsContexts(context).getContexts()

        if getUtility(ISubscriptions).search(
            object = {'any_of': contexts}, principal={'any_of': (principal,)},
            visibility = None, type = {'any_of': (self.type,)}):
            return True

        return False
 def unsubscribe(self, principal=None):
     if principal is None:
         principal = getPrincipal().id
     getUtility(ISubscriptions).removeSubscription(
         self.context, principal, self.type)
 def subscribe(self, principal=None):
     if principal is None:
         principal = getPrincipal().id
     if not self.isSubscribed(principal):
         getUtility(ISubscriptions).add(self.context, self.create(principal))