improvements on work item queries, translations; work in progress: security: additional permissions
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3182 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									466f05e5a8
								
							
						
					
					
						commit
						87cb629f1c
					
				
					 11 changed files with 76 additions and 56 deletions
				
			
		|  | @ -56,6 +56,7 @@ from cybertools.stateful.interfaces import IStateful | ||||||
| from cybertools.text import mimetypes | from cybertools.text import mimetypes | ||||||
| from cybertools.typology.interfaces import IType, ITypeManager | from cybertools.typology.interfaces import IType, ITypeManager | ||||||
| from loops.common import adapted | from loops.common import adapted | ||||||
|  | from loops.config.base import DummyOptions | ||||||
| from loops.i18n.browser import I18NView | from loops.i18n.browser import I18NView | ||||||
| from loops.interfaces import IResource, IView, INode | from loops.interfaces import IResource, IView, INode | ||||||
| from loops.organize.tracking import access | from loops.organize.tracking import access | ||||||
|  | @ -114,13 +115,9 @@ class BaseView(GenericView, I18NView): | ||||||
|         super(BaseView, self).__init__(context, request) |         super(BaseView, self).__init__(context, request) | ||||||
|         # TODO: get rid of removeSecurityProxy() call - not yet... |         # TODO: get rid of removeSecurityProxy() call - not yet... | ||||||
|         self.context = removeSecurityProxy(context) |         self.context = removeSecurityProxy(context) | ||||||
|         #self.context = context |  | ||||||
|         #self.setSkin(self.loopsRoot.skinName) |  | ||||||
|         #self.checkLanguage() |  | ||||||
|         try: |         try: | ||||||
|             if not canAccessObject(context): |             if not canAccessObject(context): | ||||||
|                 raise Unauthorized |                 raise Unauthorized('%r: title' % (context)) | ||||||
|                 #request.response.redirect('login.html') |  | ||||||
|         except ForbiddenAttribute:  # ignore when testing |         except ForbiddenAttribute:  # ignore when testing | ||||||
|             pass |             pass | ||||||
| 
 | 
 | ||||||
|  | @ -393,8 +390,7 @@ class BaseView(GenericView, I18NView): | ||||||
| 
 | 
 | ||||||
|     @Lazy |     @Lazy | ||||||
|     def options(self): |     def options(self): | ||||||
|         #return IOptions(self.context) |         return component.queryAdapter(self.adapted, IOptions) or DummyOptions() | ||||||
|         return IOptions(self.adapted) |  | ||||||
| 
 | 
 | ||||||
|     @Lazy |     @Lazy | ||||||
|     def globalOptions(self): |     def globalOptions(self): | ||||||
|  |  | ||||||
|  | @ -111,14 +111,13 @@ | ||||||
|       title="loops Container" |       title="loops Container" | ||||||
|       description="A top-level loops container" |       description="A top-level loops container" | ||||||
|       permission="zope.ManageContent" |       permission="zope.ManageContent" | ||||||
|       view="AddLoopsContainer.html" |       view="AddLoopsContainer.html" /> | ||||||
|       /> |  | ||||||
| 
 | 
 | ||||||
|   <containerViews |   <containerViews | ||||||
|       for="loops.interfaces.ILoops" |       for="loops.interfaces.ILoops" | ||||||
|       contents="zope.ManageContent" |       index="zope.View" | ||||||
|       add="zope.ManageContent" |       contents="loops.ManageSite" | ||||||
|       /> |       add="loops.ManageSite" /> | ||||||
| 
 | 
 | ||||||
|   <page |   <page | ||||||
|       name="edit.html" |       name="edit.html" | ||||||
|  | @ -136,13 +135,13 @@ | ||||||
|       schema="loops.interfaces.IConceptManager" |       schema="loops.interfaces.IConceptManager" | ||||||
|       content_factory="loops.concept.ConceptManager" |       content_factory="loops.concept.ConceptManager" | ||||||
|       template="add.pt" |       template="add.pt" | ||||||
|       permission="zope.ManageContent" |       permission="zope.ManageContent" /> | ||||||
|       /> |  | ||||||
| 
 | 
 | ||||||
|   <containerViews |   <containerViews | ||||||
|       for="loops.interfaces.IConceptManager" |       for="loops.interfaces.IConceptManager" | ||||||
|       add="zope.ManageContent" |       index="loops.ManageSite" | ||||||
|       /> |       contents="loops.ManageSite" | ||||||
|  |       add="loops.ManageSite" /> | ||||||
| 
 | 
 | ||||||
|   <!-- concept --> |   <!-- concept --> | ||||||
| 
 | 
 | ||||||
|  | @ -243,8 +242,9 @@ | ||||||
| 
 | 
 | ||||||
|   <containerViews |   <containerViews | ||||||
|       for="loops.interfaces.IResourceManager" |       for="loops.interfaces.IResourceManager" | ||||||
|       add="zope.ManageContent" |       index="loops.ManageSite" | ||||||
|       /> |       contents="loops.ManageSite" | ||||||
|  |       add="loops.ManageSite" /> | ||||||
| 
 | 
 | ||||||
|   <!-- resource in general --> |   <!-- resource in general --> | ||||||
| 
 | 
 | ||||||
|  | @ -354,55 +354,44 @@ | ||||||
|       schema="loops.interfaces.IViewManager" |       schema="loops.interfaces.IViewManager" | ||||||
|       content_factory="loops.view.ViewManager" |       content_factory="loops.view.ViewManager" | ||||||
|       template="add.pt" |       template="add.pt" | ||||||
|       permission="zope.ManageContent" |       permission="zope.ManageContent" /> | ||||||
|       /> |  | ||||||
| 
 | 
 | ||||||
|   <containerViews |   <containerViews | ||||||
|       for="loops.interfaces.IViewManager" |       for="loops.interfaces.IViewManager" | ||||||
|       index="zope.ManageContent" |       index="zope.View" | ||||||
|       add="zope.ManageContent" |       add="zope.ManageContent" /> | ||||||
|       /> |  | ||||||
| 
 | 
 | ||||||
|   <menuItem |   <menuItem | ||||||
|       for="loops.interfaces.IViewManager" |       for="loops.interfaces.IViewManager" | ||||||
|       action="contents.html" |       action="contents.html" | ||||||
|       permission="zope.ManageContent" |       permission="zope.ManageContent" | ||||||
|       menu="zmi_views" title="Contents" |       menu="zmi_views" title="Contents" /> | ||||||
|       /> |  | ||||||
| 
 | 
 | ||||||
|   <!-- record manager --> |   <!-- record manager --> | ||||||
| 
 | 
 | ||||||
|   <containerViews |   <containerViews | ||||||
|       for="loops.interfaces.IRecordManager" |       for="loops.interfaces.IRecordManager" | ||||||
|       index="zope.ManageContent" |       index="loops.ManageSite" | ||||||
|       /> |       add="loops.ManageSite" /> | ||||||
| 
 | 
 | ||||||
|   <menuItem |   <menuItem | ||||||
|       for="loops.interfaces.IRecordManager" |       for="loops.interfaces.IRecordManager" | ||||||
|       action="contents.html" |       action="contents.html" | ||||||
|       permission="zope.ManageContent" |       permission="loops.ManageSite" | ||||||
|       menu="zmi_views" title="Contents" |       menu="zmi_views" title="Contents" /> | ||||||
|       /> |  | ||||||
| 
 | 
 | ||||||
|   <!-- node --> |   <!-- node --> | ||||||
| 
 | 
 | ||||||
|   <icon |   <icon | ||||||
|       name="zmi_icon" |       name="zmi_icon" | ||||||
|       for="loops.interfaces.INode" |       for="loops.interfaces.INode" | ||||||
|       file="node_icon.gif" |       file="node_icon.gif" /> | ||||||
|       /> |  | ||||||
| 
 | 
 | ||||||
|   <menuItem |   <menuItem | ||||||
|       for="loops.interfaces.INode" |       for="loops.interfaces.INode" | ||||||
|       action="@@contents.html" |       action="contents.html" | ||||||
|       permission="zope.ManageContent" |       permission="zope.ManageContent" | ||||||
|       menu="zmi_views" title="Contents" |       menu="zmi_views" title="Contents" /> | ||||||
|       /> |  | ||||||
| 
 |  | ||||||
|   <!--<containerViews |  | ||||||
|       for="loops.interfaces.INode" |  | ||||||
|       index="zope.ManageContent" |  | ||||||
|       />--> |  | ||||||
| 
 | 
 | ||||||
|   <addform |   <addform | ||||||
|       label="Add Node" |       label="Add Node" | ||||||
|  | @ -412,10 +401,8 @@ | ||||||
|       fields="title description nodeType viewName body" |       fields="title description nodeType viewName body" | ||||||
|       template="add.pt" |       template="add.pt" | ||||||
|       permission="zope.ManageContent"> |       permission="zope.ManageContent"> | ||||||
| 
 |  | ||||||
|     <widget field="description" height="2" /> |     <widget field="description" height="2" /> | ||||||
|     <widget field="body" height="8" /> |     <widget field="body" height="8" /> | ||||||
| 
 |  | ||||||
|   </addform> |   </addform> | ||||||
| 
 | 
 | ||||||
|   <addMenuItem |   <addMenuItem | ||||||
|  | @ -423,8 +410,7 @@ | ||||||
|       title="Node" |       title="Node" | ||||||
|       description="A node provides access to concepts, possibly hierarchically organized" |       description="A node provides access to concepts, possibly hierarchically organized" | ||||||
|       permission="zope.ManageContent" |       permission="zope.ManageContent" | ||||||
|       view="AddLoopsNode.html" |       view="AddLoopsNode.html" /> | ||||||
|       /> |  | ||||||
| 
 | 
 | ||||||
|   <editform |   <editform | ||||||
|       label="Edit Node" |       label="Edit Node" | ||||||
|  |  | ||||||
|  | @ -64,10 +64,11 @@ table.listing { | ||||||
| table.listing th { | table.listing th { | ||||||
|     font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; |     font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; | ||||||
|     color: #000040; |     color: #000040; | ||||||
|  |     padding: 0 2px 0 2px; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| table.listing td { | table.listing td { | ||||||
|     padding: 0 1px 0 1px; |     padding: 0 2px 0 2px; | ||||||
|     white-space: normal; |     white-space: normal; | ||||||
|     vertical-align: middle; |     vertical-align: middle; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -503,8 +503,10 @@ class NodeView(BaseView): | ||||||
| 
 | 
 | ||||||
|     @Lazy |     @Lazy | ||||||
|     def workItems(self): |     def workItems(self): | ||||||
|         return component.getMultiAdapter((self.context, self.request), |         target = self.virtualTargetObject | ||||||
|                                          name='workitems.html') |         if target is not None: | ||||||
|  |             return component.getMultiAdapter((target, self.request), | ||||||
|  |                                              name='taskworkitems.html') | ||||||
| 
 | 
 | ||||||
|     # comments |     # comments | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2008 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2009 Helmut Merz helmutm@cy55.de | ||||||
| # | # | ||||||
| #  This program is free software; you can redistribute it and/or modify | #  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 | #  it under the terms of the GNU General Public License as published by | ||||||
|  | @ -120,7 +120,7 @@ class Concept(Contained, Persistent): | ||||||
|         typePred = self.getConceptManager().getTypePredicate() |         typePred = self.getConceptManager().getTypePredicate() | ||||||
|         if typePred is None: |         if typePred is None: | ||||||
|             return None |             return None | ||||||
|         parents = self.getParents([typePred]) |         parents = self.getParents([typePred], noSecurityCheck=True) | ||||||
|         # TODO (?): check for multiple types (->Error) |         # TODO (?): check for multiple types (->Error) | ||||||
|         return parents and parents[0] or None |         return parents and parents[0] or None | ||||||
|     def setConceptType(self, concept): |     def setConceptType(self, concept): | ||||||
|  |  | ||||||
|  | @ -73,7 +73,8 @@ class LoopsOptions(Options): | ||||||
| 
 | 
 | ||||||
|     def parseContextOptions(self): |     def parseContextOptions(self): | ||||||
|         def result(): |         def result(): | ||||||
|             for opt in  self.context.options: |             options = getattr(self.context, 'options', []) | ||||||
|  |             for opt in  options: | ||||||
|                 parts = opt.split(':', 1) |                 parts = opt.split(':', 1) | ||||||
|                 key = parts[0].strip() |                 key = parts[0].strip() | ||||||
|                 if len(parts) == 1: |                 if len(parts) == 1: | ||||||
|  | @ -94,3 +95,8 @@ class QueryOptions(LoopsOptions): | ||||||
| 
 | 
 | ||||||
|     adapts(IQueryConcept) |     adapts(IQueryConcept) | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | class DummyOptions(Options): | ||||||
|  | 
 | ||||||
|  |     def __getitem__(self, key): | ||||||
|  |         return [] | ||||||
|  |  | ||||||
|  | @ -183,9 +183,6 @@ | ||||||
|     <require |     <require | ||||||
|         permission="zope.ManageContent" |         permission="zope.ManageContent" | ||||||
|         set_schema=".interfaces.INode" /> |         set_schema=".interfaces.INode" /> | ||||||
|     <!--<require |  | ||||||
|         permission="zope.View" |  | ||||||
|         interface="zope.app.container.interfaces.IReadContainer" />--> |  | ||||||
|   </class> |   </class> | ||||||
| 
 | 
 | ||||||
|   <!-- record manager --> |   <!-- record manager --> | ||||||
|  |  | ||||||
										
											Binary file not shown.
										
									
								
							|  | @ -3,7 +3,7 @@ msgstr "" | ||||||
| 
 | 
 | ||||||
| "Project-Id-Version: $Id$\n" | "Project-Id-Version: $Id$\n" | ||||||
| "POT-Creation-Date: 2007-05-22 12:00 CET\n" | "POT-Creation-Date: 2007-05-22 12:00 CET\n" | ||||||
| "PO-Revision-Date: 2008-12-15 12:00 CET\n" | "PO-Revision-Date: 2009-01-26 12:00 CET\n" | ||||||
| "Last-Translator: Helmut Merz <helmutm@cy55.de>\n" | "Last-Translator: Helmut Merz <helmutm@cy55.de>\n" | ||||||
| "Language-Team: loops developers <helmutm@cy55.de>\n" | "Language-Team: loops developers <helmutm@cy55.de>\n" | ||||||
| "MIME-Version: 1.0\n" | "MIME-Version: 1.0\n" | ||||||
|  | @ -478,3 +478,18 @@ msgstr "Zielobjekt zuordnen" | ||||||
| msgid "Search Term" | msgid "Search Term" | ||||||
| msgstr "Suchbegriff" | msgstr "Suchbegriff" | ||||||
| 
 | 
 | ||||||
|  | msgid "Day" | ||||||
|  | msgstr "Tag" | ||||||
|  | 
 | ||||||
|  | msgid "Start" | ||||||
|  | msgstr "Beginn" | ||||||
|  | 
 | ||||||
|  | msgid "End" | ||||||
|  | msgstr "Ende" | ||||||
|  | 
 | ||||||
|  | msgid "Duration" | ||||||
|  | msgstr "Dauer" | ||||||
|  | 
 | ||||||
|  | msgid "Effort" | ||||||
|  | msgstr "Aufwand" | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2008 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2009 Helmut Merz helmutm@cy55.de | ||||||
| # | # | ||||||
| #  This program is free software; you can redistribute it and/or modify | #  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 | #  it under the terms of the GNU General Public License as published by | ||||||
|  | @ -114,7 +114,7 @@ class Resource(Image, Contained): | ||||||
|         typePred = cm.getTypePredicate() |         typePred = cm.getTypePredicate() | ||||||
|         if typePred is None: |         if typePred is None: | ||||||
|             return None |             return None | ||||||
|         concepts = self.getConcepts([typePred]) |         concepts = self.getConcepts([typePred], noSecurityCheck=True) | ||||||
|         # TODO (?): check for multiple types (->Error) |         # TODO (?): check for multiple types (->Error) | ||||||
|         return concepts and concepts[0] or cm.get('file', None) |         return concepts and concepts[0] or cm.get('file', None) | ||||||
|     def setResourceType(self, concept): |     def setResourceType(self, concept): | ||||||
|  |  | ||||||
|  | @ -15,26 +15,43 @@ | ||||||
|       id="loops.ManageSite" |       id="loops.ManageSite" | ||||||
|       title="[loops-manage-site-permission] loops: Manage Site" /> |       title="[loops-manage-site-permission] loops: Manage Site" /> | ||||||
| 
 | 
 | ||||||
|  |   <permission | ||||||
|  |       id="loops.ManageTypes" | ||||||
|  |       title="[loops-manage-types-permission] loops: Manage Types" /> | ||||||
|  | 
 | ||||||
|  |   <permission | ||||||
|  |       id="loops.ManageWorkspaces" | ||||||
|  |       title="[loops-manage-workspaces-permission] loops: Manage Workspaces" /> | ||||||
|  | 
 | ||||||
|   <permission |   <permission | ||||||
|       id="loops.ViewRestricted" |       id="loops.ViewRestricted" | ||||||
|       title="[loops-view-restricted-permission] loops: View Restricted Information" /> |       title="[loops-view-restricted-permission] loops: View Restricted Information" /> | ||||||
| 
 | 
 | ||||||
|  |   <permission | ||||||
|  |       id="loops.EditRestricted" | ||||||
|  |       title="[loops-edit-restricted-permission] loops: Edit Restricted Information" /> | ||||||
|  | 
 | ||||||
|   <!-- roles and default permissions for roles --> |   <!-- roles and default permissions for roles --> | ||||||
| 
 | 
 | ||||||
|   <role id="loops.SiteManager" |   <role id="loops.SiteManager" | ||||||
|         title="[loops-manage-site-role] loops: Site Manager" /> |         title="[loops-manage-site-role] loops: Site Manager" /> | ||||||
|   <grant role="loops.SiteManager" permission="loops.ManageSite" /> |   <grant role="loops.SiteManager" permission="loops.ManageSite" /> | ||||||
|  |   <grant role="loops.SiteManager" permission="loops.ManageTypes" /> | ||||||
|  |   <grant role="loops.SiteManager" permission="loops.ManageWorkspaces" /> | ||||||
|   <grant role="loops.SiteManager" permission="loops.xmlrpc.ManageConcepts" /> |   <grant role="loops.SiteManager" permission="loops.xmlrpc.ManageConcepts" /> | ||||||
|   <grant role="loops.SiteManager" permission="zope.ManageContent" /> |   <grant role="loops.SiteManager" permission="zope.ManageContent" /> | ||||||
|   <grant role="loops.SiteManager" permission="zope.View" /> |   <grant role="loops.SiteManager" permission="zope.View" /> | ||||||
| 
 | 
 | ||||||
|   <role id="loops.Staff" |   <role id="loops.Staff" | ||||||
|         title="[loops-staff-role] loops: Staff" /> |         title="[loops-staff-role] loops: Staff" /> | ||||||
|  |   <grant role="loops.Staff" permission="loops.ManageWorkspaces" /> | ||||||
|  |   <grant role="loops.Staff" permission="loops.EditRestricted" /> | ||||||
|   <grant role="loops.Staff" permission="zope.ManageContent" /> |   <grant role="loops.Staff" permission="zope.ManageContent" /> | ||||||
|   <grant role="loops.Staff" permission="zope.View" /> |   <grant role="loops.Staff" permission="zope.View" /> | ||||||
| 
 | 
 | ||||||
|   <role id="loops.Master" |   <role id="loops.Master" | ||||||
|         title="[loops-master-role] loops: Master" /> |         title="[loops-master-role] loops: Master" /> | ||||||
|  |   <grant role="loops.Master" permission="zope.ManageContent" /> | ||||||
| 
 | 
 | ||||||
|   <role id="loops.xmlrpc.ConceptManager" |   <role id="loops.xmlrpc.ConceptManager" | ||||||
|         title="[xmlrpc-manage-concepts-role] loops: Concept Manager (XML-RPC)" /> |         title="[xmlrpc-manage-concepts-role] loops: Concept Manager (XML-RPC)" /> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm