Curtis Hovey has proposed merging lp:~sinzui/launchpad/dedup-preferred-launguages-1 into lp:launchpad/devel with lp:~sinzui/launchpad/dedup-preferred-launguages-0 as a prerequisite.
Requested reviews: Launchpad code reviewers (launchpad-reviewers): code Related bugs: #636453 move geoip code to lp.services https://bugs.launchpad.net/bugs/636453 This is my branch to prevent duplicate preferred languages. lp:~sinzui/launchpad/dedup-preferred-launguages-1 Diff size: 48 Launchpad bug: https://bugs.launchpad.net/bugs/159146 Test command: ./bin/test -vv -t preferred-languages.txt Pre-implementation: no one Target release: 10.10 Prevent duplicate preferred languages ------------------------------------- OOPS-668E1595 shows that a DB constraint was triggered setting the answer contact for the ava-bzr project. 2 IntegrityError: ERROR: duplicate key violates unique constraint "personlanguage_person_key" INSERT INTO PersonLanguage (person, language) VALUES (1537687, 119 The problem is in the odd request header: HTTP_ACCEPT_LANGUAGE: en-US,en;q=0.9,de-CH;q=0.8,de;q=0.6, de-DE;q=0.5,en-GB;q=0.4,en-us;q=0.3,en;q=0.1 RequestPreferredLanguages returns en twice. This is a really easy fix that I should have made 2 years ago when I speculated on the origin of the problem. Rules ----- * Update RequestPreferredLanguages.getPreferredLanguages() to use a set instead of a list. QA -- * Visit Launchpad and unset your preferred languages. * Reconfigure your browser to use the example HTTP_ACCEPT_LANGUAGE. * Visit a project and add yourself as an Answer Contact. * Verify your preferred languages are set to en, en-GB, de, de-CH Lint ---- Linting changed files: lib/lp/services/geoip/model.py lib/lp/translations/doc/preferred-languages.txt Test ---- * lib/lp/translations/doc/preferred-languages.txt * Used the problematic HTTP_ACCEPT_LANGUAGE header from the oops request to verify 'en' does not appear twice in the list of languages. Implementation -------------- * lib/lp/services/geoip/model.py * Switched the list of languages to a set to ensure they are unique. -- https://code.launchpad.net/~sinzui/launchpad/dedup-preferred-launguages-1/+merge/35229 Your team Launchpad code reviewers is requested to review the proposed merge of lp:~sinzui/launchpad/dedup-preferred-launguages-1 into lp:launchpad/devel.
=== modified file 'lib/lp/services/geoip/model.py' --- lib/lp/services/geoip/model.py 2010-09-12 16:09:47 +0000 +++ lib/lp/services/geoip/model.py 2010-09-12 16:09:48 +0000 @@ -142,7 +142,7 @@ codes = IUserPreferredLanguages(self.request).getPreferredLanguages() languageset = getUtility(ILanguageSet) - languages = [] + languages = set() for code in codes: # We need to ensure that the code received contains only ASCII @@ -162,7 +162,7 @@ continue code = languageset.canonicalise_language_code(code) try: - languages.append(languageset[code]) + languages.add(languageset[code]) except KeyError: pass === modified file 'lib/lp/translations/doc/preferred-languages.txt' --- lib/lp/translations/doc/preferred-languages.txt 2010-09-12 16:09:47 +0000 +++ lib/lp/translations/doc/preferred-languages.txt 2010-09-12 16:09:48 +0000 @@ -10,9 +10,20 @@ >>> [l.code ... for l in RequestPreferredLanguages(request).getPreferredLanguages()] [u'pt_BR'] - + >>> langs = {'HTTP_ACCEPT_LANGUAGE': u'pt_BR, Espa\xf1ol'} >>> request = LaunchpadTestRequest(**langs) >>> [l.code ... for l in RequestPreferredLanguages(request).getPreferredLanguages()] [u'pt_BR'] + +The getPreferredLanguages() method returns unique codes. + + >>> langs = { + ... 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.9,de-CH;q=0.8,de;q=0.6,' + ... 'en-GB;q=0.4,en-us;q=0.3,en;q=0.1' + ... } + >>> request = LaunchpadTestRequest(**langs) + >>> [l.code + ... for l in RequestPreferredLanguages(request).getPreferredLanguages()] + [u'en', u'en_GB', u'de']
_______________________________________________ Mailing list: https://launchpad.net/~launchpad-reviewers Post to : launchpad-reviewers@lists.launchpad.net Unsubscribe : https://launchpad.net/~launchpad-reviewers More help : https://help.launchpad.net/ListHelp