def getSuggestedNames(self): # search common forms lookupNames = [] surname = self.__metadata.getList("surname").get(0) firstName = self.__metadata.getList("firstName").get(0) firstInitial = firstName[0].upper() secondName = self.__metadata.getList("secondName") if not secondName.isEmpty(): secondName = secondName.get(0) if secondName and secondName != "": secondInitial = secondName[0].upper() lookupNames.append("%s, %s. %s." % (surname, firstInitial, secondInitial)) lookupNames.append("%s, %s %s." % (surname, firstName, secondInitial)) lookupNames.append("%s, %s %s" % (surname, firstName, secondName)) lookupNames.append("%s %s %s" % (firstName, secondName, surname)) lookupNames.append("%s, %s." % (surname, firstInitial)) lookupNames.append("%s, %s" % (surname, firstName)) lookupNames.append("%s %s" % (firstName, surname)) query = '" OR dc_title:"'.join(lookupNames) # general word search from each part of the name parts = [p for p in self.getPackageTitle().split(" ") if len(p) > 0] query2 = " OR dc_title:".join(parts) req = SearchRequest('(dc_title:"%s")^2.5 OR (dc_title:%s)^0.5' % (query, query2)) self.log.info("suggestedNames query={}", req.query) req.setParam("fq", 'recordtype:"author"') req.addParam("fq", 'item_type:"object"') req.setParam("rows", "9999") req.setParam("fl", "score") req.setParam("sort", "score desc") # Make sure 'fq' has already been set in the session ##security_roles = self.authentication.get_roles_list(); ##security_query = 'security_filter:("' + '" OR "'.join(security_roles) + '")' ##req.addParam("fq", security_query) out = ByteArrayOutputStream() indexer = self.services.getIndexer() indexer.search(req, out) result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) # self.log.info("result={}", result.toString()) docs = result.getJsonList("response/docs") map = LinkedHashMap() for doc in docs: authorName = doc.getList("dc_title").get(0) if map.containsKey(authorName): authorDocs = map.get(authorName) else: authorDocs = ArrayList() map.put(authorName, authorDocs) authorDocs.add(doc) self.__maxScore = max(1.0, float(result.get("response/maxScore"))) return map
def test(self): s = "data " json = JsonConfigHelper() try: l = json.getList("test") s += str(l.size()) s += " '%s' " % json.get("test1") except Exception, e: s += "Error '%s'" % str(e)
def process_tags(self, result): tags = [] tagsDict = {} # Build a dictionary of the tags for doc in result: doc = JsonConfigHelper(doc.get("jsonString")) tag = doc.get("content/literal") locs = doc.getJsonList("annotates/locators").size() if locs == 0: if tag in tagsDict: d = tagsDict[tag] d.set("tagCount", str(int(d.get("tagCount")) + 1)) else: doc.set("tagCount", str(1)) tagsDict[tag] = doc else: tags.append(doc.toString()) for tag in tagsDict: tags.append(tagsDict[tag].toString()) return "[" + ",".join(tags) + "]"
def modify_json(self): #print "**** anotar.py : add_json() : adding json : " + json jsonObj = JsonConfigHelper(self.json) jsonObj.set("id", self.pid) rootUri = jsonObj.get("annotates/rootUri") if rootUri is not None: baseUrl = "http://%s:%s/" % (self.vc("request").serverName, self.vc("serverPort")) myUri = baseUrl + rootUri + "#" + self.pid jsonObj.set("uri", myUri) jsonObj.set("schemaVersionUri", "http://www.purl.org/anotar/schema/0.1") self.json = jsonObj.toString(False)
def __search(self, searchField): indexer = self.services.getIndexer() portalQuery = self.services.getPortalManager().get(self.portal.getName()).getQuery() portalSearchQuery = self.services.getPortalManager().get(self.portal.getName()).getSearchQuery() # Security prep work current_user = self.page.authentication.get_username() security_roles = self.page.authentication.get_roles_list() security_filter = 'security_filter:("' + '" OR "'.join(security_roles) + '")' security_exceptions = 'security_exception:"' + current_user + '"' owner_query = 'owner:"' + current_user + '"' security_query = "(" + security_filter + ") OR (" + security_exceptions + ") OR (" + owner_query + ")" startRow = 0 numPerPage = 25 numFound = 0 req = SearchRequest(searchField) if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) if not self.page.authentication.is_admin(): req.addParam("fq", security_query) objectIdList = [] while True: req.addParam("fq", 'item_type:"object"') req.addParam("rows", str(numPerPage)) req.addParam("start", str(startRow)) out = ByteArrayOutputStream() indexer.search(req, out) result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) docs = result.getList("response/docs/storage_id") objectIdList.extend(docs) startRow += numPerPage numFound = int(result.get("response/numFound")) if startRow > numFound: break return objectIdList
class SearchData: def __activate__(self, context): self.services = context["Services"] self.page = context["page"] self.formData = context["formData"] self.portalId = context["portalId"] self.sessionState = context["sessionState"] self.request = context["request"] self.pageName = context["pageName"] self.__portal = context["page"].getPortal() sessionNav = self.__portal.get("portal/use-session-navigation", "true") self.__useSessionNavigation = Boolean.parseBoolean(sessionNav) self.__result = JsonConfigHelper() if self.__useSessionNavigation: self.__pageNum = self.sessionState.get("pageNum", 1) else: self.__pageNum = 1 self.__selected = ArrayList() self.__fqParts = [] self.__searchField = self.formData.get("searchField", "full_text") self.__sortField = self.formData.get("sort-field") self.__sortOrder = self.formData.get("sort-order") if not (self.__sortField or self.__sortOrder): # use form data not specified, check session self.__sortField = self.sessionState.get("sortField", "score") self.__sortOrder = self.sessionState.get("sortOrder", "desc") self.sessionState.set("sortField", self.__sortField) self.sessionState.set("sortOrder", self.__sortOrder) self.__sortBy = "%s %s" % (self.__sortField, self.__sortOrder) # reset the query and facet selections when changing views lastPortalId = self.sessionState.get("lastPortalId") if lastPortalId != self.portalId: self.sessionState.remove("fq") self.sessionState.remove("pageNum") self.sessionState.remove("sortField") self.sessionState.remove("sortOrder") self.__pageNum = 1 self.sessionState.set("lastPortalId", self.portalId) self.__search() def usingSessionNavigation(self): return self.__restful def getPortalName(self): return self.__portal.getDescription() def getSearchField(self): return self.__searchField def __search(self): requireEscape = False recordsPerPage = self.__portal.recordsPerPage uri = URLDecoder.decode(self.request.getAttribute("RequestURI")) query = None pagePath = self.__portal.getName() + "/" + self.pageName if query is None or query == "": query = self.formData.get("query") requireEscape = True if query is None or query == "": query = "*:*" if query == "*:*": self.__query = "" else: self.__query = query if requireEscape: query = self.__escapeQuery(query) query = "%s:%s" % (self.__searchField, query) self.sessionState.set("query", self.__query) # find objects with annotations matching the query if query != "*:*": anotarQuery = self.__query if requireEscape: anotarQuery = self.__escapeQuery(anotarQuery) annoReq = SearchRequest(anotarQuery) annoReq.setParam("facet", "false") annoReq.setParam("rows", str(99999)) annoReq.setParam("sort", "dateCreated asc") annoReq.setParam("start", str(0)) anotarOut = ByteArrayOutputStream() self.services.indexer.annotateSearch(annoReq, anotarOut) resultForAnotar = JsonConfigHelper(ByteArrayInputStream(anotarOut.toByteArray())) resultForAnotar = resultForAnotar.getJsonList("response/docs") ids = HashSet() for annoDoc in resultForAnotar: annotatesUri = annoDoc.get("annotatesUri") ids.add(annotatesUri) print "Found annotation for %s" % annotatesUri # add annotation ids to query query += ' OR id:("' + '" OR "'.join(ids) + '")' portalSearchQuery = self.__portal.searchQuery if portalSearchQuery == "": portalSearchQuery = query else: if query != "*:*": query += " AND " + portalSearchQuery else: query = portalSearchQuery req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", str(recordsPerPage)) req.setParam("facet.field", self.__portal.facetFieldList) req.setParam("facet.sort", Boolean.toString(self.__portal.getFacetSort())) req.setParam("facet.limit", str(self.__portal.facetCount)) req.setParam("sort", self.__sortBy) # setup facets if self.__useSessionNavigation: action = self.formData.get("verb") value = self.formData.get("value") fq = self.sessionState.get("fq") if fq is not None: self.__pageNum = 1 req.setParam("fq", fq) if action == "add_fq": self.__pageNum = 1 req.addParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "remove_fq": self.__pageNum = 1 req.removeParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "clear_fq": self.__pageNum = 1 req.removeParam("fq") elif action == "select-page": self.__pageNum = int(value) else: navUri = uri[len(pagePath) :] self.__pageNum, fq, self.__fqParts = self.__parseUri(navUri) savedfq = self.sessionState.get("savedfq") limits = [] if savedfq: limits.extend(savedfq) if fq: limits.extend(fq) self.sessionState.set("savedfq", limits) for q in fq: req.addParam("fq", URLDecoder.decode(q, "UTF-8")) portalQuery = self.__portal.query if portalQuery: req.addParam("fq", portalQuery) req.addParam("fq", 'item_type:"object"') if req.getParams("fq"): self.__selected = ArrayList(req.getParams("fq")) if self.__useSessionNavigation: self.sessionState.set("fq", self.__selected) self.sessionState.set("searchQuery", portalSearchQuery) self.sessionState.set("pageNum", self.__pageNum) # Make sure 'fq' has already been set in the session if not self.page.authentication.is_admin(): current_user = self.page.authentication.get_username() security_roles = self.page.authentication.get_roles_list() security_filter = 'security_filter:("' + '" OR "'.join(security_roles) + '")' security_exceptions = 'security_exception:"' + current_user + '"' owner_query = 'owner:"' + current_user + '"' security_query = "(" + security_filter + ") OR (" + security_exceptions + ") OR (" + owner_query + ")" req.addParam("fq", security_query) req.setParam("start", str((self.__pageNum - 1) * recordsPerPage)) print " * search.py:", req.toString(), self.__pageNum out = ByteArrayOutputStream() self.services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) if self.__result is not None: self.__paging = Pagination( self.__pageNum, int(self.__result.get("response/numFound")), self.__portal.recordsPerPage ) def __escapeQuery(self, q): eq = q # escape all solr/lucene special chars # from http://lucene.apache.org/java/2_4_0/queryparsersyntax.html#Escaping%20Special%20Characters for c in '+-&|!(){}[]^"~*?:\\': eq = eq.replace(c, "\\%s" % c) ## Escape UTF8 try: return URLEncoder.encode(eq, "UTF-8") except UnsupportedEncodingException, e: print "Error during UTF8 escape! ", repr(eq) return eq
class SearchData: def __init__(self): self.lastPortalId = "" def __activate__(self, context): self.services = context["Services"] self.page = context["page"] self.formData = context["formData"] self.sessionState = context["sessionState"] self.request = context["request"] self.pageName = context["pageName"] self.__portal = context["page"].getPortal() sessionNav = self.__portal.get("portal/use-session-navigation", "true") self.__useSessionNavigation = Boolean.parseBoolean(sessionNav) self.__result = JsonConfigHelper() if self.__useSessionNavigation: self.__pageNum = self.sessionState.get("pageNum", 1) else: self.__pageNum = 1 self.__selected = ArrayList() self.__fqParts = [] self.__searchField = self.formData.get("searchField", "full_text") if self.__portal.getName() != self.lastPortalId: self.sessionState.remove("fq") self.sessionState.remove("pageNum") self.__pageNum = 1 self.lastPortalId = self.__portal.getName() self.__search() def usingSessionNavigation(self): return self.__restful def getPortalName(self): return self.__portal.getDescription() def getSearchField(self): return self.__searchField def __search(self): recordsPerPage = self.__portal.recordsPerPage uri = URLDecoder.decode(self.request.getAttribute("RequestURI")) query = None pagePath = self.__portal.getName() + "/" + self.pageName if query is None or query == "": query = self.formData.get("query") if query is None or query == "": query = "*:*" if query == "*:*": self.__query = "" else: self.__query = query query = "%s:%s" % (self.__searchField, query) self.sessionState.set("query", self.__query) # find objects with annotations matching the query if query != "*:*": anotarQuery = self.__query annoReq = SearchRequest(anotarQuery) annoReq.setParam("facet", "false") annoReq.setParam("rows", str(99999)) annoReq.setParam("sort", "dateCreated asc") annoReq.setParam("start", str(0)) anotarOut = ByteArrayOutputStream() self.services.indexer.annotateSearch(annoReq, anotarOut) resultForAnotar = JsonConfigHelper(ByteArrayInputStream(anotarOut.toByteArray())) resultForAnotar = resultForAnotar.getJsonList("response/docs") ids = HashSet() for annoDoc in resultForAnotar: annotatesUri = annoDoc.get("annotatesUri") ids.add(annotatesUri) print "Found annotation for %s" % annotatesUri # add annotation ids to query query += ' OR id:("' + '" OR "'.join(ids) + '")' portalSearchQuery = self.__portal.searchQuery if portalSearchQuery == "": portalSearchQuery = query else: if query != "*:*": query += " AND " + portalSearchQuery else: query = portalSearchQuery req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", str(recordsPerPage)) req.setParam("facet.field", self.__portal.facetFieldList) req.setParam("facet.sort", str(self.__portal.getFacetSort())) req.setParam("facet.limit", str(self.__portal.facetCount)) req.setParam("sort", "f_dc_title asc") # setup facets if self.__useSessionNavigation: action = self.formData.get("verb") value = self.formData.get("value") fq = self.sessionState.get("fq") if fq is not None: self.__pageNum = 1 req.setParam("fq", fq) if action == "add_fq": self.__pageNum = 1 req.addParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "remove_fq": self.__pageNum = 1 req.removeParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "clear_fq": self.__pageNum = 1 req.removeParam("fq") elif action == "select-page": self.__pageNum = int(value) else: navUri = uri[len(pagePath):] self.__pageNum, fq, self.__fqParts = self.__parseUri(navUri) savedfq = self.sessionState.get("savedfq") limits = [] if savedfq: limits.extend(savedfq) if fq: limits.extend(fq) self.sessionState.set("savedfq", limits) for q in fq: req.addParam("fq", URLDecoder.decode(q, "UTF-8")) portalQuery = self.__portal.query if portalQuery: req.addParam("fq", portalQuery) req.addParam("fq", 'item_type:"object"') if req.getParams("fq"): self.__selected = ArrayList(req.getParams("fq")) if self.__useSessionNavigation: self.sessionState.set("fq", self.__selected) self.sessionState.set("searchQuery", portalSearchQuery) self.sessionState.set("pageNum", self.__pageNum) # Make sure 'fq' has already been set in the session if not self.page.authentication.is_admin(): current_user = self.page.authentication.get_username() security_roles = self.page.authentication.get_roles_list() security_filter = 'security_filter:("' + '" OR "'.join(security_roles) + '")' security_exceptions = 'security_exception:"' + current_user + '"' owner_query = 'owner:"' + current_user + '"' security_query = "(" + security_filter + ") OR (" + security_exceptions + ") OR (" + owner_query + ")" req.addParam("fq", security_query) req.setParam("start", str((self.__pageNum - 1) * recordsPerPage)) print " * search.py:", req.toString(), self.__pageNum out = ByteArrayOutputStream() self.services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) if self.__result is not None: self.__paging = Pagination(self.__pageNum, int(self.__result.get("response/numFound")), self.__portal.recordsPerPage) def getQueryTime(self): return int(self.__result.get("responseHeader/QTime")) / 1000.0; def getPaging(self): return self.__paging def getResult(self): return self.__result def getFacetField(self, key): return self.__portal.facetFields.get(key) def getFacetName(self, key): return self.__portal.facetFields.get(key).get("label") def getFacetCounts(self, key): values = LinkedHashMap() valueList = self.__result.getList("facet_counts/facet_fields/%s" % key) for i in range(0,len(valueList),2): name = valueList[i] count = valueList[i+1] if (name.find("/") == -1 or self.hasSelectedFacets()) and count > 0: values.put(name, count) return values def hasSelectedFacets(self): return (self.__selected is not None and len(self.__selected) > 1) and \ not (self.__portal.query in self.__selected and len(self.__selected) == 2) def getSelectedFacets(self): return self.__selected def isPortalQueryFacet(self, fq): return fq == self.__portal.query def isSelected(self, fq): return fq in self.__selected def getSelectedFacetIds(self): return [md5.new(fq).hexdigest() for fq in self.__selected] def getFileName(self, path): return os.path.splitext(os.path.basename(path))[0] def getFacetQuery(self, name, value): return '%s:"%s"' % (name, value) # Packaging support def getActiveManifestTitle(self): return self.__getActiveManifest().get("title") def getActiveManifestId(self): return self.sessionState.get("package/active/id") def getSelectedItemsCount(self): return self.__getActiveManifest().getList("manifest//id").size() def isSelectedForPackage(self, oid): return self.__getActiveManifest().get("manifest//node-%s" % oid) is not None def getManifestItemTitle(self, oid, defaultValue): return self.__getActiveManifest().get("manifest//node-%s/title" % oid, defaultValue) def __getActiveManifest(self): activeManifest = self.sessionState.get("package/active") if not activeManifest: activeManifest = JsonConfigHelper() activeManifest.set("title", "New package") activeManifest.set("viewId", self.__portal.getName()) self.sessionState.set("package/active", activeManifest) return activeManifest def isSelectableForPackage(self, oid): return oid != self.getActiveManifestId() # RESTful style URL support methods def getPageQuery(self, page): prefix = "" if self.__fqParts: prefix = "/" + "/".join(self.__fqParts) suffix = "" if page > 1: suffix = "/page/%s" % page return prefix + suffix def getFacetQueryUri(self, name, value): return "%s/%s" % (name, value) def getFacetValue(self, facetValue): return facetValue.split("/")[-1] def getLimitQueryWith(self, fq): limits = ArrayList(self.__fqParts) limits.add("category/" + fq) return "/".join(limits) def getFacetIndent(self, facetValue): return len(facetValue.split("/")) def getLimitQueryWithout(self, fq): limits = ArrayList(self.__fqParts) limits.remove("category/" + fq) if limits.isEmpty(): return "" return "/".join(limits) def __parseUri(self, uri): page = 1 fq = [] fqParts = [] if uri != "": parts = uri.split("/") partType = None facetKey = None facetValues = None for part in parts: if partType == "page": facetKey = None page = int(part) elif partType == "category": partType = "category-value" facetValues = None facetKey = part elif partType == "category-value": if facetValues is None: facetValues = [] if part in ["page", "category"]: partType = part facetQuery = '%s:"%s"' % (facetKey, "/".join(facetValues)) fq.append(facetQuery) fqParts.append("category/%s/%s" % (facetKey, "/".join(facetValues))) facetKey = None facetValues = None else: facetValues.append(URLDecoder.decode(part)) else: partType = part if partType == "category-value": facetQuery = '%s:"%s"' % (facetKey, "/".join(facetValues)) fq.append(facetQuery) fqParts.append("category/%s/%s" % (facetKey, "/".join(facetValues))) return page, fq, fqParts
class DetailData: def __init__(self): self.__object = None if formData.get("func") == "open-file": self.__openFile() writer = response.getPrintWriter("text/plain") writer.println("{}") writer.close() else: self.__storage = Services.storage uri = URLDecoder.decode(request.getAttribute("RequestURI")) basePath = portalId + "/" + pageName self.__oid = uri[len(basePath)+1:] slash = self.__oid.rfind("/") self.__pid = self.__oid[slash+1:] payload = self.__storage.getPayload(self.__oid, self.__pid) self.__object = self.__storage.getObject(self.__oid) if payload is not None: self.__mimeType = payload.contentType else: self.__mimeType = "application/octet-stream" self.__metadata = JsonConfigHelper() print " * detail.py: uri='%s' oid='%s' pid='%s' mimeType='%s'" % (uri, self.__oid, self.__pid, self.__mimeType) self.__search() def __search(self): req = SearchRequest('id:"%s"' % self.__oid) out = ByteArrayOutputStream() Services.indexer.search(req, out) self.__json = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) self.__metadata = SolrDoc(self.__json) def canOpenFile(self): #HACK check if mimetypes match between index and real file #dcFormat = self.__json.get("response/docs/dc_format", "") #if dcFormat is not None: # dcFormat = dcFormat[1:-1] #return dcFormat == self.__mimeType f = File(self.getObject().getId()) return f.exists(); def encode(self, url): return URLEncoder.encode(url, "UTF-8") def isMetadataOnly(self): self.getObject().getPayloadList() return self.getObject().getSource() is None def getFileName(self, path): return os.path.split(path)[1] def getFilePathWithoutExt(self, path): return os.path.splitext(self.getFileName(path))[0] def getMimeType(self): return self.__mimeType def getSolrResponse(self): return self.__json def formatName(self, name): return name[3:4].upper() + name[4:] def formatValue(self, value): return value def isHidden(self, pid): if pid.find("_files%2F")>-1: return True return False def getMetadata(self): return self.__metadata def getObject(self): return self.__object def getStorageId(self): obj = self.getObject() if hasattr(obj, "getPath"): return obj.path.absolutePath return obj.id def hasSlideShow(self): pid = self.__pid pid = pid[:pid.find(".")] + ".slide.htm" payload = self.__storage.getPayload(self.__oid, pid) if payload is None: return False return pid def hasFlv(self): pid = self.__pid pid = pid[:pid.find(".")] + ".flv" payload = self.__storage.getPayload(self.__oid, pid) if payload is None: return "" return pid def getPdfUrl(self): pid = os.path.splitext(self.__pid)[0] + ".pdf" return "%s/%s" % (self.__oid, pid) def hasHtml(self): payloadList = self.getObject().getPayloadList() for payload in payloadList: mimeType = payload.contentType if mimeType == "text/html" or mimeType == "application/xhtml+xml": return True return False def getPayloadContent(self): mimeType = self.__mimeType print " * detail.py: payload content mimeType=%s" % mimeType contentStr = "" if mimeType == "application/octet-stream": dcFormat = self.__json.get("response/docs/dc_format") if dcFormat is not None: dcFormat = dcFormat[1:-1] print dcFormat, mimeType if dcFormat != mimeType: return "<div><em>(File not found)</em></div>" else: return "<div><em>(Binary file)</em></div>" elif mimeType.startswith("text/"): if mimeType == "text/html": contentStr = '<iframe class="iframe-preview" src="%s/%s/download/%s"></iframe>' % \ (contextPath, portalId, self.__oid) else: pid = self.__oid[self.__oid.rfind("/")+1:] payload = self.__storage.getPayload(self.__oid, pid) #print " * detail.py: pid=%s payload=%s" % (pid, payload) if payload is not None: sw = StringWriter() sw.write("<pre>") IOUtils.copy(payload.getInputStream(), sw) sw.write("</pre>") sw.flush() contentStr = sw.toString() elif mimeType == "application/pdf" or mimeType.find("vnd.ms")>-1 or mimeType.find("vnd.oasis.opendocument.")>-1: # get the html version if exist... pid = os.path.splitext(self.__pid)[0] + ".htm" print " * detail.py: pid=%s" % pid #contentStr = '<iframe class="iframe-preview" src="%s/%s/download/%s/%s"></iframe>' % \ # (contextPath, portalId, self.__oid, pid) payload = self.__storage.getPayload(self.__oid, pid) saxReader = SAXReader(Boolean.parseBoolean("false")) try: document = saxReader.read(payload.getInputStream()) slideNode = document.selectSingleNode("//*[local-name()='body']") #linkNodes = slideNode.selectNodes("//img") #contentStr = slideNode.asXML(); # encode character entities correctly slideNode.setName("div") out = ByteArrayOutputStream() format = OutputFormat.createPrettyPrint() format.setSuppressDeclaration(True) format.setExpandEmptyElements(True) writer = XMLWriter(out, format) writer.write(slideNode) writer.close() contentStr = out.toString("UTF-8") except: traceback.print_exc() contentStr = "<p class=\"error\">No preview available</p>" return contentStr def __openFile(self): file = formData.get("file") print " * detail.py: opening file %s..." % file Desktop.getDesktop().open(File(file))
class OaiData: def __init__(self): pass def __activate__(self, context): self.velocityContext = context self.services = context["Services"] self.log = context["log"] self.sessionState = context["sessionState"] self.portalDir = context["portalDir"] self.__result = None self.__token = None self.__portalName = context["page"].getPortal().getName() self.__authors = [] self.__relatedResources = [] self.__enabledInAllViews = False self.__enabledInViews = [] self.__metadataPrefix = "" self.__sessionExpiry = Long.parseLong(JsonConfig().get("portal/oai-pmh/sessionExpiry")) self.__resumptionTokenList = self.sessionState.get("resumptionTokenList") if self.__resumptionTokenList == None: self.__resumptionTokenList = {} #Check if there's resumption token exist in the formData self.__currentToken = None resumptionToken = self.vc("formData").get("resumptionToken") if resumptionToken: if self.__resumptionTokenList.has_key(resumptionToken): self.__currentToken = self.__resumptionTokenList[resumptionToken] print " * oai.py: formData=%s" % self.vc("formData") self.vc("request").setAttribute("Content-Type", "text/xml") self.__request = OaiPmhVerb(self.vc("formData"), self.__currentToken, self.sessionState) if self.getError() is None and \ self.getVerb() in ["GetRecord", "ListIdentifiers", "ListRecords"]: ## Only list those data if the metadata format is enabled self.__metadataPrefix = self.vc("formData").get("metadataPrefix") if self.__metadataPrefix is None: self.__metadataPrefix = self.__currentToken.getMetadataPrefix() self.__enabledInAllViews = Boolean.parseBoolean(JsonConfig().get("portal/oai-pmh/metadataFormats/%s/enabledInAllViews" % self.__metadataPrefix, "false")) if self.__enabledInAllViews: self.__search() else: self.__enabledInViews = JsonConfig().getList("portal/oai-pmh/metadataFormats/%s/enabledViews" % self.__metadataPrefix) if self.__portalName in self.__enabledInViews: self.__search() # Get from velocity context def vc(self, index): if self.velocityContext[index] is not None: return self.velocityContext[index] else: self.log.error("ERROR: Requested context entry '" + index + "' doesn't exist") return None def getVerb(self): return self.getRequest().getVerb() def getError(self): return self.getRequest().getError() def getResponseDate(self): return time.strftime("%Y-%m-%dT%H:%M:%SZ") def getRequest(self): return self.__request def getResult(self): return self.__result def getElement(self, elementName, values): elementStr = "" if values: for value in values: elementStr += "<%s>%s</%s>" % (elementName, value, elementName) return elementStr def __search(self): self.__result = JsonConfigHelper() portal = self.services.getPortalManager().get(self.vc("portalId")) recordsPerPage = portal.recordsPerPage query = self.vc("formData").get("query") if query is None or query == "": query = "*:*" req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", str(recordsPerPage)) req.setParam("facet.field", portal.facetFieldList) req.setParam("facet.limit", str(portal.facetCount)) req.setParam("sort", "f_dc_title asc") portalQuery = portal.query print " * portalQuery=%s" % portalQuery if portalQuery: portalQuery += "&item_type:object" else: portalQuery += "item_type:object" req.addParam("fq", portalQuery) #Check if there's resumption token exist in the formData if self.__currentToken: start = self.__currentToken.getStart() totalFound = self.__currentToken.getTotalFound() nextTokenStart = start+recordsPerPage if nextTokenStart < totalFound: self.__token = ResumptionToken(start=nextTokenStart, metadataPrefix=self.__metadataPrefix, sessionExpiry=self.__sessionExpiry) else: start = 0 metadataPrefix = self.vc("formData").get("metadataPrefix") self.__token = ResumptionToken(start=recordsPerPage, metadataPrefix=self.__metadataPrefix, sessionExpiry=self.__sessionExpiry) req.setParam("start", str(start)) print " * oai.py:", req.toString() out = ByteArrayOutputStream() self.services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) totalFound = int(self.__result.get("response/numFound")) if totalFound == 0: self.__token = None elif self.__token: if self.__token.getStart() < totalFound: self.__token.setTotalFound(totalFound) else: self.__token = None #Storing the resumptionToken to session if self.__token: self.__resumptionTokenList[self.__token.getToken()] = self.__token #(totalFound, self.__token.getConstructedToken()) #Need to know how long the server need to store this token self.sessionState.set("resumptionTokenList", self.__resumptionTokenList) def getUrlBase(self): conf = JsonConfig() return "%s%s/detail/" % (conf.get("urlBase"), self.__portalName) def getToken(self): if self.__enabledInAllViews or self.__portalName in self.__enabledInViews: return self.__token return None def getMetadataFormats(self): conf = JsonConfig() formats = conf.getMap("portal/oai-pmh/metadataFormats") return formats def encodeXml(self, string): return StringEscapeUtils.escapeXml(string) def __getManifest(self, oid): object = self.services.getStorage().getObject(oid) sourceId = object.getSourceId() payload = object.getPayload(sourceId) payloadReader = InputStreamReader(payload.open(), "UTF-8") manifest = JsonConfigHelper(payloadReader) payloadReader.close() payload.close() object.close() return manifest.getJsonMap("manifest") def getAuthors(self, item): self.__authors = HashSet() self.__processResourceRelations(item.get("id")) #get the rest of the author name self.__addAuthor(item.get("dc_title")) self.__addAuthor(item.get("fullName")) self.__addAuthor(item.get("preferedName")) return self.__authors def __addAuthor(self, values): if values: for value in values: self.__authors.add(value) def getResourceRelations(self): return self.__relatedResources def __processResourceRelations(self, oid): manifest = self.__getManifest(oid) self.__relatedResources = [] for node in manifest.keySet(): nodeMap = manifest.get(node) author = nodeMap.get("title") if author not in self.__authors: self.__authors.add(author) children = nodeMap.getJsonMap("children") for child in children.keySet(): map = HashMap() childMap = children.get(child) id = childMap.get("id") title = childMap.get("title") handle = childMap.get("handle") map.put("handle", handle) map.put("author", author) map.put("title", title) map.put("id", id) self.__relatedResources.append(map)
class BatchprocessData: def __init__(self): pass def __activate__(self, context): self.formData = context["formData"] self.response = context["response"] self.services = context["Services"] self.page = context["page"] self.portal = self.page.getPortal() self.vc = context["toolkit"] func = self.formData.get("func") if func == "num-modified": writer = self.response.getPrintWriter("text/plain") writer.println(self.numberOfModifiedRecord()) writer.close() def renderUpdateForm(self): return self.__createBatchForm("update") def renderExportForm(self): return self.__createBatchForm("export") def __createBatchForm(self, processName): self.formRenderer = self.vc.getFormRenderer() form = "<form id='%s-form' method='post'>\n" \ "<fieldset class='login'>\n" \ "<legend>Batch %s script file</legend>\n" % (processName, processName) form += self.formRenderer.ajaxFluidErrorHolder("%s-script-file" % processName) + "\n" if self.__scriptList(processName) != {}: form += self.formRenderer.renderFormSelect("%s-script-file" % processName, \ "Batch %s script:" % processName, self.__scriptList(processName)) form += "<div><br/>" form += self.formRenderer.renderFormElement("%s-upload" % processName, "button", "", "Batch %s" % processName) form += self.formRenderer.renderFormElement("%s-cancel" % processName, "button", "", "Cancel") form += self.formRenderer.ajaxProgressLoader("%s-script-file" % processName) form += "</div>" else: form += "<div>There is no script available to do batch processing.</div>" form += "</fieldset></form>\n" return form def __scriptList(self, processName): scriptDir = "%s/batch-process/%s" % (os.environ.get("TF_HOME"), processName) scriptDic = {} if os.path.isdir(scriptDir): scriptFiles = os.listdir(scriptDir) if scriptFiles: for script in scriptFiles: scriptFilePath = "%s/%s" % (scriptDir, script) scriptDic[scriptFilePath] = script return scriptDic def numberOfModifiedRecord(self): indexer = self.services.getIndexer() portalQuery = self.services.getPortalManager().get(self.portal.getName()).getQuery() portalSearchQuery = self.services.getPortalManager().get(self.portal.getName()).getSearchQuery() # Security prep work current_user = self.page.authentication.get_username() security_roles = self.page.authentication.get_roles_list() security_filter = 'security_filter:("' + '" OR "'.join(security_roles) + '")' security_exceptions = 'security_exception:"' + current_user + '"' owner_query = 'owner:"' + current_user + '"' security_query = "(" + security_filter + ") OR (" + security_exceptions + ") OR (" + owner_query + ")" req = SearchRequest("modified:true") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.addParam("fq", "") req.setParam("rows", "0") if not self.page.authentication.is_admin(): req.addParam("fq", security_query) out = ByteArrayOutputStream() indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) return self.__result.get("response/numFound")
def __workflow(self): # Workflow data WORKFLOW_ID = "packaging" wfChanged = False workflow_security = [] self.message_list = None try: wfPayload = self.object.getPayload("workflow.metadata") wfMeta = JsonConfigHelper(wfPayload.open()) wfPayload.close() # Are we indexing because of a workflow progression? targetStep = wfMeta.get("targetStep") if targetStep is not None and targetStep != wfMeta.get("step"): wfChanged = True # Step change wfMeta.set("step", targetStep) wfMeta.removePath("targetStep") # This must be a re-index then else: targetStep = wfMeta.get("step") # Security change stages = self.config.getJsonList("stages") for stage in stages: if stage.get("name") == targetStep: wfMeta.set("label", stage.get("label")) self.item_security = stage.getList("visibility") workflow_security = stage.getList("security") if wfChanged == True: self.message_list = stage.getList("message") # Form processing formData = wfMeta.getJsonList("formData") if formData.size() > 0: formData = formData[0] else: formData = None coreFields = ["title", "creator", "contributor", "description", "format", "creationDate"] if formData is not None: # Core fields title = formData.getList("title") if title: self.titleList = title creator = formData.getList("creator") if creator: self.creatorList = creator contributor = formData.getList("contributor") if contributor: self.contributorList = contributor description = formData.getList("description") if description: self.descriptionList = description format = formData.getList("format") if format: self.formatList = format creation = formData.getList("creationDate") if creation: self.creationDate = creation # Non-core fields data = formData.getMap("/") for field in data.keySet(): if field not in coreFields: self.customFields[field] = formData.getList(field) except StorageException, e: # No workflow payload, time to create wfChanged = True wfMeta = JsonConfigHelper() wfMeta.set("id", WORKFLOW_ID) wfMeta.set("step", "pending") wfMeta.set("pageTitle", "Uploaded Files - Management") stages = self.config.getJsonList("stages") for stage in stages: if stage.get("name") == "pending": wfMeta.set("label", stage.get("label")) self.item_security = stage.getList("visibility") workflow_security = stage.getList("security") self.message_list = stage.getList("message")
class HomeData: def __init__(self): action = formData.get("verb") portalName = formData.get("value") sessionState.remove("fq") if action == "delete-portal": print " * home.py: delete portal %s" % portalName Services.portalManager.remove(portalName) self.__latest = JsonConfigHelper() self.__mine = JsonConfigHelper() self.__workflows = JsonConfigHelper() self.__result = JsonConfigHelper() self.__search() def __search(self): indexer = Services.getIndexer() portalQuery = Services.getPortalManager().get(portalId).getQuery() portalSearchQuery = Services.getPortalManager().get(portalId).getSearchQuery() # Security prep work current_user = page.authentication.get_username() security_roles = page.authentication.get_roles_list() security_query = 'security_filter:("' + '" OR "'.join(security_roles) + '")' owner_query = 'owner:"' + current_user + '"' req = SearchRequest("last_modified:[NOW-1MONTH TO *]") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__latest = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest(owner_query) req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__mine = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest('workflow_security:"' + current_user + '"') req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__workflows = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest("*:*") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.addParam("fq", "") req.setParam("rows", "0") if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) sessionState.set("fq", 'item_type:"object"') #sessionState.set("query", portalQuery.replace("\"", "'")) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) def getLatest(self): return self.__latest.getList("response/docs") def getMine(self): return self.__mine.getList("response/docs") def getWorkflows(self): return self.__workflows.getList("response/docs") def getItemCount(self): return self.__result.get("response/numFound")
class OrganiseData: def __init__(self): self.__portal = Services.portalManager.get(portalId) self.__result = JsonConfigHelper() self.__pageNum = sessionState.get("pageNum", 1) self.__selected = [] self.__storage = Services.storage uri = URLDecoder.decode(request.getAttribute("RequestURI")) basePath = portalId + "/" + pageName self.__oid = uri[len(basePath) + 1 :] slash = self.__oid.rfind("/") self.__pid = self.__oid[slash + 1 :] print "uri='%s' oid='%s' pid='%s'" % (uri, self.__oid, self.__pid) payload = None if self.__oid is not None and self.__oid != "": payload = self.__storage.getPayload(self.__oid, self.__pid) if payload is not None: self.__mimeType = payload.contentType else: self.__mimeType = "application/octet-stream" self.__metadata = JsonConfigHelper() print " * single.py: uri='%s' oid='%s' pid='%s' mimeType='%s'" % (uri, self.__oid, self.__pid, self.__mimeType) self.__search() def getManifestItem(self): hashId = md5.new(self.__oid).hexdigest() return self.getPortal().getMap("manifest//node-%s" % hashId) def getMimeType(self): return self.__mimeType def __search(self): req = SearchRequest('id:"%s"' % self.__oid) out = ByteArrayOutputStream() Services.indexer.search(req, out) self.__json = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) self.__metadata = SolrDoc(self.__json) def getManifest(self): return self.getPortal().getJsonMap("manifest") def getContent(self): content = "" return content def getPortal(self): return Services.portalManager.get(portalId) def getPortalName(self): return Services.portalManager.get(portalId).description def __search(self): recordsPerPage = self.__portal.recordsPerPage query = None if query is None or query == "": query = formData.get("query") if query is None or query == "": query = "*:*" req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", "1000") req.setParam("facet.field", self.__portal.facetFieldList) req.setParam("facet.sort", "true") req.setParam("facet.limit", str(self.__portal.facetCount)) req.setParam("sort", "f_dc_title asc") # setup facets action = formData.get("verb") value = formData.get("value") fq = sessionState.get("fq") if fq is not None: self.__pageNum = 1 req.setParam("fq", fq) if action == "add_fq": self.__pageNum = 1 name = formData.get("name") print " * add_fq: %s" % value req.addParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "remove_fq": self.__pageNum = 1 req.removeParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "clear_fq": self.__pageNum = 1 req.removeParam("fq") elif action == "select-page": self.__pageNum = int(value) req.addParam("fq", 'item_type:"object"') portalQuery = self.__portal.query print " * portalQuery=%s" % portalQuery if portalQuery: req.addParam("fq", portalQuery) self.__selected = req.getParams("fq") sessionState.set("fq", self.__selected) sessionState.set("pageNum", self.__pageNum) req.setParam("start", str((self.__pageNum - 1) * recordsPerPage)) print " * single.py:", req.toString(), self.__pageNum out = ByteArrayOutputStream() Services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) if self.__result is not None: self.__paging = Pagination( self.__pageNum, int(self.__result.get("response/numFound")), self.__portal.recordsPerPage ) print " * single.py: updating manifest..." portal = self.getPortal() manifest = portal.getJsonMap("manifest") # add new items from search for doc in self.__result.getList("response/docs"): hashId = md5.new(doc.get("id")).hexdigest() node = portal.get("manifest//node-%s" % hashId) if node is None: portal.set("manifest/node-%s/title" % hashId, doc.get("dc_title").get(0)) portal.set("manifest/node-%s/id" % hashId, doc.get("id")) # remove manifest items missing from search result # print manifest for key in manifest.keySet(): item = manifest.get(key) id = item.get("id") doc = self.__result.getList('response/docs[@id="%s"]' % id) if len(doc) == 0: portal.removePath("manifest//%s" % key) Services.getPortalManager().save(portal) def getQueryTime(self): return int(self.__result.get("responseHeader/QTime")) / 1000.0 def getPaging(self): return self.__paging def getResult(self): return self.__result def getFacetField(self, key): return self.__portal.facetFields.get(key) def getFacetName(self, key): return self.__portal.facetFields.get(key).get("label") def getFacetCounts(self, key): values = LinkedHashMap() valueList = self.__result.getList("facet_counts/facet_fields/%s" % key) for i in range(0, len(valueList), 2): name = valueList[i] count = valueList[i + 1] if count > 0: values.put(name, count) return values def hasSelectedFacets(self): return (self.__selected is not None and len(self.__selected) > 1) and not ( self.__portal.query in self.__selected and len(self.__selected) == 2 ) def getSelectedFacets(self): return self.__selected def isPortalQueryFacet(self, fq): return fq == self.__portal.query def isSelected(self, fq): return fq in self.__selected def getSelectedFacetIds(self): return [md5.new(fq).hexdigest() for fq in self.__selected] def getFileName(self, path): return os.path.split(path)[1] def getFacetQuery(self, name, value): return '%s:"%s"' % (name, value) def isImage(self, format): return format.startswith("image/") def getThumbnail(self, oid): ext = os.path.splitext(oid)[1] url = oid[oid.rfind("/") + 1 : -len(ext)] + ".thumb.jpg" if Services.getStorage().getPayload(oid, url): return url return None def getPayloadContent(self): mimeType = self.__mimeType print " * single.py: payload content mimeType=%s" % mimeType contentStr = "" if mimeType.startswith("text/"): if mimeType == "text/html": contentStr = '<iframe class="iframe-preview" src="%s/%s/download/%s"></iframe>' % ( contextPath, portalId, self.__oid, ) else: pid = self.__oid[self.__oid.rfind("/") + 1 :] payload = self.__storage.getPayload(self.__oid, pid) print " * single.py: pid=%s payload=%s" % (pid, payload) if payload is not None: sw = StringWriter() sw.write("<pre>") IOUtils.copy(payload.getInputStream(), sw) sw.write("</pre>") sw.flush() contentStr = sw.toString() elif ( mimeType == "application/pdf" or mimeType.find("vnd.ms") > -1 or mimeType.find("vnd.oasis.opendocument.") > -1 ): # get the html version if exist... pid = os.path.splitext(self.__pid)[0] + ".htm" print " * single.py: pid=%s" % pid # contentStr = '<iframe class="iframe-preview" src="%s/%s/download/%s/%s"></iframe>' % \ # (contextPath, portalId, self.__oid, pid) payload = self.__storage.getPayload(self.__oid, pid) saxReader = SAXReader(Boolean.parseBoolean("false")) try: document = saxReader.read(payload.getInputStream()) slideNode = document.selectSingleNode("//*[local-name()='body']") # linkNodes = slideNode.selectNodes("//img") # contentStr = slideNode.asXML(); # encode character entities correctly slideNode.setName("div") out = ByteArrayOutputStream() format = OutputFormat.createPrettyPrint() format.setSuppressDeclaration(True) format.setExpandEmptyElements(True) writer = XMLWriter(out, format) writer.write(slideNode) writer.close() contentStr = out.toString("UTF-8") except: traceback.print_exc() contentStr = '<p class="error">No preview available</p>' elif mimeType.startswith("image/"): src = "%s/%s" % (self.__oid, self.__pid) contentStr = ( '<a class="image" href="%(src)s" style="max-width:98%%">' '<img src="%(src)s" style="max-width:100%%" /></a>' % {"src": self.__pid} ) return contentStr def getOid(self): return self.__oid
class SearchData: def __init__(self): self.__result = JsonConfigHelper() self.__portal = Services.getPortalManager().get(portalId) pageNum = sessionState.get("pageNum") if pageNum is None: self.__pageNum = 1 else: self.__pageNum = int(pageNum) self.__search() def __search(self): recordsPerPage = self.__portal.recordsPerPage query = formData.get("query") if query is None or query == "": query = "*:*" req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", str(recordsPerPage)) req.setParam("facet.field", self.__portal.facetFieldList) req.setParam("facet.sort", "true") req.setParam("facet.limit", str(self.__portal.facetCount)) req.setParam("sort", "f_dc_title asc") # setup facets action = formData.get("action") value = formData.get("value") fq = sessionState.get("fq") if fq is not None: self.__pageNum = 1 req.setParam("fq", fq) if action == "add_fq": self.__pageNum = 1 name = formData.get("name") print " * add_fq: %s" % value req.addParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "remove_fq": self.__pageNum = 1 req.removeParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "clear_fq": self.__pageNum = 1 req.removeParam("fq") elif action == "select-page": self.__pageNum = int(value) req.addParam("fq", 'item_type:"object"') portalQuery = self.__portal.query print " * portalQuery=%s" % portalQuery if portalQuery: req.addParam("fq", portalQuery) self.__selected = req.getParams("fq") sessionState.set("fq", self.__selected) sessionState.set("pageNum", self.__pageNum) req.setParam("start", str((self.__pageNum - 1) * recordsPerPage)) print " * search.py:", req.toString(), self.__pageNum out = ByteArrayOutputStream() Services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) if self.__result is not None: self.__paging = Pagination(self.__pageNum, int(self.__result.get("response/numFound")), self.__portal.recordsPerPage) def getQueryTime(self): return int(self.__result.get("responseHeader/QTime")) / 1000.0; def getPaging(self): return self.__paging def getResult(self): return self.__result def getFacetName(self, key): return self.__portal.facetFields.get(key) def getFacetCounts(self, key): values = HashMap() valueList = self.__result.getList("facet_counts/facet_fields/%s" % key) for i in range(0,len(valueList),2): name = valueList[i] count = valueList[i+1] if count > 0: values.put(name, count) return values def hasSelectedFacets(self): return self.__selected is not None and self.__selected.size() > 1 def getSelectedFacets(self): return self.__selected def isPortalQueryFacet(self, fq): return fq == self.__portal.query def isSelected(self, fq): return fq in self.__selected def getSelectedFacetIds(self): return [md5.new(fq).hexdigest() for fq in self.__selected] def getFileName(self, path): return os.path.split(path)[1] def getFacetQuery(self, name, value): return '%s:"%s"' % (name, value) def isImage(self, format): return format.startswith("image/") def getThumbnail(self, oid): ext = os.path.splitext(oid)[1] url = oid[oid.rfind("/")+1:-len(ext)] + ".thumb" + ext return url
class HomeData: def __init__(self): action = formData.get("verb") portalName = formData.get("value") sessionState.remove("fq") if action == "delete-portal": print " * home.py: delete portal %s" % portalName Services.portalManager.remove(portalName) if action == "backup-portal": print "Backing up: ", portalName backupPath = "" email = "" portal = Services.portalManager.get(portalName) if portal: email = portal.email if portal.backupPaths: for key in portal.backupPaths: if portal.backupPaths[key]=="default": backupPath = key portalQuery = portal.getQuery() #print " ***** portalQuery: ", portalQuery #print " ***** backupPath: ", backupPath #print " ***** email: ", email #print " ***** description: ", description if backupPath is None: " ** Default backup path configured in system-config.json will be used " Services.portalManager.backup(email, backupPath, portalQuery) self.__latest = JsonConfigHelper() self.__result = JsonConfigHelper() self.__search() def __search(self): indexer = Services.getIndexer() portalQuery = Services.getPortalManager().get(portalId).getQuery() req = SearchRequest("last_modified:[NOW-1MONTH TO *]") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); out = ByteArrayOutputStream() indexer.search(req, out) self.__latest = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest("*:*") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) req.addParam("fq", "") req.setParam("rows", "0") out = ByteArrayOutputStream() indexer.search(req, out) sessionState.set("fq", 'item_type:"object"') #sessionState.set("query", portalQuery.replace("\"", "'")) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) def getLatest(self): return self.__latest.getList("response/docs") def getItemCount(self): return self.__result.get("response/numFound")
def getSuggestedNames(self): # search common forms lookupNames = [] surname = self.__metadata.getList("surname").get(0) firstName = self.__metadata.getList("firstName").get(0) firstInitial = firstName[0].upper() secondName = self.__metadata.getList("secondName") if not secondName.isEmpty(): secondName = secondName.get(0) if secondName and secondName != "": secondInitial = secondName[0].upper() lookupNames.append("%s, %s. %s." % (surname, firstInitial, secondInitial)) lookupNames.append("%s, %s %s." % (surname, firstName, secondInitial)) lookupNames.append("%s, %s %s" % (surname, firstName, secondName)) lookupNames.append("%s %s %s" % (firstName, secondName, surname)) lookupNames.append("%s, %s." % (surname, firstInitial)) lookupNames.append("%s, %s" % (surname, firstName)) lookupNames.append("%s %s" % (firstName, surname)) query = '" OR dc_title:"'.join(lookupNames) # general word search from each part of the name parts = [p for p in self.getPackageTitle().split(" ") if len(p) > 0] query2 = " OR dc_title:".join(parts) #filter out the linked citation linkedCitations = self.__manifest.getList("//children//id") query3 = "" if linkedCitations: query3 = " OR ".join(linkedCitations) query3 = " AND -id:(%s)" % query3 req = SearchRequest('(dc_title:"%s")^2.5 OR (dc_title:%s)^0.5%s' % (query, query2, query3)) self.log.info("suggestedNames query={}", req.query) req.setParam("fq", 'recordtype:"author"') req.addParam("fq", 'item_type:"object"') req.setParam("rows", "9999") req.setParam("fl", "score") req.setParam("sort", "score desc") # Make sure 'fq' has already been set in the session ##security_roles = self.authentication.get_roles_list(); ##security_query = 'security_filter:("' + '" OR "'.join(security_roles) + '")' ##req.addParam("fq", security_query) out = ByteArrayOutputStream() self.__indexer.search(req, out) result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) #self.log.info("result={}", result.toString()) docs = result.getJsonList("response/docs") exactMatchRecords = LinkedHashMap() map = LinkedHashMap() idList = [] for doc in docs: authorName = doc.getList("dc_title").get(0) rank = self.getRank(doc.getList("score").get(0)) id = doc.get("id") idList.append(id) #try to do automatch if float(rank) == 100.00 and self.isModified() == "false": if exactMatchRecords.containsKey(authorName): authorMatchDocs = exactMatchRecords.get(authorName) else: authorMatchDocs = ArrayList() exactMatchRecords.put(authorName, authorMatchDocs) authorMatchDocs.add(doc) elif id not in linkedCitations: if map.containsKey(authorName): authorDocs = map.get(authorName) else: authorDocs = ArrayList() map.put(authorName, authorDocs) authorDocs.add(doc) self.__maxScore = max(1.0, float(result.get("response/maxScore"))) if idList: self.__isLinked(idList, map) # Do not auto save if record is live if self.__workflowMetadata.get("modified") == "false": self.__autoSaveExactRecord(exactMatchRecords) return map
class HomeData: def __init__(self): action = formData.get("verb") portalName = formData.get("value") sessionState.remove("fq") if action == "delete-portal": print " * home.py: delete portal %s" % portalName Services.portalManager.remove(portalName) if action == "backup-portal": print "Backing up: ", portalName backupPath = "" email = "" portal = Services.portalManager.get(portalName) if portal: email = portal.email if portal.backupPaths: for key in portal.backupPaths: if portal.backupPaths[key]=="default": backupPath = key portalQuery = portal.getQuery() #print " ***** portalQuery: ", portalQuery #print " ***** backupPath: ", backupPath #print " ***** email: ", email #print " ***** description: ", description if backupPath is None: " ** Default backup path configured in system-config.json will be used " Services.portalManager.backup(email, backupPath, portalQuery) self.__latest = JsonConfigHelper() self.__mine = JsonConfigHelper() self.__workflows = JsonConfigHelper() self.__result = JsonConfigHelper() self.__search() def __search(self): indexer = Services.getIndexer() portalQuery = Services.getPortalManager().get(portalId).getQuery() portalSearchQuery = Services.getPortalManager().get(portalId).getSearchQuery() # Security prep work current_user = page.authentication.get_username() security_roles = page.authentication.get_roles_list() security_query = 'security_filter:("' + '" OR "'.join(security_roles) + '")' owner_query = 'owner:"' + current_user + '"' req = SearchRequest("last_modified:[NOW-1MONTH TO *]") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__latest = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest(owner_query) req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__mine = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest('workflow_security:"' + current_user + '"') req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc"); if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) self.__workflows = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest("*:*") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.addParam("fq", "") req.setParam("rows", "0") if not page.authentication.is_admin(): req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") out = ByteArrayOutputStream() indexer.search(req, out) sessionState.set("fq", 'item_type:"object"') #sessionState.set("query", portalQuery.replace("\"", "'")) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) def getLatest(self): return self.__latest.getList("response/docs") def getMine(self): return self.__mine.getList("response/docs") def getWorkflows(self): return self.__workflows.getList("response/docs") def getItemCount(self): return self.__result.get("response/numFound")
def getMetadata(self, plugin, field): metadata = plugin.pluginDetails.metadata if metadata: json = JsonConfigHelper(plugin.pluginDetails.metadata) return json.get(field) return None
class DetailData: def __init__(self): self.userAgreement = AgreementData(bindings) def __activate__(self, context): self.velocityContext = context self.services = context["Services"] self.request = context["request"] self.response = context["response"] self.contextPath = context["contextPath"] self.formData = context["formData"] self.page = context["page"] self.uaActivated = False useDownload = Boolean.parseBoolean(self.formData.get("download", "true")) self.__isPreview = Boolean.parseBoolean(self.formData.get("preview", "false")) self.__previewPid = None self.__hasPid = False uri = URLDecoder.decode(self.request.getAttribute("RequestURI")) matches = re.match("^(.*?)/(.*?)/(?:(.*?)/)?(.*)$", uri) if matches and matches.group(3): oid = matches.group(3) pid = matches.group(4) self.__metadata = JsonConfigHelper() self.__object = self.__getObject(oid) self.__oid = oid # If we have a PID if pid: self.__hasPid = True if useDownload: # Download the payload to support relative links download = DownloadData() download.__activate__(context) else: # Render the detail screen with the alternative preview self.__readMetadata(oid) self.__previewPid = pid # Otherwise, render the detail screen else: self.__readMetadata(oid) self.__previewPid = self.getPreview() if self.__previewPid: self.__previewPid = URLEncoder.encode(self.__previewPid, "UTF-8") else: # require trailing slash for relative paths q = "" if self.__isPreview: q = "?preview=true" self.response.sendRedirect("%s/%s/%s" % (self.contextPath, uri, q)) def getAllowedRoles(self): metadata = self.getMetadata() if metadata is not None: return metadata.getList("security_filter") else: return [] def getAllPreviews(self): list = self.getAltPreviews() preview = self.getPreview() if not list.contains(preview): list.add(preview) return list def getAltPreviews(self): return self.__metadata.getList("altpreview") def getFileName(self): return self.getObject().getSourceId() def getFileNameSplit(self, index): return os.path.splitext(self.getFileName())[index] def getFriendlyName(self, name): if name.startswith("dc_"): name = name[3:] if name.startswith("meta_"): name = name[5:] return name.replace("_", " ").capitalize() def getMetadata(self): return self.__metadata def getMetadataMap(self): return self.__metadataMap def getObject(self): return self.__object def getOid(self): return self.__oid def getPreview(self): return self.__metadata.get("preview") def getPreviewPid(self): return self.__previewPid def getProperty(self, field): return self.getObject().getMetadata().getProperty(field) def getUserAgreement(self): if not self.uaActivated: self.userAgreement.__activate__(self.velocityContext, self.getMetadata()) self.uaActivated = True return self.userAgreement def hasLocalFile(self): # get original file.path from object properties filePath = self.getProperty("file.path") return filePath and os.path.exists(filePath) def hasPid(self): return self.__hasPid def isAccessDenied(self): myRoles = self.page.authentication.get_roles_list() allowedRoles = self.getAllowedRoles() for role in myRoles: if role in allowedRoles: return False return True def isDetail(self): return not (self.request.isXHR() or self.__isPreview) def isIndexed(self): return self.__getNumFound() == 1 def isPending(self): meta = self.getObject().getMetadata() status = meta.get("render-pending") return Boolean.parseBoolean(status) def setStatus(self, status): self.response.setStatus(status) def __getNumFound(self): return int(self.__solrData.get("response/numFound")) def __getObject(self, oid): obj = None try: storage = self.services.getStorage() try: obj = storage.getObject(oid) except StorageException: sid = self.__getStorageId(oid) if sid is not None: obj = storage.getObject(sid) print "Object not found: oid='%s', trying sid='%s'" % (oid, sid) except StorageException: print "Object not found: oid='%s'" % oid return obj def __getStorageId(self, oid): return self.__metadata.get("storage_id") def __loadSolrData(self, oid): portal = self.page.getPortal() query = 'id:"%s"' % oid if self.isDetail() and portal.getSearchQuery(): query += " AND " + portal.getSearchQuery() req = SearchRequest(query) req.addParam("fq", 'item_type:"object"') if self.isDetail(): req.addParam("fq", portal.getQuery()) out = ByteArrayOutputStream() self.services.getIndexer().search(req, out) self.__solrData = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) def __readMetadata(self, oid): self.__loadSolrData(oid) if self.isIndexed(): self.__metadata = self.__solrData.getJsonList("response/docs").get(0) if self.__object is None: # Try again, indexed records might have a special storage_id self.__object = self.__getObject(oid) # Just a more usable instance of metadata self.__json = JsonConfigHelper(self.__solrData.getList("response/docs").get(0)) self.__metadataMap = TreeMap(self.__json.getMap("/")) else: self.__metadata.set("id", oid)
class ManifestActions: def __init__(self): print "formData=%s" % formData result = "{}" func = formData.get("func") oid = formData.get("oid") if func != "set-package-title": nodeId = formData.get("nodeId") nodePath = self.__getNodePath(formData.get("parents"), nodeId) originalPath = "manifest//%s" % nodeId self.__object = Services.getStorage().getObject(oid) sourceId = self.__object.getSourceId() payload = self.__object.getPayload(sourceId) self.__manifest = JsonConfigHelper(payload.open()) payload.close() if func == "set-package-title": title = formData.get("title") self.__manifest.set("title", StringEscapeUtils.escapeHtml(title)) self.__saveManifest() if func == "rename": title = formData.get("title") self.__manifest.set("%s/title" % nodePath, title) self.__saveManifest() elif func == "move": refNodeId = formData.get("refNodeId") refNodePath = self.__getNodePath(formData.get("refParents"), formData.get("refNodeId")); moveType = formData.get("type") if moveType == "before": self.__manifest.moveBefore(originalPath, refNodePath) elif moveType == "after": self.__manifest.moveAfter(originalPath, refNodePath) elif moveType == "inside": self.__manifest.move(originalPath, nodePath) self.__saveManifest() elif func == "update": title = StringEscapeUtils.escapeHtml(formData.get("title")) hidden = formData.get("hidden") hidden = hidden == "true" self.__manifest.set("%s/title" % nodePath, title) self.__manifest.set("%s/hidden" % nodePath, str(hidden)) #if self.__manifest.get("%s/id" % nodePath) is None: # print "blank node!" self.__saveManifest() result = '{ title: "%s", hidden: "%s" }' % (title, hidden) elif func == "delete": title = self.__manifest.get("%s/title" % nodePath) if title: self.__manifest.removePath(nodePath) self.__saveManifest() else: title = "Untitled" result = '{ title: "%s" }' % title self.__object.close() writer = response.getPrintWriter("text/plain; charset=UTF-8") writer.println(result) writer.close() def __getNodePath(self, parents, nodeId): parents = [p for p in parents.split(",") if p != ""] nodePath = "manifest/%s" % nodeId if len(parents) > 0: nodePath = "" for parent in parents: if nodePath == "": nodePath = "manifest/%s" % parent else: nodePath += "/children/%s" % parent nodePath += "/children/%s" % nodeId return nodePath def __saveManifest(self): manifestStr = String(self.__manifest.toString()) self.__object.updatePayload(self.__object.getSourceId(), ByteArrayInputStream(manifestStr.getBytes("UTF-8")))
class HomeData: def __init__(self): pass def __activate__(self, context): self.velocityContext = context action = self.vc("formData").get("verb") portalName = self.vc("formData").get("value") self.vc("sessionState").remove("fq") if action == "delete-portal": print " * home.py: delete portal %s" % portalName Services.portalManager.remove(portalName) self.__latest = JsonConfigHelper() self.__mine = JsonConfigHelper() self.__workflows = JsonConfigHelper() self.__result = JsonConfigHelper() self.__search() # Get from velocity context def vc(self, index): if self.velocityContext[index] is not None: return self.velocityContext[index] else: print "ERROR: Requested context entry '" + index + "' doesn't exist" return None def __search(self): indexer = Services.getIndexer() portalQuery = Services.getPortalManager().get(self.vc("portalId")).getQuery() portalSearchQuery = Services.getPortalManager().get(self.vc("portalId")).getSearchQuery() # Security prep work current_user = self.vc("page").authentication.get_username() security_roles = self.vc("page").authentication.get_roles_list() security_filter = 'security_filter:("' + '" OR "'.join(security_roles) + '")' security_exceptions = 'security_exception:"' + current_user + '"' owner_query = 'owner:"' + current_user + '"' security_query = "(" + security_filter + ") OR (" + security_exceptions + ") OR (" + owner_query + ")" isAdmin = self.vc("page").authentication.is_admin() req = SearchRequest("last_modified:[NOW-1MONTH TO *]") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc") if not isAdmin: req.addParam("fq", security_query) out = ByteArrayOutputStream() indexer.search(req, out) self.__latest = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest(owner_query) req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc") if not isAdmin: req.addParam("fq", security_query) out = ByteArrayOutputStream() indexer.search(req, out) self.__mine = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest('workflow_security:"' + current_user + '"') req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.setParam("rows", "10") req.setParam("sort", "last_modified desc, f_dc_title asc") if not isAdmin: req.addParam("fq", security_query) out = ByteArrayOutputStream() indexer.search(req, out) self.__workflows = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) req = SearchRequest("*:*") req.setParam("fq", 'item_type:"object"') if portalQuery: req.addParam("fq", portalQuery) if portalSearchQuery: req.addParam("fq", portalSearchQuery) req.addParam("fq", "") req.setParam("rows", "0") if not isAdmin: req.addParam("fq", security_query) out = ByteArrayOutputStream() indexer.search(req, out) self.vc("sessionState").set("fq", 'item_type:"object"') # sessionState.set("query", portalQuery.replace("\"", "'")) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) def getLatest(self): return self.__latest.getList("response/docs") def getMine(self): return self.__mine.getList("response/docs") def getWorkflows(self): return self.__workflows.getList("response/docs") def getItemCount(self): return self.__result.get("response/numFound")
class SearchData: def __init__(self): self.__portal = Services.portalManager.get(portalId) self.__result = JsonConfigHelper() self.__pageNum = sessionState.get("pageNum", 1) self.__selected = [] self.__search() def getPortalName(self): return self.__portal.getDescription() def encode(self, url): return URLEncoder.encode(url, "UTF-8") def __search(self): recordsPerPage = self.__portal.recordsPerPage uri = URLDecoder.decode(request.getAttribute("RequestURI")) query = None pagePath = portalId + "/" + pageName if uri != pagePath: query = uri[len(pagePath)+1:] if query is None or query == "": query = formData.get("query") if query is None or query == "": query = "*:*" if query == "*:*": self.__query = "" else: self.__query = query sessionState.set("query", self.__query) # find objects with annotations matching the query if query != "*:*": anotarQuery = self.__query annoReq = SearchRequest(anotarQuery) annoReq.setParam("facet", "false") annoReq.setParam("rows", str(99999)) annoReq.setParam("sort", "dateCreated asc") annoReq.setParam("start", str(0)) anotarOut = ByteArrayOutputStream() Services.indexer.annotateSearch(annoReq, anotarOut) resultForAnotar = JsonConfigHelper(ByteArrayInputStream(anotarOut.toByteArray())) resultForAnotar = resultForAnotar.getJsonList("response/docs") ids = HashSet() for annoDoc in resultForAnotar: annotatesUri = annoDoc.get("annotatesUri") ids.add(annotatesUri) print "Found annotation for %s" % annotatesUri # add annotation ids to query query += ' OR id:("' + '" OR "'.join(ids) + '")' portalSearchQuery = self.__portal.searchQuery if portalSearchQuery == "": portalSearchQuery = query else: if query != "*:*": query += " AND " + portalSearchQuery else: query = portalSearchQuery req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", str(recordsPerPage)) req.setParam("facet.field", self.__portal.facetFieldList) req.setParam("facet.sort", "true") req.setParam("facet.limit", str(self.__portal.facetCount)) req.setParam("sort", "f_dc_title asc") # setup facets action = formData.get("verb") value = formData.get("value") fq = sessionState.get("fq") if fq is not None: self.__pageNum = 1 req.setParam("fq", fq) if action == "add_fq": self.__pageNum = 1 name = formData.get("name") print " * add_fq: %s" % value req.addParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "remove_fq": self.__pageNum = 1 req.removeParam("fq", URLDecoder.decode(value, "UTF-8")) elif action == "clear_fq": self.__pageNum = 1 req.removeParam("fq") elif action == "select-page": self.__pageNum = int(value) req.addParam("fq", 'item_type:"object"') portalQuery = self.__portal.query print " * portalQuery=%s" % portalQuery if portalQuery: req.addParam("fq", portalQuery) self.__selected = list(req.getParams("fq")) sessionState.set("fq", self.__selected) sessionState.set("searchQuery", portalSearchQuery) sessionState.set("pageNum", self.__pageNum) # Make sure 'fq' has already been set in the session if not page.authentication.is_admin(): security_roles = page.authentication.get_roles_list() security_query = 'security_filter:("' + '" OR "'.join(security_roles) + '")' current_user = page.authentication.get_username() owner_query = 'owner:"' + current_user + '"' req.addParam("fq", "(" + security_query + ") OR (" + owner_query + ")") req.setParam("start", str((self.__pageNum - 1) * recordsPerPage)) print " * search.py:", req.toString(), self.__pageNum out = ByteArrayOutputStream() Services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) if self.__result is not None: self.__paging = Pagination(self.__pageNum, int(self.__result.get("response/numFound")), self.__portal.recordsPerPage) def canManage(self, wfSecurity): user_roles = page.authentication.get_roles_list() for role in user_roles: if role in wfSecurity: return True return False def getQueryTime(self): return int(self.__result.get("responseHeader/QTime")) / 1000.0; def getPaging(self): return self.__paging def getResult(self): return self.__result def getFacetField(self, key): return self.__portal.facetFields.get(key) def getFacetName(self, key): return self.__portal.facetFields.get(key).get("label") def getFacetCounts(self, key): values = LinkedHashMap() valueList = self.__result.getList("facet_counts/facet_fields/%s" % key) for i in range(0,len(valueList),2): name = valueList[i] count = valueList[i+1] if count > 0: values.put(name, count) return values def hasSelectedFacets(self): return (self.__selected is not None and len(self.__selected) > 1) and \ not (self.__portal.query in self.__selected and len(self.__selected) == 2) def getSelectedFacets(self): return self.__selected def isPortalQueryFacet(self, fq): return fq == self.__portal.query def isSelected(self, fq): return fq in self.__selected def getSelectedFacetIds(self): return [md5.new(fq).hexdigest() for fq in self.__selected] def getFileName(self, path): return os.path.splitext(os.path.basename(path))[0] def getFacetQuery(self, name, value): return '%s:"%s"' % (name, value) def isImage(self, format): return format.startswith("image/") def getMimeTypeIcon(self, format): # check for specific icon iconPath = "images/icons/mimetype/%s/icon.png" % format resource = Services.getPageService().resourceExists(portalId, iconPath) if resource is not None: return iconPath elif format.find("/") != -1: # check for major type return self.getMimeTypeIcon(format[:format.find("/")]) # use default icon return "images/icons/mimetype/icon.png" def getActiveManifestTitle(self): return self.__getActiveManifest().get("title") def getActiveManifestId(self): return sessionState.get("package/active/id") def getSelectedItemsCount(self): return self.__getActiveManifest().getList("manifest//id").size() def isSelectedForPackage(self, oid): return self.__getActiveManifest().get("manifest//node-%s" % oid) is not None def getManifestItemTitle(self, oid, defaultValue): return self.__getActiveManifest().get("manifest//node-%s/title" % oid, defaultValue) def __getActiveManifest(self): activeManifest = sessionState.get("package/active") if not activeManifest: activeManifest = JsonConfigHelper() activeManifest.set("title", "New package") activeManifest.set("viewId", portalId) sessionState.set("package/active", activeManifest) return activeManifest
class ManifestData: def __init__(self): pass def __activate__(self, context): self.velocityContext = context auth = context["page"].authentication if auth.is_logged_in(): self.fd = self.vc("formData").get print "formData=%s" % self.vc("formData") result = "{}" func = self.fd("func") oid = self.fd("oid") if func != "update-package-meta": nodeId = self.fd("nodeId") nodePath = self.__getNodePath(self.fd("parents"), nodeId) originalPath = "manifest//%s" % nodeId self.__object = Services.getStorage().getObject(oid) sourceId = self.__object.getSourceId() payload = self.__object.getPayload(sourceId) self.__manifest = JsonConfigHelper(payload.open()) payload.close() if func == "update-package-meta": print "********* update-package-meta ***************" metaList = list(self.vc("formData").getValues("metaList")) for metaName in metaList: value = self.fd(metaName) self.__manifest.set(metaName, value) #title = formData.get("title") #self.__manifest.set("title", StringEscapeUtils.escapeHtml(title)) self.__saveManifest() if func == "rename": title = self.fd("title") self.__manifest.set("%s/title" % nodePath, title) self.__saveManifest() elif func == "move": refNodeId = self.fd("refNodeId") refNodePath = self.__getNodePath(self.fd("refParents"), self.fd("refNodeId")); moveType = self.fd("type") if moveType == "before": self.__manifest.moveBefore(originalPath, refNodePath) elif moveType == "after": self.__manifest.moveAfter(originalPath, refNodePath) elif moveType == "inside": self.__manifest.move(originalPath, nodePath) self.__saveManifest() elif func == "update": title = StringEscapeUtils.escapeHtml(self.fd("title")) hidden = self.fd("hidden") hidden = hidden == "true" self.__manifest.set("%s/title" % nodePath, title) self.__manifest.set("%s/hidden" % nodePath, str(hidden)) #if self.__manifest.get("%s/id" % nodePath) is None: # print "blank node!" self.__saveManifest() result = '{ title: "%s", hidden: "%s" }' % (title, hidden) elif func == "delete": title = self.__manifest.get("%s/title" % nodePath) if title: self.__manifest.removePath(nodePath) self.__saveManifest() else: title = "Untitled" result = '{ title: "%s" }' % title self.__object.close() else: result = '{ "status": "error", "message": "Only registered users can access this API" }' writer = self.vc("response").getPrintWriter("text/plain; charset=UTF-8") writer.println(result) writer.close() # Get from velocity context def vc(self, index): if self.velocityContext[index] is not None: return self.velocityContext[index] else: log.error("ERROR: Requested context entry '" + index + "' doesn't exist") return None def __getNodePath(self, parents, nodeId): parents = [p for p in parents.split(",") if p != ""] nodePath = "manifest/%s" % nodeId if len(parents) > 0: nodePath = "" for parent in parents: if nodePath == "": nodePath = "manifest/%s" % parent else: nodePath += "/children/%s" % parent nodePath += "/children/%s" % nodeId return nodePath def __saveManifest(self): manifestStr = String(self.__manifest.toString()) self.__object.updatePayload(self.__object.getSourceId(), ByteArrayInputStream(manifestStr.getBytes("UTF-8")))
rules.add(AddField("meta_audio_details", channels)) except StorageException, e: #print "Failed to index FFmpeg metadata (%s)" % str(e) pass # Workflow data WORKFLOW_ID = "workflow1" wfChanged = False customFields = {} try: wfPayload = object.getPayload("workflow.metadata") wfMeta = JsonConfigHelper(wfPayload.open()) wfPayload.close() # Are we indexing because of a workflow progression? targetStep = wfMeta.get("targetStep") if targetStep is not None and targetStep != wfMeta.get("step"): wfChanged = True # Step change wfMeta.set("step", targetStep) wfMeta.removePath("targetStep") # This must be a re-index then else: targetStep = wfMeta.get("step") # Security change stages = jsonConfig.getJsonList("stages") for stage in stages: if stage.get("name") == targetStep: item_security = stage.getList("visibility")
class OaiData: def __init__(self): pass def __activate__(self, context): self.velocityContext = context self.services = context["Services"] self.log = context["log"] self.sessionState = context["sessionState"] self.portalDir = context["portalDir"] self.__result = None self.__token = None self.__portalName = context["page"].getPortal().getName() self.__enabledInAllViews = False self.__enabledInViews = [] self.__metadataPrefix = "" self.__sessionExpiry = Long.parseLong(JsonConfig().get("portal/oai-pmh/sessionExpiry")) self.__resumptionTokenList = self.sessionState.get("resumptionTokenList") if self.__resumptionTokenList == None: self.__resumptionTokenList = {} #Check if there's resumption token exist in the formData self.__currentToken = None resumptionToken = self.vc("formData").get("resumptionToken") if resumptionToken: if self.__resumptionTokenList.has_key(resumptionToken): self.__currentToken = self.__resumptionTokenList[resumptionToken] print " * oai.py: formData=%s" % self.vc("formData") self.vc("request").setAttribute("Content-Type", "text/xml") self.__request = OaiPmhVerb(self.vc("formData"), self.__currentToken, self.sessionState) if self.getError() is None and \ self.getVerb() in ["GetRecord", "ListIdentifiers", "ListRecords"]: ## Only list those data if the metadata format is enabled self.__metadataPrefix = self.vc("formData").get("metadataPrefix") if self.__metadataPrefix is None: self.__metadataPrefix = self.__currentToken.getMetadataPrefix() self.__enabledInAllViews = Boolean.parseBoolean(JsonConfig().get("portal/oai-pmh/metadataFormats/%s/enabledInAllViews" % self.__metadataPrefix, "false")) if self.__enabledInAllViews: self.__search() else: self.__enabledInViews = JsonConfig().getList("portal/oai-pmh/metadataFormats/%s/enabledViews" % self.__metadataPrefix) if self.__portalName in self.__enabledInViews: self.__search() # Get from velocity context def vc(self, index): if self.velocityContext[index] is not None: return self.velocityContext[index] else: self.log.error("ERROR: Requested context entry '" + index + "' doesn't exist") return None def getVerb(self): return self.getRequest().getVerb() def getError(self): return self.getRequest().getError() def getResponseDate(self): return time.strftime("%Y-%m-%dT%H:%M:%SZ") def getRequest(self): return self.__request def getResult(self): return self.__result def getElement(self, elementName, values): elementStr = "" if values: for value in values: elementStr += "<%s>%s</%s>" % (elementName, value, elementName) return elementStr def __search(self): self.__result = JsonConfigHelper() portal = self.services.getPortalManager().get(self.vc("portalId")) recordsPerPage = portal.recordsPerPage query = self.vc("formData").get("query") if query is None or query == "": query = "*:*" req = SearchRequest(query) req.setParam("facet", "true") req.setParam("rows", str(recordsPerPage)) req.setParam("facet.field", portal.facetFieldList) req.setParam("facet.limit", str(portal.facetCount)) req.setParam("sort", "f_dc_title asc") portalQuery = portal.query print " * portalQuery=%s" % portalQuery if portalQuery: req.addParam("fq", portalQuery) #Check if there's resumption token exist in the formData if self.__currentToken: start = self.__currentToken.getStart() totalFound = self.__currentToken.getTotalFound() nextTokenStart = start+recordsPerPage if nextTokenStart < totalFound: self.__token = ResumptionToken(start=nextTokenStart, metadataPrefix=self.__metadataPrefix, sessionExpiry=self.__sessionExpiry) else: start = 0 metadataPrefix = self.vc("formData").get("metadataPrefix") self.__token = ResumptionToken(start=recordsPerPage, metadataPrefix=self.__metadataPrefix, sessionExpiry=self.__sessionExpiry) req.setParam("start", str(start)) print " * oai.py:", req.toString() out = ByteArrayOutputStream() self.services.indexer.search(req, out) self.__result = JsonConfigHelper(ByteArrayInputStream(out.toByteArray())) totalFound = int(self.__result.get("response/numFound")) if totalFound == 0: self.__token = None elif self.__token: if self.__token.getStart() < totalFound: self.__token.setTotalFound(totalFound) else: self.__token = None #Storing the resumptionToken to session if self.__token: self.__resumptionTokenList[self.__token.getToken()] = self.__token #(totalFound, self.__token.getConstructedToken()) #Need to know how long the server need to store this token self.sessionState.set("resumptionTokenList", self.__resumptionTokenList) def getToken(self): if self.__enabledInAllViews or self.__portalName in self.__enabledInViews: return self.__token return None def getMetadataFormats(self): conf = JsonConfig() formats = conf.getMap("portal/oai-pmh/metadataFormats") return formats def encodeXml(self, string): return StringEscapeUtils.escapeXml(string);