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 +1 -1
- tango/client.py +10 -0
- tango/models.py +19 -0
- tango/shapes/generated_overlay.py +28 -0
- {tango_python-1.9.0.dist-info → tango_python-1.11.0.dist-info}/METADATA +1 -1
- {tango_python-1.9.0.dist-info → tango_python-1.11.0.dist-info}/RECORD +9 -9
- {tango_python-1.9.0.dist-info → tango_python-1.11.0.dist-info}/WHEEL +0 -0
- {tango_python-1.9.0.dist-info → tango_python-1.11.0.dist-info}/entry_points.txt +0 -0
- {tango_python-1.9.0.dist-info → tango_python-1.11.0.dist-info}/licenses/LICENSE +0 -0
tango/__init__.py
CHANGED
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,11 +1,11 @@
|
|
|
1
|
-
tango/__init__.py,sha256=
|
|
2
|
-
tango/client.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
20
|
-
tango_python-1.
|
|
21
|
-
tango_python-1.
|
|
22
|
-
tango_python-1.
|
|
23
|
-
tango_python-1.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|