def main(): global options options, neighborhoods = optparser.parse_args() if neighborhoods: log.info('Updating neighborhoods: %s', neighborhoods) q_neighborhoods = list( c_neighborhood.find(dict(name={'$in': neighborhoods}))) neighborhood_ids = [n['_id'] for n in q_neighborhoods] q_projects = list( c_project.find(dict(neighborhood_id={'$in': neighborhood_ids}))) project_ids = list(p['_id'] for p in q_projects) q_app_config = list( c_app_config.find(dict(project_id={'$in': project_ids}))) log.info('... %d neighborhoods', len(q_neighborhoods)) log.info('... %d projects', len(q_projects)) log.info('... %d app configs', len(q_app_config)) else: q_neighborhoods = c_neighborhood.find() q_projects = c_project.find() q_app_config = c_app_config.find() log.info('Updating all neighborhoods') # Update project acls log.info('====================================') log.info('Update project ACLs') for p in q_projects: update_project_acl(p) if not options.test: c_project.save(p) # Update neighborhood acls log.info('====================================') log.info('Update neighborhood ACLs') for n in q_neighborhoods: p = c_project.find(dict( neighborhood_id=n['_id'], shortname='--init--')).next() update_neighborhood_acl(n, p) if not options.test: c_neighborhood.save(n) c_project.save(p) graph = build_model_inheritance_graph() # Update app config acls log.info('====================================') log.info('Update appconfig ACLs') for ac in q_app_config: simple_acl_update(ac, 'app_config') if not options.test: c_app_config.save(ac) # Update artifact acls log.info('====================================') log.info('Update artifact ACLs for %s', ac['_id']) for _, a_cls in dfs(M.Artifact, graph): c_artifact = project_db[a_cls.__mongometa__.name] for a in c_artifact.find(dict(app_config_id=ac['_id'])): empty_acl = a['acl'] == [] simple_acl_update(a, a_cls.__mongometa__.name) if not options.test and not empty_acl: c_artifact.save(a)
def subscribe_artifact(self, url, user): artifact_url = urlparse(url).path[1:-1].split("/") neighborhood = M.Neighborhood.query.find({ "url_prefix": "/" + artifact_url[0] + "/" }).first() if artifact_url[0] == "u": project = M.Project.query.find({ "shortname": artifact_url[0] + "/" + artifact_url[1], "neighborhood_id": neighborhood._id }).first() else: project = M.Project.query.find({ "shortname": artifact_url[1], "neighborhood_id": neighborhood._id }).first() appconf = M.AppConfig.query.find({ "options.mount_point": artifact_url[2], "project_id": project._id }).first() if appconf.url() == urlparse(url).path: M.Mailbox.subscribe(user_id=user._id, app_config_id=appconf._id, project_id=project._id) return True tool_packages = h.get_tool_packages(appconf.tool_name) classes = set() for depth, cls in dfs(M.Artifact, build_model_inheritance_graph()): for pkg in tool_packages: if cls.__module__.startswith(pkg + '.'): classes.add(cls) for cls in classes: for artifact in cls.query.find({"app_config_id": appconf._id}): if artifact.url() == urlparse(url).path: M.Mailbox.subscribe(user_id=user._id, app_config_id=appconf._id, project_id=project._id, artifact=artifact) return True return False
def subscribe_artifact(self, url, user): artifact_url = urlparse(url).path[1:-1].split("/") neighborhood = M.Neighborhood.query.find({ "url_prefix": "/" + artifact_url[0] + "/"}).first() if artifact_url[0] == "u": project = M.Project.query.find({ "shortname": artifact_url[0] + "/" + artifact_url[1], "neighborhood_id": neighborhood._id}).first() else: project = M.Project.query.find({ "shortname": artifact_url[1], "neighborhood_id": neighborhood._id}).first() appconf = M.AppConfig.query.find({ "options.mount_point": artifact_url[2], "project_id": project._id}).first() if appconf.url() == urlparse(url).path: M.Mailbox.subscribe( user_id=user._id, app_config_id=appconf._id, project_id=project._id) return True tool_packages = h.get_tool_packages(appconf.tool_name) classes = set() for depth, cls in dfs(M.Artifact, build_model_inheritance_graph()): for pkg in tool_packages: if cls.__module__.startswith(pkg + '.'): classes.add(cls) for cls in classes: for artifact in cls.query.find({"app_config_id": appconf._id}): if artifact.url() == urlparse(url).path: M.Mailbox.subscribe( user_id=user._id, app_config_id=appconf._id, project_id=project._id, artifact=artifact) return True return False