From python-checkins at python.org Wed Aug 17 18:03:20 2011
From: python-checkins at python.org (martin.von.loewis)
Date: Wed, 17 Aug 2011 18:03:20 +0200 (CEST)
Subject: [Pypi-checkins] r939 - trunk/pypi/templates
Message-ID: <3RfFhm2xzxzMsc@mail.python.org>
Author: martin.von.loewis
Date: Wed Aug 17 18:03:20 2011
New Revision: 939
Modified:
trunk/pypi/templates/display.pt
Log:
Remove note about rating removal.
Modified: trunk/pypi/templates/display.pt
==============================================================================
--- trunk/pypi/templates/display.pt (original)
+++ trunk/pypi/templates/display.pt Wed Aug 17 18:03:20 2011
@@ -244,8 +244,6 @@
-The rating feature has been removed. See catalog-sig for the discussion of this removal.
-
From python-checkins at python.org Wed Aug 17 18:10:06 2011
From: python-checkins at python.org (martin.von.loewis)
Date: Wed, 17 Aug 2011 18:10:06 +0200 (CEST)
Subject: [Pypi-checkins] r940 - trunk/pypi
Message-ID: <3RfFrZ2KfxzMtT@mail.python.org>
Author: martin.von.loewis
Date: Wed Aug 17 18:10:06 2011
New Revision: 940
Modified:
trunk/pypi/standalone.py
Log:
Make standalone server redirect / to /pypi
Modified: trunk/pypi/standalone.py
==============================================================================
--- trunk/pypi/standalone.py (original)
+++ trunk/pypi/standalone.py Wed Aug 17 18:10:06 2011
@@ -9,6 +9,10 @@
self.send_header('Content-Type', content_type)
def run(self):
+ if self.path == '/':
+ self.send_response(301)
+ self.send_header('Location', '/pypi')
+ return
for scriptname in ('/mirrors', '/simple', '/pypi', '/serversig', '/daytime'):
if self.path.startswith(scriptname):
rest = self.path[len(scriptname):]
From python-checkins at python.org Wed Aug 17 19:16:39 2011
From: python-checkins at python.org (martin.von.loewis)
Date: Wed, 17 Aug 2011 19:16:39 +0200 (CEST)
Subject: [Pypi-checkins] r941 - in trunk/pypi: . tools
Message-ID: <3RfHKM6ms2zN8K@mail.python.org>
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
+ This action cannot be undone!
+ Are you sure?'''%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
'''
From python-checkins at python.org Wed Aug 17 19:20:37 2011
From: python-checkins at python.org (martin.von.loewis)
Date: Wed, 17 Aug 2011 19:20:37 +0200 (CEST)
Subject: [Pypi-checkins] r942 - trunk/pypi/templates
Message-ID: <3RfHPx15zVzM5D@mail.python.org>
Author: martin.von.loewis
Date: Wed Aug 17 19:20:36 2011
New Revision: 942
Modified:
trunk/pypi/templates/register.pt
Log:
Support user deletion.
Modified: trunk/pypi/templates/register.pt
==============================================================================
--- trunk/pypi/templates/register.pt (original)
+++ trunk/pypi/templates/register.pt Wed Aug 17 19:20:36 2011
@@ -5,12 +5,22 @@
metal:use-macro="standard_template/macros/page">
-
+
This form allows "traditional" registration (using a password).
Users who want to register with their OpenID (e.g. Google,
myOpenID or Launchpad account) should follow one of the links
to the right.
+
+ This form allows to modify your PyPI account information, and to delete your account.
+
+ You cannot delete your account since you
+ are still listed as owner of some packages.
+