Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prepare ZMS-Headless #152

Merged
merged 1 commit into from
Jul 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
{
"python.defaultInterpreterPath": "~/vpy38/bin/python3",
"python.linting.enabled": false,
"[python]": {
"editor.defaultFormatter": "ms-python.autopep8"
},
"python.formatting.provider": "none",

// "python.testing.pytestEnabled": false,
// "python.testing.unittestEnabled": true
Expand Down
7 changes: 4 additions & 3 deletions Products/zms/ZMSItem.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,11 +167,12 @@ def f_standard_html_request(self, *args, **kwargs):
#
# @param REQUEST
# --------------------------------------------------------------------------
def display_icon(self, REQUEST, meta_type=None, key='icon', zpt=None):
if meta_type is None:
def display_icon(self, *args, **kwargs):
meta_id = kwargs.get('meta_id')
if meta_id is None:
return self.icon
else:
return self.aq_parent.display_icon( REQUEST, meta_type, key, zpt)
return self.aq_parent.display_icon(meta_id=meta_id)


# --------------------------------------------------------------------------
Expand Down
6 changes: 3 additions & 3 deletions Products/zms/ZMSMetaobjManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ def getMetaobjIds(self, sort=None, excl_ids=[]):
ids = [x for x in ids if x not in excl_ids]
# sort
if sort == True:
ids = sorted(ids,key=lambda x:self.display_type(self.REQUEST, x))
ids = sorted(ids,key=lambda x:self.display_type(meta_id=x))
elif sort == False:
ids = sorted(ids,key=lambda x:obs[x].get('name',x))
return ids
Expand Down Expand Up @@ -545,7 +545,7 @@ def getMetaobjRevision(self, id):
# --------------------------------------------------------------------------
def getMetaobjId(self, name):
for id in self.getMetaobjIds():
if name == self.display_type(meta_type=id):
if name == self.display_type(meta_id=id):
return id
return None

Expand Down Expand Up @@ -1158,7 +1158,7 @@ def manage_changeProperties(self, lang, btn='', key='all', REQUEST=None, RESPONS
else:
savedAttr = [x for x in savedAttrs if x['id'] == old_id][0]
syncZopeMetaobjAttr( self, newValue, savedAttr)
if savedAttr['ob']:
if savedAttr.get('ob'):
filename = savedAttr['ob'].title
data = bytes(zopeutil.readData(savedAttr['ob']))
newCustom = _blobfields.createBlobField( self, _blobfields.MyFile, {'filename':filename,'data':data})
Expand Down
2 changes: 1 addition & 1 deletion Products/zms/_accessmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ def synchronizePublicAccess(self):
# AccessableObject and ZMSContainerObject is inherited from
# AccessableContainer!
restricted = self.hasRestrictedAccess()
if self is not None and self.meta_type == 'ZMSLinkElement' and self.isEmbedded( self.REQUEST):
if self is not None and self.meta_type == 'ZMSLinkElement' and self.isEmbedded():
ob = self.getRefObj()
if ob is not None:
for item in ob.breadcrumbs_obj_path():
Expand Down
4 changes: 1 addition & 3 deletions Products/zms/_confmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -570,11 +570,9 @@ def get_conf_property(self, *args, **kwargs):
except:
#Py2
key = base64.b64decode(key)
try:
if hasattr(OFS.misc_.misc_,'zms'):
if key in OFS.misc_.misc_.zms['confdict']:
default = OFS.misc_.misc_.zms['confdict'].get(key)
except:
pass
value = default
confdict = self.getConfProperties()
if key in confdict:
Expand Down
230 changes: 230 additions & 0 deletions Products/zms/_deprecatedapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
################################################################################

# Imports.
from AccessControl import ClassSecurityInfo
from AccessControl.class_init import InitializeClass
import re
# Product Imports.
from Products.zms import _fileutil
Expand All @@ -40,6 +42,11 @@ def warn(self,old,new=None):
################################################################################
class DeprecatedAPI(object):

# Create a SecurityInfo for this class. We will use this
# in the rest of our class definition to make security
# assertions.
security = ClassSecurityInfo()

f_bo_area = ''
f_eo_area = ''
f_submitBtn = ''
Expand Down Expand Up @@ -477,3 +484,226 @@ def http_import(self, url, method='GET', auth=None, parse_qs=0, timeout=10, head
def getLangFmtDate(self, t, lang=None, fmt_str='SHORTDATETIME_FMT'):
warn(self, 'getLangFmtDate', 'Products.zms.standard.getLangFmtDate')
return standard.getLangFmtDate(self, t, lang, fmt_str)

# --------------------------------------------------------------------------
# ZMSObject.ajaxGetNodes:
# --------------------------------------------------------------------------
security.declareProtected('View', 'ajaxGetNodes')
def ajaxGetNodes(self, context=None, lang=None, xml_header=True, REQUEST=None):
""" ZMSObject.ajaxGetNodes """
warn(self, 'ajaxGetNodes', '++rest_api')
context = standard.nvl(context, self)
refs = REQUEST.get('refs', [])
if len(refs)==0:
for key in REQUEST.keys():
if key.startswith('ref') and key[3:].isdigit():
refs.append((int(key[3:]), REQUEST[key]))
refs.sort()
refs = [x[1] for x in refs]
# Build xml.
xml = ''
if xml_header:
RESPONSE = REQUEST.RESPONSE
content_type = 'text/plain; charset=utf-8'
filename = 'ajaxGetNodes.xml'
RESPONSE.setHeader('Content-Type', content_type)
RESPONSE.setHeader('Content-Disposition', 'inline;filename="%s"'%filename)
RESPONSE.setHeader('Cache-Control', 'no-cache')
RESPONSE.setHeader('Pragma', 'no-cache')
self.f_standard_html_request( self, REQUEST)
xml += self.getXmlHeader()
xml += '<pages>'
for ref in refs:
ob = self.getLinkObj(ref)
if ob is None:
xml += '<page ref="%s" not_found="1"/>'%ref
else:
xml += ob.ajaxGetNode(context=context, lang=lang, xml_header=False, REQUEST=REQUEST)
xml += "</pages>"
return xml

# --------------------------------------------------------------------------
# ZMSObject.ajaxGetNode:
# --------------------------------------------------------------------------
security.declareProtected('View', 'ajaxGetNode')
def ajaxGetNode(self, context=None, lang=None, xml_header=True, meta_types=None, REQUEST=None):
""" ZMSObject.ajaxGetNode """
warn(self, 'ajaxGetNode', '++rest_api')
# Build xml.
xml = ''
if xml_header:
RESPONSE = REQUEST.RESPONSE
content_type = 'text/xml; charset=utf-8'
filename = 'ajaxGetNode.xml'
RESPONSE.setHeader('Content-Type', content_type)
RESPONSE.setHeader('Content-Disposition', 'inline;filename="%s"'%filename)
RESPONSE.setHeader('Cache-Control', 'no-cache')
RESPONSE.setHeader('Pragma', 'no-cache')
self.f_standard_html_request( self, REQUEST)
xml += self.getXmlHeader()
xml += '<page'
xml += " absolute_url=\"%s\""%str(self.getAbsoluteUrlInContext(context))
xml += " physical_path=\"%s\""%('/'.join(self.getPhysicalPath()))
xml += " access=\"%s\""%str(int(self.hasAccess(REQUEST)))
xml += " active=\"%s\""%str(int(self.isActive(REQUEST)))
try:
xml += " zmi_icon=\"%s\""%self.zmi_icon()
except:
xml += " zmi_icon=\"%s\""%self.zmi_icon
xml += " display_type=\"%s\""%str(self.display_type())
xml += " uid=\"{$%s}\""%(self.get_uid())
xml += " id=\"%s_%s\""%(self.getHome().id, self.id)
xml += " home_id=\"%s\""%(self.getHome().id)
xml += " index_html=\"%s\""%standard.html_quote(self.getHref2IndexHtmlInContext(context,REQUEST=REQUEST))
xml += " is_page=\"%s\""%str(int(self.isPage()))
xml += " is_pageelement=\"%s\""%str(int(self.isPageElement()))
xml += " meta_id=\"%s\""%(self.meta_id)
xml += " title=\"%s\""%standard.html_quote(self.getTitle(REQUEST))
xml += " titlealt=\"%s\""%standard.html_quote(self.getTitlealt(REQUEST))
xml += " restricted=\"%s\""%str(self.hasRestrictedAccess())
xml += " attr_dc_type=\"%s\""%(self.attr('attr_dc_type'))
xml += ">"
if REQUEST.form.get('get_attrs', 0):
obj_attrs = self.getObjAttrs()
for key in [x for x in obj_attrs if x not in ['title', 'titlealt', 'change_dt', 'change_uid', 'change_history', 'created_dt', 'created_uid', 'attr_dc_coverage', 'attr_cacheable', 'work_dt', 'work_uid']]:
obj_attr = obj_attrs[ key]
if obj_attr['datatype_key'] in _globals.DT_TEXTS or \
obj_attr['datatype_key'] in _globals.DT_NUMBERS or \
obj_attr['datatype_key'] in _globals.DT_DATETIMES:
v = self.attr(key)
if v:
xml += "<%s>%s</%s>"%(key, standard.toXmlString(self,v).encode('utf-8'), key)
elif obj_attr['datatype_key'] in _globals.DT_BLOBS:
v = self.attr(key)
if v:
xml += "<%s>"%key
xml += "<href>%s</href>"%standard.html_quote(v.getHref(REQUEST))
xml += "<filename>%s</filename>"%standard.html_quote(v.getFilename())
xml += "<content_type>%s</content_type>"%standard.html_quote(v.getContentType())
xml += "<size>%s</size>"%standard.getDataSizeStr(v.get_size())
xml += "<icon>%s</icon>"%standard.getMimeTypeIconSrc(v.getContentType())
xml += "</%s>"%key
xml += "</page>"
return xml

# --------------------------------------------------------------------------
# ZMSObject.ajaxGetParentNodes:
# --------------------------------------------------------------------------
security.declareProtected('View', 'ajaxGetParentNodes')
def ajaxGetParentNodes(self, lang, xml_header=True, meta_types=None, REQUEST=None):
""" ZMSObject.ajaxGetParentNodes """
warn(self, 'ajaxGetParentNodes', '++rest_api')
# Get context.
context = self
for id in REQUEST.get('physical_path', '').split('/'):
if id and context is not None:
context = getattr(context, id, None)
if context is None:
context = self
break
# Build xml.
xml = ''
if xml_header:
RESPONSE = REQUEST.RESPONSE
content_type = 'text/xml; charset=utf-8'
filename = 'ajaxGetParentNodes.xml'
RESPONSE.setHeader('Content-Type', content_type)
RESPONSE.setHeader('Content-Disposition', 'inline;filename="%s"'%filename)
RESPONSE.setHeader('Cache-Control', 'no-cache')
RESPONSE.setHeader('Pragma', 'no-cache')
self.f_standard_html_request( self, REQUEST)
xml += self.getXmlHeader()
# Start-tag.
xml += "<pages"
for key in REQUEST.form.keys():
if key.find('get_') < 0 and key not in ['lang', 'preview', 'http_referer', 'meta_types']:
xml += " %s=\"%s\""%(key, str(REQUEST.form.get(key)))
xml += " level=\"%i\""%self.getLevel()
xml += ">\n"
# Process nodes.
for node in self.breadcrumbs_obj_path():
nodexml = node.ajaxGetNode( context=context, lang=lang, xml_header=False, meta_types=meta_types, REQUEST=REQUEST)
try:
xml += str(nodexml, 'utf-8', errors='ignore')
except:
xml += nodexml
# End-tag.
xml += "</pages>"
# Return xml.
return xml

# --------------------------------------------------------------------------
# ZMSObject.ajaxGetChildNodes:
# --------------------------------------------------------------------------
security.declareProtected('View', 'ajaxGetChildNodes')
def ajaxGetChildNodes(self, lang, xml_header=True, meta_types=None, REQUEST=None):
""" ZMSObject.ajaxGetChildNodes """
warn(self, 'ajaxGetChildNodes', '++rest_api')
# Get context.
context = self
for id in REQUEST.get('physical_path', '').split('/'):
if id and context is not None:
context = getattr(context, id, None)
if context is None:
context = self
break
# Build xml.
xml = ''
if xml_header:
RESPONSE = REQUEST.RESPONSE
content_type = 'text/xml; charset=utf-8'
filename = 'ajaxGetChildNodes.xml'
RESPONSE.setHeader('Content-Type', content_type)
RESPONSE.setHeader('Content-Disposition', 'inline;filename="%s"'%filename)
RESPONSE.setHeader('Cache-Control', 'no-cache')
RESPONSE.setHeader('Pragma', 'no-cache')
self.f_standard_html_request( self, REQUEST)
xml += self.getXmlHeader()
xml += "<pages"
for key in REQUEST.form.keys():
if key.find('get_') < 0 and key not in ['lang', 'preview', 'http_referer', 'meta_types']:
xml += " %s=\"%s\""%(key, str(REQUEST.form.get(key)))
xml += " level=\"%i\""%self.getLevel()
xml += ">\n"
if isinstance(meta_types, str) and meta_types.find(',') > 0:
meta_types = meta_types.split(',')
if isinstance(meta_types, list):
new_meta_types = []
for meta_type in meta_types:
try:
new_meta_types.append( int( meta_type))
except:
new_meta_types.append( meta_type)
meta_types = new_meta_types
if REQUEST.form.get('http_referer'):
REQUEST.set('URL', REQUEST.form.get('http_referer'))
# Add child-nodes.
obs = []
childNodes = self.getChildNodes(REQUEST, meta_types)
# Exclude meta-ids.
excludeMetaIds = self.getConfProperty('ZMS.ajaxGetChildNodes.excludeMetaIds','').split(',')
childNodes = [x for x in childNodes if x.meta_id not in excludeMetaIds]
# Sort.
sortedChildNodes = self.evalMetaobjAttr('sortChildNodes',childNodes=childNodes)
if isinstance(sortedChildNodes,list):
childNodes = sortedChildNodes
obs.extend(childNodes)
# Add trashcan.
if ( self.meta_type == 'ZMS') and \
( ( isinstance(meta_types, list) and 'ZMSTrashcan' in meta_types) or \
( isinstance(meta_types, str) and 'ZMSTrashcan' == meta_types)):
obs.append( self.getTrashcan())
if self.meta_type == 'ZMS':
obs.extend( self.getPortalClients())
for ob in obs:
xml += ob.ajaxGetNode( context=context, lang=lang, xml_header=False, meta_types=meta_types, REQUEST=REQUEST)
xml += "</pages>"
if REQUEST.RESPONSE.getHeader('Location'):
del REQUEST.RESPONSE.headers['location']
return xml

# call this to initialize framework classes, which
# does the right thing with the security assertions.
InitializeClass(DeprecatedAPI)

################################################################################
5 changes: 2 additions & 3 deletions Products/zms/_exportable.py
Original file line number Diff line number Diff line change
Expand Up @@ -383,13 +383,12 @@ def toXhtml(self, REQUEST, deep=True):
# --------------------------------------------------------------------------
# Exportable.toXml:
# --------------------------------------------------------------------------
def toXml(self, REQUEST, deep=True, data2hex=False):
def toXml(self, REQUEST, deep=True, data2hex=False, multilang=True):
xml = ''
xml += _xmllib.xml_header()
xml += _xmllib.getObjToXml( self, REQUEST, deep, base_path='', data2hex=data2hex)
xml += _xmllib.getObjToXml( self, REQUEST, deep, base_path='', data2hex=data2hex, multilang=multilang)
return xml


# --------------------------------------------------------------------------
# Exportable.exportRessources:
#
Expand Down
31 changes: 13 additions & 18 deletions Products/zms/_globals.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,10 @@
################################################################################

# Imports.
from Products.PageTemplates.Expressions import SecureModuleImporter
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
import sys
import time
# Product Imports.
from Products.zms import standard
from Products.PageTemplates.Expressions import SecureModuleImporter
from Products.PageTemplates.PageTemplateFile import PageTemplateFile

# Umlauts
umlaut_map = {
Expand Down Expand Up @@ -65,7 +63,6 @@
u'ч': 'ch',
u'ш': 'sh',
u'щ': 'sch',
u'ь': "'",
u'ы': 'y',
u'ь': "'",
u'э': 'e',
Expand Down Expand Up @@ -106,19 +103,17 @@
u'Я': 'JA',}

def sort_item( i):
if isinstance(i, time.struct_time):
i = time.strftime('%Y%m%d%H%M%S',i)
elif isinstance(i, float):
pass
elif i is None or i == '':
i = 0
elif not isinstance(i, int):
i = standard.pystr(i)
mapping = umlaut_map
for key in mapping:
try: i = i.replace(key, mapping[key])
except: pass
return i
if isinstance(i, time.struct_time):
i = time.strftime('%Y%m%d%H%M%S',i)
elif isinstance(i, float):
pass
elif i is None or i == '':
i = 0
elif not isinstance(i, str):
mapping = umlaut_map
for key, value in mapping.items():
i = i.replace(key, value)
return i


# Datatypes.
Expand Down
Loading
Loading