trim(value) && (
@@ -74,6 +77,24 @@ export default function FacilityDetailsSidebarClaimedInfo({
value={facility.phone_number}
label="Phone Number"
/>
+
+ {get(facility, 'parent_company.name', null)}
+ )
+ : null
+ }
+ />
+ update(state, {
+ parentCompanyOptions: {
+ fetching: { $set: true },
+ error: { $set: initialState.parentCompanyOptions.error },
+ },
+ }),
+ [failFetchParentCompanyOptions]: (state, error) =>
+ update(state, {
+ parentCompanyOptions: {
+ fetching: { $set: initialState.parentCompanyOptions.fetching },
+ error: { $set: error },
+ },
+ }),
+ [completeFetchParentCompanyOptions]: (state, data) =>
+ update(state, {
+ parentCompanyOptions: {
+ data: { $set: data },
+ fetching: { $set: initialState.parentCompanyOptions.fetching },
+ },
+ }),
+ [resetParentCompanyOptions]: state =>
+ update(state, {
+ parentCompanyOptions: {
+ $set: initialState.parentCompanyOptions,
+ },
+ }),
[updateClaimAFacilityContactPerson]: (state, payload) =>
update(state, {
claimData: {
@@ -99,6 +137,14 @@ export default createReducer(
},
},
}),
+ [updateClaimAFacilityParentCompany]: (state, payload) =>
+ update(state, {
+ claimData: {
+ formData: {
+ parentCompany: { $set: payload },
+ },
+ },
+ }),
[updateClaimAFacilityWebsite]: (state, payload) =>
update(state, {
claimData: {
diff --git a/src/app/src/reducers/ClaimedFacilityDetailsReducer.js b/src/app/src/reducers/ClaimedFacilityDetailsReducer.js
index 4a4adc9bc..19e5c01bd 100644
--- a/src/app/src/reducers/ClaimedFacilityDetailsReducer.js
+++ b/src/app/src/reducers/ClaimedFacilityDetailsReducer.js
@@ -25,6 +25,7 @@ import {
updateClaimedFacilityOfficeAddress,
updateClaimedFacilityOfficeCountry,
updateClaimedFacilityOfficePhone,
+ updateClaimedFacilityParentCompany,
} from '../actions/claimedFacilityDetails';
const initialState = Object.freeze({
@@ -109,6 +110,14 @@ export default createReducer({
facility_phone_number_publicly_visible: { $set: visible },
},
}),
+ [updateClaimedFacilityParentCompany]: (state, parentCompany) => update(state, {
+ updateData: {
+ error: { $set: initialState.updateData.error },
+ },
+ data: {
+ facility_parent_company: { $set: parentCompany },
+ },
+ }),
[updateClaimedFacilityPointOfContactVisibility]: (state, visible) => update(state, {
updateData: {
error: { $set: initialState.updateData.error },
diff --git a/src/app/src/util/constants.js b/src/app/src/util/constants.js
index 03a435d9a..15413a1b2 100644
--- a/src/app/src/util/constants.js
+++ b/src/app/src/util/constants.js
@@ -434,6 +434,10 @@ export const claimAFacilityFormFields = Object.freeze({
id: 'company-name',
label: 'Official name of LLC or company registered',
}),
+ parentCompany: Object.freeze({
+ id: 'parent-company',
+ label: 'Parent company of facility, selected from contributors list',
+ }),
website: Object.freeze({
id: 'website',
label: 'Facility website',
diff --git a/src/app/src/util/util.js b/src/app/src/util/util.js
index 44dbb17aa..f5f95726d 100644
--- a/src/app/src/util/util.js
+++ b/src/app/src/util/util.js
@@ -107,6 +107,7 @@ export const makeRevokeFacilityClaimByClaimIDURL = claimID => `/api/facility-cla
export const makeAddNewFacilityClaimReviewNoteURL = claimID => `/api/facility-claims/${claimID}/note/`;
export const makeGetOrUpdateApprovedFacilityClaimURL = claimID => `/api/facility-claims/${claimID}/claimed/`;
+export const makeParentCompanyOptionsAPIURL = () => '/api/facility-claims/parent-company-options/';
export const makeGetClaimedFacilitiesURL = () => '/api/facilities/claimed/';
export const makeClaimedFacilityDetailsLink = claimID => `/claimed/${claimID}/`;
diff --git a/src/django/api/migrations/0017_add_parent_company_to_facilityclaim.py b/src/django/api/migrations/0017_add_parent_company_to_facilityclaim.py
new file mode 100644
index 000000000..27fa200bb
--- /dev/null
+++ b/src/django/api/migrations/0017_add_parent_company_to_facilityclaim.py
@@ -0,0 +1,24 @@
+# Generated by Django 2.0.13 on 2019-06-21 18:47
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0016_historicalfacilityalias'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='facilityclaim',
+ name='parent_company',
+ field=models.ForeignKey(default=None, help_text='The parent company of this facility claim.', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='parent_company', to='api.Contributor'),
+ ),
+ migrations.AddField(
+ model_name='historicalfacilityclaim',
+ name='parent_company',
+ field=models.ForeignKey(blank=True, db_constraint=False, default=None, help_text='The parent company of this facility claim.', null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='api.Contributor'),
+ ),
+ ]
diff --git a/src/django/api/models.py b/src/django/api/models.py
index d421eb23c..0c54f4af4 100644
--- a/src/django/api/models.py
+++ b/src/django/api/models.py
@@ -526,6 +526,13 @@ class FacilityClaim(models.Model):
null=False,
default=False,
help_text='Is the office info publicly visible?')
+ parent_company = models.ForeignKey(
+ 'Contributor',
+ related_name='parent_company',
+ null=True,
+ default=None,
+ on_delete=models.PROTECT,
+ help_text='The parent company of this facility claim.')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
diff --git a/src/django/api/serializers.py b/src/django/api/serializers.py
index f3b8b021a..164d7dbe8 100644
--- a/src/django/api/serializers.py
+++ b/src/django/api/serializers.py
@@ -427,6 +427,14 @@ def get_claim_info(self, facility):
.filter(status=FacilityClaim.APPROVED) \
.get(facility=facility)
+ if claim.parent_company:
+ parent_company = {
+ 'id': claim.parent_company.id,
+ 'name': claim.parent_company.name,
+ }
+ else:
+ parent_company = None
+
return {
'id': claim.id,
'facility': {
@@ -434,6 +442,7 @@ def get_claim_info(self, facility):
'name': claim.facility_name,
'address': claim.facility_address,
'website': claim.facility_website,
+ 'parent_company': parent_company,
'phone_number': claim.facility_phone_number
if claim.facility_phone_number_publicly_visible else None,
'minimum_order': claim.facility_minimum_order_quantity,
@@ -492,6 +501,7 @@ class FacilityClaimDetailsSerializer(ModelSerializer):
facility = SerializerMethodField()
status_change = SerializerMethodField()
notes = SerializerMethodField()
+ facility_parent_company = SerializerMethodField()
class Meta:
model = FacilityClaim
@@ -499,7 +509,7 @@ class Meta:
'phone_number', 'company_name', 'website',
'facility_description', 'preferred_contact_method', 'status',
'contributor', 'facility', 'verification_method',
- 'status_change', 'notes')
+ 'status_change', 'notes', 'facility_parent_company')
def get_contributor(self, claim):
return UserProfileSerializer(claim.contributor.admin).data
@@ -529,6 +539,15 @@ def get_notes(self, claim):
data = FacilityClaimReviewNoteSerializer(notes, many=True).data
return data
+ def get_facility_parent_company(self, claim):
+ if not claim.parent_company:
+ return None
+
+ return {
+ 'id': claim.parent_company.id,
+ 'name': claim.parent_company.name,
+ }
+
class FacilityClaimReviewNoteSerializer(ModelSerializer):
author = SerializerMethodField()
@@ -544,6 +563,8 @@ def get_author(self, note):
class ApprovedFacilityClaimSerializer(ModelSerializer):
facility = SerializerMethodField()
countries = SerializerMethodField()
+ contributors = SerializerMethodField()
+ facility_parent_company = SerializerMethodField()
class Meta:
model = FacilityClaim
@@ -557,14 +578,31 @@ class Meta:
'office_official_name', 'office_address',
'office_country_code', 'office_phone_number',
'office_info_publicly_visible',
- 'facility', 'countries')
+ 'facility', 'countries', 'facility_parent_company',
+ 'contributors')
def get_facility(self, claim):
return FacilityDetailsSerializer(claim.facility).data
- def get_countries(self, claimd):
+ def get_countries(self, claim):
return COUNTRY_CHOICES
+ def get_contributors(self, claim):
+ return [
+ (contributor.id, contributor.name)
+ for contributor
+ in Contributor.objects.all().order_by('name')
+ ]
+
+ def get_facility_parent_company(self, claim):
+ if not claim.parent_company:
+ return None
+
+ return {
+ 'id': claim.parent_company.id,
+ 'name': claim.parent_company.name,
+ }
+
class FacilityMatchSerializer(ModelSerializer):
oar_id = SerializerMethodField()
diff --git a/src/django/api/views.py b/src/django/api/views.py
index 0ebc1a057..b3886a042 100644
--- a/src/django/api/views.py
+++ b/src/django/api/views.py
@@ -753,6 +753,7 @@ def claim(self, request, pk=None):
email = request.data.get('email')
phone_number = request.data.get('phone_number')
company_name = request.data.get('company_name')
+ parent_company = request.data.get('parent_company')
website = request.data.get('website')
facility_description = request.data.get('facility_description')
verification_method = request.data.get('verification_method')
@@ -768,6 +769,13 @@ def claim(self, request, pk=None):
if not company_name:
raise ValidationError('Company name is required')
+ if parent_company:
+ parent_company_contributor = Contributor \
+ .objects \
+ .get(pk=parent_company)
+ else:
+ parent_company_contributor = None
+
user_has_pending_claims = FacilityClaim \
.objects \
.filter(status=FacilityClaim.PENDING) \
@@ -787,6 +795,7 @@ def claim(self, request, pk=None):
email=email,
phone_number=phone_number,
company_name=company_name,
+ parent_company=parent_company_contributor,
website=website,
facility_description=facility_description,
verification_method=verification_method,
@@ -1790,6 +1799,17 @@ def get_claimed_details(self, request, pk=None):
response_data = ApprovedFacilityClaimSerializer(claim).data
return Response(response_data)
+ parent_company_data = request.data.get('facility_parent_company')
+
+ if not parent_company_data:
+ parent_company = None
+ elif 'id' not in parent_company_data:
+ parent_company = None
+ else:
+ parent_company = Contributor \
+ .objects \
+ .get(pk=parent_company_data['id'])
+
FacilityClaim.objects.filter(pk=pk).update(
facility_description=request.data.get('facility_description'),
facility_name=request.data.get('facility_name'),
@@ -1803,6 +1823,7 @@ def get_claimed_details(self, request, pk=None):
.get('facility_minimum_order_quantity'),
facility_average_lead_time=request.data
.get('facility_average_lead_time'),
+ parent_company=parent_company,
point_of_contact_person_name=request.data
.get('point_of_contact_person_name'),
point_of_contact_email=request.data
@@ -1832,3 +1853,16 @@ def get_claimed_details(self, request, pk=None):
raise NotFound()
except Contributor.DoesNotExist:
raise NotFound('No contributor found for that user')
+
+ @action(detail=False,
+ methods=['GET'],
+ url_path='parent-company-options',
+ permission_classes=(IsRegisteredAndConfirmed,))
+ def get_parent_company_options(self, request):
+ response_data = [
+ (contributor.id, contributor.name)
+ for contributor
+ in Contributor.objects.all().order_by('name')
+ ]
+
+ return Response(response_data)