{ "info": { "author": "Daniel Nouri", "author_email": "daniel (dot) nouri at gmail (dot) com", "bugtrack_url": null, "classifiers": [ "Framework :: Plone", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "Relations Readme\n\n Overview\n\n Relations allows for the definition of sets of rules for\n validation, creation and lifetime of Archetypes references.\n Contained in each ruleset are components that make for the actual\n rules logic.\n\n Rulesets may be created and edited through the web (TTW).\n Components implementing custom behaviour are easily added.\n\n Installation\n\n In Plone, click \"Add/Remove Products\" in the Plone Setup. Then select\n Relations from the list of available products and click \"Install\".\n\n Now click \"Relations Library\" in the Plone Setup portlet on the\n left to visit the TTW configuration user interface.\n\n Usage\n\n As an example, add a ruleset by clicking \"Add Ruleset\" in the\n library. Now choose a reasonable identification. Notice that\n identifications are required to be unique among rulesets in your\n portal.\n\n Note: When you create a reference through a ruleset, the\n relationship attribute of the reference is set to be the ruleset's\n id. There's nothing that is different about how you use the\n Archetypes Reference API when querying for referenced objects.\n (However, references are created and deleted differently; namely\n through function 'processor.process'.)\n\n The ruleset's title is what is presented to the user in Plone.\n Let's choose \"Is Child Of\" as the title of our ruleset, and\n \"isChildOf\" as the identification.\n\n After saving changes, click \"Add New Item\" and add a cardinality\n constraint. Enter \"Exactly Two\" as the title and choose \"2\" for\n both the minimum and the maximum number of targets.\n \n At this point we still need another component so we can actually\n make use of the \"Is Child Of\" ruleset. Add a \"Portal Type\n Constraint\" and choose \"Unrestricted\" as its title. Click the\n \"Save\" button and then the \"Relations\" tab that just appeared.\n The form says \"Edit Relations for Unrestricted\", meaning that we\n can from here add and remove \"Is Child Of\" references from our\n Portal Type Constraint \"Unrestricted\" to any referenceable portal\n object.\n\n Through our \"Exactly Two\" constraint we assert that we have\n exactly two \"parents\".\n\n Requirements\n\n Archetypes >= 1.4.0\n Python 2.4\n\n See also\n\n Additional documentation is in the product's doc/ directory on the\n filesystem.\n\n Credits\n\n This code was created for the ZUCCARO project. ZUCCARO is a\n database framework for the Humanities developed by the Bibliotheca\n Hertziana, Max-Planck Institute for Art History. For further\n information, please visit http://zuccaro.biblhertz.it/\n\n2008-09-10 Cris Ewing (cewing at u dot washington dot edu)\n\n Fixed a bug in the finalizeOnConnect() method of \n components.contentreference.ContentReferenceFinalizer.finalizeOnConnect\n that left Shared Objects (association classes) cataloged by \n portal_catalog. This caused attribute errors to be thrown by \n methods called in Plone's sharing UI. (See \n https://weblion.psu.edu/trac/weblion/ticket/531 for a detailed\n discussion)\n \n Tagged 0.8.1 bugfix release, posted egg to cheeseshop.\n\n2008-05-28 Alex Clark (aclark at aclark dot net)\n\n Egg-i-fy.\n\n2007-06-25 Jens Klein (jens at bluedynamics dot com)\n\n we added events to relations on each connect and disconnect.\n within this implementation some cleanup were done. \n the events are used for exampe by RelationsIndex, but you\n can subscribe to them also to fulfill task need to be done\n on connect or disconnect.\n\n2007-02-25 Philipp Auersperg (phil at bluedynamics.com)\n\n allowedTypesByInterface now also supports zope3 interfaces\n\n2006-03-30 Daniel Nouri \n\n\tutils.py (adddeleteVocab): I put the ``adddelete_vocab`` script\n\tonto the filesystem while adding a check for\n\t``ModifyPortalContent`` on context. The Python script still\n\texists, but it's only an alias now. Also added tests, which the\n\tscript didn't have.\n\n2006-03-01 Jens Klein \n\n field.py: i18n moved in Archetypes 1.4 to \n\tProducts.Archetypes.generator.i18n\n\n2006-02-04 Daniel Nouri \n\n\ttests: Added more tests to check if multiple refs per triple\n\t(i.e. same source, target, relationship) are working. (Note that\n\tthis currently requires the dpunktnpunkt-multipleref branch of\n\tArchetypes and that it's disallowed by default.\n\n2006-01-28 Daniel Nouri \n\n\tcomponents/inverse.py (InverseImplicator.implyOnDisconnect):\n\tImprovement of implementation.\n\n2006-01-26 Daniel Nouri \n\n\tcomponents/inverse.py (InverseImplicator): New implementation\n\tthat no longer assumes that there's only one reference with the\n\tsame relationship between two objects.\n\n\tinterfaces.py (IRuleset.implyOnConnect): No longer care about\n\twhether a reference with the same triple of (source, target,\n\trelationship) already exists.\n\n\tconfig.py (ALLOW_MULTIPLE_REFS_PER_TRIPLE): Added configuration\n\toption for updateReferences argument of\n\tReferenceEngine.addReference. It's turned off by default.\n\n\tinterfaces.py (IRuleset.implyOnConnect)\n\t(IPrimaryImplicator.connect): Added metadata keyword argument that\n\tlets you provide attributes for the reference. Note that this is\n\tsubject to change and will probably be moved out of the public\n\tAPI.\n\n\tinterfaces.py (IReferenceConnectionProcessor.process): Elements\n\tof ``disconnect`` may also be UIDs of reference objects.\n\n2005-11-22 Jens Klein \n\n\tfixed hiding of tools from navigation and tabs\n\n2005-08-10 Daniel Nouri \n\n\truleset.py (Library.__implements__): Fixed the faulty\n\tIActionProvider implementation of Library.\n\n2005-07-20 Daniel Nouri \n\n\tcomponents/cardinality.py: Applied patch by David Baehrens that\n\tallows us to define source cardinality with CardinalityConstraint.\n\n2005-07-07 Daniel Nouri \n\n\truleset.py (XMLImportExport.schema): Use the accessor as the\n\tdefault_method.\n\n\tutils.py (AllowedTypesByIface._verifyObjectPaste): Use\n\tPortalFolderBase's _verifyObjectPaste as we're actually not\n\tinheriting from PortalFolder.\n\n\ttests/testRuleset.py (TestRuleset.testRenameRulesetInLibrary):\n\tImport transaction instead of using the global get_transaction.\n\n\tprocessor.py (process): Import transaction instead of using the\n\tglobal get_transaction.\n\t\n2005-06-03 Daniel Nouri \n\n\tcomponents/contentreference.py (ContentReferenceFinalizer):\n\tAdded isPrimary attribute to CRF.\n\n2005-05-28 Daniel Nouri \n\n\tExtensions/Install.py (install_tools): Don't add library to\n\tmetaTypesNotToList.\n\n2005-05-18 Daniel Nouri \n\n\tskins/relations/relations_adddelete_vocab.py, model/*, tests/relations_sample.xml, \n tests/testXMLImportExport.py, doc/Overview.txt, interfaces.py, ruleset.py, field.py:\n Merged relations_xml_import_export branch. Adds import/export\n capabilities to Rules, Rulesets, Library and RulesetCollections.\n\t\n2005-02-21 Daniel Nouri \n\n\tinterfaces.py (IRuleset.getComponents): This replaces the earlier\n\tprivate _filterByInterface.\n\n\tinterfaces.py (IRuleset.listActionsFor): Added a method which I\n\tforgot to put in the interface earlier.\n\n\tinterfaces.py (IVocabularyProvider.getSearchTerms): This should allow\n\tus to interface with ATReferenceBrowserWidget in a reasonable manner.\n\n\tcomponents/types.py (PortalTypeConstraint.getSearchTerms):\n\tComply with IVocabularyProvider.getSearchTerms .\n\t\n2005-02-16 Daniel Nouri \n\n\tdoc/Overview.txt: Doctest examples.\n\n2005-02-06 Daniel Nouri \n\n\tdoc/Overview.txt: Added Developer's Documentation. More to\n\tcome.\n\t\n\tinterfaces.py: Cleaned up a bit.\n\t\n2005-02-02 Daniel Nouri \n\n\tfield.py: Slimmed field.py by removing reimplemented methods\n\t_Vocabulary and Vocabulary of ReferenceField. The field's purpose\n\tneeds to be made clear, still. See XXX comments.\n\t\n2005-01-27 Daniel Nouri \n\n\truleset.py (RulesetCollection): Implemented a \"Ruleset Collection\"\n\ttype that allows to categorise Rulesets inside the Library.\n\t\n\truleset.py (RulesetAwareContainer): Factored out methods\n\tinvokeFactory and _setObject of Library into class\n\tRulesetAwareContainer.\n\n2005-01-25 Daniel Nouri \n\n\t*: Massive renaming. 'Jig' becomes 'Ruleset',\n\t'ReferenceJigRegistry' becomes 'Library' etc. These changes not\n\tonly affect portal type names, but also classes & variables.\n\tThese changes are not backwards compatible (i.e., no way to\n\tmigrate) and they're not tested thoroughly.\n\t\n2005-01-13 Daniel Nouri \n\n\tjig.py (ReferenceJig.listActionsFor): Remove duplicate actions.\n\n\tskins/relations/relations_listrefs.py: Added helper script for\n\t'relations_form', which now lists existing refs along with their\n\tactions. 'relations_form' still needs improvement.\n\t\n\tinterfaces.py (IReferenceActionProvider): Added subtype of\n\tIJigComponent.\n\t\n2005-01-08 Daniel Nouri \n\n\tskins/relations/relations_form.cpt: Added an overview form that will\n\tlist existing references.\n\t\n\tskins/relations/relations_adddelete.cpt: Renamed from relations_form.\n\n\tutils.py (getReferenceableTypes): Added function that returns a list\n\tof portal type strings of all referenceable types.\n\t\n\tExtensions/Install.py (install_tools): Fixed metaTypesNotToList\n\tfeature on install, which wasn't using the right meta_type.\n\n2005-01-02 Daniel Nouri \n\n\tcomponents/contentreference.py, tests/testComponents.py: Added\n\tcomponent \"ContentReferenceFinalizer\", which associates portal objects\n\twith references.\n\n\tjig.py (ReferenceJig._forEachDo): Prevent acquiring method from self\n\tif it's not implemented in the component.\n\n2005-01-01 Daniel Nouri \n\n\tExtensions/Install.py (install_tools): Fixed hiding in navtree; check\n\tfor the existance of a 'portal_properties.navtree_properties' to not\n\tbreak all tests. :-)\n\n\tbrain.py (makeBrainAggrFromBrain): More explanatory exception message\n\twhen no metadata could be found in a source.\n\t\n2004-10-21 Daniel Nouri \n\n\ttests/*: Removed calls to CMFTestCase.setupCMFSite(), which were done\n\ttoo early.\n\n2004-10-15 Daniel Nouri \n\n\tCOPYRIGHT, LICENSE: Added copyright information.\n\n\tjig.py (ReferenceJigRegistry._setObject): Copied referencejigs are\n\tregistered properly now.\n\n2004-10-05 Daniel Nouri \n\n\tschema.py (ReferenceJigSchema): Added 'about' field to referencejig's\n\tschema.\n\n2004-10-04 Daniel Nouri \n\n\tjig.py (ReferenceJigRegistry.getJig): Restored old way of looking\n\tup a jig by its id, which involves two catalog lookups. 'targetId'\n\tindex of 'reference_catalog' seems to be broken.\n\n\tThis fixes a bug where renaming a jig would cause a lookup to fail.\n\n\tREADME.txt: Revamped README. Also, some minor code changes according\n\tto new terms.\n\n2004-10-02 Daniel Nouri \n\n\tjig.py (ReferenceJigRegistry.getJigs): Made ReferenceJigRegistry\n\tan OrderedBaseFolder. 'getJigs' now returns jigs in the order in which\n\tthey appear in the registry.\n\n\tjig.py (ReferenceJig._afterRename): Set relationship attribute for\n\treferences that belong to us on rename.\n\n\tjig.py (ReferenceJigRegistry._setObject): Added function only\n\tto assist ReferenceJig in finding out when it is renamed.\n\n\tjig.py (ReferenceJig.implyOnConnect): When connecting, we now put up\n\ta reference between the jig and the ref.\n\n\ttests/testJig.py (TestReferenceJig.testRenameJigInRegistry): Test\n\tthe new 'referencejig rename -> ref relationship attrs change'\n\tbehaviour.\n\t\n\ttests/testJig.py (TestReferenceJig.testForward): Fixed bug with a\n\tref catalog search.\n\t\n2004-09-25 Daniel Nouri \n\n\ttests/testJig.py (TestJigRegistry.testRenameRegistry): Added test\n\tto ensure that the jig registry may not be renamed.\n\n\tschema.py: Added module: Schema definitions for jig module, and other\n\tcommon schemas.\n\n\tutils.py (AllowedTypesByIface._verifyObjectPaste): Use _setObject\n\tof 'portal_types' instead of setattr. This fixes renaming of jigs and\n\tcomponents yet again.\n\n2004-09-24 Daniel Nouri \n\n\tcomponents/types.py (PortalTypeConstraint.makeVocabulary): Fixed bug\n\twhere filtering a vocabulary would behave differently than creating it.\n\n2004-09-22 Daniel Nouri \n\t\n\tutils.py (AllowedTypesByIface._verifyObjectPaste): A temporary and\n\trather hackish solution for a bug that would hinder renaming jigs\n\tand components.\n\tAllowedTypesByIface feels more and more like a hack.\n\n\ttests/testJig.py (TestReferenceJig.testRenameJigInRegistry): Added\n\ttest for the jig/component rename bug.\n\t\n\tExtensions/Install.py (uninstall): Working around a bug with\n\tQuickInstaller thinking we own ['mimetypes_registry',\n\t'portal_transforms', 'archetype_tool', 'uid_catalog',\n\t'reference_catalog'].\n\n2004-09-20 Daniel Nouri \n\n\tskins/relations/relations_form_security.vpy: Added check for\n\t'Modify portal content' permission when using 'relations_form'.\n\n\tskins/relations/relations_form_vocab.py: Removed vocabulary logic\n\tout of PT. The result is this somewhat bloated script.\n\n\tbrain.py (makeBrainAggregate): Made function public.\n\n\tjig.py (ReferenceJigRegistry.listActions): We want to check for\n\t'Modify portal content' permission for the 'Relations' action.\n\n\tutils.py (isReferenceable): Added new TTW method to assist\n\t'relations_form_vocab'.\n\t\n2004-09-19 Daniel Nouri \n\n\texception.py (ValidationException): Added class level attribute\n\t__allow_access_to_unprotected_subobjects__, fixing a severe bug with\n\t'relations_form_validate'.\n\n\tskins/relations/relations_form.cpt: Display error messages in the\n\torange box.\n\n2004-09-16 Daniel Nouri \n\n\tjig.py (ReferenceJigRegistry.listActions): Made ReferenceJigRegistry\n\tan ActionProvider. All referenceable objects have a 'relations' action\n\tnow.\n\n\tprocessor.py (process): Made function public.\n\n\texception.py (ValidationException): Made exception class public.\n\n\tskins/relations/*, TODO: Added form for creating references through\n\t'processor.process'. Removed TODO item for such a form, added one\n\tfor i18n.\n\n\tjig.py (ReferenceJigRegistry.invokeFactory): Moved automatic\n\tregistration of jigs from _setObject to invokeFactory.\n\n\tcomponents/types.py (PortalTypeConstraint.makeVocabulary): Fixed a\n\tbug where this method would return [] if allowed target types were the\n\tempty list.\n\t\n2004-09-10 Daniel Nouri \n\n\tcomponents/cardinality.py (CardinalityConstraint.doValidate): Renamed\n\tvalidate to doValidate to avoid nameclash with 'BaseObject.validate'.\n\n2004-09-07 Daniel Nouri \n\n\tjig.py (ReferenceJig, ReferenceJigRegistry): Added class docstring.\n\tZope returned 404s because of this.\n\n\tTODO, jig.py (ReferenceJig, ReferenceJigRegistry): ReferenceJig's\n\tand ReferenceJigRegistry's type titles are now \"Reference Rulebook\" and\n\t\"Rulebook Library\" respectively.\n\n2004-09-06 Daniel Nouri \n\n\tinterfaces.py, jig.py, components/*: Removed `jig' argument from\n\tall calls to IJigComponents. Extended IJigComponent and added a new\n\tsuperclass JigComponentBase providing a `getJig' method.\n\n\tjig.py, interfaces.py (IReferenceJig): IReferenceJig.makeVocabulary\n\tnow accepts an optional `targets' argument. Targets, which has a\n\tdefault value of None, is forwarded to the first IVocabularyProvider.\n\tNo changes to IVocabularyProvider necessary.\n\n\tutils.py (AllowedTypesByIface): A superclass for ReferenceJig and\n\tReferenceJigRegistry that alters PortalFolder's allowedContentTypes\n\tand invokeFactory behaviour. Method `allowedContentTypes' was a module\n\tlevel function before. I had to add invokeFactory.\n\n\tjig.py (JigComponentBase): Added global_allow = 0. Subclasses are\n\tnow by default only addable inside ReferenceJigs.\n\n\ttests/types.py: Deleted. These types were not in use anywhere.\n\n\tTODO: Added two items.\n\t\n2004-08-22 Daniel Nouri \n\n\tprocessor.py (process): Changed interface of processor from seperate\n\tprocessConnection and processDisconnection to one process function\n\twith optional connect and disconnect arguments.\n\n\tChanged 7 tests to reflect these changes.\n\n2004-08-19 Daniel Nouri \n\n\tcomponents/inverse.py: Added 'Inverse Implicator' component.\n\n\ttests/testComponents.py (TestInverseImplicator): Test for\n\tInverseImplicator.\n\n\tbrain.py: Changed BrainAggregate to use __getattr__ instead of\n\trelying on acquisition to get uid brain's attributes.\n\n2004-08-17 Daniel Nouri \n\n\tcomponents/cardinality.py (CardinalityConstraint): Added\n\tCardinalityConstraint.\n\n\ttests/testComponents.py (TestCardinalityConstraint): Test for\n\tCardinalityConstraint.\n\n\tcomponents/types.py (InterfaceConstraint): Added InterfaceConstraint:\n\tA validator/vocab provider based on PortalTypeConstraint that checks\n\tfor interfaces rather than types.\n\n\ttests/testComponents.py (TestInterfaceConstraint): Added test.\n\n2004-08-16 Daniel Nouri \n\n\tprocessor.py: Use a subtransaction and abort it for both\n\tprocessConnection and processDisconnection if an exception is thrown.\n\n\tcomponents/types.py: A validator and vocab provider that restricts\n\ttypes of source and target.\n\n\ttests/testComponents.py: Test components in module components.\n\n2004-08-15 Daniel Nouri \n\n\ttests/common.py (createObjects, createJig): Factored out of\n\ttestJig.py.\n\n\ttests/testProcess.py: Test for processConnection and\n\tprocessDisconnection.\n\n2004-08-11 Daniel Nouri \n\n\tTODO: Added file.\n\n\tAdded jig as the first argument to every component call. Updated\n\tinterfaces and tests accordingly.\n\n2004-08-10 Daniel Nouri \n\n\ttests/testJig.py (TestJigRegistry.testAllowedContentTypes): Added.\n\n\tjig.py (ReferenceJigRegistry.allowedContentTypes): Override\n\tallowedContentTypes in Jig Registry as well to the effect that we\n\tare now able to add any type of objects that implement the\n\tIReferenceJig interface from the UI.\n\n\tutils.py: Added.\n\n\tutils.py (allowedContentTypesByInterface): Refactored\n\tallowedContentTypes of ReferenceJig into this.\n\n\tExtensions/Install.py, Extensions/utils.py: Add ReferenceJigRegistry\n\tto Plone configlets.\n\t\n2004-08-03 Daniel Nouri \n\n\tinterfaces.py: Modified behaviour of IPrimaryImplicator's connect\n\tand disconnect methods. They now return None if they didn't add or\n\tdelete the reference because it was already there or deleted\n\trespectively.\n\n\ttests/testJig.py (TestReferenceJig.testDefaultPrimaryImplicator):\n\tAdded.\n\t\n2004-08-01 Daniel Nouri \n\n\tjig.py (ReferenceJigRegistry): Made ReferenceJigRegistry an AT\n\tBaseFolder instead of an OFS.Folder. ReferenceJigRegistry will serve\n\tas a folderish UI for adding jigs.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://svn.plone.org/svn/archetypes/Products.Relations", "keywords": "", "license": "GPL", "maintainer": null, "maintainer_email": null, "name": "Products.Relations", "package_url": "https://pypi.org/project/Products.Relations/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/Products.Relations/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://svn.plone.org/svn/archetypes/Products.Relations" }, "release_url": "https://pypi.org/project/Products.Relations/0.8.1/", "requires_dist": null, "requires_python": null, "summary": "Relations allows for the definition of sets of rules for validation, creation and lifetime of Archetypes references.", "version": "0.8.1" }, "last_serial": 1456602, "releases": { "0.8": [ { "comment_text": "", "digests": { "md5": "258c86e07c10b11a2730af8b260b5dab", "sha256": "e370921f475d5b2fde9805c47a2314adcffa3b8b0efafab0485dd039782d1211" }, "downloads": -1, "filename": "Products.Relations-0.8-py2.4.egg", "has_sig": false, "md5_digest": "258c86e07c10b11a2730af8b260b5dab", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 160463, "upload_time": "2008-05-21T01:22:14", "url": "https://files.pythonhosted.org/packages/e8/11/66ae26039beb41a6cde5bc7c1c4b6dffb910f1492c9ccc8a99415d6dd393/Products.Relations-0.8-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "35aa3ea5231a25c6c4cb5bd5a9e451e2", "sha256": "a4f34f4dbfdd1539ef6a4bcaf9182449b6924b23631725bf5b986b7ee9f21e1e" }, "downloads": -1, "filename": "Products.Relations-0.8.tar.gz", "has_sig": false, "md5_digest": "35aa3ea5231a25c6c4cb5bd5a9e451e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 83971, "upload_time": "2008-05-21T01:21:59", "url": "https://files.pythonhosted.org/packages/16/ee/56794309f46e87fef2868e9eded6d8b0c69ff8f03f94e510f525ad0c65f9/Products.Relations-0.8.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "7a54ff9900da1b0e517b3e22f82dd094", "sha256": "752d76a7857fed846b1610e5eaa6213136367ec44cb9006ac6241bb734d0decd" }, "downloads": -1, "filename": "Products.Relations-0.8.1-py2.4.egg", "has_sig": false, "md5_digest": "7a54ff9900da1b0e517b3e22f82dd094", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 161307, "upload_time": "2008-09-12T22:35:13", "url": "https://files.pythonhosted.org/packages/8b/b4/8a88343722d0d8c048a94e2fabc81bff2558bfa33417f338996eb7c91e46/Products.Relations-0.8.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "54c2ca6842b3c611ac1ef32cd802db55", "sha256": "d6df94378ee708d511a4f65122d3c0ec3a28465fff395d2d8858e4b944f47d3c" }, "downloads": -1, "filename": "Products.Relations-0.8.1.tar.gz", "has_sig": false, "md5_digest": "54c2ca6842b3c611ac1ef32cd802db55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 85402, "upload_time": "2008-09-12T22:35:10", "url": "https://files.pythonhosted.org/packages/df/9a/351b802da865180a77d307725939bd84a14cd687923493fdb65095c3790f/Products.Relations-0.8.1.tar.gz" } ], "0.9b1": [ { "comment_text": "", "digests": { "md5": "900aed172224bb47a0f9b4f2e0eafc1e", "sha256": "c393f0888be3382284b8ef33bbe64482768282d2276f1bc3bd23c8056f340a46" }, "downloads": -1, "filename": "Products.Relations-0.9b1.zip", "has_sig": false, "md5_digest": "900aed172224bb47a0f9b4f2e0eafc1e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 130225, "upload_time": "2010-11-30T21:53:11", "url": "https://files.pythonhosted.org/packages/d2/29/21f97718e4c61694f24a3b6d7a850d53edc2f11b8c06a0b5680bbbe9b7b7/Products.Relations-0.9b1.zip" } ], "0.9b2": [ { "comment_text": "", "digests": { "md5": "305098b7d08dca414e5b58deb78cd1f7", "sha256": "2c633a853e48fe54249bad3ee1ed3c51b1637689b993fb866c2f06510b96fd48" }, "downloads": -1, "filename": "Products.Relations-0.9b2-py2-none-any.whl", "has_sig": false, "md5_digest": "305098b7d08dca414e5b58deb78cd1f7", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 63091, "upload_time": "2015-03-05T16:13:42", "url": "https://files.pythonhosted.org/packages/55/60/6dc36ab0d7e503dfefea32e1e1fe5d0a0864d122f0f34a3d9fb9a8a97ca3/Products.Relations-0.9b2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c8d8669f3273ec4633db6f55bdd64ca9", "sha256": "79b82cad0cf2a8059ef404042d884a33301fa0f08fcb3ae853d1fc830d7cf072" }, "downloads": -1, "filename": "Products.Relations-0.9b2.tar.gz", "has_sig": false, "md5_digest": "c8d8669f3273ec4633db6f55bdd64ca9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46752, "upload_time": "2015-03-05T16:13:39", "url": "https://files.pythonhosted.org/packages/2c/98/28e0f5f7378686e673b29fa32cba84f289fd3395ab6f2dc6f071ea288135/Products.Relations-0.9b2.tar.gz" } ], "0.9b3": [], "0.9b4": [ { "comment_text": "", "digests": { "md5": "eebdadfed39cdbe9519e431a27269e31", "sha256": "e4876d748b0620a6dbf35aa6535ba997fd1c511fa784daffcb9325d1d15902c5" }, "downloads": -1, "filename": "Products.Relations-0.9b4.tar.gz", "has_sig": false, "md5_digest": "eebdadfed39cdbe9519e431a27269e31", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 149178, "upload_time": "2015-03-10T22:46:38", "url": "https://files.pythonhosted.org/packages/c0/73/fae6fc8b1f9832e1cb34c74bf762dd16ced67af26d5e55a0777cc7634f72/Products.Relations-0.9b4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7a54ff9900da1b0e517b3e22f82dd094", "sha256": "752d76a7857fed846b1610e5eaa6213136367ec44cb9006ac6241bb734d0decd" }, "downloads": -1, "filename": "Products.Relations-0.8.1-py2.4.egg", "has_sig": false, "md5_digest": "7a54ff9900da1b0e517b3e22f82dd094", "packagetype": "bdist_egg", "python_version": "2.4", "requires_python": null, "size": 161307, "upload_time": "2008-09-12T22:35:13", "url": "https://files.pythonhosted.org/packages/8b/b4/8a88343722d0d8c048a94e2fabc81bff2558bfa33417f338996eb7c91e46/Products.Relations-0.8.1-py2.4.egg" }, { "comment_text": "", "digests": { "md5": "54c2ca6842b3c611ac1ef32cd802db55", "sha256": "d6df94378ee708d511a4f65122d3c0ec3a28465fff395d2d8858e4b944f47d3c" }, "downloads": -1, "filename": "Products.Relations-0.8.1.tar.gz", "has_sig": false, "md5_digest": "54c2ca6842b3c611ac1ef32cd802db55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 85402, "upload_time": "2008-09-12T22:35:10", "url": "https://files.pythonhosted.org/packages/df/9a/351b802da865180a77d307725939bd84a14cd687923493fdb65095c3790f/Products.Relations-0.8.1.tar.gz" } ] }