Skip to content
Open
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
26 changes: 21 additions & 5 deletions shareclient/alfresco.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,8 @@ def __init__(self, url="http://localhost:8080/share", tenant=None, debug=0, mpli
def doRequest(self, method, path, data=None, dataType=None):
"""Perform a general HTTP request against Share"""
reqbase = self.getRequestBase()
req = SurfRequest(url="%s/%s" % (reqbase, path), data=data, method=method)
url = "%s/%s" % (reqbase, path)
req = SurfRequest(url=url, data=data, method=method)
if self.debug == 1:
print "%s %s/%s" % (method, reqbase, path)
if dataType is not None:
Expand Down Expand Up @@ -348,10 +349,18 @@ def doLogout(self):
"""Log the current user out of Share using the logout servlet"""
try:
resp = self.doGet('page/dologout')
resp.close()
except SurfRequestError, e:
if e.code == 405: # GET Method not allowed, must use POST for newer versions of Alfresco
resp = self.doPost('page/dologout')
resp.close()
try:
resp = self.doPost('page/dologout')
except SurfRequestError, e:
if e.code == 401: # POST Method return not authorized, must use POST for newer versions of Alfresco
print "Logged out"
else:
print "Unknown error on logout, HTTP response: %s error: %s" % e.code, e.description
resp.close()

self._username = None

def getSitesContainerName(self):
Expand Down Expand Up @@ -643,7 +652,14 @@ def importSiteContent(self, siteId, containerId, f, delete=True):
if tempContainerData is None:
# Create upload container if it doesn't exist
folderData = { 'alf_destination': siteNodeRef, 'prop_cm_name': tempContainerName, 'prop_cm_title': tempContainerName, 'prop_cm_description': '' }
createData = self.doJSONPost('proxy/alfresco/api/type/%s/formprocessor' % (urllib.quote(unicode(folderType))), json.dumps(folderData))
try:
createData = self.doJSONPost('proxy/alfresco/api/type/%s/formprocessor' % (urllib.quote(unicode(folderType))), json.dumps(folderData))
except SurfRequestError, e:
if e.code == 404:
folderType = 'cm:folder'
createData = self.doJSONPost('proxy/alfresco/api/type/%s/formprocessor' % (urllib.quote(unicode(folderType))), json.dumps(folderData))
else:
raise e
tempContainerData = { 'nodeRef': createData['persistedObject'], 'name' : tempContainerName }

# First apply a ruleset to the temp folder
Expand Down Expand Up @@ -1241,7 +1257,7 @@ def createGroups(self, group, parent=None):

def getCategories(self, path):
"""Fetch a list of child categories at the given location, in a recursive structure"""
categories = self.doJSONGet('proxy/alfresco/slingshot/doclib/categorynode/node/%s' % (urllib.quote(path)))['items']
categories = self.doJSONGet('proxy/alfresco/slingshot/doclib/categorynode/node/%s' % (urllib.quote(path.encode('utf-8'))))['items']
# Recursively call the function on each child to find child categories
for c in categories:
c['children'] = self.getCategories('%s/%s' % (path, c['name']))
Expand Down
105 changes: 105 additions & 0 deletions shareclient/example-scripts/import-categories.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/*
Example of import of categories using javascript (EX in javascript console)

It will create categories with the same name, do this before you import your site.

Remember nodeRef of ctegories are changed on new installation/server.

Author: Rasmus Melgaard, Novem-IT
Email: rm@novem-it.dk
*/

var catNtags = {
"categories": [],
"tags": []
};
/* add result of export-categories.py

var catNtags = {
"categories": [
{
"children": [
{
....
}

}
],
"tags": [
....
]
}; */

function category(cat) {
logger.log("cat: " + cat.name);
if (cat.children) {
categories(cat.children);
}
}

function categories(cats) {
for (var i = 0, len=cats.length; i<len;i++) {
category(cats[i]);
}
}

function tag(t) {
logger.log("tag: " + t);
if (t.children) {
tags(t.children);
}
}

function tags(tags) {
for (var i = 0, len=tags.length; i<len;i++) {
tag(tags[i]);
}
}

function createCategory(nodeParent, cat) {
logger.log("NodeParent: " + nodeParent.name + "cat: " + cat.name);
var props = new Array();
props["cm:name"] = cat.name;
props["cm:description"] = cat.description;
//props["cm:hasChildren"] = cat.hasChildren;
props["cm:nodeRef"] = cat.nodeRef;
//workspace://SpacesStore
//cm:categoryRoot && type: cm:category_root
//cm:generalclassifiable || cm:taggable aspect ... type: cm:category assoc: cm:categories
//cm:subcategories assoc
var newNode = null;
var nodeExists = false;
for each(node in nodeParent.childAssocs["cm:subcategories"]) {
logger.log("checking child: " + node.name);
if (node.name == cat.name) {
newNode = node;
nodeExists = true;
logger.log("found: " + cat.name);
break;

}

}
if (!nodeExists) {
logger.log("creating new: " + cat.name);
newNode = nodeParent.createNode(cat.name, "{http://www.alfresco.org/model/content/1.0}category", props, "cm:subcategories"); //alt: nodeParent.createSubCategory(cat.name)
}
if (null != newNode && cat.hasChildren) {
var cats=cat.children;
for (var i = 0, len=cats.length; i<len;i++) {
createCategory(newNode, cats[i]);
}
}
}
for each (root in classification.getRootCategories("cm:generalclassifiable")) logger.log("root:: " + root.name);

var realRoot = classification.getRootCategories("cm:generalclassifiable")[0].parent;

for (var i = 0, len=catNtags.categories.length; i<len;i++) {
logger.log("rootCategory:: " + catNtags.categories[i].name);
createCategory(realRoot, catNtags.categories[i]);
}


//categories(catNtags.categories);
//tags(catNtags.tags);
6 changes: 4 additions & 2 deletions shareclient/export-categories.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,10 @@ def main(argv):
categoryJson = json.dumps(cdata, sort_keys=True, indent=4)
print categoryJson
else:
if not os.path.exists(os.path.dirname(filename)):
os.makedirs(os.path.dirname(filename))
directory = os.path.dirname(filename)
if not os.path.exists(directory):
if not '' == directory:
os.makedirs(os.path.dirname(filename))

# Write user data to a file
categoryJson = json.dumps(cdata, sort_keys=True, indent=4)
Expand Down
12 changes: 9 additions & 3 deletions shareclient/import-site.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,10 @@ def main(argv):
try:
filenamenoext = os.path.splitext(os.path.split(filename)[1])[0]
thisdir = os.path.dirname(filename)
if thisdir == "":
thisdir = os.path.dirname(sys.argv[0])
if thisdir is not "":
thisdir = thisdir + os.sep
"""if thisdir == "":"""
""" thisdir = os.path.dirname(sys.argv[0])"""
sd = json.loads(open(filename).read())
siteId = str(sd['shortName'])
if create_site:
Expand Down Expand Up @@ -232,7 +234,9 @@ def main(argv):
# Import ACP files
if importContent:
for container in siteContainers:
acpFile = thisdir + os.sep + '%s-%s.acp' % (filenamenoext, container.replace(' ', '_'))
print "Import Content for site container: %s" % container
acpFile = thisdir + '%s-%s.acp' % (filenamenoext, container.replace(' ', '_'))
print "... using file %s" % acpFile
if os.path.isfile(acpFile) or uploadContent == False:
print "Import %s content" % (container)
fileobj = file(acpFile, 'rb') if uploadContent == True else None
Expand All @@ -244,13 +248,15 @@ def main(argv):
# Import site tags
if importTags:
for container in siteContainers:
print "Import Tags for site container: %s" % container
jsonFile = thisdir + os.sep + '%s-%s-tags.json' % (filenamenoext, container.replace(' ', '_'))
if os.path.isfile(jsonFile):
print "Import %s tags" % (container)
items = json.loads(open(jsonFile).read())['items']
sc.importSiteTags(siteId, items)

except alfresco.SurfRequestError, e:
print "Error (%s)" % (e.description)
if e.description == "error.duplicateShortName":
print "Site with short name '%s' already exists" % (siteId)
sys.exit(1)
Expand Down
5 changes: 4 additions & 1 deletion shareclient/purge-site.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,10 @@ def main(argv):

if len(argv) > 0:
siteurl = argv[0];
idm = re.match('^(\w+)$', siteurl)
idm = re.match('^[ ]*[0-9a-zA-Z\-]+[ ]*$', siteurl)
urlm = re.match('^(https?\\://[\w\\-\\.\\:]+/share)/page/site/(\w+)/[\w\\-\\./]*$', siteurl)
if idm is not None:

sitename = idm.group(0)
elif urlm is not None:
url = urlm.group(1)
Expand All @@ -105,6 +106,8 @@ def main(argv):
print "Delete site '%s'" % (sitename)
try:
sc.deleteSite(sitename)
"""site shortname is blocked by site in trashcan - https://issues.alfresco.com/jira/browse/ACE-2756"""
print "... Deleted site '%s' - site shortname is locked by site in user trashcan (delete in profile)" % (sitename)
except alfresco.SurfRequestError, e:
if e.code == 404:
print "Site '%s' does not exist" % (sitename)
Expand Down