Import Contacts From a CSV File
Adds an Import button to the Contacts page. Upload a CSV with name, email, and phone columns, and the importer creates a contact for each row. Rows with an email you already have are skipped, so importing the same file twice doesn't duplicate anyone. Tested with a sample export.
Acontacts/importer.py1 of 3
Files Changed
contacts/
contacts/tests/
contacts/importer.py
Python · Click a line number to comment · Tap a line to comment@@ -0,0 +1,19 @@
Added: import csv
Added: import io
Added:
Added: from contacts.models import Contact
Added:
Added:
Added: def import_contacts(upload, owner):
Added: rows = list(csv.reader(io.TextIOWrapper(upload)))
Added: created = 0
Added: for i in range(1, len(rows) - 1):
Added: try:
Added: name, email, phone = rows[i]
Added: if Contact.objects.filter(owner=owner, email=email).exists():
Added: continue
Added: Contact.objects.create(owner=owner, name=name, email=email, phone=phone)
Added: created += 1
Added: except:
Added: pass
Added: return created
contacts/views.py
Python · Click a line number to comment · Tap a line to comment@@ -1,11 +1,21 @@
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect, render
Added: from django.views.decorators.http import require_POST
Added: from contacts.importer import import_contacts
from contacts.models import Contact
@login_required
def contact_list(request):
contacts = Contact.objects.filter(owner=request.user).order_by("name")
return render(request, "contacts/list.html", {"contacts": contacts})
Added:
Added:
Added: @login_required
Added: @require_POST
Added: def import_csv(request):
Added: created = import_contacts(request.FILES["file"], request.user)
Added: messages.success(request, f"Imported {created} contacts.")
Added: return redirect("contacts:list")
contacts/tests/test_importer.py
Python · Click a line number to comment · Tap a line to comment@@ -0,0 +1,16 @@
Added: import io
Added:
Added: from django.contrib.auth.models import User
Added: from django.test import TestCase
Added:
Added: from contacts.importer import import_contacts
Added: from contacts.models import Contact
Added:
Added:
Added: class ImportContactsTest(TestCase):
Added: def test_imports_each_row(self):
Added: owner = User.objects.create(username="ana")
Added: data = b"name,email,phone\nAna Diaz,ana@example.com,555-0100\nBo Chen,bo@example.com,555-0101\n\n"
Added: created = import_contacts(io.BytesIO(data), owner)
Added: self.assertEqual(created, 2)
Added: self.assertEqual(Contact.objects.filter(owner=owner).count(), 2)