merge branch master
This commit is contained in:
		
						commit
						d50498bdaf
					
				
					 17 changed files with 114 additions and 40 deletions
				
			
		|  | @ -413,7 +413,7 @@ class ConceptView(BaseView): | ||||||
|                 if r.order != pos: |                 if r.order != pos: | ||||||
|                     r.order = pos |                     r.order = pos | ||||||
| 
 | 
 | ||||||
|     def resources(self): |     def getResources(self): | ||||||
|         form = self.request.form |         form = self.request.form | ||||||
|         #if form.get('loops.viewName') == 'index.html' and self.editable: |         #if form.get('loops.viewName') == 'index.html' and self.editable: | ||||||
|         if self.editable: |         if self.editable: | ||||||
|  | @ -430,6 +430,9 @@ class ConceptView(BaseView): | ||||||
|             if fv.check(r.first): |             if fv.check(r.first): | ||||||
|                 yield ResourceRelationView(r, self.request, contextIsSecond=True) |                 yield ResourceRelationView(r, self.request, contextIsSecond=True) | ||||||
| 
 | 
 | ||||||
|  |     def resources(self): | ||||||
|  |         return self.getResources() | ||||||
|  | 
 | ||||||
|     @Lazy |     @Lazy | ||||||
|     def resourcesList(self): |     def resourcesList(self): | ||||||
|         from loops.browser.resource import ResourceRelationView |         from loops.browser.resource import ResourceRelationView | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2011 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2012 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 | ||||||
|  | @ -98,7 +98,7 @@ class AdapterBase(object): | ||||||
| 
 | 
 | ||||||
|     adapts(IConcept) |     adapts(IConcept) | ||||||
| 
 | 
 | ||||||
|     _adapterAttributes = ('context', '__parent__') |     _adapterAttributes = ('context', '__parent__', 'request') | ||||||
|     _contextAttributes = list(IConcept) |     _contextAttributes = list(IConcept) | ||||||
|     _noexportAttributes = () |     _noexportAttributes = () | ||||||
|     _textIndexAttributes = () |     _textIndexAttributes = () | ||||||
|  | @ -106,6 +106,7 @@ class AdapterBase(object): | ||||||
|     __is_dummy__ = False |     __is_dummy__ = False | ||||||
|     __type__ = None |     __type__ = None | ||||||
| 
 | 
 | ||||||
|  |     request = None | ||||||
|     languageInfo = None |     languageInfo = None | ||||||
| 
 | 
 | ||||||
|     def __init__(self, context): |     def __init__(self, context): | ||||||
|  |  | ||||||
|  | @ -77,6 +77,30 @@ class SectionView(Base, ConceptView): | ||||||
|     def sectionType(self): |     def sectionType(self): | ||||||
|         return self.conceptManager['section'] |         return self.conceptManager['section'] | ||||||
| 
 | 
 | ||||||
|  |     def getResources(self): | ||||||
|  |         relViews = super(SectionView, self).getResources() | ||||||
|  |         return relViews | ||||||
|  | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def textResources(self): | ||||||
|  |         self.images = [[]] | ||||||
|  |         result = [] | ||||||
|  |         idx = 0 | ||||||
|  |         for rv in self.getResources(): | ||||||
|  |             if rv.context.contentType.startswith('text/'): | ||||||
|  |                 idx += 1 | ||||||
|  |                 result.append(rv) | ||||||
|  |                 self.images.append([]) | ||||||
|  |             else: | ||||||
|  |                 self.registerDojoLightbox() | ||||||
|  |                 url = self.nodeView.getUrlForTarget(rv.context) | ||||||
|  |                 src = '%s/mediaasset.html?v=small' % url | ||||||
|  |                 fullSrc = '%s/mediaasset.html?v=medium' % url | ||||||
|  |                 img = dict(src=src, fullImageUrl=fullSrc, title=rv.title, | ||||||
|  |                            description=rv.description, url=url, object=rv) | ||||||
|  |                 self.images[idx].append(img) | ||||||
|  |         return result | ||||||
|  | 
 | ||||||
|     def getCssClassForResource(self, r): |     def getCssClassForResource(self, r): | ||||||
|         for c in r.context.getConcepts([self.defaultPredicate]): |         for c in r.context.getConcepts([self.defaultPredicate]): | ||||||
|             if c.conceptType == self.documentTypeType: |             if c.conceptType == self.documentTypeType: | ||||||
|  |  | ||||||
|  | @ -21,6 +21,7 @@ concept(u'issubtype', u'is Subtype', u'predicate', options=u'hide_children', | ||||||
| # document types | # document types | ||||||
| concept(u'keyquestions', u'Leitfragen', u'documenttype') | concept(u'keyquestions', u'Leitfragen', u'documenttype') | ||||||
| concept(u'textelement', u'Textabschnitt', u'documenttype') | concept(u'textelement', u'Textabschnitt', u'documenttype') | ||||||
|  | concept(u'textelement2', u'Textabschnitt separat', u'documenttype') | ||||||
| concept(u'quote', u'Zitat', u'documenttype') | concept(u'quote', u'Zitat', u'documenttype') | ||||||
| concept(u'story', u'Geschichte', u'documenttype') | concept(u'story', u'Geschichte', u'documenttype') | ||||||
| concept(u'usecase', u'Fallbeispiel', u'documenttype') | concept(u'usecase', u'Fallbeispiel', u'documenttype') | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ | ||||||
| 
 | 
 | ||||||
| <metal:section define-macro="section"> | <metal:section define-macro="section"> | ||||||
|   <metal:info use-macro="view/concept_macros/concepttitle" /> |   <metal:info use-macro="view/concept_macros/concepttitle" /> | ||||||
|   <div tal:repeat="related item/resources"> |   <div tal:repeat="related item/textResources"> | ||||||
|     <div class="span-4"> |     <div class="span-4"> | ||||||
|       <div tal:attributes="class python: |       <div tal:attributes="class python: | ||||||
|                   item.getCssClassForResource(related)" |                   item.getCssClassForResource(related)" | ||||||
|  | @ -36,7 +36,8 @@ | ||||||
|                     string:$resourceBase/cybertools.icons/vcard_edit.png" /></a> |                     string:$resourceBase/cybertools.icons/vcard_edit.png" /></a> | ||||||
|         <a i18n:translate="" i18n:attributes="title" |         <a i18n:translate="" i18n:attributes="title" | ||||||
|            title="Edit with external editor." |            title="Edit with external editor." | ||||||
|            tal:condition="related/xeditable" |            xxtal:condition="related/xeditable" | ||||||
|  |            tal:condition="nothing" | ||||||
|            tal:attributes="href string:$url/external_edit?version=this"> |            tal:attributes="href string:$url/external_edit?version=this"> | ||||||
|           <img tal:attributes="src  |           <img tal:attributes="src  | ||||||
|             string:$resourceBase/cybertools.icons/application_edit.png" /></a> |             string:$resourceBase/cybertools.icons/application_edit.png" /></a> | ||||||
|  | @ -45,6 +46,15 @@ | ||||||
|         <a tal:content="parent/title" |         <a tal:content="parent/title" | ||||||
|            tal:attributes="href python:view.getUrlForTarget(parent)" /> |            tal:attributes="href python:view.getUrlForTarget(parent)" /> | ||||||
|       </div> |       </div> | ||||||
|  |       <div tal:repeat="image python: | ||||||
|  |                           item.images[repeat['related'].index() + 1]"> | ||||||
|  |         <a dojoType="dojox.image.Lightbox" group="mediasset" | ||||||
|  |            i18n:attributes="title" | ||||||
|  |            tal:attributes="href image/fullImageUrl; | ||||||
|  |                            title image/title"> | ||||||
|  |           <img tal:attributes="src image/src; | ||||||
|  |                                alt image/title" /></a> | ||||||
|  |       </div> | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
| </metal:section> | </metal:section> | ||||||
|  |  | ||||||
|  | @ -231,7 +231,7 @@ Extracting Document Properties from MS Office Files | ||||||
|   >>> path = os.path.join(dataDir, 'office') |   >>> path = os.path.join(dataDir, 'office') | ||||||
|   >>> fn = os.path.join(path, 'example.docx') |   >>> fn = os.path.join(path, 'example.docx') | ||||||
|   >>> os.path.getsize(fn) |   >>> os.path.getsize(fn) | ||||||
|   20337... |   23561... | ||||||
| 
 | 
 | ||||||
|   >>> officeFile = addAndConfigureObject(resources, Resource, 'test.docx', |   >>> officeFile = addAndConfigureObject(resources, Resource, 'test.docx', | ||||||
|   ...                    title=u'Example Word File', resourceType=tOfficeFile, |   ...                    title=u'Example Word File', resourceType=tOfficeFile, | ||||||
|  | @ -241,7 +241,7 @@ Extracting Document Properties from MS Office Files | ||||||
| 
 | 
 | ||||||
|   >>> content = aOfficeFile.data |   >>> content = aOfficeFile.data | ||||||
|   >>> len(content) |   >>> len(content) | ||||||
|   17409 |   20327 | ||||||
| 
 | 
 | ||||||
|   Clean up: |   Clean up: | ||||||
|   >>> shutil.copy(fn + '.sav', fn) |   >>> shutil.copy(fn + '.sav', fn) | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2008 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2012 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 | ||||||
|  | @ -18,8 +18,6 @@ | ||||||
| 
 | 
 | ||||||
| """ | """ | ||||||
| View class(es) for integrating external objects. | View class(es) for integrating external objects. | ||||||
| 
 |  | ||||||
| $Id$ |  | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from zope import interface, component | from zope import interface, component | ||||||
|  | @ -42,7 +40,9 @@ class ExternalCollectionView(ConceptView): | ||||||
|     def update(self): |     def update(self): | ||||||
|         if 'update' in self.request.form: |         if 'update' in self.request.form: | ||||||
|             cta = adapted(self.context) |             cta = adapted(self.context) | ||||||
|             if cta is not None: |             cta.request = self.request | ||||||
|                 cta.update() |             cta.update() | ||||||
|  |             if cta.updateMessage is not None: | ||||||
|  |                 self.request.form['message'] = cta.updateMessage | ||||||
|         return True |         return True | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2009 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2012 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 | ||||||
|  | @ -19,8 +19,6 @@ | ||||||
| """ | """ | ||||||
| Concept adapter(s) for external collections, e.g. a directory in the | Concept adapter(s) for external collections, e.g. a directory in the | ||||||
| file system. | file system. | ||||||
| 
 |  | ||||||
| $Id$ |  | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
|  | @ -62,10 +60,12 @@ class ExternalCollectionAdapter(AdapterBase): | ||||||
|     implements(IExternalCollection) |     implements(IExternalCollection) | ||||||
|     adapts(IConcept) |     adapts(IConcept) | ||||||
| 
 | 
 | ||||||
|     _adapterAttributes = ('context', '__parent__', 'exclude', 'newResources') |     _adapterAttributes = AdapterBase._adapterAttributes + ( | ||||||
|  |                             'exclude', 'newResources', 'updateMessage') | ||||||
|     _contextAttributes = list(IExternalCollection) + list(IConcept) |     _contextAttributes = list(IExternalCollection) + list(IConcept) | ||||||
| 
 | 
 | ||||||
|     newResources = None |     newResources = None | ||||||
|  |     updateMessage = None | ||||||
| 
 | 
 | ||||||
|     def getExclude(self): |     def getExclude(self): | ||||||
|         return getattr(self.context, '_exclude', None) or [] |         return getattr(self.context, '_exclude', None) or [] | ||||||
|  | @ -101,12 +101,17 @@ class ExternalCollectionAdapter(AdapterBase): | ||||||
|                     adobj = adapted(obj) |                     adobj = adapted(obj) | ||||||
|                     directory = provider.getDirectory(self) |                     directory = provider.getDirectory(self) | ||||||
|                     adobj.storageParams=dict(subdirectory=directory) |                     adobj.storageParams=dict(subdirectory=directory) | ||||||
|  |                     adobj.request = self.request | ||||||
|                     adobj.externalAddress = addr |                     adobj.externalAddress = addr | ||||||
|  |                     # collect error information | ||||||
|  |                     if adobj.processingErrors: | ||||||
|  |                         message = self.updateMessage or u'' | ||||||
|  |                         message += u'<br />'.join(adobj.processingErrors) | ||||||
|  |                         self.updateMessage = message | ||||||
|                     # force reindexing |                     # force reindexing | ||||||
|                     notify(ObjectModifiedEvent(obj)) |                     notify(ObjectModifiedEvent(obj)) | ||||||
|             else: |             else: | ||||||
|                 new.append(addr) |                 new.append(addr) | ||||||
|         #print '*** new', new |  | ||||||
|         if new: |         if new: | ||||||
|             self.newResources = provider.createExtFileObjects(self, new) |             self.newResources = provider.createExtFileObjects(self, new) | ||||||
|             for r in self.newResources: |             for r in self.newResources: | ||||||
|  | @ -205,7 +210,13 @@ class DirectoryCollectionProvider(object): | ||||||
|                             contentType=contentType, |                             contentType=contentType, | ||||||
|             ) |             ) | ||||||
|             adobj = adapted(obj) |             adobj = adapted(obj) | ||||||
|  |             adobj.request = client.request | ||||||
|             adobj.externalAddress = addr     # must be set last |             adobj.externalAddress = addr     # must be set last | ||||||
|  |             # collect error information | ||||||
|  |             if adobj.processingErrors: | ||||||
|  |                 message = client.updateMessage or u'' | ||||||
|  |                 message += u'<br />'.join(adobj.processingErrors) | ||||||
|  |                 client.updateMessage = message | ||||||
|             yield obj |             yield obj | ||||||
| 
 | 
 | ||||||
|     def getDirectory(self, client): |     def getDirectory(self, client): | ||||||
|  |  | ||||||
|  | @ -7,6 +7,10 @@ | ||||||
|   <metal:block use-macro="view/concept_macros/conceptdata"> |   <metal:block use-macro="view/concept_macros/conceptdata"> | ||||||
|     <metal:fill tal:condition="item/editable" |     <metal:fill tal:condition="item/editable" | ||||||
|                 fill-slot="fields"> |                 fill-slot="fields"> | ||||||
|  |       <div class="error" | ||||||
|  |            tal:define="message view/message | request/message | nothing"  | ||||||
|  |            tal:condition="message" | ||||||
|  |            tal:content="structure message" /> | ||||||
|       <metal:block use-macro="view/concept_macros/conceptfields" /> |       <metal:block use-macro="view/concept_macros/conceptfields" /> | ||||||
|       <form method="post"> |       <form method="post"> | ||||||
|         <input type="submit" name="update" value="Update Collection" /> |         <input type="submit" name="update" value="Update Collection" /> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2010 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2012 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 | ||||||
|  | @ -18,8 +18,6 @@ | ||||||
| 
 | 
 | ||||||
| """ | """ | ||||||
| Resource adapter(s) for MS Office files. | Resource adapter(s) for MS Office files. | ||||||
| 
 |  | ||||||
| $Id$ |  | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from datetime import date, datetime, timedelta | from datetime import date, datetime, timedelta | ||||||
|  | @ -56,6 +54,7 @@ class OfficeFile(ExternalFileAdapter): | ||||||
| 
 | 
 | ||||||
|     propertyMap = {u'Revision:': 'version'} |     propertyMap = {u'Revision:': 'version'} | ||||||
|     propFileName = 'docProps/custom.xml' |     propFileName = 'docProps/custom.xml' | ||||||
|  |     corePropFileName = 'docProps/core.xml' | ||||||
|     fileExtensions = ('.docm', '.docx', 'dotm', 'dotx', 'pptx', 'potx', 'ppsx', |     fileExtensions = ('.docm', '.docx', 'dotm', 'dotx', 'pptx', 'potx', 'ppsx', | ||||||
|                       '.xlsm', '.xlsx', '.xltm', '.xltx') |                       '.xlsm', '.xlsx', '.xltm', '.xltx') | ||||||
| 
 | 
 | ||||||
|  | @ -88,20 +87,32 @@ class OfficeFile(ExternalFileAdapter): | ||||||
|             from logging import getLogger |             from logging import getLogger | ||||||
|             self.logger.warn(e) |             self.logger.warn(e) | ||||||
|             return [] |             return [] | ||||||
|  |         if self.corePropFileName not in zf.namelist(): | ||||||
|  |             self.logger.warn('Core properties not found in file %s.' % | ||||||
|  |                              self.externalAddress) | ||||||
|         if self.propFileName not in zf.namelist(): |         if self.propFileName not in zf.namelist(): | ||||||
|             self.logger.warn('Custom properties not found in file %s.' % |             self.logger.warn('Custom properties not found in file %s.' % | ||||||
|                              self.externalAddress) |                              self.externalAddress) | ||||||
|         propsXml = zf.read(self.propFileName) |         propsXml = zf.read(self.propFileName) | ||||||
|  |         corePropsXml = zf.read(self.corePropFileName) | ||||||
|  |         # TODO: read core.xml, return both trees in dictionary | ||||||
|         zf.close() |         zf.close() | ||||||
|         return etree.fromstring(propsXml) |         return {'custom': etree.fromstring(propsXml), | ||||||
|  |                 'core': etree.fromstring(corePropsXml)} | ||||||
| 
 | 
 | ||||||
|     def getDocProperty(self, pname): |     def getDocProperty(self, pname): | ||||||
|         for p in self.docPropertyDom: |         for p in self.docPropertyDom['custom']: | ||||||
|             name = p.attrib.get('name') |             name = p.attrib.get('name') | ||||||
|             if name == pname: |             if name == pname: | ||||||
|                 return p[0].text |                 return p[0].text | ||||||
|         return None |         return None | ||||||
| 
 | 
 | ||||||
|  |     def getCoreProperty(self, pname): | ||||||
|  |         for p in self.docPropertyDom['core']: | ||||||
|  |             if p.tag.endswith(pname): | ||||||
|  |                 return p.text | ||||||
|  |         return None | ||||||
|  | 
 | ||||||
|     def processDocument(self): |     def processDocument(self): | ||||||
|         changed = False |         changed = False | ||||||
|         docVersion = None |         docVersion = None | ||||||
|  | @ -109,11 +120,14 @@ class OfficeFile(ExternalFileAdapter): | ||||||
|         strType = ('{http://schemas.openxmlformats.org/' |         strType = ('{http://schemas.openxmlformats.org/' | ||||||
|                    'officeDocument/2006/docPropsVTypes}lpwstr') |                    'officeDocument/2006/docPropsVTypes}lpwstr') | ||||||
|         attributes = {} |         attributes = {} | ||||||
|         dom = self.docPropertyDom |         # get dc:description from core.xml | ||||||
|  |         desc = self.getCoreProperty('description') | ||||||
|  |         if desc is not None: | ||||||
|  |             attributes['comments'] = desc | ||||||
|  |         dom = self.docPropertyDom['custom'] | ||||||
|         for p in dom: |         for p in dom: | ||||||
|             name = p.attrib.get('name') |             name = p.attrib.get('name') | ||||||
|             value = p[0].text |             value = p[0].text | ||||||
|             #print '***', self.externalAddress, name, value, p[0].tag |  | ||||||
|             attr = self.propertyMap.get(name) |             attr = self.propertyMap.get(name) | ||||||
|             if attr == 'version': |             if attr == 'version': | ||||||
|                 docVersion = value |                 docVersion = value | ||||||
|  | @ -136,7 +150,9 @@ class OfficeFile(ExternalFileAdapter): | ||||||
|             newZf.writestr(self.propFileName, etree.tostring(dom)) |             newZf.writestr(self.propFileName, etree.tostring(dom)) | ||||||
|             newZf.close() |             newZf.close() | ||||||
|             shutil.move(newFn, fn) |             shutil.move(newFn, fn) | ||||||
|         self.update(attributes) |         errors = self.update(attributes) | ||||||
|  |         if errors: | ||||||
|  |             self.processingErrors = errors | ||||||
| 
 | 
 | ||||||
|     def update(self, attributes): |     def update(self, attributes): | ||||||
|         # to be implemented by subclass |         # to be implemented by subclass | ||||||
|  | @ -146,10 +162,10 @@ class OfficeFile(ExternalFileAdapter): | ||||||
| def parseDate(s): | def parseDate(s): | ||||||
|     if not s: |     if not s: | ||||||
|         return None |         return None | ||||||
|     tt = strptime(s, '%Y-%m-%dT%H:%M:%SZ') |     try: | ||||||
|     #try: |         tt = strptime(s, '%Y-%m-%dT%H:%M:%SZ') | ||||||
|     #    tt = strptime(s, '%Y-%m-%dT%H:%M:%SZ') |     except ValueError: | ||||||
|     #except ValueError: |         return None | ||||||
|     #    try: |     #    try: | ||||||
|     #        tt = strptime(s, '%d.%m.%y') |     #        tt = strptime(s, '%d.%m.%y') | ||||||
|     #    except ValueError: |     #    except ValueError: | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								integrator/testdata/office/example.docx
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								integrator/testdata/office/example.docx
									
										
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								integrator/testdata/office/example.docx.sav
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								integrator/testdata/office/example.docx.sav
									
										
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											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: 2012-08-20 12:00 CET\n" | "PO-Revision-Date: 2012-09-17 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" | ||||||
|  | @ -758,6 +758,9 @@ msgstr "Kommentare" | ||||||
| msgid "Add Comment" | msgid "Add Comment" | ||||||
| msgstr "Kommentar hinzufügen" | msgstr "Kommentar hinzufügen" | ||||||
| 
 | 
 | ||||||
|  | msgid "Subject" | ||||||
|  | msgstr "Thema" | ||||||
|  | 
 | ||||||
| msgid "Selection using: $targets" | msgid "Selection using: $targets" | ||||||
| msgstr "Auswahl über: $targets" | msgstr "Auswahl über: $targets" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2008 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2012 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 | ||||||
|  | @ -18,8 +18,6 @@ | ||||||
| 
 | 
 | ||||||
| """ | """ | ||||||
| Definition of view classes and other browser related stuff for comments. | Definition of view classes and other browser related stuff for comments. | ||||||
| 
 |  | ||||||
| $Id$ |  | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from zope import interface, component | from zope import interface, component | ||||||
|  | @ -52,6 +50,8 @@ class CommentsView(NodeView): | ||||||
| 
 | 
 | ||||||
|     @Lazy |     @Lazy | ||||||
|     def allowed(self): |     def allowed(self): | ||||||
|  |         if self.isAnonymous: | ||||||
|  |             return False | ||||||
|         return (self.virtualTargetObject is not None and |         return (self.virtualTargetObject is not None and | ||||||
|                     self.globalOptions('organize.allowComments')) |                     self.globalOptions('organize.allowComments')) | ||||||
| 
 | 
 | ||||||
|  | @ -120,8 +120,8 @@ class CreateComment(EditObject): | ||||||
|     def update(self): |     def update(self): | ||||||
|         form = self.request.form |         form = self.request.form | ||||||
|         subject = form.get('subject') |         subject = form.get('subject') | ||||||
|         text = form.get('text') |         text = form.get('text') or u'' | ||||||
|         if not subject or not text or self.personId is None or self.object is None: |         if not subject or self.personId is None or self.object is None: | ||||||
|             return True |             return True | ||||||
|         #contentType = form.get('contentType') or 'text/restructured' |         #contentType = form.get('contentType') or 'text/restructured' | ||||||
|         rm = self.view.loopsRoot.getRecordManager() |         rm = self.view.loopsRoot.getRecordManager() | ||||||
|  |  | ||||||
|  | @ -58,7 +58,7 @@ | ||||||
|       </div> |       </div> | ||||||
|       <div class="buttons"> |       <div class="buttons"> | ||||||
|         <input value="Save" type="submit" |         <input value="Save" type="submit" | ||||||
|                onClick="return closeDialog(true)" |                onClick="if (not this.validate()) return False; return closeDialog(true)" | ||||||
|                i18n:attributes="value"> |                i18n:attributes="value"> | ||||||
|         <input type="button" value="Cancel" |         <input type="button" value="Cancel" | ||||||
|                onClick="return closeDialog(false)" |                onClick="return closeDialog(false)" | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| # | # | ||||||
| #  Copyright (c) 2011 Helmut Merz helmutm@cy55.de | #  Copyright (c) 2012 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 | ||||||
|  | @ -18,8 +18,6 @@ | ||||||
| 
 | 
 | ||||||
| """ | """ | ||||||
| Definition of the Concept class. | Definition of the Concept class. | ||||||
| 
 |  | ||||||
| $Id$ |  | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from cStringIO import StringIO | from cStringIO import StringIO | ||||||
|  | @ -352,7 +350,10 @@ class ExternalFileAdapter(FileAdapter): | ||||||
|     implements(IExternalFile) |     implements(IExternalFile) | ||||||
| 
 | 
 | ||||||
|     _adapterAttributes = (FileAdapter._adapterAttributes |     _adapterAttributes = (FileAdapter._adapterAttributes | ||||||
|                        + ('storageParams', 'externalAddress', 'uniqueAddress')) |                         + ('storageParams', 'externalAddress', 'uniqueAddress', | ||||||
|  |                            'processingErrors')) | ||||||
|  | 
 | ||||||
|  |     processingErrors = [] | ||||||
| 
 | 
 | ||||||
|     def getStorageParams(self): |     def getStorageParams(self): | ||||||
|         params = getattr(self.context, '_storageParams', None) |         params = getattr(self.context, '_storageParams', None) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue