def filterLatestVersion(self, brains, noOfItems=6): """ Take a list of catalog brains and return only the first noOfItems which are either latest versions or not versioned. """ cat = getToolByName(self.context, 'portal_catalog') res = [] res_urls_set = set() for brain in brains: # if object implements our versioning if 'eea.versions.interfaces.IVersionEnhanced' in brain.object_provides: obj = brain.getObject() versionsObj = IGetVersions(obj) brain_url = brain.getURL() try: is_latest = versionsObj.isLatest() except Exception: logger.warning("Couldn't check if object at %s is latest obj", brain_url) continue if is_latest: # keep it, this is latest object, first checking if the current # brain url is not already added within our results url set if brain_url not in res_urls_set: res_urls_set.add(brain_url) res.append(brain) else: # attempt to retrieve the latest versions of the given brain # if this brains doesn't contain the latest version of the # object latest = versionsObj.latest_version() uid = latest.UID() results = cat.searchResults(UID=uid) if not results: logger.warning("Couldn't find catalog entry for UID %s", uid) else: brain = cat.searchResults(UID=uid)[0] brain_url = brain.getURL() if brain_url not in res_urls_set: res_urls_set.add(brain_url) res.append(brain) else: #this object is not versioned, so keep it brain_url = brain.getURL() if brain_url not in res_urls_set: res_urls_set.add(brain_url) res.append(brain) if len(res) == noOfItems: break #we got enough items # because of performance optimization ticket and #14008 # resort based on effective date since getting the latest version could # mess up the sorting that came from the catalog search res.sort(key=lambda x: x.effective) res.reverse() return res
def get_datasets(self): """ Return datasets sorted by legislation """ view = self.context.restrictedTraverse('all-datasets/daviz.json')() values = json.loads(view) datasets = values['items'] results = {} legislation_titles = {} for data in datasets: legislation_label = data['instrument_label'] legislation_url = data['instrument'] legislation_title = data['instrument_title'] key = (legislation_label, legislation_url, legislation_title) if key not in results: results[key] = [] legislation_titles[legislation_label] = [] # get dataset latest version only data_url = data['dataset'] data_url_short = str(data_url.split('http://www.eea.europa.eu/')[1]) data_obj = self.context.unrestrictedTraverse(data_url_short, None) if data_obj: api = IGetVersions(data_obj) latest_version = api.latest_version() latest_version_url = latest_version.absolute_url() data_url = latest_version_url data['dataset'] = latest_version_url date = latest_version.getEffectiveDate() or latest_version.creation_date if not date: field = latest_version.getField('lastUpload') if field: date = field.getAccessor(latest_version)() data['publishing_date'] = date else: continue # avoid dataset duplicated since query returns same datasets with # several rod objects if not data_url in legislation_titles[legislation_label]: results[key].append(data) legislation_titles[legislation_label].append(data_url) return results
def __call__(self, count=5, ver_num=3): res = [] cat = getToolByName(self.context, 'portal_catalog') brains = cat.searchResults({'portal_type': ['EEAFigure'], 'sort_on': 'modified', 'sort_order': 'reverse', 'review_state': 'published'}) for brain in brains: figure = brain.getObject() api = IGetVersions(figure) versions = api.versions() versions_num = len(versions) if versions_num > ver_num: latest_version = api.latest_version() if not latest_version in res: res.append(latest_version) if len(res) == count: break return res
def addOrUpdateQuery(self, title, endpoint, query): """Update an already existing query Create new version""" oldSecurityManager = getSecurityManager() newSecurityManager(None, SpecialUsers.system) ob = None changed = True for sparql in self.values(): if sparql.title == title: x1 = IGetVersions(sparql) latest_sparql = x1.latest_version() ob = latest_sparql if latest_sparql.query_with_comments == query: changed = False break if not ob: _id = generateUniqueId("Sparql") _id = self.invokeFactory(type_name="Sparql", id=_id) ob = self[_id] ob.edit( title = title, endpoint_url = endpoint, sparql_query = query, ) ob._renameAfterCreation(check_auto_id=True) ob.invalidateWorkingResult() else: if changed: ob = versions.create_version(ob) ob.edit( sparql_query = query, ) ob.invalidateWorkingResult() setSecurityManager(oldSecurityManager) return ob
def addOrUpdateQuery(self, title, endpoint, query): """Update an already existing query Create new version""" oldSecurityManager = getSecurityManager() newSecurityManager(None, SpecialUsers.system) ob = None changed = True for sparql in self.values(): if sparql.title == title: x1 = IGetVersions(sparql) latest_sparql = x1.latest_version() ob = latest_sparql if latest_sparql.query_with_comments == query: changed = False break if not ob: _id = generateUniqueId("Sparql") _id = self.invokeFactory(type_name="Sparql", id=_id) ob = self[_id] ob.edit( title=title, endpoint_url=endpoint, sparql_query=query, ) ob._renameAfterCreation(check_auto_id=True) ob.invalidateWorkingResult() else: if changed: ob = versions.create_version(ob) ob.edit(sparql_query=query, ) ob.invalidateWorkingResult() setSecurityManager(oldSecurityManager) return ob