dhisana 0.0.1.dev252__tar.gz → 0.0.1.dev254__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/PKG-INFO +1 -1
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/setup.py +1 -1
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/schemas/sales.py +8 -2
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/apollo_tools.py +14 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/test_connect.py +77 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana.egg-info/PKG-INFO +1 -1
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_apollo_lead_search.py +11 -3
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/README.md +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/pyproject.toml +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/setup.cfg +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/__init__.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/cli/__init__.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/cli/cli.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/cli/datasets.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/cli/models.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/cli/predictions.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/schemas/__init__.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/schemas/common.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/ui/__init__.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/ui/components.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/__init__.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/add_mapping.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/agent_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/assistant_tool_tag.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/built_with_api_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/cache_output_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/cache_output_tools_local.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/check_email_validity_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/check_for_intent_signal.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/check_linkedin_url_validity.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/clay_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/clean_properties.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/company_utils.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/compose_salesnav_query.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/compose_search_query.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/compose_three_step_workflow.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/composite_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/dataframe_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/domain_parser.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/email_body_utils.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/email_parse_helpers.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/email_provider.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/enrich_lead_information.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/extract_email_content_for_llm.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/fetch_openai_config.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/field_validators.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/g2_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/generate_content.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/generate_custom_message.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/generate_email.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/generate_email_response.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/generate_flow.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/generate_leads_salesnav.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/generate_linkedin_connect_message.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/generate_linkedin_response_message.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/generate_structured_output_internal.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/google_custom_search.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/google_oauth_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/google_workspace_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/hubspot_clearbit.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/hubspot_crm_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/instantly_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/linkedin_crawler.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/lusha_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/mailgun_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/mailreach_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/microsoft365_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/openai_assistant_and_file_utils.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/openai_helpers.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/openapi_spec_to_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/openapi_tool/__init__.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/openapi_tool/api_models.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/openapi_tool/convert_openai_spec_to_tool.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/openapi_tool/openapi_tool.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/parse_linkedin_messages_txt.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/profile.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/proxy_curl_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/proxycurl_search_leads.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/python_function_to_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/research_lead.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/sales_navigator_crawler.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/salesforce_crm_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/search_router.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/search_router_jobs.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/sendgrid_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serarch_router_local_business.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serpapi_additional_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serpapi_google_jobs.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serpapi_google_search.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serpapi_local_business_search.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serpapi_search_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serperdev_google_jobs.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serperdev_local_business.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serperdev_search.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/smtp_email_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/trasform_json.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/web_download_parse_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/workflow_code_model.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/zoominfo_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/workflow/__init__.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/workflow/agent.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/workflow/flow.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/workflow/task.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/workflow/test.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana.egg-info/SOURCES.txt +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana.egg-info/dependency_links.txt +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana.egg-info/entry_points.txt +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana.egg-info/requires.txt +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana.egg-info/top_level.txt +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_agent_tools.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_apollo_company_search.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_connectivity.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_email_body_utils.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_google_document.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_hubspot_call_logs.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_linkedin_serper.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_mailreach.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_mcp_connectivity.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_proxycurl_get_company_search_id.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_proxycurl_job_count.py +0 -0
- {dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/tests/test_structured_output_with_mcp.py +0 -0
|
@@ -728,7 +728,10 @@ class LeadsQueryFilters(BaseModel):
|
|
|
728
728
|
# CHANGED: Renamed to be more descriptive
|
|
729
729
|
industries: Optional[List[str]] = Field(
|
|
730
730
|
default=None,
|
|
731
|
-
description=
|
|
731
|
+
description=(
|
|
732
|
+
"List of organization industries (case sensitive). "
|
|
733
|
+
"Maps to organization_industries in Apollo."
|
|
734
|
+
)
|
|
732
735
|
)
|
|
733
736
|
|
|
734
737
|
# Potential existing fields
|
|
@@ -800,7 +803,10 @@ class LeadsQueryFilters(BaseModel):
|
|
|
800
803
|
# CHANGED: Renamed for consistency
|
|
801
804
|
company_industry_tag_ids: Optional[List[str]] = Field(
|
|
802
805
|
default=None,
|
|
803
|
-
description=
|
|
806
|
+
description=(
|
|
807
|
+
"List of industry tag IDs, e.g. ['5567cd4773696439b10b0000']. "
|
|
808
|
+
"Maps to organization_industry_tag_ids."
|
|
809
|
+
)
|
|
804
810
|
)
|
|
805
811
|
|
|
806
812
|
q_organization_keyword_tags: Optional[List[str]] = Field(
|
|
@@ -547,6 +547,7 @@ async def search_leads_with_apollo(
|
|
|
547
547
|
"revenueRange[max]": "revenue_range_max",
|
|
548
548
|
"revenueRange[min]": "revenue_range_min",
|
|
549
549
|
"currentlyUsingAnyOfTechnologyUids": "currently_using_any_of_technology_uids",
|
|
550
|
+
"organizationIndustries": "organization_industries",
|
|
550
551
|
"organizationIndustryTagIds": "organization_industry_tag_ids",
|
|
551
552
|
"notOrganizationIds": "not_organization_ids",
|
|
552
553
|
"qOrganizationDomainsList": "q_organization_domains_list",
|
|
@@ -614,6 +615,8 @@ async def search_leads_with_apollo(
|
|
|
614
615
|
"person_not_titles", # <--- added so single item is forced into list
|
|
615
616
|
"q_organization_job_titles",
|
|
616
617
|
"organization_latest_funding_stage_cd",
|
|
618
|
+
"organization_industries",
|
|
619
|
+
"organization_industry_tag_ids",
|
|
617
620
|
):
|
|
618
621
|
if isinstance(final_value, str):
|
|
619
622
|
final_value = [final_value]
|
|
@@ -664,6 +667,10 @@ async def search_leads_with_apollo(
|
|
|
664
667
|
dynamic_payload["sort_ascending"] = query.sort_ascending
|
|
665
668
|
if query.person_seniorities:
|
|
666
669
|
dynamic_payload["person_seniorities"] = query.person_seniorities
|
|
670
|
+
if query.industries:
|
|
671
|
+
dynamic_payload["organization_industries"] = query.industries
|
|
672
|
+
if query.company_industry_tag_ids:
|
|
673
|
+
dynamic_payload["organization_industry_tag_ids"] = query.company_industry_tag_ids
|
|
667
674
|
# Add company domains to include in search
|
|
668
675
|
if query.company_domains:
|
|
669
676
|
dynamic_payload["q_organization_domains_list"] = query.company_domains
|
|
@@ -782,6 +789,7 @@ async def search_leads_with_apollo_page(
|
|
|
782
789
|
"revenueRange[max]": "revenue_range_max",
|
|
783
790
|
"revenueRange[min]": "revenue_range_min",
|
|
784
791
|
"currentlyUsingAnyOfTechnologyUids": "currently_using_any_of_technology_uids",
|
|
792
|
+
"organizationIndustries": "organization_industries",
|
|
785
793
|
"organizationIndustryTagIds": "organization_industry_tag_ids",
|
|
786
794
|
"notOrganizationIds": "not_organization_ids",
|
|
787
795
|
"qOrganizationDomainsList": "q_organization_domains_list",
|
|
@@ -834,6 +842,8 @@ async def search_leads_with_apollo_page(
|
|
|
834
842
|
"person_not_titles",
|
|
835
843
|
"q_organization_job_titles",
|
|
836
844
|
"organization_latest_funding_stage_cd",
|
|
845
|
+
"organization_industries",
|
|
846
|
+
"organization_industry_tag_ids",
|
|
837
847
|
):
|
|
838
848
|
if isinstance(final_value, str):
|
|
839
849
|
final_value = [final_value]
|
|
@@ -880,6 +890,10 @@ async def search_leads_with_apollo_page(
|
|
|
880
890
|
|
|
881
891
|
if query.q_not_organization_keyword_tags:
|
|
882
892
|
dynamic_payload["q_not_organization_keyword_tags"] = query.q_not_organization_keyword_tags
|
|
893
|
+
if query.industries:
|
|
894
|
+
dynamic_payload["organization_industries"] = query.industries
|
|
895
|
+
if query.company_industry_tag_ids:
|
|
896
|
+
dynamic_payload["organization_industry_tag_ids"] = query.company_industry_tag_ids
|
|
883
897
|
|
|
884
898
|
# Add company domains to include in search (Apollo API: q_organization_domains_list[])
|
|
885
899
|
if query.company_domains:
|
|
@@ -1714,6 +1714,82 @@ async def test_theorg(api_key: str) -> Dict[str, Any]:
|
|
|
1714
1714
|
return {"success": False, "status_code": 0, "error_message": str(exc)}
|
|
1715
1715
|
|
|
1716
1716
|
|
|
1717
|
+
###############################################################################
|
|
1718
|
+
# CORESIGNAL CONNECTIVITY
|
|
1719
|
+
###############################################################################
|
|
1720
|
+
|
|
1721
|
+
async def test_coresignal(api_key: str) -> Dict[str, Any]:
|
|
1722
|
+
"""
|
|
1723
|
+
Connectivity test for Coresignal using the Multi-source Jobs API search preview.
|
|
1724
|
+
|
|
1725
|
+
Uses a lightweight search query to verify API key validity.
|
|
1726
|
+
Reference: https://docs.coresignal.com/jobs-api/multi-source-jobs-api/search-preview
|
|
1727
|
+
"""
|
|
1728
|
+
url = "https://api.coresignal.com/cdapi/v2/job_multi_source/search/es_dsl/preview"
|
|
1729
|
+
headers = {
|
|
1730
|
+
"apikey": api_key,
|
|
1731
|
+
"Accept": "application/json",
|
|
1732
|
+
"Content-Type": "application/json",
|
|
1733
|
+
}
|
|
1734
|
+
# Minimal query to check connectivity
|
|
1735
|
+
payload = {
|
|
1736
|
+
"query": {
|
|
1737
|
+
"bool": {
|
|
1738
|
+
"must": [
|
|
1739
|
+
{
|
|
1740
|
+
"match": {
|
|
1741
|
+
"title": "software engineer"
|
|
1742
|
+
}
|
|
1743
|
+
}
|
|
1744
|
+
]
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1747
|
+
}
|
|
1748
|
+
|
|
1749
|
+
try:
|
|
1750
|
+
timeout = aiohttp.ClientTimeout(total=15)
|
|
1751
|
+
async with aiohttp.ClientSession(timeout=timeout) as session:
|
|
1752
|
+
async with session.post(url, headers=headers, json=payload) as resp:
|
|
1753
|
+
status = resp.status
|
|
1754
|
+
data = await safe_json(resp)
|
|
1755
|
+
|
|
1756
|
+
if status == 200:
|
|
1757
|
+
# Check if we got a valid response (list of job results or empty list)
|
|
1758
|
+
if isinstance(data, list):
|
|
1759
|
+
return {"success": True, "status_code": status, "error_message": None}
|
|
1760
|
+
# Some endpoints may return a dict with results
|
|
1761
|
+
if isinstance(data, dict):
|
|
1762
|
+
if "error" in data or "errors" in data:
|
|
1763
|
+
err = data.get("error") or data.get("errors")
|
|
1764
|
+
if isinstance(err, dict):
|
|
1765
|
+
err = err.get("message") or str(err)
|
|
1766
|
+
return {"success": False, "status_code": status, "error_message": str(err)}
|
|
1767
|
+
return {"success": True, "status_code": status, "error_message": None}
|
|
1768
|
+
return {"success": True, "status_code": status, "error_message": None}
|
|
1769
|
+
|
|
1770
|
+
if status in (401, 403):
|
|
1771
|
+
msg = None
|
|
1772
|
+
if isinstance(data, dict):
|
|
1773
|
+
msg = data.get("message") or data.get("error") or data.get("detail")
|
|
1774
|
+
return {
|
|
1775
|
+
"success": False,
|
|
1776
|
+
"status_code": status,
|
|
1777
|
+
"error_message": msg or "Unauthorized – check Coresignal API key",
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
msg = None
|
|
1781
|
+
if isinstance(data, dict):
|
|
1782
|
+
msg = data.get("message") or data.get("error") or data.get("detail")
|
|
1783
|
+
return {
|
|
1784
|
+
"success": False,
|
|
1785
|
+
"status_code": status,
|
|
1786
|
+
"error_message": msg or f"Coresignal responded with {status}",
|
|
1787
|
+
}
|
|
1788
|
+
except Exception as e:
|
|
1789
|
+
logger.error(f"Coresignal connectivity test failed: {e}")
|
|
1790
|
+
return {"success": False, "status_code": 0, "error_message": str(e)}
|
|
1791
|
+
|
|
1792
|
+
|
|
1717
1793
|
###############################################################################
|
|
1718
1794
|
# DATAGMA CONNECTIVITY
|
|
1719
1795
|
###############################################################################
|
|
@@ -1808,6 +1884,7 @@ async def test_connectivity(tool_config: List[Dict[str, Any]]) -> Dict[str, Dict
|
|
|
1808
1884
|
"commonRoom": test_commonroom,
|
|
1809
1885
|
"scarf": test_scarf,
|
|
1810
1886
|
"theorg": test_theorg,
|
|
1887
|
+
"coresignal": test_coresignal,
|
|
1811
1888
|
"salesforce": test_salesforce,
|
|
1812
1889
|
"clay": test_clay,
|
|
1813
1890
|
"posthog": test_posthog,
|
|
@@ -58,7 +58,9 @@ async def test_search_leads_with_apollo_page_parses_url_filters(apollo_people_re
|
|
|
58
58
|
"https://app.apollo.io/#/people?page=1&personTitles[]=VP%20Sales&"
|
|
59
59
|
"organizationLatestFundingStageCd[]=3&organizationLatestFundingStageCd[]=4&"
|
|
60
60
|
"organizationLatestFundingStageCd[]=5&qOrganizationJobTitles[]=SDR&"
|
|
61
|
-
"qOrganizationJobTitles[]=account%20executive"
|
|
61
|
+
"qOrganizationJobTitles[]=account%20executive&"
|
|
62
|
+
"organizationIndustries[]=information%20technology%20%26%20services&"
|
|
63
|
+
"organizationIndustryTagIds[]=5567cd4773696439b10b0000"
|
|
62
64
|
)
|
|
63
65
|
|
|
64
66
|
with patch(
|
|
@@ -66,7 +68,7 @@ async def test_search_leads_with_apollo_page_parses_url_filters(apollo_people_re
|
|
|
66
68
|
new=AsyncMock(return_value=apollo_people_response),
|
|
67
69
|
) as mock_fetch_data, patch(
|
|
68
70
|
"src.dhisana.utils.apollo_tools.get_apollo_access_token",
|
|
69
|
-
return_value="test_api_key",
|
|
71
|
+
return_value=("test_api_key", False),
|
|
70
72
|
):
|
|
71
73
|
result = await search_leads_with_apollo_page(
|
|
72
74
|
query=LeadsQueryFilters(),
|
|
@@ -83,6 +85,8 @@ async def test_search_leads_with_apollo_page_parses_url_filters(apollo_people_re
|
|
|
83
85
|
payload = mock_fetch_data.call_args[0][3]
|
|
84
86
|
assert payload["q_organization_job_titles"] == ["SDR", "account executive"]
|
|
85
87
|
assert payload["organization_latest_funding_stage_cd"] == ["3", "4", "5"]
|
|
88
|
+
assert payload["organization_industries"] == ["information technology & services"]
|
|
89
|
+
assert payload["organization_industry_tag_ids"] == ["5567cd4773696439b10b0000"]
|
|
86
90
|
|
|
87
91
|
|
|
88
92
|
@pytest.mark.asyncio
|
|
@@ -92,6 +96,8 @@ async def test_search_leads_with_apollo_page_uses_query_filters(apollo_people_re
|
|
|
92
96
|
job_openings_with_titles=["SDR", "Account Executive"],
|
|
93
97
|
latest_funding_stages=["3", "4"],
|
|
94
98
|
organization_num_employees_ranges=["201,500"],
|
|
99
|
+
industries=["information technology & services"],
|
|
100
|
+
company_industry_tag_ids=["5567cd4773696439b10b0000"],
|
|
95
101
|
)
|
|
96
102
|
|
|
97
103
|
with patch(
|
|
@@ -99,7 +105,7 @@ async def test_search_leads_with_apollo_page_uses_query_filters(apollo_people_re
|
|
|
99
105
|
new=AsyncMock(return_value=apollo_people_response),
|
|
100
106
|
) as mock_fetch_data, patch(
|
|
101
107
|
"src.dhisana.utils.apollo_tools.get_apollo_access_token",
|
|
102
|
-
return_value="test_api_key",
|
|
108
|
+
return_value=("test_api_key", False),
|
|
103
109
|
):
|
|
104
110
|
result = await search_leads_with_apollo_page(
|
|
105
111
|
query=query,
|
|
@@ -117,3 +123,5 @@ async def test_search_leads_with_apollo_page_uses_query_filters(apollo_people_re
|
|
|
117
123
|
assert payload["person_titles"] == ["Head of Sales"]
|
|
118
124
|
assert payload["q_organization_job_titles"] == ["SDR", "Account Executive"]
|
|
119
125
|
assert payload["organization_latest_funding_stage_cd"] == ["3", "4"]
|
|
126
|
+
assert payload["organization_industries"] == ["information technology & services"]
|
|
127
|
+
assert payload["organization_industry_tag_ids"] == ["5567cd4773696439b10b0000"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/check_email_validity_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/check_linkedin_url_validity.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/compose_three_step_workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/extract_email_content_for_llm.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/generate_linkedin_connect_message.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/openai_assistant_and_file_utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/openapi_tool/openapi_tool.py
RENAMED
|
File without changes
|
{dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/parse_linkedin_messages_txt.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serarch_router_local_business.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dhisana-0.0.1.dev252 → dhisana-0.0.1.dev254}/src/dhisana/utils/serpapi_local_business_search.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|