def mark_as_deleted(self): copied_user = copy(self) self.email = '{}@deleted'.format(self.id) self.password = None self.active = False self.first_name = 'DELETED' self.last_name = 'DELETED' self.avatar = None self.avatar_url = None self.website = None self.about = None self.extras = None self.deleted = datetime.now() self.save() for organization in self.organizations: organization.members = [member for member in organization.members if member.user != self] organization.save() for discussion in Discussion.objects(discussion__posted_by=self): for message in discussion.discussion: if message.posted_by == self: message.content = 'DELETED' discussion.save() Follow.objects(follower=self).delete() Follow.objects(following=self).delete() mail.send(_('Account deletion'), copied_user, 'account_deleted')
def purge_organizations(self): for organization in Organization.objects(deleted__ne=None): log.info(f'Purging organization {organization}') # Remove followers Follow.objects(following=organization).delete() # Remove activity Activity.objects(related_to=organization).delete() Activity.objects(organization=organization).delete() # Remove transfers Transfer.objects(recipient=organization).delete() Transfer.objects(owner=organization).delete() # Store datasets for later reindexation d_ids = [d.id for d in Dataset.objects(organization=organization)] # Remove organization's logo in all sizes if organization.logo.filename is not None: storage = storages.avatars storage.delete(organization.logo.filename) storage.delete(organization.logo.original) for key, value in organization.logo.thumbnails.items(): storage.delete(value) # Remove organization.delete() # Reindex the datasets that were linked to the organization for id in d_ids: reindex(Dataset.__name__, str(id))
def mark_as_deleted(self): copied_user = copy(self) self.email = '{}@deleted'.format(self.id) self.password = None self.active = False self.first_name = 'DELETED' self.last_name = 'DELETED' self.avatar = None self.avatar_url = None self.website = None self.about = None self.deleted = datetime.now() self.save() for organization in self.organizations: organization.members = [ member for member in organization.members if member.user != self ] organization.save() for discussion in Discussion.objects(discussion__posted_by=self): for message in discussion.discussion: if message.posted_by == self: message.content = 'DELETED' discussion.save() Follow.objects(follower=self).delete() Follow.objects(following=self).delete() mail.send(_('Account deletion'), copied_user, 'account_deleted')
def purge_datasets(self): for dataset in Dataset.objects(deleted__ne=None): log.info(f'Purging dataset {dataset}') # Remove followers Follow.objects(following=dataset).delete() # Remove issues Issue.objects(subject=dataset).delete() # Remove discussions Discussion.objects(subject=dataset).delete() # Remove activity Activity.objects(related_to=dataset).delete() # Remove topics' related dataset for topic in Topic.objects(datasets=dataset): datasets = topic.datasets datasets.remove(dataset) topic.update(datasets=datasets) # Remove HarvestItem references HarvestJob.objects(items__dataset=dataset).update( set__items__S__dataset=None) # Remove each dataset's resource's file storage = storages.resources for resource in dataset.resources: if resource.fs_filename is not None: storage.delete(resource.fs_filename) # Remove each dataset related community resource and it's file community_resources = CommunityResource.objects(dataset=dataset) for community_resource in community_resources: if community_resource.fs_filename is not None: storage.delete(community_resource.fs_filename) community_resource.delete() # Remove dataset dataset.delete()
def purge_reuses(self): for reuse in Reuse.objects(deleted__ne=None): log.info('Purging reuse "{0}"'.format(reuse)) # Remove followers Follow.objects(following=reuse).delete() # Remove issues Issue.objects(subject=reuse).delete() # Remove discussions Discussion.objects(subject=reuse).delete() # Remove activity Activity.objects(related_to=reuse).delete() reuse.delete()
def purge_organizations(self): for organization in Organization.objects(deleted__ne=None): log.info('Purging organization "{0}"'.format(organization)) # Remove followers Follow.objects(following=organization).delete() # Remove activity Activity.objects(related_to=organization).delete() Activity.objects(organization=organization).delete() # Remove metrics Metrics.objects(object_id=organization.id).delete() # Remove organization.delete()
def purge_reuses(self): for reuse in Reuse.objects(deleted__ne=None): log.info('Purging reuse "{0}"'.format(reuse)) # Remove followers Follow.objects(following=reuse).delete() # Remove issues Issue.objects(subject=reuse).delete() # Remove discussions Discussion.objects(subject=reuse).delete() # Remove activity Activity.objects(related_to=reuse).delete() # Remove metrics Metrics.objects(object_id=reuse.id).delete() reuse.delete()
def purge_organizations(self): for organization in Organization.objects(deleted__ne=None): log.info('Purging organization "{0}"'.format(organization)) # Remove followers Follow.objects(following=organization).delete() # Remove activity Activity.objects(related_to=organization).delete() Activity.objects(organization=organization).delete() # Store datasets for later reindexation d_ids = [d.id for d in Dataset.objects(organization=organization)] # Remove organization.delete() # Reindex the datasets that were linked to the organization for id in d_ids: reindex(Dataset.__name__, str(id))
def purge_reuses(self): for reuse in Reuse.objects(deleted__ne=None): log.info(f'Purging reuse {reuse}') # Remove followers Follow.objects(following=reuse).delete() # Remove discussions Discussion.objects(subject=reuse).delete() # Remove activity Activity.objects(related_to=reuse).delete() # Remove transfers Transfer.objects(subject=reuse).delete() # Remove reuse's logo in all sizes if reuse.image.filename is not None: storage = storages.images storage.delete(reuse.image.filename) storage.delete(reuse.image.original) for key, value in reuse.image.thumbnails.items(): storage.delete(value) reuse.delete()
def purge_datasets(self): for dataset in Dataset.objects(deleted__ne=None): log.info('Purging dataset "{0}"'.format(dataset)) # Remove followers Follow.objects(following=dataset).delete() # Remove issues Issue.objects(subject=dataset).delete() # Remove discussions Discussion.objects(subject=dataset).delete() # Remove activity Activity.objects(related_to=dataset).delete() # Remove metrics Metrics.objects(object_id=dataset.id).delete() # Remove topics' related dataset for topic in Topic.objects(datasets=dataset): datasets = topic.datasets datasets.remove(dataset) topic.update(datasets=datasets) # Remove dataset.delete()
def purge_datasets(self): for dataset in Dataset.objects(deleted__ne=None): log.info('Purging dataset "{0}"'.format(dataset)) # Remove followers Follow.objects(following=dataset).delete() # Remove issues Issue.objects(subject=dataset).delete() # Remove discussions Discussion.objects(subject=dataset).delete() # Remove activity Activity.objects(related_to=dataset).delete() # Remove topics' related dataset for topic in Topic.objects(datasets=dataset): datasets = topic.datasets datasets.remove(dataset) topic.update(datasets=datasets) # Remove HarvestItem references HarvestJob.objects(items__dataset=dataset).update( set__items__S__dataset=None) # Remove dataset.delete()
def migrate(db): log.info('Processing Follow references.') count = 0 follows = Follow.objects(following__ne=None).no_cache().all() for follow in follows: try: follow.following.id except mongoengine.errors.DoesNotExist: count += 1 follow.delete() log.info(f'Delete {count} Follow objects')
def purge_datasets(self): for dataset in Dataset.objects(deleted__ne=None): log.info(f'Purging dataset {dataset}') # Remove followers Follow.objects(following=dataset).delete() # Remove discussions Discussion.objects(subject=dataset).delete() # Remove activity Activity.objects(related_to=dataset).delete() # Remove topics' related dataset for topic in Topic.objects(datasets=dataset): datasets = topic.datasets datasets.remove(dataset) topic.update(datasets=datasets) # Remove HarvestItem references HarvestJob.objects(items__dataset=dataset).update( set__items__S__dataset=None) # Remove associated Transfers Transfer.objects(subject=dataset).delete() # Remove each dataset's resource's file storage = storages.resources for resource in dataset.resources: if resource.fs_filename is not None: storage.delete(resource.fs_filename) # Not removing the resource from dataset.resources # with `dataset.remove_resource` as removing elements # from a list while iterating causes random effects. Dataset.on_resource_removed.send(Dataset, document=dataset, resource_id=resource.id) # Remove each dataset related community resource and it's file community_resources = CommunityResource.objects(dataset=dataset) for community_resource in community_resources: if community_resource.fs_filename is not None: storage.delete(community_resource.fs_filename) community_resource.delete() # Remove dataset dataset.delete()
def followers_org_count(self): """Return the number of followers of user's organizations.""" from udata.models import Follow # Circular imports. return sum( Follow.objects(following=org).count() for org in self.organizations)
def count_followers(self): from udata.models import Follow self.metrics['followers'] = Follow.objects( until=None).followers(self).count() self.save()
def test_delete(self): '''It should delete the connected user''' user = self.login() self.assertIsNone(user.deleted) other_user = UserFactory() members = [Member(user=user), Member(user=other_user)] organization = OrganizationFactory(members=members) disc_msg_content = faker.sentence() disc_msg = DiscMsg(content=disc_msg_content, posted_by=user) other_disc_msg_content = faker.sentence() other_disc_msg = DiscMsg(content=other_disc_msg_content, posted_by=other_user) discussion = DiscussionFactory(user=user, discussion=[disc_msg, other_disc_msg]) issue_msg_content = faker.sentence() issue_msg = IssueMsg(content=issue_msg_content, posted_by=user) other_issue_msg_content = faker.sentence() other_issue_msg = IssueMsg(content=other_issue_msg_content, posted_by=other_user) issue = IssueFactory(user=user, discussion=[issue_msg, other_issue_msg]) dataset = DatasetFactory(owner=user) reuse = ReuseFactory(owner=user) resource = CommunityResourceFactory(owner=user) activity = UserCreatedDataset.objects().create(actor=user, related_to=dataset) following = Follow.objects().create(follower=user, following=other_user) followed = Follow.objects().create(follower=other_user, following=user) with capture_mails() as mails: response = self.delete(url_for('api.me')) self.assertEqual(len(mails), 1) self.assertEqual(mails[0].send_to, set([user.email])) self.assertEqual(mails[0].subject, _('Account deletion')) self.assert204(response) user.reload() organization.reload() discussion.reload() issue.reload() dataset.reload() reuse.reload() resource.reload() activity.reload() # The following are deleted with self.assertRaises(Follow.DoesNotExist): following.reload() # The followers are deleted with self.assertRaises(Follow.DoesNotExist): followed.reload() # The personal data of the user are anonymized self.assertEqual(user.email, '{}@deleted'.format(user.id)) self.assertEqual(user.password, None) self.assertEqual(user.active, False) self.assertEqual(user.first_name, 'DELETED') self.assertEqual(user.last_name, 'DELETED') self.assertFalse(bool(user.avatar)) self.assertEqual(user.avatar_url, None) self.assertEqual(user.website, None) self.assertEqual(user.about, None) # The user is marked as deleted self.assertIsNotNone(user.deleted) # The user is removed from his organizations self.assertEqual(len(organization.members), 1) self.assertEqual(organization.members[0].user.id, other_user.id) # The discussions are kept but the messages are anonymized self.assertEqual(len(discussion.discussion), 2) self.assertEqual(discussion.discussion[0].content, 'DELETED') self.assertEqual(discussion.discussion[1].content, other_disc_msg_content) # The issues are kept and the messages are not anonymized self.assertEqual(len(issue.discussion), 2) self.assertEqual(issue.discussion[0].content, issue_msg_content) self.assertEqual(issue.discussion[1].content, other_issue_msg_content) # The datasets are unchanged self.assertEqual(dataset.owner, user) # The reuses are unchanged self.assertEqual(reuse.owner, user) # The community resources are unchanged self.assertEqual(resource.owner, user) # The activities are unchanged self.assertEqual(activity.actor, user)
def get(self, id): '''List all followers for a given object''' args = parser.parse_args() model = self.model.objects.only('id').get_or_404(id=id) qs = Follow.objects(following=model, until=None) return qs.paginate(args['page'], args['page_size'])
def get_value(self): return Follow.objects(until=None).count()
def followers_org_count(self): """Return the number of followers of user's organizations.""" from udata.models import Follow # Circular imports. return sum(Follow.objects(following=org).count() for org in self.organizations)