def _resolve(self, elements: [int], query: SearchQuery) -> Iterable: """Resolve oids from `elements`, convert to list if `query.resolve`.""" objectmap = find_objectmap(self) elements = (objectmap.object_for(e) for e in elements) if query.resolve: elements = [x for x in elements] return elements
def velruse_login_complete_view(self): context = self.context request = self.request profile = context.profile account = profile['accounts'][0] domain = account['domain'] username = account['username'] userid = account['userid'] sd_userid = f'{domain}_{userid}' root = root_factory(request) adapter = request.registry.queryMultiAdapter( (root, request), IUserLocator) if adapter is None: adapter = DefaultUserLocator(root, request) user = adapter.get_user_by_login(sd_userid) headers = [] if user is None: photos = profile.get('photos') if photos: photo_url = photos[0]['value'] request.session['photo_url'] = photo_url request.session['userid'] = sd_userid realname = profile['displayName'] request.session['profilename'] = username request.session['realname'] = realname location = request.resource_url(root, 'create_profile') else: objectmap = find_objectmap(root) performer = list(objectmap.sources(user, PerformerToUser))[0] location = request.resource_url(performer) headers = remember(request, get_oid(user)) return HTTPFound(location, headers=headers)
def change_bplan_officeworker_email_representation(root, registry): """Change bplan officeworker email representation.""" from substanced.util import find_objectmap from adhocracy_core.utils import find_graph from adhocracy_meinberlin.resources.bplan import IProcess from adhocracy_meinberlin.sheets.bplan import IProcessSettings from adhocracy_meinberlin.sheets.bplan import IProcessPrivateSettings from adhocracy_meinberlin.sheets.bplan import OfficeWorkerUserReference migrate_new_sheet(root, IProcess, IProcessPrivateSettings) catalogs = find_service(root, 'catalogs') bplaene = _search_for_interfaces(catalogs, IProcess) objectmap = find_objectmap(root) graph = find_graph(root) for bplan in bplaene: process_settings_ref = graph.get_references_for_isheet( bplan, IProcessSettings) if 'office_worker' in process_settings_ref: office_worker = process_settings_ref['office_worker'][0] private_settings = registry.content.get_sheet( bplan, IProcessPrivateSettings) private_settings.set({'office_worker_email': office_worker.email}) objectmap.disconnect(bplan, office_worker, OfficeWorkerUserReference)
def get_folder_content(folder, user, add_query=None, **args): _filters = deepcopy(getattr(folder, 'filters', [])) objects = [] if _filters: query = None if add_query: query = QUERY_OPERATORS['and'](query, add_query) objects = find_entities( user=user, add_query=query, filters=_filters, filter_op='or', **args) oids = [get_oid(c) for c in folder.contents if can_access(user, c)] if args: contents = find_entities( user=user, intersect=oids, **args) oids = contents.ids if not isinstance(contents, list) else contents if isinstance(objects, list): objectmap = find_objectmap(folder) objects = ResultSet(oids, len(oids), objectmap.object_for) else: # ResultSet objects.ids = list(objects.ids) objects.ids.extend(oids) objects.numids += len(oids) return objects
def borrow_lock( self, resource, owner_or_ownerid, locktype=WriteLock, ): """ Search for an existing, avlid lock on resource. If not found, return None. If owned by 'owner_or_ownerid', return it. Otherwise, raise LockError. """ objectmap = find_objectmap(self) ownerid = self._get_ownerid(owner_or_ownerid) locks = objectmap.targets(resource, locktype) for lock in locks: if lock.is_valid(): if lock.ownerid == ownerid: return lock else: raise LockError(lock) else: lock.commit_suicide() break
def get_obj(oid, only_exists=False): root = getSite() objectmap = find_objectmap(root) obj = objectmap.object_for(oid) if only_exists and obj and obj.__parent__ is None: return None return obj
def __resolve(self, content_id): try: resolver = self._v_resolver except AttributeError: objectmap = find_objectmap(self) resolver = self._v_resolver = objectmap.object_for try: return resolver(content_id) except KeyError: return None
def connect(source, target, **kwargs): container = get_relations_container(source) objectmap = find_objectmap(container) source_id, target_id = objectmap._refids_for(source, target) relation = RelationValue(source_id, target_id, **kwargs) objectid = objectmap.new_objectid() set_oid(relation, objectid) container.add(str(objectid), relation, send_events=False) invalidate_cache() return relation
def preparer(self, value): context = self.bindings['context'] request = self.bindings['request'] objectmap = find_objectmap(context) if value is colander.null: return colander.null try: resource = objectmap.object_for(tuple(value.split('/'))) except ValueError: return None if not has_permission('sdi.lock', resource, request): return False return resource
def discover(self, resource, include_invalid=False, include_lineage=True, locktype=WriteLock): objectmap = find_objectmap(self) valid = [] if include_lineage: resources = lineage(resource) else: resources = [resource] for res in resources: locks = objectmap.targets(res, locktype) for lock in locks: if include_invalid or lock.is_valid(): valid.append(lock) return valid
def delete_locks_for_resource(event): """ Remove all lock objects associated with an resource when it is about to be removed """ if event.moving is not None: # it's not really being removed return if event.loading: # fbo dump/load return objectmap = find_objectmap(event.parent) if objectmap is not None: # might be None if parent is not seated for oid in event.removed_oids: locks = objectmap.targets(oid, WriteLock) for lock in locks: lock.commit_suicide()
def is_valid(self, when=None): """ Return True if the lock has not expired and its resource exists. """ objectmap = find_objectmap(self) if objectmap is not None: # might be None if we're not yet seated if self.resourceid is None: return False if when is None: # pragma: no cover when = now() expires = self.expires() if expires is None: return True return expires >= when
def show_blog(self): blog = self.context request = self.request system_catalog = find_catalog(blog, 'system') path = system_catalog['path'] allowed = system_catalog['allowed'] q = (path.eq(blog, depth=1, include_origin=False) & allowed.allows(request, 'view')) limit = self.posts_per_page year = request.params.get('year') month = request.params.get('month') if year and month: year, month = int(year), int(month) limit = None start = datetime.datetime(year, month, 1, 0, 0, tzinfo=UTC) if month == 12: end = datetime.datetime(year + 1, 1, 1, 0, 0, tzinfo=UTC) else: end = datetime.datetime(year, month + 1, 1, 0, 0, tzinfo=UTC) catalog = find_catalog(blog, 'navel') pub_date = catalog['pub_date'] q &= query.InRange(pub_date, start, end) results = q.execute() results = pub_date_sorter(blog, results, reverse=True) if limit and len(results) > limit: offset = int(request.params.get('offset', 0)) last = offset + limit ids = itertools.islice(results.ids, offset, last) pager = [{ 'title': 'Older', 'url': request.resource_url(blog, query={'offset': last}), 'disabled': " disabled" if last >= len(results) else "" }, { 'title': 'Newer', 'url': request.resource_url(blog, query={'offset': offset - limit}), 'disabled': " disabled" if offset <= 0 else "" }] else: pager = None ids = results.ids objectmap = find_objectmap(blog) entries = map(self.get_info, map(objectmap.object_for, ids)) return {'entries': entries, 'pager': pager}
def delete_locks_for_user(event): """ Remove all lock objects associated with a user when it is about to be removed""" # if the principal service containing the user is removed (or any parent of # the user) this event won't be fired if event.moving is not None: # it's not really being removed return if event.loading: # fbo dump/load return objectmap = find_objectmap(event.parent) if objectmap is not None: # might be None if parent is not seated locks = objectmap.targets(event.object, UserToLock) for lock in locks: lock.commit_suicide()
def test_create_root_with_initial_content(self, registry): from adhocracy_core.resources.root import IRootPool from adhocracy_core.utils import find_graph from substanced.util import find_objectmap from substanced.util import find_catalog from substanced.util import find_service inst = registry.content.create(IRootPool.__identifier__) assert IRootPool.providedBy(inst) assert find_objectmap(inst) is not None assert find_graph(inst) is not None assert find_graph(inst)._objectmap is not None assert find_catalog(inst, 'system') is not None assert find_catalog(inst, 'adhocracy') is not None assert find_service(inst, 'principals', 'users') is not None assert find_service(inst, 'locations') is not None
def show_blog(self): blog = self.context request = self.request system_catalog = find_catalog(blog, 'system') path = system_catalog['path'] allowed = system_catalog['allowed'] q = (path.eq(blog, depth=1, include_origin=False) & allowed.allows(request, 'view') ) limit = self.posts_per_page year = request.params.get('year') month = request.params.get('month') if year and month: year, month = int(year), int(month) limit = None start = datetime.datetime(year, month, 1, 0, 0, tzinfo=UTC) if month == 12: end = datetime.datetime(year + 1, 1, 1, 0, 0, tzinfo=UTC) else: end = datetime.datetime(year, month + 1, 1, 0, 0, tzinfo=UTC) catalog = find_catalog(blog, 'navel') pub_date = catalog['pub_date'] q &= query.InRange(pub_date, start, end) results = q.execute() results = pub_date_sorter(blog, results, reverse=True) if limit and len(results) > limit: offset = int(request.params.get('offset', 0)) last = offset + limit ids = itertools.islice(results.ids, offset, last) pager = [ {'title': 'Older', 'url': request.resource_url(blog, query={'offset': last}), 'disabled': " disabled" if last >= len(results) else ""}, {'title': 'Newer', 'url': request.resource_url(blog, query={'offset': offset - limit}), 'disabled': " disabled" if offset <= 0 else ""}] else: pager = None ids = results.ids objectmap = find_objectmap(blog) entries = map(self.get_info, map(objectmap.object_for, ids)) return { 'entries': entries, 'pager': pager}
def unlock(self, resource, owner_or_ownerid, locktype=WriteLock): # NB: callers should ensure that the user has 'sdi.lock' permission # on the resource before calling objectmap = find_objectmap(self) ownerid = self._get_ownerid(owner_or_ownerid) locks = objectmap.targets(resource, locktype) lock = None for lock in locks: if not lock.is_valid(): lock.commit_suicide() elif lock.ownerid == ownerid: lock.commit_suicide() break else: # nobreak raise UnlockError(lock)
def test_create_new_version_with_referencing_non_versionable(self, registry, config, item): from substanced.util import find_objectmap events = create_event_listener(config, ISheetReferenceNewVersion) creator = self.make_one(registry, item) version_0 = self.make_one(registry, item) other_version_0 = self.make_one(registry, item) om = find_objectmap(item) om.connect(other_version_0, version_0, SheetToSheet) self.make_one(registry, item, follows=[version_0], creator=creator, is_batchmode=True) assert len(events) == 1 assert events[0].creator == creator assert events[0].is_batchmode
def internal_login(context, request): login = '' password = '' if 'form.submitted' in request.POST: try: check_csrf_token(request) except: request.sdiapi.flash('Failed login (CSRF)', 'danger') else: login = request.POST['login'] password = request.POST['password'] root = request.root adapter = request.registry.queryMultiAdapter( (root, request), IUserLocator) if adapter is None: adapter = DefaultUserLocator(root, request) user = adapter.get_user_by_login(login) if user is None: request.session.flash('Bad username or password', 'danger') else: if user.check_password(password): request.registry.notify(LoggedIn( login, user, context, request)) objectmap = find_objectmap(root) try: performer = list( objectmap.sources(user, PerformerToUser) )[0] except IndexError: request.session.flash( 'No performer associated with account', 'danger' ) else: headers = remember(request, get_oid(user)) location = request.resource_url(performer) return HTTPFound(location, headers=headers) else: request.session.flash('Bad username or password', 'danger') return { 'login':login, 'password':password, 'login_url':request.resource_url( request.virtual_root, '@@internal_login'), }
def delete_locks(event): """ Remove all lock objects associated with an object and/or user when it/he is removed""" if event.moving is not None: # it's not really being removed return if event.loading: # fbo dump/load return resource = event.object objectmap = find_objectmap(resource) if objectmap is not None: # might be None if resource is a broken object if IUser.providedBy(resource): locks = objectmap.targets(resource, UserToLock) for lock in locks: lock.commit_suicide() locks = objectmap.targets(resource, WriteLock) for lock in locks: lock.commit_suicide()
def object_deleted(event): if getattr(event, 'moving', False): return registry = get_current_registry() request = get_current_request() if not request: return objectmap = find_objectmap(request.root) ob = event.object catalog = get_relations_catalog(request.root) if catalog is None: # We don't have a Catalog installed in this part of the site return if IRelationValue.providedBy(ob): # We assume relations can't be source or targets of relations objectid = oid_from_resource(ob) catalog.unindex_doc(objectid) return objectid = oid_from_resource(ob) rels = catalog['source_id'].eq(objectid).execute( resolver=objectmap.object_for).all() for rel in rels: registry.notify(RelationSourceDeleted(ob, rel)) parent = rel.__parent__ try: parent.remove(rel.__name__, send_events=False, registry=registry) except KeyError: continue rels = catalog['target_id'].eq(objectid).execute( resolver=objectmap.object_for).all() for rel in rels: registry.notify(RelationTargetDeleted(ob, rel)) parent = rel.__parent__ try: parent.remove(rel.__name__, send_events=False, registry=registry) except KeyError: continue invalidate_cache()
def test_create_new_version_with_referencing_non_versionable( self, registry, config, item): from substanced.util import find_objectmap events = create_event_listener(config, ISheetReferenceNewVersion) creator = self.make_one(registry, item) version_0 = self.make_one(registry, item) other_version_0 = self.make_one(registry, item) om = find_objectmap(item) om.connect(other_version_0, version_0, SheetToSheet) self.make_one(registry, item, follows=[version_0], creator=creator, is_batchmode=True) assert len(events) == 1 assert events[0].creator == creator assert events[0].is_batchmode
def unlock( self, resource, owner_or_ownerid, locktype=WriteLock, ): # NB: callers should ensure that the user has 'sdi.lock' permission # on the resource before calling objectmap = find_objectmap(self) ownerid = self._get_ownerid(owner_or_ownerid) locks = objectmap.targets(resource, locktype) lock = None for lock in locks: if not lock.is_valid(): lock.commit_suicide() elif lock.ownerid == ownerid: lock.commit_suicide() break else: # nobreak raise UnlockError(lock)
def find_relations(resource, query): catalog = get_relations_catalog(resource) root = find_root(resource) objectmap = find_objectmap(root) queryobject = None for index, value in sorted(query.items(), key=get_order): if 'reftype' == index: # ignore reftype, it's always 'Role' continue if isinstance(value, (tuple, list)): querytype = value[0] value = value[1] else: querytype = 'eq' criterion = getattr(catalog[index], querytype)(value) if queryobject is None: queryobject = criterion else: queryobject &= criterion resultset = queryobject.execute(resolver=objectmap.object_for) #print('%s %s'%(query, len(resultset))) return resultset
def _objectmap(self): return find_objectmap(self)
def validator(self, node, value): context = self.bindings['context'] objectmap = find_objectmap(context) if not value in objectmap.objectid_to_path: raise colander.Invalid(node, 'Not a valid userid %r' % value)
def _objectmap(self): return find_objectmap(self.context)