Implement User.delete() (#540)
authorSebastian Spaeth <Sebastian@SSpaeth.de>
Wed, 28 Nov 2012 14:46:40 +0000 (15:46 +0100)
committerSebastian Spaeth <Sebastian@SSpaeth.de>
Thu, 17 Jan 2013 10:48:49 +0000 (11:48 +0100)
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)

mediagoblin/db/models.py

index e8616404826fb050f597adb1872e3efa2c0e9f9d..1c6cbda779be3d9722f417c4bbe7afa24bdc3e04 100644 (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?