def unsubscribe(self, person, unsubscribed_by, ignore_permissions=False): """See ISpecification.""" # see if a relevant subscription exists, and if so, delete it if person is None: person = unsubscribed_by for sub in self.subscriptions: if sub.person.id == person.id: if (not sub.canBeUnsubscribedByUser(unsubscribed_by) and not ignore_permissions): raise UserCannotUnsubscribePerson( '%s does not have permission to unsubscribe %s.' % (unsubscribed_by.displayname, person.displayname)) get_property_cache(self).subscriptions.remove(sub) SpecificationSubscription.delete(sub.id) artifacts_to_delete = getUtility(IAccessArtifactSource).find( [self]) getUtility(IAccessArtifactGrantSource).revokeByArtifact( artifacts_to_delete, [person]) return
def unsubscribe(self, person, unsubscribed_by, ignore_permissions=False): """See ISpecification.""" # see if a relevant subscription exists, and if so, delete it if person is None: person = unsubscribed_by for sub in self.subscriptions: if sub.person.id == person.id: if (not sub.canBeUnsubscribedByUser(unsubscribed_by) and not ignore_permissions): raise UserCannotUnsubscribePerson( '%s does not have permission to unsubscribe %s.' % ( unsubscribed_by.displayname, person.displayname)) get_property_cache(self).subscriptions.remove(sub) SpecificationSubscription.delete(sub.id) artifacts_to_delete = getUtility( IAccessArtifactSource).find([self]) getUtility(IAccessArtifactGrantSource).revokeByArtifact( artifacts_to_delete, [person]) return
def subscribe(self, person, subscribed_by=None, essential=False): """See ISpecification.""" if subscribed_by is None: subscribed_by = person # Create or modify a user's subscription to this blueprint. # First see if a relevant subscription exists, and if so, return it sub = self.subscription(person) if sub is not None: if sub.essential != essential: # If a subscription already exists, but the value for # 'essential' changes, there's no need to create a new # subscription, but we modify the existing subscription # and notify the user about the change. sub.essential = essential # The second argument should really be a copy of sub with # only the essential attribute changed, but we know # that we can get away with not examining the attribute # at all - it's a boolean! notify( ObjectModifiedEvent(sub, sub, ['essential'], user=subscribed_by)) return sub # since no previous subscription existed, create and return a new one sub = SpecificationSubscription(specification=self, person=person, essential=essential) property_cache = get_property_cache(self) if 'subscription' in property_cache: from lp.registry.model.person import person_sort_key property_cache.subscriptions.append(sub) property_cache.subscriptions.sort( key=lambda sub: person_sort_key(sub.person)) if self.information_type in PRIVATE_INFORMATION_TYPES: # Grant the subscriber access if they can't see the # specification. service = getUtility(IService, 'sharing') ignored, ignored, shared_specs = service.getVisibleArtifacts( person, specifications=[self], ignore_permissions=True) if not shared_specs: service.ensureAccessGrants([person], subscribed_by, specifications=[self]) notify(ObjectCreatedEvent(sub, user=subscribed_by)) return sub
def subscription(self, person): """See ISpecification.""" return SpecificationSubscription.selectOneBy(specification=self, person=person)
def subscription(self, person): """See ISpecification.""" return SpecificationSubscription.selectOneBy( specification=self, person=person)