From 010da28f07c2cc5697e8b83bcef0fc7b38f6eb22 Mon Sep 17 00:00:00 2001 From: Robin Goodall <rjg21@cam.ac.uk> Date: Thu, 6 Oct 2022 14:14:31 +0100 Subject: [PATCH] add check for lookup jd import default displayname --- .flake8 | 2 +- gsuitesync/naming.py | 45 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/.flake8 b/.flake8 index a984856..f589c8f 100644 --- a/.flake8 +++ b/.flake8 @@ -1,3 +1,3 @@ [flake8] max-line-length=99 -exclude = venv,.tox +exclude = venv,env,.venv,.env,.tox diff --git a/gsuitesync/naming.py b/gsuitesync/naming.py index c773d8f..a9f9740 100644 --- a/gsuitesync/naming.py +++ b/gsuitesync/naming.py @@ -39,8 +39,9 @@ def get_names(*, uid, display_name=None, cn=None, sn=None, given_name=None): Names(given_name='Stephen', family_name='Quill-RomanXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX') - If display name has been changed from cn (or we are missing cn) then use that in - preference to a given name and surname pairing + If display name has been changed from cn (or we are missing cn) but isn't the default + we'd get from using preferred first name initial then use that in preference to a given + name and surname pairing, i.e. assume that's what is really wanted >>> get_names(uid='spqr1', cn='Stephen Quill Roman', display_name='Steve Quill-Roman', ... sn='Quill Roman', given_name='Stephen') @@ -48,6 +49,9 @@ def get_names(*, uid, display_name=None, cn=None, sn=None, given_name=None): >>> get_names(uid='spqr1', display_name='Steve Quill-Roman', sn='Quill Roman', ... given_name='Stephen') Names(given_name='Steve', family_name='Quill-Roman') + >>> get_names(uid='spqr1', cn='S.P. Quill-Roman', display_name='S. Quill-Roman', + ... sn='Quill-Roman', given_name='Steve') + Names(given_name='Steve', family_name='Quill-Roman') If we have given name and surname then pass these through (after stripping unsupported characters and truncating as above) @@ -145,7 +149,9 @@ def get_names(*, uid, display_name=None, cn=None, sn=None, given_name=None): # If we have a display name and it doesn't match cn (or we have no cn) then use this as # an indication that this is what the user wants displayed - if display_name is not None and (cn is None or cn != display_name): + if (display_name is not None + and (cn is None or cn != display_name) + and display_name != jd_import_default(given_name, sn)): gn, fn = _split_fullname(display_name, sn=sn, given_name=given_name) if gn: return _make_ret(family_name=fn, given_name=gn) @@ -265,6 +271,39 @@ def _split_fullname(fullname, sn=None, given_name=None): return (None, None) +def jd_import_default(gn, sn): + """ + Works out the default display name that Lookup's Jackdaw import would give from given and + surname. + + We need both value to work this out + + >>> jd_import_default(None, None) + '' + >>> jd_import_default('foo', None) + '' + >>> jd_import_default(None, 'bar') + '' + + Use only first initial + + >>> jd_import_default('Anne Marie', 'Smith') + 'A. Smith' + + Cope with hyphenated first names + + >>> jd_import_default('Mary-Anne', 'Jones') + 'M-A. Jones' + + """ + if gn is None or sn is None: + return '' + + initial = '-'.join([name[0].upper() for name in gn.split('-')]) + "." + + return f'{initial} {sn}' + + def _clean(s): """ Clean any "bad characters" in names. This pattern is based on the one used by the -- GitLab