Skip to content
This repository has been archived by the owner on Aug 26, 2022. It is now read-only.

Commit

Permalink
Fix Bug 706530 migrate mt account with most recent login
Browse files Browse the repository at this point in the history
  • Loading branch information
groovecoder committed Dec 7, 2011
1 parent a0e1da5 commit 71904b5
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 13 deletions.
24 changes: 20 additions & 4 deletions apps/dekicompat/backends.py
@@ -1,3 +1,4 @@
from datetime import datetime
from urllib import urlencode
from urllib2 import HTTPError
import urlparse
Expand Down Expand Up @@ -83,17 +84,32 @@ def get_deki_user(deki_user_id=None, url=None, authtoken=None):
return None
return DekiUser.parse_user_info(resp.read())

@staticmethod
def get_deki_user_id(resp):
deki_user_id = None
if resp.status_code is 200:
doc = pq(resp.content)
if len(doc('user')) > 1:
most_recent_login = datetime(2000, 1, 1)
deki_user_id = None
for user in doc('user'):
last_login = datetime.strptime(user.find('date.lastlogin').text,
"%Y-%m-%dT%H:%M:%SZ")
if last_login > most_recent_login:
most_recent_login = last_login
deki_user_id = pq(user).attr('id')
else:
deki_user_id = doc('user').attr('id')
return deki_user_id

@staticmethod
def get_deki_user_by_email(deki_user_email):
"""get_deki_user after an email query"""
deki_user_id = None
email_url = DekiUserBackend.users_by_email % urlencode(
{'usernameemailfilter': deki_user_email,
'apikey': settings.DEKIWIKI_APIKEY})
resp = requests.get(email_url)
if resp.status_code is 200:
doc = pq(resp.content)
deki_user_id = doc('user').attr('id')
deki_user_id = DekiUserBackend.get_deki_user_id(resp)
if deki_user_id:
return DekiUserBackend.get_deki_user(deki_user_id)
else:
Expand Down
1 change: 1 addition & 0 deletions apps/dekicompat/fixtures/email_multiple_users.xml
@@ -0,0 +1 @@
<users count="3" querycount="3" totalcount="154434" href="http://192.168.10.55/@api/deki/users"><user id="83724" href="http://192.168.10.55/@api/deki/users/83724"><nick>Ibn el haithem</nick><username>Ibn el haithem</username><fullname>Ibn el haithem</fullname><email>f487e0b2f7b637e4e7d5dd0ff76b0447@mozilla.com</email><hash.email>47c0077f5cdd10a8a2a92c499e0cdf11</hash.email><uri.gravatar>http://www.gravatar.com/avatar/47c0077f5cdd10a8a2a92c499e0cdf11.png?d=http://192.168.10.55/skins/common/images/default-avatar.png</uri.gravatar><uri.avatar>http://www.gravatar.com/avatar/47c0077f5cdd10a8a2a92c499e0cdf11.png?d=http://192.168.10.55/skins/common/images/default-avatar.png</uri.avatar><date.created>2005-03-15T23:42:24Z</date.created><page.home id="85187" revision="1" href="http://192.168.10.55/@api/deki/pages/85187?redirects=0"><uri.ui>http://192.168.10.55/User:Ibn_el_haithem</uri.ui><title>Ibn el haithem</title><path type="fixed">User:Ibn_el_haithem</path><namespace>user</namespace></page.home><status>active</status><date.lastlogin>2011-12-06T22:20:00Z</date.lastlogin><language /><timezone /><service.authentication id="1" href="http://192.168.10.55/@api/deki/site/services/1" /><permissions.user><operations mask="63">LOGIN,BROWSE,READ,SUBSCRIBE,UPDATE,CREATE</operations><role id="4" href="http://192.168.10.55/@api/deki/site/roles/4">Contributor</role></permissions.user><permissions.effective><operations mask="63">LOGIN,BROWSE,READ,SUBSCRIBE,UPDATE,CREATE</operations></permissions.effective><permissions.revoked /><groups /><properties count="0" href="http://192.168.10.55/@api/deki/users/83724/properties" /></user><user id="27658" href="http://192.168.10.55/@api/deki/users/27658"><nick>Ibnhaithem</nick><username>Ibnhaithem</username><fullname>Ibnhaithem</fullname><email hidden="true" /><hash.email>47c0077f5cdd10a8a2a92c499e0cdf11</hash.email><uri.gravatar>http://www.gravatar.com/avatar/47c0077f5cdd10a8a2a92c499e0cdf11.png?d=http://192.168.10.55/skins/common/images/default-avatar.png</uri.gravatar><uri.avatar>http://www.gravatar.com/avatar/47c0077f5cdd10a8a2a92c499e0cdf11.png?d=http://192.168.10.55/skins/common/images/default-avatar.png</uri.avatar><date.created>2005-03-15T23:42:24Z</date.created><status>active</status><date.lastlogin>2007-01-05T14:57:37Z</date.lastlogin><language /><timezone /><service.authentication id="1" href="http://192.168.10.55/@api/deki/site/services/1" /><permissions.user><operations mask="63">LOGIN,BROWSE,READ,SUBSCRIBE,UPDATE,CREATE</operations><role id="4" href="http://192.168.10.55/@api/deki/site/roles/4">Contributor</role></permissions.user><permissions.effective><operations mask="63">LOGIN,BROWSE,READ,SUBSCRIBE,UPDATE,CREATE</operations></permissions.effective><permissions.revoked /><groups /><properties href="http://192.168.10.55/@api/deki/users/27658/properties" /></user><user id="26224" href="http://192.168.10.55/@api/deki/users/26224"><nick>Bsedki</nick><username>Bsedki</username><fullname>Bsedki</fullname><email hidden="true" /><hash.email>47c0077f5cdd10a8a2a92c499e0cdf11</hash.email><uri.gravatar>http://www.gravatar.com/avatar/47c0077f5cdd10a8a2a92c499e0cdf11.png?d=http://192.168.10.55/skins/common/images/default-avatar.png</uri.gravatar><uri.avatar>http://www.gravatar.com/avatar/47c0077f5cdd10a8a2a92c499e0cdf11.png?d=http://192.168.10.55/skins/common/images/default-avatar.png</uri.avatar><date.created>2005-03-15T23:42:24Z</date.created><status>active</status><date.lastlogin>2006-12-20T01:29:09Z</date.lastlogin><language /><timezone /><service.authentication id="1" href="http://192.168.10.55/@api/deki/site/services/1" /><permissions.user><operations mask="63">LOGIN,BROWSE,READ,SUBSCRIBE,UPDATE,CREATE</operations><role id="4" href="http://192.168.10.55/@api/deki/site/roles/4">Contributor</role></permissions.user><permissions.effective><operations mask="63">LOGIN,BROWSE,READ,SUBSCRIBE,UPDATE,CREATE</operations></permissions.effective><permissions.revoked /><groups /><properties href="http://192.168.10.55/@api/deki/users/26224/properties" /></user></users>
1 change: 1 addition & 0 deletions apps/dekicompat/fixtures/email_single_user.xml
@@ -0,0 +1 @@
<user id="83724" href="http://192.168.10.55/@api/deki/users/83724"><nick>Ibn el haithem</nick><username>Ibn el haithem</username><fullname>Ibn el haithem</fullname><email>f487e0b2f7b637e4e7d5dd0ff76b0447@mozilla.com</email><hash.email>47c0077f5cdd10a8a2a92c499e0cdf11</hash.email><uri.gravatar>http://www.gravatar.com/avatar/47c0077f5cdd10a8a2a92c499e0cdf11.png?d=http://192.168.10.55/skins/common/images/default-avatar.png</uri.gravatar><uri.avatar>http://www.gravatar.com/avatar/47c0077f5cdd10a8a2a92c499e0cdf11.png?d=http://192.168.10.55/skins/common/images/default-avatar.png</uri.avatar><date.created>2005-03-15T23:42:24Z</date.created><page.home id="85187" revision="1" href="http://192.168.10.55/@api/deki/pages/85187?redirects=0"><uri.ui>http://192.168.10.55/User:Ibn_el_haithem</uri.ui><title>Ibn el haithem</title><path type="fixed">User:Ibn_el_haithem</path><namespace>user</namespace></page.home><status>active</status><date.lastlogin>2011-12-06T22:20:00Z</date.lastlogin><language /><timezone /><service.authentication id="1" href="http://192.168.10.55/@api/deki/site/services/1" /><permissions.user><operations mask="63">LOGIN,BROWSE,READ,SUBSCRIBE,UPDATE,CREATE</operations><role id="4" href="http://192.168.10.55/@api/deki/site/roles/4">Contributor</role></permissions.user><permissions.effective><operations mask="63">LOGIN,BROWSE,READ,SUBSCRIBE,UPDATE,CREATE</operations></permissions.effective><permissions.revoked /><groups /><properties count="0" href="http://192.168.10.55/@api/deki/users/83724/properties" /></user>
12 changes: 6 additions & 6 deletions apps/dekicompat/tests.py
Expand Up @@ -19,8 +19,6 @@

from dekicompat.backends import DekiUser, DekiUserBackend

from devmo.models import UserProfile


log = commonware.log.getLogger('mdn.dekicompat')

Expand All @@ -29,6 +27,8 @@
# Need to make test account fixture XML filename relative to this file, since
# working dir of running tests is not always the same.
TESTACCOUNT_FIXTURE_XML = ('%s/fixtures/testaccount.xml' % APP_DIR)
MULTI_ACCOUNT_FIXTURE_XML = ('%s/fixtures/email_multiple_users.xml' % APP_DIR)
SINGLE_ACCOUNT_FIXTURE_XML = ('%s/fixtures/email_single_user.xml' % APP_DIR)


def mockdekiauth(test):
Expand Down Expand Up @@ -68,11 +68,11 @@ def test_new(self, put_mindtouch_user):
return test


def mock_get_deki_user(test):
def mock_get_deki_user(test, fixture_file=TESTACCOUNT_FIXTURE_XML):
if settings.DEKIWIKI_MOCK:
@mock.patch('dekicompat.backends.DekiUserBackend.get_deki_user')
def test_new(self, get_deki_user):
testaccount_fixture = open(TESTACCOUNT_FIXTURE_XML)
testaccount_fixture = open(fixture_file)
user_info = DekiUser.parse_user_info(testaccount_fixture.read())
get_deki_user.return_value = user_info
test(self)
Expand All @@ -81,11 +81,11 @@ def test_new(self, get_deki_user):
return test


def mock_get_deki_user_by_email(test):
def mock_get_deki_user_by_email(test, fixture_file=TESTACCOUNT_FIXTURE_XML):
if settings.DEKIWIKI_MOCK:
@mock.patch('dekicompat.backends.DekiUserBackend.get_deki_user_by_email')
def test_new(self, get_deki_user_by_email):
testaccount_fixture = open(TESTACCOUNT_FIXTURE_XML)
testaccount_fixture = open(fixture_file)
user_info = DekiUser.parse_user_info(testaccount_fixture.read())
get_deki_user_by_email.return_value = user_info
test(self)
Expand Down
4 changes: 2 additions & 2 deletions apps/users/templates/users/email/pw_reset.ltxt
@@ -1,7 +1,7 @@
{% load i18n %}{# L10n: This is an email. Whitespace matters! #}{% blocktrans %}
{% load i18n %}{# L10n: This is an email. Whitespace matters! #}{% blocktrans with user.username as username %}
{{ domain }} Password Reset

A request was received to reset the password for this account on
A request was received to reset the password for user '{{ username }}' on
{{ site_name }}. To change this password please click on the following link,
or paste it into your browser's location bar:

Expand Down
23 changes: 22 additions & 1 deletion apps/users/tests/test_templates.py
Expand Up @@ -14,7 +14,9 @@
from pyquery import PyQuery as pq
from test_utils import RequestFactory

from dekicompat.tests import (mock_post_mindtouch_user,
from dekicompat.tests import (MULTI_ACCOUNT_FIXTURE_XML,
SINGLE_ACCOUNT_FIXTURE_XML,
mock_post_mindtouch_user,
mock_put_mindtouch_user,
mock_get_deki_user_by_email,
mock_get_deki_user)
Expand Down Expand Up @@ -196,6 +198,25 @@ def test_deki_only_user(self, get_current):
u = User.objects.get(username='testaccount')
assert mail.outbox[0].body.find('pwreset/%s' % int_to_base36(u.id)) > 0

@mock.patch_object(Site.objects, 'get_current')
def test_deki_email_multi_user(self, get_current):
get_current.return_value.domain = 'testserver.com'
self.assertRaises(User.DoesNotExist, User.objects.get, username='testaccount')

r = self.client.post(reverse('users.pw_reset'),
{'email': 'f487e0b2f7b637e4e7d5dd0ff76b0447@mozilla.com'})
eq_(302, r.status_code)
eq_('http://testserver/en-US/users/pwresetsent', r['location'])
eq_(1, len(mail.outbox))
assert mail.outbox[0].subject.find('Password reset') == 0

u = User.objects.get(username='Ibn el haithem')
assert mail.outbox[0].body.find('pwreset/%s' % int_to_base36(u.id)) > 0

test_deki_email_multi_user = mock_get_deki_user(
test_deki_email_multi_user,
fixture_file=SINGLE_ACCOUNT_FIXTURE_XML)

def _get_reset_url(self):
return reverse('users.pw_reset_confirm',
args=[self.uidb36, self.token])
Expand Down

0 comments on commit 71904b5

Please sign in to comment.