diff --git a/ietf/idindex/index.py b/ietf/idindex/index.py index e0cf91e6a..08f2feac3 100644 --- a/ietf/idindex/index.py +++ b/ietf/idindex/index.py @@ -239,7 +239,7 @@ def active_drafts_index_by_group(extra_values=()): if d: if "authors" not in d: d["authors"] = [] - d["authors"].append(a.author.person.plain_name()) + d["authors"].append(a.author.person.plain_ascii()) # This should probably change to .plain_name() when non-ascii names are permitted # put docs into groups for d in docs_dict.itervalues(): diff --git a/ietf/person/factories.py b/ietf/person/factories.py index ef47865e9..57e88cd82 100644 --- a/ietf/person/factories.py +++ b/ietf/person/factories.py @@ -31,7 +31,7 @@ class PersonFactory(factory.DjangoModelFactory): user = factory.SubFactory(UserFactory) name = factory.LazyAttribute(lambda p: '%s %s'%(p.user.first_name,p.user.last_name)) - ascii = factory.LazyAttribute(lambda p: unidecode(p.name)) + ascii = factory.LazyAttribute(lambda p: unicode(unidecode(p.name).strip())) class Params: with_bio = factory.Trait( diff --git a/ietf/person/models.py b/ietf/person/models.py index de0d49b8b..c73728a46 100644 --- a/ietf/person/models.py +++ b/ietf/person/models.py @@ -12,6 +12,7 @@ from django.contrib.auth.models import User from django.template.loader import render_to_string from django.utils.text import slugify +import debug # pyflakes:ignore from ietf.person.name import name_parts, initials from ietf.utils.mail import send_mail_preformatted @@ -55,10 +56,22 @@ class PersonInfo(models.Model): # It's possibly overkill with unidecode() here, but needed until # we're validating the content of the ascii field, and have # verified that the field is ascii clean in the database: - self._cached_ascii_name = unidecode(self.ascii) + if not all(ord(c) < 128 for c in self.ascii): + self._cached_ascii_name = unidecode(self.ascii).strip() + else: + self._cached_ascii_name = self.ascii else: - self._cached_ascii_name = unidecode(self.plain_name()) + self._cached_ascii_name = unidecode(self.plain_name()).strip() return self._cached_ascii_name + def plain_ascii(self): + if not hasattr(self, '_cached_plain_ascii'): + if self.ascii: + ascii = unidecode(self.ascii).strip() + else: + ascii = unidecode(self.name).strip() + prefix, first, middle, last, suffix = name_parts(ascii) + self._cached_plain_ascii = u" ".join([first, last]) + return self._cached_plain_ascii def initials(self): return initials(self.ascii or self.name) def last_name(self): diff --git a/ietf/person/tests.py b/ietf/person/tests.py index 0f0cbfeb6..0f5900a66 100644 --- a/ietf/person/tests.py +++ b/ietf/person/tests.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + import json from pyquery import PyQuery @@ -48,3 +50,21 @@ class PersonTests(TestCase): r = self.client.get(photo_url) self.assertEqual(r.status_code, 200) + def test_name_methods(self): + person = PersonFactory(name=u"Dr. Jens F. Möller", ) + + self.assertEqual(person.name, u"Dr. Jens F. Möller" ) + self.assertEqual(person.ascii_name(), u"Dr. Jens F. Moller" ) + self.assertEqual(person.plain_name(), u"Jens Möller" ) + self.assertEqual(person.plain_ascii(), u"Jens Moller" ) + self.assertEqual(person.initials(), u"J. F.") + self.assertEqual(person.first_name(), u"Jens" ) + self.assertEqual(person.last_name(), u"Möller" ) + + person = PersonFactory(name=u"吴建平") + # The following are probably incorrect because the given name should + # be Jianping and the surname should be Wu ... + # TODO: Figure out better handling for names with CJK characters. + # Maybe use ietf.person.cjk.* + self.assertEqual(person.ascii_name(), u"Wu Jian Ping") +