Skip to content

Commit

Permalink
Merge branch 'main' into unibe/headless
Browse files Browse the repository at this point in the history
  • Loading branch information
drfho authored Sep 29, 2024
2 parents 7baa994 + 166e201 commit 19f0bfd
Show file tree
Hide file tree
Showing 201 changed files with 4,773 additions and 1,611 deletions.
18 changes: 18 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// {
// "version": "2.0.0",
// "tasks": [
// {
// "label": "Install latest Py3-VScode-Extension",
// "type": "shell",
// "command": "code --install-extension ms-python.python --force",
// "group": "none",
// "presentation": {
// "reveal": "always",
// "panel": "new"
// },
// "runOptions": {
// "runOn": "folderOpen"
// }
// }
// ]
// }
30 changes: 15 additions & 15 deletions Products/zms/IZMSCatalogConnector.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,26 +21,26 @@

class IZMSCatalogConnector(Interface):

def search(self, qs, order=None):
def search_json(self, REQUEST=None, RESPONSE=None):
"""
Search.
@param qs: query-string
@param REQUEST: the triggering request
@type REQUEST: ZPublisher.HTTPRequest
@return: JSON-list of result items
@rtype: C{str}
@param order: result order (obsolete)
@rtype: C{bool}
@return: list of result items
@rtype: C{list}
"""

def reindex_all(self):
def reindex_page(self, uid, page_size, clients=False, fileparsing=True, REQUEST=None, RESPONSE=None):
"""
Reindex.
@return: comma separated result message for any indexed object
@rtype: C{str}
"""

def reindex_node(self, node):
"""
Reindex single node.
Reindex page.
@param uid the uid of the page's start-node
@param page-size the page-size
@param clients process clients
@type clients C{Boolean}
@param fileparsing parse files
@type fileparsing C{Boolean}
@param REQUEST: the triggering request
@type REQUEST: ZPublisher.HTTPRequest
@return log
@rtype: C{str}
"""
3 changes: 2 additions & 1 deletion Products/zms/ZMSMetaobjManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,8 @@ def getTypedMetaIds(self, meta_ids):
elif meta_id in metaObjIds:
typed_meta_ids.append( meta_id)
else:
standard.writeError( self, "[getMetaIds]: invalid meta_id \'%s\'"%meta_id)
# standard.writeBlock( self, "[getMetaIds]: invalid meta_id \'%s\'"%meta_id)
continue
return typed_meta_ids

# --------------------------------------------------------------------------
Expand Down
237 changes: 131 additions & 106 deletions Products/zms/ZMSZCatalogAdapter.py

Large diffs are not rendered by default.

37 changes: 22 additions & 15 deletions Products/zms/ZMSZCatalogConnector.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,10 @@ def manage_init(self):
# --------------------------------------------------------------------------
# ZMSZCatalogConnector.manage_objects_add
#
# @param objects ((node, data), (node, data), (node, data), ...)
# @type objects list|tuple
# @return success, failed
# @rtype tuple
# @param objects ((node, data), (node, data), (node, data), ...)
# @type objects C{list|tuple}
# @return success, failed
# @rtype C{tuple}
# --------------------------------------------------------------------------
def manage_objects_add(self, objects):
return [x['ob'](self, objects) for x in self.getActions(r'^manage_(.*?)_objects_add$')][0]
Expand All @@ -148,9 +148,9 @@ def manage_objects_add(self, objects):
# ZMSZCatalogConnector.manage_objects_remove
#
# @param nodes
# @type nodes list|tuple
# @type nodes C{list|tuple}
# @return success, failed
# @rtype tuple
# @rtype C{tuple}
# --------------------------------------------------------------------------
def manage_objects_remove(self, nodes):
return [x['ob'](self, nodes) for x in self.getActions(r'^manage_(.*?)_objects_remove$')][0]
Expand Down Expand Up @@ -314,21 +314,28 @@ def reindex_page(self, uid, page_size, clients=False, fileparsing=True, REQUEST=
adapter = self.getCatalogAdapter()
result = {'success':0,'failed':0,'log':[],'next_node':None}
objects = []
node = self.findObject(uid)
if node.meta_id == 'ZMS':
home_id = node.getHome().id
result['home_id'] = home_id
result['cleared'] = self.manage_objects_clear(home_id)[0]
nodes, next_node = self.get_next_page(uid, page_size, clients)
log = []
nodes, next_node = self.get_next_page(uid, page_size, clients)
for node in nodes:
node_objects = adapter.get_catalog_objects(self, node, fileparsing)
objects.extend(node_objects)
# Clear client.
if node.meta_id == 'ZMS':
home_id = node.getHome().id
result['home_id'] = home_id
result['cleared'] = self.manage_objects_clear(home_id)[0]
# Get catalog objects.
d = {}
for lang in node.getLangIds():
REQUEST.set('lang', lang)
node_objects = adapter.get_catalog_objects(node, fileparsing)
objects.extend(node_objects)
d[lang] = len(node_objects)
log.append({'index':nodes.index(node),
'path':'/'.join(node.getPhysicalPath()),
'meta_id':node.meta_id,
'objects':len(node_objects)})
'objects':d})
# Add objects.
result['success'], result['failed'] = self.manage_objects_add(objects)
# Return with log and next-node.
result['log'], result['next_node'] = log, next_node
RESPONSE.setHeader('Cache-Control', 'no-cache')
RESPONSE.setHeader('Content-Type', 'application/json; charset=utf-8')
Expand Down
10 changes: 7 additions & 3 deletions Products/zms/_accessmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,10 @@ def visit(docelmnt):
else:
del nodes[nodekey]
root.setConfProperty('ZMS.security.users', d)
# View management screens
if root.getConfProperty('ZMS.security.build', 0) == 3:
root.setConfProperty('ZMS.security.build', 4)
root.initRoleDefs()

# ------------------------------------------------------------------------------
# _accessmanager.user_folder_meta_types:
Expand All @@ -120,10 +124,10 @@ def visit(docelmnt):
# ------------------------------------------------------------------------------
role_defs = {
'ZMSAdministrator':['*']
,'ZMSEditor':['Access contents information', 'Add ZMSs', 'Add Documents, Images, and Files', 'Copy or Move', 'Delete objects', 'Manage properties', 'Use Database Methods', 'View', 'ZMS Author']
,'ZMSAuthor':['Access contents information', 'Add ZMSs', 'Copy or Move', 'Delete objects', 'Use Database Methods', 'View', 'ZMS Author']
,'ZMSEditor':['View management screens', 'Access contents information', 'Add ZMSs', 'Add Documents, Images, and Files', 'Copy or Move', 'Delete objects', 'Manage properties', 'Use Database Methods', 'View', 'ZMS Author']
,'ZMSAuthor':['View management screens', 'Access contents information', 'Add ZMSs', 'Copy or Move', 'Delete objects', 'Use Database Methods', 'View', 'ZMS Author']
,'ZMSSubscriber':['Access contents information', 'View']
,'ZMSUserAdministrator':['Access contents information', 'View', 'ZMS UserAdministrator']
,'ZMSUserAdministrator':['View management screens', 'Access contents information', 'View', 'ZMS UserAdministrator']
}

# ------------------------------------------------------------------------------
Expand Down
39 changes: 20 additions & 19 deletions Products/zms/_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,22 +180,18 @@ def OnStartElement(self, name, attrs):
if constructor is None:
newNode = self
else:
# Get new id.
# Get id.
id = None
if self.oRootTag == 'ZMS' and 'id' in attrs:
id = attrs.get( 'id')
prefix = standard.id_prefix(id)
self.getNewId(prefix) # force sequence to generate new-id
elif 'id_fix' in attrs:
id = attrs.get( 'id_fix')
prefix = standard.id_prefix(id)
self.getNewId(prefix) # force sequence to generate new-id
if 'id' in attrs:
id = attrs.get('id')
if standard.pybool(self.REQUEST.get('ignore_ids')):
# If id values should be ignored, generate a new one.
prefix = standard.id_prefix(id)
new_id = self.getNewId(prefix)
id = new_id
elif 'id_prefix' in attrs:
prefix = attrs.get( 'id_prefix')
id = self.getNewId(prefix)
elif 'id' in attrs:
id = attrs.get( 'id')
prefix = standard.id_prefix(id)
# If no id is given, a new one must be created.
prefix = attrs.get('id_prefix')
id = self.getNewId(prefix)

# Assure new id does not already exists.
Expand All @@ -207,12 +203,17 @@ def OnStartElement(self, name, attrs):
sort_id = self.oCurrNode.getNewSortId()

##### Uid ####
uid = '!%s'%attrs.get('uid') if 'uid' in attrs else ''

uid = '%s'%attrs.get('uid') if 'uid' in attrs else ''
if standard.pybool(self.REQUEST.get('ignore_uids')):
uid = ''

##### Init ####
newNode = constructor(id, sort_id, meta_id, uid)
self.oCurrNode._setObject(newNode.id, newNode)
newNode = getattr(self.oCurrNode, newNode.id)
if uid and not standard.pybool(self.REQUEST.get('ignore_uids',False)):
# Restore given uid.
newNode.set_uid(uid)
standard.writeLog( self, "[Builder.OnStartElement]: object with id " + str(newNode.id) + " of class " + str(newNode.__class__) + " created in " + str(self.oCurrNode.__class__))

##### Object State ####
Expand All @@ -228,10 +229,10 @@ def OnStartElement(self, name, attrs):
newNode.setObjProperty('active', 1, lang)
if len( langs) == 1:
dt = time.time()
uid = self.REQUEST['AUTHENTICATED_USER'].getId()
newNode.setObjProperty('created_uid',uid,lang)
userid = self.REQUEST['AUTHENTICATED_USER'].getId()
newNode.setObjProperty('created_uid',userid,lang)
newNode.setObjProperty('created_dt',dt,lang)
newNode.setObjProperty('change_uid',uid,lang)
newNode.setObjProperty('change_uid',userid,lang)
newNode.setObjProperty('change_dt',dt,lang)

# notify new node
Expand Down
15 changes: 10 additions & 5 deletions Products/zms/_confmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,8 @@ def get_conf_properties(self):
def getConfPropertiesDefaults(self):
return [
{'key':'ZMS.conf.path','title':'ZMS conf-path','desc':'ZMS conf-path','datatype':'string','default':'$INSTANCE_HOME/var/$HOME_ID'},
{'key':'ZMS.debug','title':'ZMS debug','desc':'ZMS debug','datatype':'boolean','default':0},
{'key':'ZMS.mode.debug','title':'ZMS Debug Mode','desc':'Run ZMS in debug mode','datatype':'boolean','default':0},
{'key':'ZMS.mode.maintenance','title':'ZMS Maintenance Mode','desc':'Run ZMS in maintenance mode','datatype':'boolean','default':0},
{'key':'ZMSAdministrator.email','title':'Admin e-Mail','desc':'Administrators e-mail address.','datatype':'string'},
{'key':'ASP.protocol','title':'ASP Protocol','desc':'ASP Protocol.','datatype':'string','options':['http', 'https'],'default':'http'},
{'key':'ASP.ip_or_domain','title':'ASP IP/Domain','desc':'ASP IP/Domain.','datatype':'string'},
Expand Down Expand Up @@ -1096,11 +1097,15 @@ def getCharFormats(self):

def getCatalogAdapter(self):
from Products.zms import IZMSCatalogAdapter, ZMSZCatalogAdapter
for ob in self.objectValues():
if IZMSCatalogAdapter.IZMSCatalogAdapter in list(providedBy(ob)):
return ob
path_nodes = self.breadcrumbs_obj_path()
path_nodes.reverse()
for path_node in path_nodes:
for ob in path_node.objectValues():
if IZMSCatalogAdapter.IZMSCatalogAdapter in list(providedBy(ob)):
return ob
# If no ZMSZCatalogAdapter then add one to root node
adapter = ZMSZCatalogAdapter.ZMSZCatalogAdapter()
self._setObject( adapter.id, adapter)
path_nodes[0]._setObject( adapter.id, adapter)
adapter = getattr(self, adapter.id)
adapter.initialize()
return adapter
Expand Down
4 changes: 2 additions & 2 deletions Products/zms/_exportable.py
Original file line number Diff line number Diff line change
Expand Up @@ -580,7 +580,7 @@ def toZippedHtml(self, REQUEST, get_data=True):
rtn = _fileutil.buildZipArchive( zipfiles, get_data)

#-- Remove temporary folder.
if not self.getConfProperty('ZMS.debug', 0):
if not self.getConfProperty('ZMS.mode.debug', 0):
_fileutil.remove( tempfolder, deep=1)

return rtn
Expand All @@ -607,7 +607,7 @@ def toZippedXml(self, REQUEST, get_data=True):
rtn = _fileutil.buildZipArchive( zipfiles, get_data)

#-- Remove temporary folder.
if not self.getConfProperty('ZMS.debug', 0):
if not self.getConfProperty('ZMS.mode.debug', 0):
_fileutil.remove( tempfolder, deep=1)

return rtn
Expand Down
4 changes: 2 additions & 2 deletions Products/zms/_filtermanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def processData(self, processId, data, trans=None):
data = f.read()
f.close()
# Remove temporary folder.
if not self.getConfProperty('ZMS.debug', 0):
if not self.getConfProperty('ZMS.mode.debug', 0):
_fileutil.remove(tempfolder, deep=True)
# Return data.
return data
Expand Down Expand Up @@ -215,7 +215,7 @@ def exportFilter(self, id, REQUEST):
data = f.read()
f.close()
# Remove temporary folder.
if not self.getConfProperty('ZMS.debug', 0):
if not self.getConfProperty('ZMS.mode.debug', 0):
_fileutil.remove( tempfolder, deep=1)
# Return.
return filename, data, content_type
Expand Down
5 changes: 3 additions & 2 deletions Products/zms/_importable.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,9 @@ def recurse_importContent(self, folder):
self.onChangeObj( self.REQUEST, forced=1)

# Process children.
for ob in self.getChildNodes():
recurse_importContent(ob, folder)
if self.meta_id != 'ZMS':
for ob in self.getChildNodes():
recurse_importContent(ob, folder)


# ------------------------------------------------------------------------------
Expand Down
15 changes: 10 additions & 5 deletions Products/zms/_objattrs.py
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,7 @@ def evalMetaobjAttr(self, *args, **kwargs):
request = kwargs.get('request', kwargs.get('REQUEST', self.get('REQUEST', {})))
id = request.get('ZMS_INSERT', self.meta_id)
key = args[0]
id = standard.nvl(request.get('ZMS_INSERT'), self.meta_id)
if key.find('.')>0:
id = key[:key.find('.')]
key = key[key.find('.')+1:]
Expand Down Expand Up @@ -669,6 +670,7 @@ def isActive(self, REQUEST):
obj_vers = self.getObjVersion(REQUEST)
obj_attrs = self.getObjAttrs()
now = datetime.datetime.now()
dst = time.daylight == 1 and 1 or 0 # Daylight saving time.
for key in ['active', 'attr_active_start', 'attr_active_end']:
if key in obj_attrs:
obj_attr = obj_attrs[key]
Expand All @@ -691,7 +693,7 @@ def isActive(self, REQUEST):
if isinstance(value, time.struct_time):
# Convert time.struct_time to datetime tuple.
value = tuple(value[:8]) + (0,)
dt = datetime.datetime.fromtimestamp(time.mktime(value))
dt = datetime.datetime.fromtimestamp(time.mktime(value) - (dst * 3600))
b = b and now > dt
if dt > now and self.REQUEST.get('ZMS_CACHE_EXPIRE_DATETIME', dt) >= dt:
self.REQUEST.set('ZMS_CACHE_EXPIRE_DATETIME',dt)
Expand All @@ -701,7 +703,7 @@ def isActive(self, REQUEST):
if isinstance(value, time.struct_time):
# Convert time.struct_time to datetime tuple.
value = tuple(value[:8]) + (0,)
dt = datetime.datetime.fromtimestamp(time.mktime(value))
dt = datetime.datetime.fromtimestamp(time.mktime(value) - (dst * 3600))
b = b and dt > now
if dt > now and self.REQUEST.get('ZMS_CACHE_EXPIRE_DATETIME', dt) >= dt:
self.REQUEST.set('ZMS_CACHE_EXPIRE_DATETIME',dt)
Expand All @@ -725,14 +727,17 @@ def isActive(self, REQUEST):
def formatObjAttrValue(self, obj_attr, v, lang=None):

#-- DATATYPE
datatype = obj_attr.get('datatype_key', _globals.DT_UNKNOWN)

try:
datatype = obj_attr.get('datatype_key', _globals.DT_UNKNOWN)
except:
datatype = _globals.DT_UNKNOWN

#-- VALUE
if isinstance(v, str):
chars = ''.join([ x for x in string.whitespace if x != '\t'])
v = v.strip(chars)
# Retrieve v from options.
if 'options' in obj_attr:
if obj_attr is not None and 'options' in obj_attr:
options = obj_attr['options']
try:
i = options.index(int(v))
Expand Down
5 changes: 0 additions & 5 deletions Products/zms/_objchildren.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,6 @@
################################################################################
# _objchildren.py
#
# $Id: _objchildren.py,v 1.7 2004/11/24 21:02:52 zmsdev Exp $
# $Name:$
# $Author: zmsdev $
# $Revision: 1.7 $
#
# 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
Expand Down
5 changes: 5 additions & 0 deletions Products/zms/_versionmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -624,10 +624,15 @@ def commitObjChanges(self, parent, REQUEST, forced=False, do_history=True, do_de
t0 = time.time()
standard.writeLog( self, "[commitObjChanges]: forced=%s, do_history=%s, do_delete=%s"%(str(forced), str(do_history), str(do_delete)))
delete = self._commitObjChanges( parent, REQUEST, forced, do_history, do_delete)
# Unset Request-Flags.
request = {'ZMS_INSERT': None, 'preview': None}
[(operator.setitem(request, x, REQUEST.get(x)), REQUEST.set(x, None)) for x in request]
# Synchronize access.
self.synchronizePublicAccess()
# Synchronize search.
self.getCatalogAdapter().reindex_node(self)
# Reset Request-Flags.
[REQUEST.set(x, request.get(x)) for x in request]
# Return flag for deleted objects.
standard.writeLog( self, '[commitObjChanges]: done (in '+str(int((time.time()-t0)*100.0)/100.0)+' secs.)')
return delete
Expand Down
Loading

0 comments on commit 19f0bfd

Please sign in to comment.