]>
Commit | Line | Data |
---|---|---|
26235f08 | 1 | from django.contrib.auth import get_user_model |
d1f79ec8 | 2 | from django.contrib.auth.models import User |
26235f08 | 3 | from django.contrib.auth.backends import ModelBackend |
40e726c7 MF |
4 | try: |
5 | import requests | |
6 | except ModuleNotFoundError as e: | |
7 | pass | |
93be1853 | 8 | from django.conf import settings |
26235f08 MF |
9 | |
10 | class EmailBackend(ModelBackend): | |
40e726c7 | 11 | def fetch_fortnox(self, customer_id=None): |
d1f79ec8 MF |
12 | """ Fetch all active customers from Fortnox API. Return as dict keyed on email.""" |
13 | res = None | |
14 | customers = {} | |
93be1853 MF |
15 | headers = {"Access-Token":settings.FORTNOX_ACCESS_TOKEN, |
16 | "Client-Secret":settings.FORTNOX_CLIENT_SECRET, | |
d1f79ec8 MF |
17 | "Content-Type":"application/json", |
18 | "Accept":"application/json" } | |
40e726c7 MF |
19 | if customer_id: #We already have id, use that to update info in local db |
20 | res = requests.get(f"https://api.fortnox.se/3/customers/{customer_id}?filter=active", headers=headers) | |
21 | res = res.json() | |
22 | res['Customer'] = [res['Customer']] | |
23 | else: | |
24 | res = requests.get("https://api.fortnox.se/3/customers?filter=active", headers=headers) | |
25 | ||
26 | for customer in res['Customer']: | |
d1f79ec8 MF |
27 | customers[customer['Email']] = customer |
28 | return customers | |
29 | ||
26235f08 MF |
30 | def authenticate(self, username=None, password=None, **kwargs): |
31 | UserModel = get_user_model() | |
32 | try: | |
33 | user = UserModel.objects.get(email=username) | |
34 | except UserModel.DoesNotExist: | |
d1f79ec8 | 35 | customers = self.fetch_fortnox() |
40e726c7 | 36 | # import pdb;pdb.set_trace() |
d1f79ec8 MF |
37 | if username in customers: |
38 | if ' ' in customers[username]['Name']: | |
39 | (fname,lname) = customers[username]['Name'].split(' ',1) | |
40e726c7 | 40 | user = User.objects.create_user(email=username, |
d1f79ec8 | 41 | first_name=fname, |
40e726c7 MF |
42 | last_name=lname, |
43 | fortnox_external_id=int(customers[username]['CustomerNumber'])) | |
d1f79ec8 MF |
44 | return user |
45 | else: | |
46 | fname = customers[username]['Name'] | |
47 | user = User.objects.create_user(username=username, | |
48 | email=username, | |
40e726c7 MF |
49 | first_name=fname, |
50 | fortnox_external_id=int(customers[username]['CustomerNumber'])) | |
d1f79ec8 | 51 | return user |
26235f08 MF |
52 | return None |
53 | else: | |
40e726c7 MF |
54 | customer = self.fetch_fortnox(customer_id=user.fortnox_external_id) |
55 | if not customer: | |
56 | user.is_active=False | |
57 | return None | |
58 | user.first_name = customer[user.email]['Name'] #TODO synd more data | |
59 | user.save() | |
26235f08 MF |
60 | if user.check_password(password): |
61 | return user | |
62 | return None |