{"id":31782314,"url":"https://github.com/zopefoundation/products.cmfuid","last_synced_at":"2025-10-10T09:18:33.940Z","repository":{"id":32518091,"uuid":"36099285","full_name":"zopefoundation/Products.CMFUid","owner":"zopefoundation","description":"Unique ID implementation for Zope Content Mangement Framework (CMF) content","archived":false,"fork":false,"pushed_at":"2025-03-17T08:14:30.000Z","size":180,"stargazers_count":2,"open_issues_count":0,"forks_count":7,"subscribers_count":62,"default_branch":"master","last_synced_at":"2025-09-29T03:00:49.751Z","etag":null,"topics":["maintained"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zopefoundation.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGES.rst","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-05-22T23:20:26.000Z","updated_at":"2025-03-17T08:14:34.000Z","dependencies_parsed_at":"2023-11-13T10:24:13.109Z","dependency_job_id":"367b6bcc-d09e-4a29-bb09-0524f2f6a2fe","html_url":"https://github.com/zopefoundation/Products.CMFUid","commit_stats":{"total_commits":97,"total_committers":19,"mean_commits":5.105263157894737,"dds":0.7938144329896908,"last_synced_commit":"3b3c7d567c141eb0cd2d92791fda9c0fb633fca9"},"previous_names":[],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/zopefoundation/Products.CMFUid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zopefoundation%2FProducts.CMFUid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zopefoundation%2FProducts.CMFUid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zopefoundation%2FProducts.CMFUid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zopefoundation%2FProducts.CMFUid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zopefoundation","download_url":"https://codeload.github.com/zopefoundation/Products.CMFUid/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zopefoundation%2FProducts.CMFUid/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279003410,"owners_count":26083581,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["maintained"],"created_at":"2025-10-10T09:18:32.633Z","updated_at":"2025-10-10T09:18:33.932Z","avatar_url":"https://github.com/zopefoundation.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":".. image:: https://github.com/zopefoundation/Products.CMFUid/actions/workflows/tests.yml/badge.svg\n        :target: https://github.com/zopefoundation/Products.CMFUid/actions/workflows/tests.yml\n\n.. image:: https://coveralls.io/repos/github/zopefoundation/Products.CMFUid/badge.svg\n        :target: https://coveralls.io/github/zopefoundation/Products.CMFUid\n\n.. image:: https://img.shields.io/pypi/v/Products.CMFUid.svg\n        :target: https://pypi.org/project/Products.CMFUid/\n        :alt: Current version on PyPI\n\n.. image:: https://img.shields.io/pypi/pyversions/Products.CMFUid.svg\n        :target: https://pypi.org/project/Products.CMFUid/\n        :alt: Supported Python versions\n\nProducts.CMFUid\n===============\n\n.. contents::\n\nCMFUid introduces a simple unique id implementation.\n\nImplementation\n--------------\n\nThe supplied tools attach the unique ids to the objects. The objects\ndo not have to be aware of unique ids.\n\nThe current implementation depends on the portal catalog to find an \nobject of a given unique id. The interfaces do not imply the use\nof the catalog (except the IUniqueIdBrainQuery).\n\nWhich Tool does What?\n---------------------\n\nThe 'portal_uidgenerator' tools responsibility is to generate \nunique ids. The 'portal_uidannotation' tool is responsible to \nattach unique ids to a content object, and enforce rules about\nwhat happens on object move/create/delete. The 'portal_uidhandler' \nmanages registering and accessing unique ids. \n\nThis design was chosen to allow users replacing only parts of\nthe functionality without having to understand the whole thing.\n\nUnique Id API\n-------------\n\n'portal_uidhandler' implementing 'IUniqueIdHandler' is the main \nAPI for playing with unique ids.\n    \nUsage\n-----\n\n'portal_uidhandler' fully implements IUniqueIdHandler (IUniqueIdSet\nfor registering/unregistering unique ids, IUniqueIdQuery for queries\nand IUniqueIdBrainQuery for more efficient queries by returning \ncatalog brains instead of objects).\n\nThe current implementation of get/queryBrain and get/queryObject \ndo not return invisible objects (and brains of invisible objects).\nBy invisible objects, we mean objects that would be filtered out\nby portal_catalog.searchResults due to expiry/effective date and/or\nuser roles.\n\nIt is often necessary to avoid this filtering in an application.\nTo do this, use the unrestrictedGet/QueryBrain and\nunrestrictedGet/QueryObject as this will avoid 'None' results.\n\nHave a look at the interfaces.\n\nCMFUid's functionality is used by CMFDefault's favorite content type \nto follow linked objects. The favorite content type works as before if \nCMFUid is not installed. \n\n\nUpdate 2007-03-30\n-----------------\n\nThe annotation code has been updated to use events for assigning/removing \nuids.  The settings for this live in the portal_uidannotation tool.\n\nThe default behaviour is:\n\n- uids are NOT assigned when an object is created\n  (it is assumed that other code is responsible for this)\n\n- when an object is moved, a UID is not changed\n\n- when an object is imported, any EXISTING UID is removed\n  (this can be controlled via the 'remove_on_add' property)\n\n- when an object is copied, any EXISTING UID is removed\n  (this can be controlled via the 'remove_on_clone' property)\n\nA more natural behaviour is for UIDs to be assigned automatically on \ncreation.  To enable this feature:\n\n- tick the 'assign UIDs on add' tickbox\n  (uids will now be assigned when content is added or imported and any\n  EXISTING uid will be replaced)\n\n- tick the 'assign UIDs on copy' tickbox\n  (objects will get a NEW uid when they are copied which will replace \n  any EXISTING uid)\n\nIn order to preserve the original behaviour of the tool, automatic \nassignment of uids is NOT enabled by default - it must be turned on in \nthe uidannotation tool.\n\nThe behaviour is hooked in based on object creating/deletion/move events\nfor any IContentish objects.  The event handlers live in the \nUniqueIdAnnotation tool.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzopefoundation%2Fproducts.cmfuid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzopefoundation%2Fproducts.cmfuid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzopefoundation%2Fproducts.cmfuid/lists"}