1 from datetime import datetime
3 from celery import shared_task
4 from django.conf import settings
10 def __init__(self, base, key):
13 self.api_base = (base or '') + 'civicrm/ajax/api4/'
14 self.enabled = bool(self.base and self.key)
16 def request(self, resource, method, params):
20 response = requests.post(
21 self.api_base + f'{resource}/{method}',
23 'params': json.dumps(params),
30 def create_or_update_contact(self, email, fields=None):
31 contact_id = self.get_contact_id(email)
32 if contact_id is None:
33 contact_id = self.create_contact(email, fields)
35 self.update_contact(contact_id, fields)
38 def get_contact_id(self, email):
39 result = self.request(
43 "join": [["Email AS email", "LEFT"]],
44 "where":[["email.email", "=", email]],
50 return result[0]['id']
52 def create_contact(self, email, fields):
69 data['values'].update(fields)
70 result = self.request('Contact', 'create', data)
71 return result['values'][0]['id']
73 def update_phone(self, contact_id, phone):
74 if self.request('Phone', 'get', {'where': [['phone', "=", phone], ['contact_id', "=", contact_id]]})['count']:
76 self.request('Phone', 'create', {'values': {'phone': phone, 'contact_id': contact_id}})
78 def update_contact(self, contact_id, fields):
85 ['id', '=', contact_id]
91 def report_activity(self, email, tpwl_key, key, name, datetime, details):
95 fields = {'WL.TPWL_key': tpwl_key}
96 contact_id = self.create_or_update_contact(email, fields)
98 activity_id = self.get_activity_id(key)
99 if activity_id is None:
100 self.create_activity(
108 self.update_activity(
116 def get_activity_id(self, key):
117 result = self.request(
122 ['subject', '=', key],
127 return result[0]['id']
129 def create_activity(self, contact_id, key, name, date_time, details):
130 detail_str = yaml.dump(details)
136 'source_contact_id': contact_id,
137 'activity_type_id:name': name,
138 'status_id:name': 'Completed',
139 'activity_date_time': date_time.isoformat() if date_time else '',
140 'details' : detail_str,
147 def update_activity(self, activity_id, contact_id, name, date_time, details):
148 detail_str = yaml.dump(details)
155 'source_contact_id': contact_id,
156 'activity_type_id:name': name,
157 'status_id:name': 'Completed',
158 'activity_date_time': date_time.isoformat(),
159 'details' : detail_str,
162 ['id', '=', activity_id]
167 def add_email_to_group(self, email, group_id):
168 contact_id = self.create_or_update_contact(email)
169 self.add_contact_to_group(contact_id, group_id)
171 def add_contact_to_group(self, contact_id, group_id):
177 "group_id": group_id,
178 "contact_id": contact_id,
185 settings.CIVICRM_BASE,
186 settings.CIVICRM_KEY,
189 @shared_task(ignore_result=True)
190 def report_activity(*args, **kwargs):
191 civicrm.report_activity(*args, **kwargs)