def walk_subscriptions(obj, cutoff_level=None): """ Get subscriptions on `obj` and all of its children. Returns a generator that yields tuples in the form `(obj, n, subscription)`. If `cutoff_level` is set to an integer x, than at most x levels will be walked, first included. """ if cutoff_level == 0: return elif cutoff_level is not None: cutoff_level -= 1 try: sc = ISubscriptionContainer(obj) except TypeError: # we reached an object that does not support subscription return for n, subscription in sc.list_with_keys(): yield (obj, n, subscription) for child_obj in obj.objectValues(): for item in walk_subscriptions(child_obj, cutoff_level): yield item
def _validate_subscription(self, **kw): """ Validate add/edit subscription for authorized and anonymous users """ if (kw['notif_type'] not in self.available_notif_types(kw['location']) and not (kw['notif_type'] == 'administrative' and self.checkPermissionPublishObjects())): raise i18n_exception(ValueError, 'Subscribing to ${notif_type} ' 'notifications in "${location}" not allowed', location=kw['location'] or self.getSite().title, notif_type=kw['notif_type']) try: obj = self.getSite().restrictedTraverse(kw['location']) except: raise i18n_exception(ValueError, 'This path is invalid or protected') try: subscription_container = ISubscriptionContainer(obj) except: raise i18n_exception(ValueError, 'Cannot subscribe to this folder') if kw.get('anonymous', False): #Check if subscription exists for this anonymous subscriber if not is_valid_email(kw.get('email', '')): raise i18n_exception(ValueError, 'Your e-mail address does not appear to be valid.') for id, subscription in subscription_container.list_with_keys(): #Normal subscriptions don't have e-mail if isinstance(subscription, AnonymousSubscription): if (subscription.email == kw['email'] and subscription.notif_type == kw['notif_type'] and subscription.lang == kw['lang']): raise i18n_exception(ValueError, 'Subscription already exists')
def _validate_subscription(self, **kw): """ Validate add/edit subscription for authorized and anonymous users """ if kw['notif_type'] not in self.available_notif_types(kw['location']): raise i18n_exception(ValueError, 'Subscribing to notifications in ' '"${location}" not allowed', location=kw['location']) try: obj = self.getSite().restrictedTraverse(kw['location']) except: raise i18n_exception(ValueError, 'This path is invalid or protected') try: subscription_container = ISubscriptionContainer(obj) except: raise i18n_exception(ValueError, 'Cannot subscribe to this folder') if not kw.get('anonymous', False): n = utils.match_account_subscription(subscription_container, kw['user_id'], kw['notif_type'], kw['lang']) if n is not None: raise i18n_exception(ValueError, 'Subscription already exists') else: #Check if subscription exists for this anonymous subscriber if not is_valid_email(kw.get('email', '')): raise i18n_exception(ValueError, 'Your e-mail address does not appear to be valid.') for id, subscription in subscription_container.list_with_keys(): #Normal subscriptions don't have e-mail if isinstance(subscription, AnonymousSubscription): if (subscription.email == kw['email'] and subscription.notif_type == kw['notif_type'] and subscription.lang == kw['lang']): raise i18n_exception(ValueError, 'Subscription already exists')
def walk_subscriptions(obj): """ Get subscriptions on `obj` and all of its children. Returns a generator that yields tuples in the form `(obj, n, subscription)`. """ try: sc = ISubscriptionContainer(obj) except TypeError: # we reached an object that does not support subscription return for n, subscription in sc.list_with_keys(): yield (obj, n, subscription) for child_obj in obj.objectValues(): for item in walk_subscriptions(child_obj): yield item
def remove_anonymous_subscription(self, email, location, notif_type, lang): try: obj = self.getSite().restrictedTraverse(location) except: raise i18n_exception(ValueError, 'Invalid location') try: subscription_container = ISubscriptionContainer(obj) except: raise i18n_exception(ValueError, 'Invalid container') anonymous_subscriptions = [(n, s) for n, s in subscription_container.list_with_keys() if hasattr(s, 'email')] subscriptions = filter(lambda s: (s[1].email == email and s[1].location == location and s[1].notif_type == notif_type), anonymous_subscriptions) if len(subscriptions) == 1: subscription_container.remove(subscriptions[0][0]) else: raise i18n_exception(ValueError, 'Subscription not found')
def remove_anonymous_subscription(self, email, location, notif_type, lang): try: obj = self.getSite().restrictedTraverse(location) except: raise i18n_exception(ValueError, 'Invalid location') try: subscription_container = ISubscriptionContainer(obj) except: raise i18n_exception(ValueError, 'Invalid container') anonymous_subscriptions = [ (n, s) for n, s in subscription_container.list_with_keys() if hasattr(s, 'email') ] subscriptions = filter( lambda s: (s[1].email == email and s[1].location == location and s[ 1].notif_type == notif_type), anonymous_subscriptions) if len(subscriptions) == 1: subscription_container.remove(subscriptions[0][0]) else: raise i18n_exception(ValueError, 'Subscription not found')