[Pypi-checkins] r941 - in trunk/pypi: . tools

martin.von.loewis python-checkins at python.org
Wed Aug 17 19:16:39 CEST 2011


Author: martin.von.loewis
Date: Wed Aug 17 19:16:39 2011
New Revision: 941

Added:
   trunk/pypi/tools/sql-migrate-20110831.sql   (contents, props changed)
Modified:
   trunk/pypi/store.py
   trunk/pypi/webui.py
Log:
Add user deletion facility.


Modified: trunk/pypi/store.py
==============================================================================
--- trunk/pypi/store.py	(original)
+++ trunk/pypi/store.py	Wed Aug 17 19:16:39 2011
@@ -1398,12 +1398,16 @@
         return res[0]
 
     _User_Packages = FastResultRow('package_name')
-    def user_packages(self, user):
+    def user_packages(self, user, only_owner=False):
         ''' Retrieve package info for all packages of a user
         '''
         cursor = self.get_cursor()
+        owner_sql = ''
+        if only_owner:
+            owner_sql = "and roles.role_name='Owner'"
         sql = '''select distinct(package_name),lower(package_name) from roles
                  where roles.user_name=%s and package_name is not NULL
+                 ''' + owner_sql + '''
                  order by lower(package_name)'''
         safe_execute(cursor, sql, (user,))
         res = cursor.fetchall()
@@ -1411,6 +1415,28 @@
             res = []
         return Result(None, res, self._User_Packages)
 
+    def delete_user(self, user):
+        '''Delete a user. Return None.'''
+        cursor = self.get_cursor()
+        # delete all maintainer roles
+        safe_execute(cursor,
+                     '''delete from roles where role_name='Maintainer'
+                        and user_name=%s''',
+                     (user,))
+        # point all journal entries to the "deleted user"
+        safe_execute(cursor,
+                     '''update journals set name='deleted user' where name=%s''',
+                     (user,))
+        # delete all cookies
+        safe_execute(cursor,
+                     '''delete from cookies where name=%s''',
+                     (user,))       
+        # every other reference should either be cascading, 
+        # or it's a bug to break it
+
+        # delete user account itself
+        safe_execute(cursor, 'delete from users where name=%s', (user,))
+
     #
     # Trove
     #

Added: trunk/pypi/tools/sql-migrate-20110831.sql
==============================================================================
--- (empty file)
+++ trunk/pypi/tools/sql-migrate-20110831.sql	Wed Aug 17 19:16:39 2011
@@ -0,0 +1,2 @@
+insert into users(name, password, email, gpg_keyid, last_login)
+values('deleted user', 'invalid', '', '', '2000-01-01');

Modified: trunk/pypi/webui.py
==============================================================================
--- trunk/pypi/webui.py	(original)
+++ trunk/pypi/webui.py	Wed Aug 17 19:16:39 2011
@@ -520,7 +520,7 @@
         display register_form user_form forgotten_password_form user
         password_reset role role_form list_classifiers login logout files
         file_upload show_md5 doc_upload claim openid openid_return dropid
-        clear_auth addkey delkey lasthour json gae_file about'''.split():
+        clear_auth addkey delkey lasthour json gae_file about delete_user'''.split():
             getattr(self, action)()
         else:
             #raise NotFound, 'Unknown action %s' % action
@@ -2314,6 +2314,7 @@
         if self.username:
             user = self.store.get_user(self.username)
             info['new_user'] = False
+            info['owns_packages'] = bool(self.store.user_packages(self.username, True))
             info['name'] = user['name']
             info['email'] = user['email']
             info['action'] = 'Update details'
@@ -2571,6 +2572,31 @@
             self.write_template("password_reset.pt", title="Request password reset",
                 retry=True)
 
+    def delete_user(self):
+        if not self.authenticated:
+            raise Unauthorised
+        if self.form.has_key('submit_ok'):
+            # ok, do it
+            self.store.delete_user(self.username)
+            self.authenticated = self.loggedin = False
+            self.username = self.usercookie = None
+            return self.home()
+        elif self.form.has_key('submit_cancel'):
+            self.ok_message='Deletion cancelled'
+            return self.home()
+        else:
+            message = '''You are about to delete the %s account<br />
+                This action <em>cannot be undone</em>!<br />
+                Are you <strong>sure</strong>?'''%self.username
+
+            fields = [
+                {'name': ':action', 'value': 'delete_user'},
+            ]
+            return self.write_template('dialog.pt', message=message,
+                title='Confirm account deletion', fields=fields)
+
+            
+        
     def send_email(self, recipient, message):
         ''' Send an administrative email to the recipient
         '''


More information about the Pypi-checkins mailing list