tango-python 1.9.0__py3-none-any.whl → 1.11.0__py3-none-any.whl

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.
tango/__init__.py CHANGED
@@ -59,7 +59,7 @@ from .webhooks import (
59
59
  )
60
60
  from .webhooks.receiver import Delivery, WebhookReceiver
61
61
 
62
- __version__ = "1.9.0"
62
+ __version__ = "1.11.0"
63
63
  __all__ = [
64
64
  "TangoClient",
65
65
  "TangoAPIError",
tango/client.py CHANGED
@@ -2346,6 +2346,9 @@ class TangoClient:
2346
2346
  search: str | None = None,
2347
2347
  set_aside: str | None = None,
2348
2348
  solicitation_number: str | None = None,
2349
+ *,
2350
+ awarded: bool | None = None,
2351
+ awardee_uei: str | None = None,
2349
2352
  ) -> PaginatedResponse:
2350
2353
  """
2351
2354
  List contract opportunities/solicitations
@@ -2358,6 +2361,8 @@ class TangoClient:
2358
2361
  flat_lists: If True, flatten arrays using indexed keys
2359
2362
  active: Filter by active status
2360
2363
  agency: Agency filter
2364
+ awarded: Filter by whether the opportunity has an award, either posted on it or linked to it from a separate award notice. Searches every opportunity rather than only active ones. Requires Tango API 5.5.0
2365
+ awardee_uei: Filter by the awardee's UEI (case-insensitive). OR several with ``|``. Searches every opportunity rather than only active ones. Requires Tango API 5.5.0
2361
2366
  first_notice_date_after: First notice date after
2362
2367
  first_notice_date_before: First notice date before
2363
2368
  last_notice_date_after: Last notice date after
@@ -2387,6 +2392,8 @@ class TangoClient:
2387
2392
  for key, val in (
2388
2393
  ("active", active),
2389
2394
  ("agency", agency),
2395
+ ("awarded", awarded),
2396
+ ("awardee_uei", awardee_uei),
2390
2397
  ("first_notice_date_after", first_notice_date_after),
2391
2398
  ("first_notice_date_before", first_notice_date_before),
2392
2399
  ("last_notice_date_after", last_notice_date_after),
@@ -3733,6 +3740,7 @@ class TangoClient:
3733
3740
  flat_lists: bool = False,
3734
3741
  topic_number: str | None = None,
3735
3742
  solicitation_number: str | None = None,
3743
+ cycle_name: str | None = None,
3736
3744
  agency: str | None = None,
3737
3745
  activity: str | None = None,
3738
3746
  year: int | None = None,
@@ -3759,6 +3767,7 @@ class TangoClient:
3759
3767
  flat_lists: If True, flatten arrays using indexed keys
3760
3768
  topic_number: Filter by topic number
3761
3769
  solicitation_number: Filter by solicitation number
3770
+ cycle_name: Filter by DSIP solicitation cycle, exact (e.g. "DOD_SBIR_2026_P1_CBZ"; requires Tango API 5.3.1)
3762
3771
  agency: Filter by agency
3763
3772
  activity: Filter by activity (component/branch)
3764
3773
  year: Filter by solicitation year
@@ -3786,6 +3795,7 @@ class TangoClient:
3786
3795
  for key, val in (
3787
3796
  ("topic_number", topic_number),
3788
3797
  ("solicitation_number", solicitation_number),
3798
+ ("cycle_name", cycle_name),
3789
3799
  ("agency", agency),
3790
3800
  ("activity", activity),
3791
3801
  ("year", year),
tango/models.py CHANGED
@@ -565,6 +565,10 @@ class Opportunity:
565
565
  Both must be named, e.g. ``attachments(name,url,doc_role,doc_role_alt)``, because ``attachments(*)`` does not include them.
566
566
  An attachment Tango has not classified omits both keys rather than returning null, so read them with ``.get()``.
567
567
  A Free-plan request that names them gets the response without them, plus an entry in ``meta.upgrade_hints``.
568
+
569
+ The award fields (``award_date``, ``award_amount``, ``awardee``, ``awardee_uei``) are filled only where SAM.gov posted an award notice, and ``award_amount`` is the text SAM.gov published, not a number.
570
+ SAM.gov often posts an award as its own opportunity; when that award notice references its solicitation, ``solicitation_opportunity_id`` points back to it, and the solicitation's ``awards(...)`` expand lists up to ten of the most recent linked awards, with ``award_count`` giving the full count.
571
+ An award notice that does not reference its solicitation is not linked.
568
572
  """
569
573
 
570
574
  opportunity_id: str
@@ -575,6 +579,15 @@ class Opportunity:
575
579
  active: bool | None = None
576
580
  naics_code: str | None = None
577
581
  psc_code: str | None = None
582
+ award_number: str | None = None
583
+ awarded: bool | None = None
584
+ award_date: date | None = None
585
+ award_amount: str | None = None
586
+ awardee: str | None = None
587
+ awardee_uei: str | None = None
588
+ award_count: int | None = None
589
+ solicitation_opportunity_id: str | None = None
590
+ awards: list[dict[str, Any]] | None = None
578
591
 
579
592
 
580
593
  @dataclass
@@ -593,6 +606,11 @@ class Notice:
593
606
  description: str | None = None
594
607
  posted_date: datetime | None = None
595
608
  naics_code: str | None = None
609
+ award_number: str | None = None
610
+ award_date: date | None = None
611
+ award_amount: str | None = None
612
+ awardee: str | None = None
613
+ awardee_uei: str | None = None
596
614
 
597
615
 
598
616
  @dataclass
@@ -1000,6 +1018,7 @@ class SbirTopic:
1000
1018
  activity: str | None = None
1001
1019
  year: int | None = None
1002
1020
  solicitation_number: str | None = None
1021
+ cycle_name: str | None = None
1003
1022
  solicitation_status: str | None = None
1004
1023
  release_date: str | None = None
1005
1024
  open_date: str | None = None
@@ -213,6 +213,16 @@ AWARDS_SCHEMA: dict[str, FieldSchema] = {
213
213
  "transactions": FieldSchema(name="transactions", type=str, is_optional=True, is_list=False),
214
214
  }
215
215
 
216
+ AWARDS2_SCHEMA: dict[str, FieldSchema] = {
217
+ "award_amount": FieldSchema(name="award_amount", type=str, is_optional=True, is_list=False),
218
+ "award_date": FieldSchema(name="award_date", type=date, is_optional=True, is_list=False),
219
+ "award_number": FieldSchema(name="award_number", type=str, is_optional=True, is_list=False),
220
+ "awardee": FieldSchema(name="awardee", type=str, is_optional=True, is_list=False),
221
+ "awardee_uei": FieldSchema(name="awardee_uei", type=str, is_optional=True, is_list=False),
222
+ "notice_id": FieldSchema(name="notice_id", type=str, is_optional=True, is_list=False),
223
+ "opportunity_id": FieldSchema(name="opportunity_id", type=str, is_optional=True, is_list=False),
224
+ }
225
+
216
226
  BUDGET_APPROPRIATION_SCHEMA: dict[str, FieldSchema] = {
217
227
  "cgac": FieldSchema(name="cgac", type=int, is_optional=True, is_list=False),
218
228
  "fiscal_year": FieldSchema(name="fiscal_year", type=int, is_optional=True, is_list=False),
@@ -1112,6 +1122,7 @@ GENERATED_NESTED: dict[str, dict[str, FieldSchema]] = {
1112
1122
  "AwardingOffice": AWARDING_OFFICE_SCHEMA,
1113
1123
  "AwardingOffice2": AWARDING_OFFICE2_SCHEMA,
1114
1124
  "Awards": AWARDS_SCHEMA,
1125
+ "Awards2": AWARDS2_SCHEMA,
1115
1126
  "BudgetAppropriation": BUDGET_APPROPRIATION_SCHEMA,
1116
1127
  "BudgetSpending": BUDGET_SPENDING_SCHEMA,
1117
1128
  "Children": CHILDREN_SCHEMA,
@@ -2228,6 +2239,10 @@ GENERATED_OVERLAY: dict[str, dict[str, FieldSchema]] = {
2228
2239
  is_list=True,
2229
2240
  nested_model="Attachments",
2230
2241
  ),
2242
+ "award_amount": FieldSchema(name="award_amount", type=str, is_optional=True, is_list=False),
2243
+ "award_date": FieldSchema(name="award_date", type=date, is_optional=True, is_list=False),
2244
+ "awardee": FieldSchema(name="awardee", type=str, is_optional=True, is_list=False),
2245
+ "awardee_uei": FieldSchema(name="awardee_uei", type=str, is_optional=True, is_list=False),
2231
2246
  "meta": FieldSchema(
2232
2247
  name="meta", type=dict, is_optional=True, is_list=False, nested_model="Meta"
2233
2248
  ),
@@ -2476,6 +2491,15 @@ GENERATED_OVERLAY: dict[str, dict[str, FieldSchema]] = {
2476
2491
  is_list=False,
2477
2492
  nested_model="Attachments5",
2478
2493
  ),
2494
+ "award_amount": FieldSchema(name="award_amount", type=str, is_optional=True, is_list=False),
2495
+ "award_count": FieldSchema(name="award_count", type=int, is_optional=True, is_list=False),
2496
+ "award_date": FieldSchema(name="award_date", type=date, is_optional=True, is_list=False),
2497
+ "awarded": FieldSchema(name="awarded", type=bool, is_optional=True, is_list=False),
2498
+ "awardee": FieldSchema(name="awardee", type=str, is_optional=True, is_list=False),
2499
+ "awardee_uei": FieldSchema(name="awardee_uei", type=str, is_optional=True, is_list=False),
2500
+ "awards": FieldSchema(
2501
+ name="awards", type=dict, is_optional=True, is_list=True, nested_model="Awards2"
2502
+ ),
2479
2503
  "department": FieldSchema(
2480
2504
  name="department",
2481
2505
  type=dict,
@@ -2529,6 +2553,9 @@ GENERATED_OVERLAY: dict[str, dict[str, FieldSchema]] = {
2529
2553
  nested_model="CodeDescription",
2530
2554
  ),
2531
2555
  "snippet": FieldSchema(name="snippet", type=str, is_optional=True, is_list=False),
2556
+ "solicitation_opportunity_id": FieldSchema(
2557
+ name="solicitation_opportunity_id", type=str, is_optional=True, is_list=False
2558
+ ),
2532
2559
  },
2533
2560
  "Organization": {
2534
2561
  "aac_code": FieldSchema(name="aac_code", type=str, is_optional=True, is_list=False),
@@ -2731,6 +2758,7 @@ GENERATED_OVERLAY: dict[str, dict[str, FieldSchema]] = {
2731
2758
  "activity": FieldSchema(name="activity", type=str, is_optional=True, is_list=False),
2732
2759
  "agency": FieldSchema(name="agency", type=str, is_optional=True, is_list=False),
2733
2760
  "close_date": FieldSchema(name="close_date", type=date, is_optional=True, is_list=False),
2761
+ "cycle_name": FieldSchema(name="cycle_name", type=str, is_optional=True, is_list=False),
2734
2762
  "description": FieldSchema(name="description", type=str, is_optional=True, is_list=False),
2735
2763
  "doc_source": FieldSchema(name="doc_source", type=str, is_optional=True, is_list=False),
2736
2764
  "due_dates_text": FieldSchema(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tango-python
3
- Version: 1.9.0
3
+ Version: 1.11.0
4
4
  Summary: Python SDK for the Tango API
5
5
  Project-URL: Homepage, https://github.com/makegov/tango-python
6
6
  Project-URL: Documentation, https://docs.makegov.com/tango-python
@@ -1,11 +1,11 @@
1
- tango/__init__.py,sha256=jdqZItlsYrPAUN5SNr0jxMzKta8MVebhkafeJkatzyI,2534
2
- tango/client.py,sha256=_QCR5rwYPHs1YHsuf9TCEJXQoNIcHshF5nRrArmuf7s,237760
1
+ tango/__init__.py,sha256=nM2IFpjrIua3MzTAR1bedo7DRmTgJ0DU9YeRQOlDXQA,2535
2
+ tango/client.py,sha256=3jxYp3Dcgy8cVUpy0uK0H_qQbfKrgWMq3k65bm0uadg,238519
3
3
  tango/exceptions.py,sha256=oPiLCccBoWLK5SjHkzP-oI6mUD9twEeKSvEuLV5h01I,4224
4
- tango/models.py,sha256=Ujvt-cUxfFA2VZoAfRZs77WPcwUdyb-Hw-EWkoa7mrw,66613
4
+ tango/models.py,sha256=WkIK_Ym36afRych_EtlGk5Ki3aevL14klk0SCiCDxgU,67741
5
5
  tango/shapes/__init__.py,sha256=7ea1WU74jp4znhNw-gXruag6m6eyPZtbVgbDFmFUWro,1072
6
6
  tango/shapes/explicit_schemas.py,sha256=spYyMmWKOiMJygz9yViBQrjIxUPFfv7HpVkJcWy13x8,84021
7
7
  tango/shapes/factory.py,sha256=uDPhnp6VVzrLBKodxteZy5AcU43juEv-qKVRWth51j0,31550
8
- tango/shapes/generated_overlay.py,sha256=X6VLGbO2sgh4X_u8hJmIqnB30Hct8XZDQfnSbIV7tBU,138368
8
+ tango/shapes/generated_overlay.py,sha256=RrCqR-iwBnUbr5dtPQ_f78fnrWcfLf_fP9EtfHKIdw4,140461
9
9
  tango/shapes/generator.py,sha256=xzakpwTwqTMUr89I06hp54-FIYZziviWHk2Glscg-LM,22775
10
10
  tango/shapes/models.py,sha256=h3pIhOqrrdlN953Y6r0oney5HFbKPOD-frRndRWimJ0,3018
11
11
  tango/shapes/parser.py,sha256=AecNx5oT_hV_pf2AWZnsR8Y2aLmCtjfgS9-znA2Pesc,27429
@@ -16,8 +16,8 @@ tango/webhooks/cli.py,sha256=f_vQbJ2AeSQjKnQo7MxHFyUB2SAKcgHYmGQULS0isqQ,13858
16
16
  tango/webhooks/receiver.py,sha256=5yhsVhlLyoxmOCGvmbynWAIlDB2OaCPVf1H4GA1SxmU,9279
17
17
  tango/webhooks/signing.py,sha256=92Ee-0B6PR7ZkvY3Np3gzl88-mtfKkh-I7lxqCe2lGw,2374
18
18
  tango/webhooks/simulate.py,sha256=g2Osa0FYU5mJuon07T2aUCtmkUoTEzsY261tlp76fF0,3165
19
- tango_python-1.9.0.dist-info/METADATA,sha256=FFL14hmyg_t__WWg6lSxVA3ydOSA8GwLoaIdysJsuog,22117
20
- tango_python-1.9.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
21
- tango_python-1.9.0.dist-info/entry_points.txt,sha256=kGLUbglUjuaAqEFvOZ1QuSW0vWb6VeSpCIFKaOFkKoQ,50
22
- tango_python-1.9.0.dist-info/licenses/LICENSE,sha256=j2kYVHMwTkoGn3ZNScnrdIueG0k2XzB_LCPFoyBc2wk,1064
23
- tango_python-1.9.0.dist-info/RECORD,,
19
+ tango_python-1.11.0.dist-info/METADATA,sha256=l9-XAukNLKq3XM_V8zjXOzALwqo6MeGBIFtdEsW9kuY,22118
20
+ tango_python-1.11.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
21
+ tango_python-1.11.0.dist-info/entry_points.txt,sha256=kGLUbglUjuaAqEFvOZ1QuSW0vWb6VeSpCIFKaOFkKoQ,50
22
+ tango_python-1.11.0.dist-info/licenses/LICENSE,sha256=j2kYVHMwTkoGn3ZNScnrdIueG0k2XzB_LCPFoyBc2wk,1064
23
+ tango_python-1.11.0.dist-info/RECORD,,