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

Add investment team members endpoints #295

Merged
merged 25 commits into from
Jul 12, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
58d5b37
[DH-381] Disable related_name for archived_by
reupen Jul 7, 2017
44a6ac3
Add team_members to InvestmentProject model
reupen Jul 7, 2017
32f9ad9
[DH-381] Add investment project team members to admin pages
reupen Jul 7, 2017
81cfc15
[DH-381] Stop using through M2M field for investment team members
reupen Jul 7, 2017
de65a96
[DH-381] Add read-only team members to investment serialiser
reupen Jul 7, 2017
8928f3b
[DH-381] Add investment team member endpoints
reupen Jul 10, 2017
2962fac
[DH-381] Move investment document views tests to separate class
reupen Jul 10, 2017
f216fdb
[DH-381] Fix a few problems in investment team member views
reupen Jul 10, 2017
8bf4abd
[DH-381] Add test for getting a team member
reupen Jul 10, 2017
36d3b3f
[DH-381] Add delete team member test
reupen Jul 10, 2017
2955bd0
Merge remote-tracking branch 'origin/develop' into feature/DH-381-inv…
reupen Jul 10, 2017
8e7ac33
[DH-381] Add test for adding duplicate team member to a project
reupen Jul 10, 2017
6ebca0c
[DH-381] Test updating an investment team member's role.
reupen Jul 11, 2017
322f7fc
[DH-381] Add test for removing all team members from a project
reupen Jul 11, 2017
7998554
[DH-381] Add validation tests for team member endpoints
reupen Jul 11, 2017
680975d
[DH-381] Update InvestmentProjectTeamMember docstring
reupen Jul 11, 2017
51988c0
[DH-381] Use NestedAdviserField in investment serialisers
reupen Jul 11, 2017
a34f885
[DH-381] Add non-existent project/adviser investment team member tests
reupen Jul 11, 2017
3336b4b
[DH-381] Tidy up IProjectTeamMembersViewSet.get_queryset()
reupen Jul 11, 2017
cbdf09e
[DH-381] Add migration for investment team members
reupen Jul 11, 2017
51f6daa
[DH-381] Correct docstring for InvestmentProjectTeamMemberAdmin
reupen Jul 11, 2017
3c9ad58
[DH-381] Correct IProjectTeamMembersViewSet docstring
reupen Jul 11, 2017
0ba7cc3
[DH-381] Remove team_members from search ignored fields
reupen Jul 11, 2017
a5273e5
Merge remote-tracking branch 'origin/develop' into feature/DH-381-inv…
reupen Jul 11, 2017
e463e26
[DH-381] Add investment team_members to search
reupen Jul 11, 2017
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
4 changes: 2 additions & 2 deletions datahub/company/migrations/0001_squash_0030_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ class Migration(migrations.Migration):
('trading_address_county', models.CharField(blank=True, max_length=255, null=True)),
('trading_address_postcode', models.CharField(blank=True, max_length=255, null=True)),
('account_manager', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='companies', to=settings.AUTH_USER_MODEL)),
('archived_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
('archived_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
('business_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='metadata.BusinessType')),
('classification', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='metadata.CompanyClassification')),
('employee_range', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='metadata.EmployeeRange')),
Expand Down Expand Up @@ -160,7 +160,7 @@ class Migration(migrations.Migration):
('contactable_by_phone', models.BooleanField(default=True)),
('address_country', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='metadata.Country')),
('advisor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='contacts', to=settings.AUTH_USER_MODEL)),
('archived_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
('archived_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
('company', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contacts', to='company.Company')),
('title', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='metadata.Title')),
],
Expand Down
4 changes: 2 additions & 2 deletions datahub/company/migrations/0003_fix_blank_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='company',
name='archived_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AlterField(
model_name='company',
Expand Down Expand Up @@ -88,7 +88,7 @@ class Migration(migrations.Migration):
migrations.AlterField(
model_name='contact',
name='archived_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AlterField(
model_name='contact',
Expand Down
2 changes: 1 addition & 1 deletion datahub/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class ArchivableModel(models.Model):
archived_reason = models.TextField(blank=True, null=True)
archived_by = models.ForeignKey(
settings.AUTH_USER_MODEL, blank=True, null=True,
on_delete=models.SET_NULL
on_delete=models.SET_NULL, related_name='+'
)

class Meta: # noqa: D101
Expand Down
2 changes: 1 addition & 1 deletion datahub/documents/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class Migration(migrations.Migration):
('scan_initiated_on', models.DateTimeField(blank=True, null=True)),
('scanned_on', models.DateTimeField(blank=True, null=True)),
('av_clean', models.NullBooleanField(db_index=True)),
('archived_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
('archived_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
],
options={
'abstract': False,
Expand Down
13 changes: 12 additions & 1 deletion datahub/investment/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@

from reversion.admin import VersionAdmin

from datahub.investment.models import (InvestmentProject, IProjectDocument)
from datahub.investment.models import (InvestmentProject, InvestmentProjectTeamMember,
IProjectDocument)


@admin.register(InvestmentProject)
Expand All @@ -25,6 +26,16 @@ class InvestmentProjectAdmin(VersionAdmin):
)


@admin.register(InvestmentProjectTeamMember)
class InvestmentProjectTeamMemberAdmin(VersionAdmin):
"""Investment project team member admin."""

raw_id_fields = (
'investment_project',
'adviser',
)


@admin.register(IProjectDocument)
class IProjectDocumentAdmin(admin.ModelAdmin):
"""Investment project document admin."""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='investmentproject',
name='archived_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL),
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='investmentproject',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class Migration(migrations.Migration):
('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('doc_type', models.CharField(choices=[('actual_land_date', 'Actual land date'), ('fdi_type', 'Fdi type'), ('operations_commenced', 'Operations commenced'), ('total_investment', 'Total investment'), ('foreign_equity_investment', 'Foreign equity investment'), ('number_new_jobs', 'Number new jobs'), ('number_safeguarded jobs', 'Number safeguarded jobs'), ('r_and_d_budget', 'R and D budget'), ('new_tech_to_uk', 'New tech to uk'), ('export_revenue', 'Export revenue'), ('average_salary', 'Average salary')], max_length=255)),
('filename', models.CharField(max_length=255)),
('archived_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
('archived_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
('document', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='documents.Document')),
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='documents', to='investment.InvestmentProject')),
],
Expand Down
31 changes: 31 additions & 0 deletions datahub/investment/migrations/0010_add_team_members.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-07-10 15:24
from __future__ import unicode_literals

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('investment', '0009_add_likelihood_priority'),
]

operations = [
migrations.CreateModel(
name='InvestmentProjectTeamMember',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('role', models.CharField(max_length=255)),
('adviser', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL)),
('investment_project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='team_members', to='investment.InvestmentProject')),
],
),
migrations.AlterUniqueTogether(
name='investmentprojectteammember',
unique_together=set([('investment_project', 'adviser')]),
),
]
18 changes: 18 additions & 0 deletions datahub/investment/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,24 @@ def __str__(self):
return f'{company_name} – {self.name}'


class InvestmentProjectTeamMember(models.Model):
"""Intermediary M2M model for investment project team members.

ManyToManyField with through is not used in the InvestmentProject model, because
it makes working with DRF serialisers difficult (as it would return advisers rather than
instances of this model).
"""

investment_project = models.ForeignKey(
InvestmentProject, on_delete=models.CASCADE, related_name='team_members'
)
adviser = models.ForeignKey('company.Advisor', on_delete=models.CASCADE, related_name='+')
role = models.CharField(max_length=MAX_LENGTH)

class Meta: # noqa: D101
unique_together = (('investment_project', 'adviser'),)


class InvestmentProjectCode(models.Model):
"""An investment project number used for project codes.

Expand Down
45 changes: 23 additions & 22 deletions datahub/investment/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
from reversion.models import Version

import datahub.metadata.models as meta_models
from datahub.company.models import Advisor, Company, Contact
from datahub.company.models import Company, Contact
from datahub.company.serializers import NestedAdviserField
from datahub.core.serializers import NestedRelatedField
from datahub.investment.models import InvestmentProject, IProjectDocument
from datahub.investment.models import (InvestmentProject, InvestmentProjectTeamMember,
IProjectDocument)
from datahub.investment.validate import validate


Expand All @@ -32,14 +34,8 @@ class IProjectSerializer(serializers.ModelSerializer):
Contact, many=True, required=True, allow_null=False, allow_empty=False
)

client_relationship_manager = NestedRelatedField(
Advisor, required=True, allow_null=False,
extra_fields=('first_name', 'last_name')
)
referral_source_adviser = NestedRelatedField(
Advisor, required=True, allow_null=False,
extra_fields=('first_name', 'last_name')
)
client_relationship_manager = NestedAdviserField(required=True, allow_null=False)
referral_source_adviser = NestedAdviserField(required=True, allow_null=False)
referral_source_activity = NestedRelatedField(
meta_models.ReferralSourceActivity, required=True, allow_null=False
)
Expand All @@ -62,9 +58,7 @@ class IProjectSerializer(serializers.ModelSerializer):
meta_models.InvestmentBusinessActivity, many=True, required=True,
allow_null=False, allow_empty=False
)
archived_by = NestedRelatedField(
Advisor, read_only=True, extra_fields=('first_name', 'last_name')
)
archived_by = NestedAdviserField(read_only=True)

def validate(self, data):
"""Validates the object after individual fields have been validated.
Expand Down Expand Up @@ -259,23 +253,29 @@ class Meta: # noqa: D101
)


class IProjectTeamMemberSerializer(serializers.ModelSerializer):
"""Serialiser for investment project team members."""

investment_project = NestedRelatedField(InvestmentProject)
adviser = NestedAdviserField()

class Meta: # noqa: D101
model = InvestmentProjectTeamMember
fields = ('investment_project', 'adviser', 'role')


class IProjectTeamSerializer(serializers.ModelSerializer):
"""Serialiser for investment project team objects."""

project_manager = NestedRelatedField(
Advisor, required=False, allow_null=True,
extra_fields=('first_name', 'last_name')
)
project_assurance_adviser = NestedRelatedField(
Advisor, required=False, allow_null=True,
extra_fields=('first_name', 'last_name')
)
project_manager = NestedAdviserField(required=False, allow_null=True)
project_assurance_adviser = NestedAdviserField(required=False, allow_null=True)
project_manager_team = NestedRelatedField(
meta_models.Team, read_only=True
)
project_assurance_team = NestedRelatedField(
meta_models.Team, read_only=True
)
team_members = IProjectTeamMemberSerializer(many=True, read_only=True)
team_complete = serializers.SerializerMethodField()

def get_team_complete(self, instance):
Expand All @@ -291,7 +291,8 @@ class Meta: # noqa: D101
'project_assurance_adviser',
'project_manager_team',
'project_assurance_team',
'team_complete'
'team_complete',
'team_members'
)


Expand Down
14 changes: 13 additions & 1 deletion datahub/investment/test/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@


class InvestmentProjectFactory(factory.django.DjangoModelFactory):
"""Company factory."""
"""Investment project factory."""

id = factory.Sequence(lambda _: str(uuid.uuid4()))
name = factory.Sequence(lambda n: f'name {n}')
Expand Down Expand Up @@ -57,3 +57,15 @@ def uk_region_locations(self):

class Meta:
model = 'investment.InvestmentProject'


class InvestmentProjectTeamMemberFactory(factory.django.DjangoModelFactory):
"""Investment project team member factory."""

investment_project = factory.SubFactory(InvestmentProjectFactory)
adviser = factory.SubFactory(AdviserFactory)
role = factory.Sequence(lambda n: f'role {n}')

class Meta:
model = 'investment.InvestmentProjectTeamMember'

Loading