feat: add option to sync to twenty
This commit is contained in:
19
src/fellchensammlung/management/commands/sync_to_twenty.py
Normal file
19
src/fellchensammlung/management/commands/sync_to_twenty.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
from django.core.management import BaseCommand
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
from fellchensammlung.models import RescueOrganization
|
||||||
|
from fellchensammlung.tools.twenty import sync_rescue_org_to_twenty
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
help = 'Send rescue organizations as companies to twenty'
|
||||||
|
|
||||||
|
def add_arguments(self, parser):
|
||||||
|
parser.add_argument("base_url", type=str)
|
||||||
|
parser.add_argument("token", type=str)
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
base_url = options["base_url"]
|
||||||
|
token = options["token"]
|
||||||
|
for rescue_org in tqdm(RescueOrganization.objects.all()):
|
||||||
|
sync_rescue_org_to_twenty(rescue_org, base_url, token)
|
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 5.2.1 on 2025-08-02 09:33
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('fellchensammlung', '0058_socialmediapost'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='rescueorganization',
|
||||||
|
name='twenty_id',
|
||||||
|
field=models.UUIDField(blank=True, help_text='ID der der Organisation in Twenty', null=True, verbose_name='Twenty-ID'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='rescueorganization',
|
||||||
|
name='specializations',
|
||||||
|
field=models.ManyToManyField(blank=True, to='fellchensammlung.species'),
|
||||||
|
),
|
||||||
|
]
|
@@ -173,6 +173,8 @@ class RescueOrganization(models.Model):
|
|||||||
parent_org = models.ForeignKey("RescueOrganization", on_delete=models.PROTECT, blank=True, null=True)
|
parent_org = models.ForeignKey("RescueOrganization", on_delete=models.PROTECT, blank=True, null=True)
|
||||||
# allows to specify if a rescue organization has a specialization for dedicated species
|
# allows to specify if a rescue organization has a specialization for dedicated species
|
||||||
specializations = models.ManyToManyField(Species, blank=True)
|
specializations = models.ManyToManyField(Species, blank=True)
|
||||||
|
twenty_id = models.UUIDField(verbose_name=_("Twenty-ID"), null=True, blank=True,
|
||||||
|
help_text=_("ID der der Organisation in Twenty"))
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('external_object_identifier', 'external_source_identifier',)
|
unique_together = ('external_object_identifier', 'external_source_identifier',)
|
||||||
|
52
src/fellchensammlung/tools/twenty.py
Normal file
52
src/fellchensammlung/tools/twenty.py
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import requests
|
||||||
|
|
||||||
|
from fellchensammlung.models import RescueOrganization
|
||||||
|
|
||||||
|
|
||||||
|
def sync_rescue_org_to_twenty(rescue_org: RescueOrganization, base_url, token: str):
|
||||||
|
if rescue_org.twenty_id:
|
||||||
|
update = True
|
||||||
|
else:
|
||||||
|
update = False
|
||||||
|
|
||||||
|
payload = {
|
||||||
|
"eMails": {
|
||||||
|
"primaryEmail": rescue_org.email,
|
||||||
|
"additionalEmails": None
|
||||||
|
},
|
||||||
|
"domainName": {
|
||||||
|
"primaryLinkLabel": rescue_org.website,
|
||||||
|
"primaryLinkUrl": rescue_org.website,
|
||||||
|
"additionalLinks": []
|
||||||
|
},
|
||||||
|
"name": rescue_org.name,
|
||||||
|
}
|
||||||
|
|
||||||
|
if rescue_org.location:
|
||||||
|
payload["address"] = {
|
||||||
|
"addressStreet1": f"{rescue_org.location.street} {rescue_org.location.housenumber}",
|
||||||
|
"addressCity": rescue_org.location.city,
|
||||||
|
"addressPostcode": rescue_org.location.postcode,
|
||||||
|
"addressCountry": rescue_org.location.countrycode,
|
||||||
|
"addressLat": rescue_org.location.latitude,
|
||||||
|
"addressLng": rescue_org.location.longitude,
|
||||||
|
}
|
||||||
|
headers = {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"Authorization": f"Bearer {token}"
|
||||||
|
}
|
||||||
|
|
||||||
|
if update:
|
||||||
|
url = f"{base_url}/rest/companies/{rescue_org.twenty_id}"
|
||||||
|
response = requests.patch(url, json=payload, headers=headers)
|
||||||
|
assert response.status_code == 200
|
||||||
|
else:
|
||||||
|
url = f"{base_url}/rest/companies"
|
||||||
|
response = requests.post(url, json=payload, headers=headers)
|
||||||
|
try:
|
||||||
|
assert response.status_code == 201
|
||||||
|
except AssertionError:
|
||||||
|
print(response.request.body)
|
||||||
|
return
|
||||||
|
rescue_org.twenty_id = response.json()["data"]["createCompany"]["id"]
|
||||||
|
rescue_org.save()
|
Reference in New Issue
Block a user