Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

3518 sync contact type and add warnings in app #436

Merged
merged 5 commits into from
Jun 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion djconnectwise/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
VERSION = (1, 5, 9, 'final')
VERSION = (1, 6, 0, 'final')

# pragma: no cover
if VERSION[-1] != "final":
Expand Down
8 changes: 7 additions & 1 deletion djconnectwise/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,16 @@ class CompanyStatusAdmin(admin.ModelAdmin):

@admin.register(models.CompanyType)
class CompanyTypeAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'vendor_flag')
list_display = ('id', 'name', 'vendor_flag', 'service_alert_flag')
search_fields = ['name']


@admin.register(models.ContactType)
class ContactTypeAdmin(admin.ModelAdmin):
list_display = ('id', 'description', 'default_flag', 'service_alert_flag')
search_fields = ['description']


@admin.register(models.Contact)
class ContactAdmin(admin.ModelAdmin):
list_display = ('id', 'full_name')
Expand Down
6 changes: 6 additions & 0 deletions djconnectwise/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -499,6 +499,7 @@ class CompanyAPIClient(ConnectWiseAPIClient):
ENDPOINT_CONTACTS = 'contacts'
ENDPOINT_COMPANY_STATUSES = '{}/statuses'.format(ENDPOINT_COMPANIES)
ENDPOINT_COMPANY_TYPES = '{}/types'.format(ENDPOINT_COMPANIES)
ENDPOINT_CONTACT_TYPES = '{}/types'.format(ENDPOINT_CONTACTS)
ENDPOINT_COMPANY_COMMUNICATION_TYPES = 'communicationTypes'
ENDPOINT_CONTACT_COMMUNICATIONs = 'communications'
ENDPOINT_COMPANY_NOTE_TYPES = 'noteTypes'
Expand Down Expand Up @@ -550,6 +551,11 @@ def get_contacts(self, *args, **kwargs):
return self.fetch_resource(self.ENDPOINT_CONTACTS, should_page=True,
*args, **kwargs)

def get_contact_types(self, *args, **kwargs):
return self.fetch_resource(self.ENDPOINT_CONTACT_TYPES,
should_page=True,
*args, **kwargs)

def get_contact_communications(self, contact_id, *args, **kwargs):
endpoint_url = '{}/{}/communications'.format(self.ENDPOINT_CONTACTS,
contact_id)
Expand Down
1 change: 1 addition & 0 deletions djconnectwise/management/commands/cwsync.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def __init__(self, *args, **kwargs):
('communication_type', sync.CommunicationTypeSynchronizer,
_('Communication Type')),
('contact', sync.ContactSynchronizer, _('Contact')),
('contact_type', sync.ContactTypeSynchronizer, _('Contact Type')),
('contact_communication',
sync.ContactCommunicationSynchronizer,
_('Contact Communication')),
Expand Down
28 changes: 28 additions & 0 deletions djconnectwise/migrations/0183_companytype_default_flag_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 4.2.11 on 2024-06-05 16:53

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('djconnectwise', '0182_alter_companysite_inactive'),
]

operations = [
migrations.AddField(
model_name='companytype',
name='default_flag',
field=models.BooleanField(blank=True, null=True),
),
migrations.AddField(
model_name='companytype',
name='service_alert_flag',
field=models.BooleanField(blank=True, null=True),
),
migrations.AddField(
model_name='companytype',
name='service_alert_message',
field=models.TextField(blank=True, null=True),
),
]
38 changes: 38 additions & 0 deletions djconnectwise/migrations/0184_contacttype_contacttypetracker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Generated by Django 4.2.11 on 2024-06-05 16:54

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('djconnectwise', '0183_companytype_default_flag_and_more'),
]

operations = [
migrations.CreateModel(
name='ContactType',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('description', models.CharField(max_length=250)),
('default_flag', models.BooleanField()),
('service_alert_flag', models.BooleanField(blank=True, null=True)),
('service_alert_message', models.TextField(blank=True, null=True)),
],
options={
'ordering': ('description',),
},
),
migrations.CreateModel(
name='ContactTypeTracker',
fields=[
],
options={
'db_table': 'djconnectwise_contacttype',
'proxy': True,
'indexes': [],
'constraints': [],
},
bases=('djconnectwise.contacttype',),
),
]
18 changes: 18 additions & 0 deletions djconnectwise/migrations/0185_contact_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.11 on 2024-06-05 20:44

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('djconnectwise', '0184_contacttype_contacttypetracker'),
]

operations = [
migrations.AddField(
model_name='contact',
name='type',
field=models.ManyToManyField(to='djconnectwise.contacttype'),
),
]
30 changes: 30 additions & 0 deletions djconnectwise/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,11 @@ def __str__(self):
class CompanyType(models.Model):
name = models.CharField(max_length=50)
vendor_flag = models.BooleanField()
default_flag = models.BooleanField(blank=True, null=True)
service_alert_flag = models.BooleanField(blank=True, null=True)
service_alert_message = models.TextField(
blank=True, null=True
)

class Meta:
ordering = ('name', )
Expand All @@ -434,6 +439,22 @@ def __str__(self):
return self.name


class ContactType(models.Model):
description = models.CharField(max_length=250)
default_flag = models.BooleanField()
service_alert_flag = models.BooleanField(
blank=True, null=True)
service_alert_message = models.TextField(
blank=True, null=True
)

class Meta:
ordering = ('description', )

def __str__(self):
return self.description


class CompanyNoteType(models.Model):
name = models.CharField(max_length=50)
identifier = models.CharField(max_length=50)
Expand Down Expand Up @@ -509,6 +530,7 @@ def __str__(self):
title = models.CharField(blank=True, null=True, max_length=200)
company = models.ForeignKey(
'Company', null=True, on_delete=models.CASCADE)
type = models.ManyToManyField('ContactType')

class Meta:
ordering = ('first_name', 'last_name')
Expand Down Expand Up @@ -2375,6 +2397,14 @@ class Meta:
db_table = 'djconnectwise_companytype'


class ContactTypeTracker(ContactType):
tracker = FieldTracker()

class Meta:
proxy = True
db_table = 'djconnectwise_contacttype'


class CompanyNoteTypeTracker(CompanyNoteType):
tracker = FieldTracker()

Expand Down
18 changes: 18 additions & 0 deletions djconnectwise/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -1227,11 +1227,29 @@ def _assign_field_data(self, instance, json_data):
instance.id = json_data.get('id')
instance.name = json_data.get('name')
instance.vendor_flag = json_data.get('vendorFlag')
instance.default_flag = json_data.get('defaultFlag')
instance.service_alert_flag = json_data.get('service_alert_flag')
instance.service_alert_message = json_data.get('service_alert_message')

def get_page(self, *args, **kwargs):
return self.client.get_company_types(*args, **kwargs)


class ContactTypeSynchronizer(Synchronizer):
client_class = api.CompanyAPIClient
model_class = models.ContactTypeTracker

def _assign_field_data(self, instance, json_data):
instance.id = json_data.get('id')
instance.description = json_data.get('description')
instance.default_flag = json_data.get('defaultFlag')
instance.service_alert_flag = json_data.get('service_alert_flag')
instance.service_alert_message = json_data.get('service_alert_message')

def get_page(self, *args, **kwargs):
return self.client.get_contact_types(*args, **kwargs)


class CompanyNoteTypesSynchronizer(Synchronizer):
client_class = api.CompanyAPIClient
model_class = models.CompanyNoteTypeTracker
Expand Down
6 changes: 6 additions & 0 deletions djconnectwise/tests/fixture_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,12 @@ def init_company_site():
return synchronizer.sync()


def init_contact_type():
mocks.company_api_get_contact_type_call(fixtures.API_CONTACT_TYPE_LIST)
synchronizer = sync.ContactTypeSynchronizer()
return synchronizer.sync()


def init_company_team_role():
mocks.company_api_get_company_team_role_call(
[fixtures.API_COMPANY_TEAM_ROLE])
Expand Down
10 changes: 10 additions & 0 deletions djconnectwise/tests/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,16 @@
"inactive": False,
}]

API_CONTACT_TYPE_LIST = [
{
"id": 1,
"description": "Test Contact Type",
"defaultFlag": True,
"serviceAlertFlag": True,
"serviceAlertMessage": "",
}]


API_SERVICE_NOTE_LIST = [
{
'id': 3,
Expand Down
5 changes: 5 additions & 0 deletions djconnectwise/tests/mocks.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ def company_api_get_company_site_call(return_value, raised=None):
return create_mock_call(method_name, return_value, side_effect=raised)


def company_api_get_contact_type_call(return_value, raised=None):
method_name = 'djconnectwise.api.CompanyAPIClient.get_contact_types'
return create_mock_call(method_name, return_value, side_effect=raised)


def company_api_get_company_team_role_call(return_value, raised=None):
method_name = 'djconnectwise.api.CompanyAPIClient.get_company_team_role'
return create_mock_call(method_name, return_value, side_effect=raised)
Expand Down
16 changes: 15 additions & 1 deletion djconnectwise/tests/test_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,18 @@ def setUp(self):
fixture_utils.init_company_site()


class TestSyncContactTypeCommand(AbstractBaseSyncTest, TestCase):
args = (
mocks.company_api_get_contact_type_call,
fixtures.API_CONTACT_TYPE_LIST,
'contact_type'
)

def setUp(self):
fixture_utils.init_companies()
fixture_utils.init_contact_type()


class TestSyncCompanyTeamRoleCommand(AbstractBaseSyncTest, TestCase):
args = (
mocks.company_api_get_company_team_role_call,
Expand Down Expand Up @@ -813,6 +825,7 @@ def setUp(self):
TestSyncTimeEntriesCommand,
TestSyncContactCommunicationsCommand,
TestSyncContactsCommand,
TestSyncContactTypeCommand,
TestSyncCommunicationTypesCommand,
TestSyncCompaniesCommand,
TestSyncCompanyTypesCommand,
Expand Down Expand Up @@ -942,6 +955,7 @@ def test_full_sync(self):
'service_note': models.ServiceNote,
'opportunity_note': models.OpportunityNote,
'contact': models.Contact,
'contact_type': models.ContactType,
'communication_type': models.CommunicationType,
'contact_communication': models.ContactCommunication,
'company': models.Company,
Expand Down Expand Up @@ -1003,7 +1017,7 @@ def test_full_sync(self):
'holiday',
'contact',
'contact_communication',
'company_site'
'company_site',
):
# Assert that there were objects to get deleted, then change
# to zero to verify the output formats correctly.
Expand Down
Loading