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