Skip to content

Commit 60e942f

Browse files
authored
Merge pull request #147 from modoboa/fix/import_backend_detection
Added option to force import backend
2 parents db81802 + 3cebabb commit 60e942f

File tree

4 files changed

+36
-5
lines changed

4 files changed

+36
-5
lines changed

modoboa_contacts/importer/__init__.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
]
99

1010

11-
def detect_import_backend(fp, delimiter: str = ";"):
11+
def get_import_backend(fp, delimiter: str = ";", name: str = "auto"):
1212
reader = csv.DictReader(
1313
fp,
1414
delimiter=delimiter,
@@ -18,16 +18,21 @@ def detect_import_backend(fp, delimiter: str = ";"):
1818
rows = reader
1919

2020
for backend in BACKENDS:
21-
if backend.detect_from_columns(columns):
21+
if name == "auto":
22+
if backend.detect_from_columns(columns):
23+
return backend, rows
24+
elif name == backend.name:
2225
return backend, rows
2326

2427
raise RuntimeError("Failed to detect backend to use")
2528

2629

2730
def import_csv_file(addressbook,
31+
backend_name: str,
2832
csv_filename: str,
2933
delimiter: str,
3034
carddav_password: str = None):
3135
with open(csv_filename) as fp:
32-
backend, rows = detect_import_backend(fp, delimiter)
36+
backend, rows = get_import_backend(
37+
fp, delimiter, backend_name)
3338
backend(addressbook).proceed(rows, carddav_password)

modoboa_contacts/importer/backends/outlook.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class OutlookBackend(ImporterBackend):
3232

3333
@classmethod
3434
def detect_from_columns(cls, columns):
35-
return columns == OUTLOOK_COLUMNS
35+
return set(OUTLOOK_COLUMNS).issubset(columns)
3636

3737
def get_first_name(self, values: dict) -> str:
3838
result = values["First Name"]

modoboa_contacts/management/commands/import_contacts.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ def add_arguments(self, parser):
2323
"contacts will be synced to CardDAV servert too"
2424
)
2525
)
26+
parser.add_argument(
27+
"--backend", type=str, default="auto",
28+
help=(
29+
"Specify import backend to use. Defaults to 'auto', "
30+
"meaning the script will try to guess which one to use"
31+
)
32+
)
2633
parser.add_argument(
2734
"email", type=str,
2835
help="Email address to import contacts for"
@@ -44,6 +51,7 @@ def handle(self, *args, **options):
4451
try:
4552
import_csv_file(
4653
addressbook,
54+
options["backend"],
4755
options["file"],
4856
options["delimiter"],
4957
options.get("carddav_password")

modoboa_contacts/tests.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,7 @@ def test_import_unknown_backend(self):
375375
self.assertEqual(str(ctx.exception),
376376
"Failed to detect backend to use")
377377

378-
def test_import_from_outlook(self):
378+
def test_import_from_outlook_auto(self):
379379
management.call_command(
380380
"import_contacts", "user@test.com", self.path)
381381
address = models.EmailAddress.objects.get(
@@ -389,6 +389,24 @@ def test_import_from_outlook(self):
389389
"Street 1 Street 2"
390390
)
391391

392+
def test_import_from_outlook(self):
393+
management.call_command(
394+
"import_contacts",
395+
"user@test.com",
396+
self.path,
397+
backend="outlook",
398+
)
399+
address = models.EmailAddress.objects.get(
400+
address="toto@titi.com")
401+
phone = models.PhoneNumber.objects.get(
402+
number="12345678")
403+
self.assertEqual(address.contact.first_name, "Toto Tata")
404+
self.assertEqual(address.contact.addressbook.user.email, "user@test.com")
405+
self.assertEqual(
406+
address.contact.address,
407+
"Street 1 Street 2"
408+
)
409+
392410
def test_import_and_carddav_sync(self):
393411
with httmock.HTTMock(mocks.options_mock, mocks.put_mock):
394412
management.call_command(

0 commit comments

Comments
 (0)