Implement User.delete() (#540)

Set User.collections to her Collections using the backref feature.
This way we can iterate a user's collections and delete them all.

Delete all MediaEntries/Files/attachments/comments/collections etc
before finally deleting the User object. This is the backend work for
issue 302 (allow a user to delete ones own account)
This commit is contained in:
Sebastian Spaeth 2012-11-28 15:46:40 +01:00
parent 242776e363
commit 03b4fc500c

View File

@ -81,6 +81,27 @@ class User(Base, UserMixin):
'admin' if self.is_admin else 'user',
self.username)
def delete(self, **kwargs):
"""Deletes a User and all related entries/comments/files/..."""
# Delete this user's Collections and all contained CollectionItems
for collection in self.collections:
collection.delete(commit=False)
media_entries = MediaEntry.query.filter(MediaEntry.uploader == self.id)
for media in media_entries:
# TODO: Make sure that "MediaEntry.delete()" also deletes
# all related files/Comments
media.delete(del_orphan_tags=False, commit=False)
# Delete now unused tags
# TODO: import here due to cyclic imports!!! This cries for refactoring
from mediagoblin.db.sql.util import clean_orphan_tags
clean_orphan_tags(commit=False)
# Delete user, pass through commit=False/True in kwargs
super(User, self).delete(**kwargs)
_log.info('Deleted user "{0}" account'.format(self.username))
class MediaEntry(Base, MediaEntryMixin):
"""
@ -393,7 +414,7 @@ class Collection(Base, CollectionMixin):
# TODO: No of items in Collection. Badly named, can we migrate to num_items?
items = Column(Integer, default=0)
get_creator = relationship(User)
get_creator = relationship(User, backref="collections")
def get_collection_items(self, ascending=False):
#TODO, is this still needed with self.collection_items being available?