Skip to content

feat(jobadder): add job attachment file actions - #529

Merged
sumitramanga merged 3 commits into
masterfrom
sm/extend-job-adder-integration
Oct 19, 2026
Merged

sumitramanga merged 3 commits into
masterfrom
sm/extend-job-adder-integration

Conversation

@sumitramanga

Copy link
Copy Markdown
Contributor

Description 📝

  • Purpose: Let JobAdder workflows list, download, upload and update job attachments (e.g. job descriptions), matching what candidate attachments already support.
  • Approach: Added four job attachment actions and extended list_job_attachments with type/latest filters. Generalised the candidate attachment download and size-limit helpers so both attachment types share them. Added the write_job OAuth scope. Bumped integration version to 1.2.0.

Type of change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • This change requires a documentation update

Updates
👉 New actions: list_job_attachment_categories, download_job_attachment (up to 5 MiB, returned as an Autohive file object), upload_job_attachment and update_job_attachment
👉 list_job_attachments now accepts types and latest filters; shared _download_attachment helper and MAX_ATTACHMENT_BYTES replace the candidate-specific versions
👉 Added write_job scope to config.json; README updated with the new actions, scope and limitations

Screenshots 📷

{Image here of before and after - if applicable}

Test plan 🧪

Provide guidance for how to QA your proposed changes. This is not only for a test but also useful for a reviewer.
{A test plan outlining scenarios to test}

Author(s) to check 👓

  • Project and all contained modules builds successfully
  • Self-/dev-tested
  • Unit/UI/Automation/Integration tests provided where applicable
  • Code is written to standards
  • Appropriate documentation written (code comments, internal docs)

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T02:06:34.978856Z e385e29 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

🔍 Integration Validation Results

Commit: f234be4b6ebce6a8846ff1dafc2fc27845c8307c · fix(jobadder): encode job attachment types as CSV
Changed directories: jobadder

Check Result
Structure ⚠️ Passed with warnings
Code ✅ Passed
Tests ✅ Passed
README ✅ Passed
Version ⚠️ Passed with warnings
⚠️ Structure Check output
Validating 1 integration(s)...

============================================================
Integration: jobadder
============================================================

Warnings (1):
  ⚠️ Potentially unused scopes (please verify): offline_access, read_jobapplication, write_jobapplication

============================================================
SUMMARY
============================================================
Integrations validated: 1
Total errors: 0
Total warnings: 1

⚠️ Validation passed with warnings - please review
✅ Code Check output
----------------------------------------
Checking: jobadder
----------------------------------------

🐍 Checking Python syntax...
   ✅ Syntax OK

📥 Checking imports...
   ✅ Imports OK

📄 Checking JSON files...
   ✅ JSON files OK

🔍 Linting with ruff...
   ✅ Lint OK

🎨 Checking formatting with ruff...
   ✅ Formatting OK

🔒 Scanning for security issues with bandit...
   ✅ Security OK
   Warnings:
     ⚠️ nosec encountered (B105) in jobadder/tests/conftest.py:16
     ⚠️ nosec encountered (B105) in jobadder/tests/conftest.py:17
     ⚠️ nosec encountered (B105) in jobadder/tests/conftest.py:18

🛡️ Checking dependencies for vulnerabilities with pip-audit...
   ✅ Dependencies OK

🔗 Checking config-code sync...
   ✅ Config-code sync OK

🔄 Checking fetch patterns...
   ✅ Fetch patterns OK

========================================
✅ CODE CHECK PASSED
========================================
✅ Tests Check output
Integration      Tests  Coverage        Status
----------------------------------------------
jobadder       211/211       99%      ✅ Passed
----------------------------------------------
Total          211/211            ✅ All passed

✅ Tests passed: jobadder
✅ README Check output
========================================
✅ README CHECK PASSED
========================================
⚠️ Version Check output
✅ jobadder: 1.1.1 → 1.2.0 (minor bump) (⚠️ consider a major bump — breaking changes detected (removed code, auth, or actions))

========================================
✅ VERSION CHECK PASSED
========================================

@autohive-ai autohive-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Result P1 P2 P3
Clean review 0 0 0

Clean review

Summary

Reviewed commit: e385e29

No actionable issues found in the job attachment actions, schemas, or shared download refactor.

For an explanation, reply under a comment with @autohiveai and your question.

Limitations

  • Tests were not run, as requested.
  • Live JobAdder behavior and the platform chat-file handoff were not exercised.

Review powered by Autohive

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e385e29177

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread jobadder/jobadder.py Outdated
params = {
key: value
for key, value in {
"type": inputs.get("types"),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Encode attachment type filters as CSV

When callers select both types, _fetch_get serializes this list as ?type=Other&type=JobDescription, and the new category action does the same. The JobAdder API reference declares type on both job-attachment endpoints with CSV collection format, so these actions need to send type=Other,JobDescription; otherwise JobAdder may reject the request or apply only one selected type. Pass these particular arrays as comma-separated scalar values rather than through the generic repeated-parameter encoding.

Useful? React with 👍 / 👎.

@teamcity-autohive-ai

teamcity-autohive-ai Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

Integration tests

✅ JobAdder (14/14 tests pass, 43 skipped)

Skipped (43)
⏭️ test_get_job
⏭️ test_download_job_attachment
⏭️ test_get_candidate
⏭️ test_download_candidate_attachment
⏭️ test_get_contact
⏭️ test_list_contact_notes
⏭️ test_list_contact_activities
⏭️ test_list_all_contact_activities
⏭️ test_get_note
⏭️ test_list_contact_jobs
⏭️ test_get_company
⏭️ test_list_related_resource[list_candidate_applications-candidate-candidate_id-applications-extra_inputs0]
⏭️ test_list_related_resource[list_candidate_active_applications-candidate-candidate_id-applications-extra_inputs1]
⏭️ test_list_related_resource[list_candidate_placements-candidate-candidate_id-placements-extra_inputs2]
⏭️ test_list_related_resource[list_candidate_approved_placements-candidate-candidate_id-placements-extra_inputs3]
⏭️ test_list_related_resource[list_candidate_attachments-candidate-candidate_id-attachments-extra_inputs4]
⏭️ test_list_related_resource[list_candidate_skills-candidate-candidate_id-skills-extra_inputs5]
⏭️ test_list_related_resource[list_candidate_notes-candidate-candidate_id-notes-extra_inputs6]
⏭️ test_list_related_resource[list_job_applications-job-job_id-applications-extra_inputs7]
⏭️ test_list_related_resource[list_job_active_applications-job-job_id-applications-extra_inputs8]
⏭️ test_list_related_resource[list_job_placements-job-job_id-placements-extra_inputs9]
⏭️ test_list_related_resource[list_job_approved_placements-job-job_id-placements-extra_inputs10]
⏭️ test_list_related_resource[list_job_attachments-job-job_id-attachments-extra_inputs11]
⏭️ test_list_related_resource[list_job_notes-job-job_id-notes-extra_inputs12]
⏭️ test_list_related_resource[list_job_activities-job-job_id-activities-extra_inputs13]
⏭️ test_list_related_resource[list_application_attachments-application-application_id-attachments-extra_inputs14]
⏭️ test_list_related_resource[list_application_notes-application-application_id-notes-extra_inputs15]
⏭️ test_list_related_resource[list_application_activities-application-application_id-activities-extra_inputs16]
⏭️ test_list_related_resource[list_placement_attachments-placement-placement_id-attachments-extra_inputs17]
⏭️ test_list_related_resource[list_placement_notes-placement-placement_id-notes-extra_inputs18]
⏭️ test_list_related_resource[list_placement_timesheets-placement-placement_id-timesheets-extra_inputs19]
⏭️ test_list_related_resource[list_placement_activities-placement-placement_id-activities-extra_inputs20]
⏭️ test_list_related_resource[list_company_contacts-company-company_id-contacts-extra_inputs21]
⏭️ test_list_related_resource[list_company_addresses-company-company_id-addresses-extra_inputs22]
⏭️ test_list_related_resource[list_company_jobs-company-company_id-jobs-extra_inputs23]
⏭️ test_list_related_resource[list_company_active_jobs-company-company_id-jobs-extra_inputs24]
⏭️ test_list_related_resource[list_company_placements-company-company_id-placements-extra_inputs25]
⏭️ test_list_related_resource[list_company_approved_placements-company-company_id-placements-extra_inputs26]
⏭️ test_list_related_resource[list_company_attachments-company-company_id-attachments-extra_inputs27]
⏭️ test_list_related_resource[list_company_notes-company-company_id-notes-extra_inputs28]
⏭️ test_get_candidate_availability
⏭️ test_get_application
⏭️ test_get_placement

Passed (14)
✅ test_get_current_user
✅ test_list_jobs
✅ test_list_job_attachment_categories
✅ test_list_candidates
✅ test_list_candidate_attachment_categories
✅ test_list_note_types[list_candidate_note_types]
✅ test_list_note_types[list_contact_note_types]
✅ test_list_note_types[list_job_note_types]
✅ test_list_note_types[list_placement_note_types]
✅ test_list_note_types[list_company_note_types]
✅ test_list_contacts
✅ test_list_companies
✅ test_list_applications
✅ test_list_placements

View tests in TeamCity

@sumitramanga

Copy link
Copy Markdown
Contributor Author

The code review feedback on scopes is a false positive. We need the scopes

The version number bump, I will need Kai to check this please! @TheRealAgentK

@TheRealAgentK

TheRealAgentK commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

The code review feedback on scopes is a false positive. We need the scopes

The version number bump, I will need Kai to check this please! @TheRealAgentK

There is at least one action renames/removal, so I'd make it 2.0.0 because it's breaking the contract.

Would also be worthwhile for you to check if it's used in workflows anywhere because they might break. And if the integration gets uploaded and it's not setup from the customer to enable all actions, there might be differences in what's enabled after the rename/removal.

Edit: I misread the code - the changes are entirely in internal functions, sorry for any confusion, @sumitramanga .

Version can stay with what you changed it to.

@sumitramanga
sumitramanga merged commit a1a392c into master Oct 19, 2026
4 checks passed
@sumitramanga
sumitramanga deleted the sm/extend-job-adder-integration branch October 19, 2026 00:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants