-
Notifications
You must be signed in to change notification settings - Fork 325
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
[PLAT-926] Add employment and institution information to user serializer #8546
Changes from 1 commit
510e465
b6cf748
9c735bb
8ae71f9
130ff07
270702a
3c6e4c3
82ecae8
a37c058
57dabbf
d7338f3
699ec81
198fae1
aed443d
89178ff
39e0c63
8fd6d66
344f50a
811b7b7
b7d9324
72d4a45
53ab147
633aa46
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -36,17 +36,12 @@ | |
} | ||
}, | ||
"required": [ | ||
"ongoing", | ||
"department", | ||
"institution", | ||
"title" | ||
"institution" | ||
], | ||
"additionalProperties": false, | ||
"dependencies": { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should there be dependencies for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No, they are not necessary because |
||
"endMonth": ["endYear"], | ||
"endYear": ["endMonth"], | ||
"startMonth": ["startYear"], | ||
"startYear": ["startMonth"] | ||
"startMonth": ["startYear"] | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -148,13 +148,16 @@ def _validate_user_json(self, value, json_schema): | |
def _validate_dates(self, info): | ||
for history in info: | ||
|
||
startDate = datetime.date(history['startYear'], history['startMonth'], 1) | ||
if history.get('startYear'): | ||
startDate = datetime.date(history['startYear'], history['startMonth'], 1) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should be
to prevent KeyErrors. |
||
|
||
if not history['ongoing']: | ||
endDate = datetime.date(history['endYear'], history['endMonth'], 1) | ||
if history.get('endYear'): | ||
endDate = datetime.date(history['endYear'], history.get('endMonth', 1), 1) | ||
|
||
if (endDate - startDate).days <= 0: | ||
raise InvalidModelValueError(detail='End date must be greater than or equal to the start date.') | ||
if history.get('startYear') and history.get('endYear'): | ||
if (endDate - startDate).days <= 0: | ||
raise InvalidModelValueError(detail='End date must be greater than or equal to the start date.') | ||
elif history.get('endYear') or history.get('endMonth'): | ||
raise InvalidModelValueError(detail='Ongoing positions cannot have end dates.') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I believe adding the following to the json schema will validate this for you:
The "not" will ensure that "endYear" is not included if "ongoing" is true. The "anyOf" will ensure that "startYear" is required if "ongoing" is true and that "endYear" is included if "ongoing" is false. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm hesitant to add this to the schema because: But there's definitely a benefit to always relying using the schema, so 🤷♂️ . There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, I definitely agree that the error messages are way less than ideal. My opinion is that using the schema for validation is a lot nicer than writing our own, and we can document this in a more human-readable format in the dev docs. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1004,6 +1004,33 @@ class UserProfileMixin(object): | |
def request_payload(self): | ||
raise NotImplementedError | ||
|
||
@pytest.fixture() | ||
def bad_request_payload(self, request_payload, request_key): | ||
request_payload['data']['attributes'][request_key][0]['bad_key'] = 'bad_value' | ||
return request_payload | ||
|
||
@pytest.fixture() | ||
def end_dates_no_start_dates_payload(self, request_payload, request_key): | ||
del request_payload['data']['attributes'][request_key][0]['startYear'] | ||
del request_payload['data']['attributes'][request_key][0]['startMonth'] | ||
return request_payload | ||
|
||
@pytest.fixture() | ||
def start_dates_no_end_dates_payload(self, request_payload, request_key): | ||
del request_payload['data']['attributes'][request_key][0]['endYear'] | ||
del request_payload['data']['attributes'][request_key][0]['endMonth'] | ||
return request_payload | ||
|
||
@pytest.fixture() | ||
def end_month_dependency_payload(self, request_payload, request_key): | ||
del request_payload['data']['attributes'][request_key][0]['endYear'] | ||
return request_payload | ||
|
||
@pytest.fixture() | ||
def start_month_dependency_payload(self, request_payload, request_key): | ||
del request_payload['data']['attributes'][request_key][0]['startYear'] | ||
return request_payload | ||
|
||
@pytest.fixture() | ||
def request_key(self): | ||
raise NotImplementedError | ||
|
@@ -1026,6 +1053,11 @@ def test_user_put_profile_200(self, app, user_one, user_one_url, request_payload | |
assert res.status_code == 200 | ||
assert getattr(user_one, user_attr) == request_payload['data']['attributes'][request_key] | ||
|
||
def test_user_put_profile_400(self, app, user_one, user_one_url, bad_request_payload): | ||
res = app.put_json_api(user_one_url, bad_request_payload, auth=user_one.auth, expect_errors=True) | ||
assert res.status_code == 400 | ||
assert res.json['errors'][0]['detail'] == "Additional properties are not allowed (u'bad_key' was unexpected)" | ||
|
||
def test_user_put_profile_401(self, app, user_one, user_one_url, request_payload): | ||
res = app.put_json_api(user_one_url, request_payload, expect_errors=True) | ||
assert res.status_code == 401 | ||
|
@@ -1048,7 +1080,7 @@ def test_user_put_profile_validation_list(self, app, user_one, user_one_url, req | |
request_payload['data']['attributes'][request_key] = [{}] | ||
res = app.put_json_api(user_one_url, request_payload, auth=user_one.auth, expect_errors=True) | ||
assert res.status_code == 400 | ||
assert res.json['errors'][0]['detail'] == "u'ongoing' is a required property" | ||
assert res.json['errors'][0]['detail'] == "u'institution' is a required property" | ||
|
||
def test_user_put_profile_validation_empty_string(self, app, user_one, user_one_url, request_payload, request_key): | ||
# Tests to make sure institution is not empty string | ||
|
@@ -1094,6 +1126,32 @@ def test_user_put_profile_date_validate_end_date(self, app, user_one, user_one_u | |
assert res.status_code == 400 | ||
assert res.json['errors'][0]['detail'] == 'End date must be greater than or equal to the start date.' | ||
|
||
def test_user_put_profile_date_validate_end_month_dependency(self, app, user_one, user_one_url, end_month_dependency_payload): | ||
# No endMonth with endYear | ||
res = app.put_json_api(user_one_url, end_month_dependency_payload, auth=user_one.auth, expect_errors=True) | ||
assert res.status_code == 400 | ||
assert res.json['errors'][0]['detail'] == "u'endYear' is a dependency of u'endMonth'" | ||
|
||
def test_user_put_profile_date_validate_start_month_dependency(self, app, user_one, user_one_url, start_month_dependency_payload): | ||
# No endMonth with endYear | ||
res = app.put_json_api(user_one_url, start_month_dependency_payload, auth=user_one.auth, expect_errors=True) | ||
assert res.status_code == 400 | ||
assert res.json['errors'][0]['detail'] == "u'startYear' is a dependency of u'startMonth'" | ||
|
||
def test_user_put_profile_date_validate_start_date_no_end_date(self, app, user_one, user_attr, user_one_url, start_dates_no_end_dates_payload, request_key): | ||
# End date is greater then start date | ||
res = app.put_json_api(user_one_url, start_dates_no_end_dates_payload, auth=user_one.auth, expect_errors=True) | ||
user_one.reload() | ||
assert res.status_code == 200 | ||
assert getattr(user_one, user_attr) == start_dates_no_end_dates_payload['data']['attributes'][request_key] | ||
|
||
def test_user_put_profile_date_validate_end_date_no_start_date(self, app, user_one, user_attr, user_one_url, end_dates_no_start_dates_payload, request_key): | ||
# End dates, but no start dates | ||
res = app.put_json_api(user_one_url, end_dates_no_start_dates_payload, auth=user_one.auth, expect_errors=True) | ||
user_one.reload() | ||
assert res.status_code == 200 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
assert getattr(user_one, user_attr) == end_dates_no_start_dates_payload['data']['attributes'][request_key] | ||
|
||
|
||
@pytest.mark.django_db | ||
class TestUserSchools(UserProfileMixin): | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should there be dependencies for
startMonth
andstartYear
here?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, they are not necessary because
startMonth
andstartYear
are both always required no matter what, so they're not really dependencies of each other.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, that doesn't match current functionality. I'm able to add an education entry to my profile without a start date.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you double check these dependencies with functionality on production? Start year and end year can be entered and saved without start month and end month, but months can't be saved without years. I also think there should be a
"endYear": "startYear"
dependency here because an end year can't be saved unless there's a start year.