|
7 | 7 | Callable,
|
8 | 8 | List,
|
9 | 9 | Optional,
|
| 10 | + Sequence, |
10 | 11 | Tuple,
|
11 | 12 | Union,
|
12 | 13 | )
|
|
49 | 50 |
|
50 | 51 | ActorUrn: TypeAlias = Union[CorpUserUrn, CorpGroupUrn]
|
51 | 52 |
|
| 53 | +_DEFAULT_ACTOR_URN = CorpUserUrn("__ingestion").urn() |
| 54 | + |
52 | 55 |
|
53 | 56 | def make_time_stamp(ts: Optional[datetime]) -> Optional[models.TimeStampClass]:
|
54 | 57 | if ts is None:
|
@@ -438,8 +441,7 @@ def _parse_glossary_term_association_class(
|
438 | 441 | def _terms_audit_stamp(self) -> models.AuditStampClass:
|
439 | 442 | return models.AuditStampClass(
|
440 | 443 | time=0,
|
441 |
| - # TODO figure out what to put here |
442 |
| - actor=CorpUserUrn("__ingestion").urn(), |
| 444 | + actor=_DEFAULT_ACTOR_URN, |
443 | 445 | )
|
444 | 446 |
|
445 | 447 | def set_terms(self, terms: TermsInputType) -> None:
|
@@ -493,3 +495,86 @@ def domain(self) -> Optional[DomainUrn]:
|
493 | 495 | def set_domain(self, domain: DomainInputType) -> None:
|
494 | 496 | domain_urn = DomainUrn.from_string(domain) # basically a type assertion
|
495 | 497 | self._set_aspect(models.DomainsClass(domains=[str(domain_urn)]))
|
| 498 | + |
| 499 | + |
| 500 | +LinkInputType: TypeAlias = Union[ |
| 501 | + str, |
| 502 | + Tuple[str, str], # url, description |
| 503 | + models.InstitutionalMemoryMetadataClass, |
| 504 | +] |
| 505 | +LinksInputType: TypeAlias = Sequence[LinkInputType] |
| 506 | + |
| 507 | + |
| 508 | +class HasInstitutionalMemory(Entity): |
| 509 | + __slots__ = () |
| 510 | + |
| 511 | + # Internally the aspect is called institutionalMemory, and so much of the code |
| 512 | + # uses that name. However, the public-facing API is called "links", since |
| 513 | + # that's what we call these in the UI. |
| 514 | + |
| 515 | + def _ensure_institutional_memory( |
| 516 | + self, |
| 517 | + ) -> List[models.InstitutionalMemoryMetadataClass]: |
| 518 | + return self._setdefault_aspect( |
| 519 | + models.InstitutionalMemoryClass(elements=[]) |
| 520 | + ).elements |
| 521 | + |
| 522 | + @property |
| 523 | + def links(self) -> Optional[List[models.InstitutionalMemoryMetadataClass]]: |
| 524 | + if institutional_memory := self._get_aspect(models.InstitutionalMemoryClass): |
| 525 | + return institutional_memory.elements |
| 526 | + return None |
| 527 | + |
| 528 | + @classmethod |
| 529 | + def _institutional_memory_audit_stamp(self) -> models.AuditStampClass: |
| 530 | + return models.AuditStampClass( |
| 531 | + time=0, |
| 532 | + actor=_DEFAULT_ACTOR_URN, |
| 533 | + ) |
| 534 | + |
| 535 | + @classmethod |
| 536 | + def _parse_link_association_class( |
| 537 | + cls, link: LinkInputType |
| 538 | + ) -> models.InstitutionalMemoryMetadataClass: |
| 539 | + if isinstance(link, models.InstitutionalMemoryMetadataClass): |
| 540 | + return link |
| 541 | + elif isinstance(link, str): |
| 542 | + return models.InstitutionalMemoryMetadataClass( |
| 543 | + url=link, |
| 544 | + description=link, |
| 545 | + createStamp=cls._institutional_memory_audit_stamp(), |
| 546 | + ) |
| 547 | + elif isinstance(link, tuple) and len(link) == 2: |
| 548 | + url, description = link |
| 549 | + return models.InstitutionalMemoryMetadataClass( |
| 550 | + url=url, |
| 551 | + description=description, |
| 552 | + createStamp=cls._institutional_memory_audit_stamp(), |
| 553 | + ) |
| 554 | + else: |
| 555 | + assert_never(link) |
| 556 | + |
| 557 | + def set_links(self, links: LinksInputType) -> None: |
| 558 | + self._set_aspect( |
| 559 | + models.InstitutionalMemoryClass( |
| 560 | + elements=[self._parse_link_association_class(link) for link in links] |
| 561 | + ) |
| 562 | + ) |
| 563 | + |
| 564 | + @classmethod |
| 565 | + def _link_key(self, link: models.InstitutionalMemoryMetadataClass) -> str: |
| 566 | + return link.url |
| 567 | + |
| 568 | + def add_link(self, link: LinkInputType) -> None: |
| 569 | + add_list_unique( |
| 570 | + self._ensure_institutional_memory(), |
| 571 | + self._link_key, |
| 572 | + self._parse_link_association_class(link), |
| 573 | + ) |
| 574 | + |
| 575 | + def remove_link(self, link: LinkInputType) -> None: |
| 576 | + remove_list_unique( |
| 577 | + self._ensure_institutional_memory(), |
| 578 | + self._link_key, |
| 579 | + self._parse_link_association_class(link), |
| 580 | + ) |
0 commit comments