Author: rossp Date: Wed Aug 13 20:28:11 2008 New Revision: 69840 Added: collective.portlet.member/trunk/README.txt (contents, props changed) collective.portlet.member/trunk/collective/ collective.portlet.member/trunk/collective/__init__.py (contents, props changed) collective.portlet.member/trunk/collective/portlet/ collective.portlet.member/trunk/collective/portlet/__init__.py (contents, props changed) collective.portlet.member/trunk/collective/portlet/member/ collective.portlet.member/trunk/collective/portlet/member/__init__.py (contents, props changed) collective.portlet.member/trunk/collective/portlet/member/configure.zcml collective.portlet.member/trunk/collective/portlet/member/profiles/ collective.portlet.member/trunk/collective/portlet/member/profiles/default/ collective.portlet.member/trunk/collective/portlet/member/profiles/default/metadata.xml collective.portlet.member/trunk/collective/portlet/member/profiles/default/portlets.xml collective.portlet.member/trunk/collective/portlet/member/recentmembersportlet.pt (contents, props changed) collective.portlet.member/trunk/collective/portlet/member/recentmembersportlet.py (contents, props changed) collective.portlet.member/trunk/collective/portlet/member/tests/ collective.portlet.member/trunk/collective/portlet/member/tests/__init__.py (contents, props changed) collective.portlet.member/trunk/collective/portlet/member/tests/base.py (contents, props changed) collective.portlet.member/trunk/collective/portlet/member/tests/test_portlet.py (contents, props changed) collective.portlet.member/trunk/collective/portlet/member/version.txt (contents, props changed) collective.portlet.member/trunk/docs/ collective.portlet.member/trunk/docs/HISTORY.txt (contents, props changed) collective.portlet.member/trunk/docs/INSTALL.txt (contents, props changed) collective.portlet.member/trunk/docs/LICENSE.GPL collective.portlet.member/trunk/docs/LICENSE.txt (contents, props changed) collective.portlet.member/trunk/setup.py (contents, props changed) Log: - Initial paster layout Added: collective.portlet.member/trunk/README.txt ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/README.txt Wed Aug 13 20:28:11 2008 @@ -0,0 +1,4 @@ +Introduction +============ + + Added: collective.portlet.member/trunk/collective/__init__.py ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/__init__.py Wed Aug 13 20:28:11 2008 @@ -0,0 +1,6 @@ +# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages +try: + __import__('pkg_resources').declare_namespace(__name__) +except ImportError: + from pkgutil import extend_path + __path__ = extend_path(__path__, __name__) Added: collective.portlet.member/trunk/collective/portlet/__init__.py ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/__init__.py Wed Aug 13 20:28:11 2008 @@ -0,0 +1,6 @@ +# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages +try: + __import__('pkg_resources').declare_namespace(__name__) +except ImportError: + from pkgutil import extend_path + __path__ = extend_path(__path__, __name__) Added: collective.portlet.member/trunk/collective/portlet/member/__init__.py ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/member/__init__.py Wed Aug 13 20:28:11 2008 @@ -0,0 +1,3 @@ +from zope.i18nmessageid import MessageFactory +RecentMembersPortletMessageFactory = MessageFactory('collective.portlet.member') + Added: collective.portlet.member/trunk/collective/portlet/member/configure.zcml ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/member/configure.zcml Wed Aug 13 20:28:11 2008 @@ -0,0 +1,34 @@ +<configure + xmlns="http://namespaces.zope.org/zope" + xmlns:five="http://namespaces.zope.org/five" + xmlns:genericsetup="http://namespaces.zope.org/genericsetup" + xmlns:plone="http://namespaces.plone.org/plone" + i18n_domain="collective.portlet.member"> + + <genericsetup:registerProfile + name="default" + title="Recent Members" + directory="profiles/default" + description="Plone portlets listing members based on various criteria" + provides="Products.GenericSetup.interfaces.EXTENSION" + /> + + <!-- Register the portlet --> + + <!-- If the portlet has no configurable parameters, you can remove + the EditForm declaration in recentmembersportlet.py and delete + the 'editview' attribute from this statement. + --> + + <plone:portlet + name="collective.portlet.member.RecentMembersPortlet" + interface=".recentmembersportlet.IRecentMembersPortlet" + assignment=".recentmembersportlet.Assignment" + view_permission="zope2.View" + edit_permission="cmf.ManagePortal" + renderer=".recentmembersportlet.Renderer" + addview=".recentmembersportlet.AddForm" + editview=".recentmembersportlet.EditForm" + /> + +</configure> Added: collective.portlet.member/trunk/collective/portlet/member/profiles/default/metadata.xml ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/member/profiles/default/metadata.xml Wed Aug 13 20:28:11 2008 @@ -0,0 +1,4 @@ +<?xml version="1.0"?> +<metadata> + <version>0.1</version> +</metadata> Added: collective.portlet.member/trunk/collective/portlet/member/profiles/default/portlets.xml ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/member/profiles/default/portlets.xml Wed Aug 13 20:28:11 2008 @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<portlets> + + <!-- Portlet type registrations --> + + <portlet + addview="collective.portlet.member.RecentMembersPortlet" + title="Recent Members" + description="Plone portlets listing members based on various criteria" + /> + +</portlets> Added: collective.portlet.member/trunk/collective/portlet/member/recentmembersportlet.pt ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/member/recentmembersportlet.pt Wed Aug 13 20:28:11 2008 @@ -0,0 +1,20 @@ +<dl class="portlet portletRecentMembersPortlet" + i18n:domain="collective.portlet.member"> + + <dt class="portletHeader"> + <span class="portletTopLeft"></span> + Header + <span class="portletTopRight"></span> + </dt> + + <dd class="portletItem odd"> + Body text + </dd> + + <dd class="portletFooter"> + <span class="portletBottomLeft"></span> + Footer + <span class="portletBottomRight"></span> + </dd> + +</dl> Added: collective.portlet.member/trunk/collective/portlet/member/recentmembersportlet.py ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/member/recentmembersportlet.py Wed Aug 13 20:28:11 2008 @@ -0,0 +1,104 @@ +from zope.interface import implements + +from plone.portlets.interfaces import IPortletDataProvider +from plone.app.portlets.portlets import base + +from zope import schema +from zope.formlib import form +from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile + +from collective.portlet.member import RecentMembersPortletMessageFactory as _ + + +class IRecentMembersPortlet(IPortletDataProvider): + """A portlet + + It inherits from IPortletDataProvider because for this portlet, the + data that is being rendered and the portlet assignment itself are the + same. + """ + + # TODO: Add any zope.schema fields here to capture portlet configuration + # information. Alternatively, if there are no settings, leave this as an + # empty interface - see also notes around the add form and edit form + # below. + + # some_field = schema.TextLine(title=_(u"Some field"), + # description=_(u"A field to use"), + # required=True) + + +class Assignment(base.Assignment): + """Portlet assignment. + + This is what is actually managed through the portlets UI and associated + with columns. + """ + + implements(IRecentMembersPortlet) + + # TODO: Set default values for the configurable parameters here + + # some_field = u"" + + # TODO: Add keyword parameters for configurable parameters here + # def __init__(self, some_field=u""): + # self.some_field = some_field + + def __init__(self): + pass + + @property + def title(self): + """This property is used to give the title of the portlet in the + "manage portlets" screen. + """ + return "Recent Members" + + +class Renderer(base.Renderer): + """Portlet renderer. + + This is registered in configure.zcml. The referenced page template is + rendered, and the implicit variable 'view' will refer to an instance + of this class. Other methods can be added and referenced in the template. + """ + + render = ViewPageTemplateFile('recentmembersportlet.pt') + + +class AddForm(base.AddForm): + """Portlet add form. + + This is registered in configure.zcml. The form_fields variable tells + zope.formlib which fields to display. The create() method actually + constructs the assignment that is being added. + """ + form_fields = form.Fields(IRecentMembersPortlet) + + def create(self, data): + return Assignment(**data) + + +# NOTE: If this portlet does not have any configurable parameters, you +# can use the next AddForm implementation instead of the previous. + +# class AddForm(base.NullAddForm): +# """Portlet add form. +# """ +# def create(self): +# return Assignment() + + +# NOTE: If this portlet does not have any configurable parameters, you +# can remove the EditForm class definition and delete the editview +# attribute from the <plone:portlet /> registration in configure.zcml + + +class EditForm(base.EditForm): + """Portlet edit form. + + This is registered with configure.zcml. The form_fields variable tells + zope.formlib which fields to display. + """ + form_fields = form.Fields(IRecentMembersPortlet) Added: collective.portlet.member/trunk/collective/portlet/member/tests/__init__.py ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/member/tests/__init__.py Wed Aug 13 20:28:11 2008 @@ -0,0 +1 @@ +# Added: collective.portlet.member/trunk/collective/portlet/member/tests/base.py ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/member/tests/base.py Wed Aug 13 20:28:11 2008 @@ -0,0 +1,42 @@ +from Products.Five import zcml +from Products.Five import fiveconfigure + +from Testing import ZopeTestCase as ztc + +from Products.PloneTestCase import PloneTestCase as ptc +from Products.PloneTestCase.layer import onsetup + +@onsetup +def setup_product(): + """Set up additional products and ZCML required to test this product. + + The @onsetup decorator causes the execution of this body to be deferred + until the setup of the Plone site testing layer. + """ + + # Load the ZCML configuration for this package and its dependencies + + fiveconfigure.debug_mode = True + import collective.portlet.member + zcml.load_config('configure.zcml', collective.portlet.member) + fiveconfigure.debug_mode = False + + # We need to tell the testing framework that these products + # should be available. This can't happen until after we have loaded + # the ZCML. + + ztc.installPackage('collective.portlet.member') + +# The order here is important: We first call the deferred function and then +# let PloneTestCase install it during Plone site setup + +setup_product() +ptc.setupPloneSite(products=['collective.portlet.member']) + +class TestCase(ptc.PloneTestCase): + """Base class used for test cases + """ + +class FunctionalTestCase(ptc.FunctionalTestCase): + """Test case class used for functional (doc-)tests + """ Added: collective.portlet.member/trunk/collective/portlet/member/tests/test_portlet.py ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/member/tests/test_portlet.py Wed Aug 13 20:28:11 2008 @@ -0,0 +1,112 @@ +from zope.component import getUtility, getMultiAdapter + +from plone.portlets.interfaces import IPortletType +from plone.portlets.interfaces import IPortletManager +from plone.portlets.interfaces import IPortletAssignment +from plone.portlets.interfaces import IPortletDataProvider +from plone.portlets.interfaces import IPortletRenderer + +from plone.app.portlets.storage import PortletAssignmentMapping + +from collective.portlet.member import recentmembersportlet + +from collective.portlet.member.tests.base import TestCase + + +class TestPortlet(TestCase): + + def afterSetUp(self): + self.setRoles(('Manager', )) + + def test_portlet_type_registered(self): + portlet = getUtility( + IPortletType, + name='collective.portlet.member.RecentMembersPortlet') + self.assertEquals(portlet.addview, + 'collective.portlet.member.RecentMembersPortlet') + + def test_interfaces(self): + # TODO: Pass any keyword arguments to the Assignment constructor + portlet = recentmembersportlet.Assignment() + self.failUnless(IPortletAssignment.providedBy(portlet)) + self.failUnless(IPortletDataProvider.providedBy(portlet.data)) + + def test_invoke_add_view(self): + portlet = getUtility( + IPortletType, + name='collective.portlet.member.RecentMembersPortlet') + mapping = self.portal.restrictedTraverse( + '++contextportlets++plone.leftcolumn') + for m in mapping.keys(): + del mapping[m] + addview = mapping.restrictedTraverse('+/' + portlet.addview) + + # TODO: Pass a dictionary containing dummy form inputs from the add + # form. + # Note: if the portlet has a NullAddForm, simply call + # addview() instead of the next line. + addview.createAndAdd(data={}) + + self.assertEquals(len(mapping), 1) + self.failUnless(isinstance(mapping.values()[0], + recentmembersportlet.Assignment)) + + def test_invoke_edit_view(self): + # NOTE: This test can be removed if the portlet has no edit form + mapping = PortletAssignmentMapping() + request = self.folder.REQUEST + + mapping['foo'] = recentmembersportlet.Assignment() + editview = getMultiAdapter((mapping['foo'], request), name='edit') + self.failUnless(isinstance(editview, recentmembersportlet.EditForm)) + + def test_obtain_renderer(self): + context = self.folder + request = self.folder.REQUEST + view = self.folder.restrictedTraverse('@@plone') + manager = getUtility(IPortletManager, name='plone.rightcolumn', + context=self.portal) + + # TODO: Pass any keyword arguments to the Assignment constructor + assignment = recentmembersportlet.Assignment() + + renderer = getMultiAdapter( + (context, request, view, manager, assignment), IPortletRenderer) + self.failUnless(isinstance(renderer, recentmembersportlet.Renderer)) + + +class TestRenderer(TestCase): + + def afterSetUp(self): + self.setRoles(('Manager', )) + + def renderer(self, context=None, request=None, view=None, manager=None, + assignment=None): + context = context or self.folder + request = request or self.folder.REQUEST + view = view or self.folder.restrictedTraverse('@@plone') + manager = manager or getUtility( + IPortletManager, name='plone.rightcolumn', context=self.portal) + + # TODO: Pass any default keyword arguments to the Assignment + # constructor. + assignment = assignment or recentmembersportlet.Assignment() + return getMultiAdapter((context, request, view, manager, assignment), + IPortletRenderer) + + def test_render(self): + # TODO: Pass any keyword arguments to the Assignment constructor. + r = self.renderer(context=self.portal, + assignment=recentmembersportlet.Assignment()) + r = r.__of__(self.folder) + r.update() + output = r.render() + # TODO: Test output + + +def test_suite(): + from unittest import TestSuite, makeSuite + suite = TestSuite() + suite.addTest(makeSuite(TestPortlet)) + suite.addTest(makeSuite(TestRenderer)) + return suite Added: collective.portlet.member/trunk/collective/portlet/member/version.txt ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/collective/portlet/member/version.txt Wed Aug 13 20:28:11 2008 @@ -0,0 +1 @@ +0.1 \ No newline at end of file Added: collective.portlet.member/trunk/docs/HISTORY.txt ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/docs/HISTORY.txt Wed Aug 13 20:28:11 2008 @@ -0,0 +1,8 @@ +Changelog +========= + +0.1 - Unreleased +---------------- + +* Initial release + Added: collective.portlet.member/trunk/docs/INSTALL.txt ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/docs/INSTALL.txt Wed Aug 13 20:28:11 2008 @@ -0,0 +1,39 @@ +collective.portlet.member Installation +======================= + + * When you're reading this you have probably already run + ``easy_install collective.portlet.member``. Find out how to install setuptools + (and EasyInstall) here: + http://peak.telecommunity.com/DevCenter/EasyInstall + + * Create a file called ``collective.portlet.member-configure.zcml`` in the + ``/path/to/instance/etc/package-includes`` directory. The file + should only contain this:: + + <include package="collective.portlet.member" /> + +Alternatively, if you are using zc.buildout and the plone.recipe.zope2instance +recipe to manage your project, you can do this: + + * Add ``collective.portlet.member`` to the list of eggs to install, e.g.: + + [buildout] + ... + eggs = + ... + collective.portlet.member + + * Tell the plone.recipe.zope2instance recipe to install a ZCML slug: + + [instance] + recipe = plone.recipe.zope2instance + ... + zcml = + collective.portlet.member + + * Re-run buildout, e.g. with: + + $ ./bin/buildout + +You can skip the ZCML slug if you are going to explicitly include the package +from another package's configure.zcml file. Added: collective.portlet.member/trunk/docs/LICENSE.GPL ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/docs/LICENSE.GPL Wed Aug 13 20:28:11 2008 @@ -0,0 +1,222 @@ + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS Added: collective.portlet.member/trunk/docs/LICENSE.txt ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/docs/LICENSE.txt Wed Aug 13 20:28:11 2008 @@ -0,0 +1,16 @@ + collective.portlet.member is copyright Ross Patterson + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, + MA 02111-1307 USA. Added: collective.portlet.member/trunk/setup.py ============================================================================== --- (empty file) +++ collective.portlet.member/trunk/setup.py Wed Aug 13 20:28:11 2008 @@ -0,0 +1,33 @@ +from setuptools import setup, find_packages +import os + +version = '0.1' + +setup(name='collective.portlet.member', + version=version, + description="Plone portlets listing members based on various criteria", + long_description=open("README.txt").read() + "\n" + + open(os.path.join("docs", "HISTORY.txt")).read(), + # Get more strings from http://www.python.org/pypi?%3Aaction=list_classifiers + classifiers=[ + "Framework :: Plone", + "Programming Language :: Python", + "Topic :: Software Development :: Libraries :: Python Modules", + ], + keywords='', + author='Ross Patterson', + author_email='me...@rp...', + url='http://pypi.python.org/pypi/collective.portlet.member', + license='GPL', + packages=find_packages(exclude=['ez_setup']), + namespace_packages=['collective', 'collective.portlet'], + include_package_data=True, + zip_safe=False, + install_requires=[ + 'setuptools', + # -*- Extra requirements: -*- + ], + entry_points=""" + # -*- Entry points: -*- + """, + ) |