[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