def index(self): if not request.environ.get('repoze.who.identity'): abort(401, "Not Authorised") ident = request.environ.get('repoze.who.identity') c.ident = ident c.granary_list = ag.authz(ident, permission=['administrator', 'manager']) http_method = request.environ['REQUEST_METHOD'] if http_method == 'GET': if not 'administrator' in ident['permissions'] and not 'manager' in ident['permissions']: abort(403, "Do not have administrator or manager credentials") else: if not 'administrator' in ident['permissions']: abort(403, "Do not have administrator credentials") if http_method == "GET": #c.granary = ag.granary # conneg return accept_list = None if 'HTTP_ACCEPT' in request.environ: try: accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) except: accept_list= [MT("text", "html")] if not accept_list: accept_list= [MT("text", "html")] mimetype = accept_list.pop(0) while(mimetype): if str(mimetype).lower() in ["text/html", "text/xhtml"]: return render("/admin_silos.html") elif str(mimetype).lower() in ["text/plain", "application/json"]: response.content_type = 'application/json; charset="UTF-8"' response.status_int = 200 response.status = "200 OK" return simplejson.dumps(list(c.granary_list)) try: mimetype = accept_list.pop(0) except IndexError: mimetype = None #Whoops nothing satisfies - return text/html return render("admin_silos.html") elif http_method == "POST": params = request.POST if 'silo' in params: if ag.granary.issilo(params['silo']): abort(403, "The silo %s exists"%params['silo']) if not allowable_id2(params['silo']): response.content_type = "text/plain" response.status_int = 400 response.status = "400 Bad request. Silo name not valid" return "Silo name can contain only the following characters - %s and has to be more than 1 character"%ag.naming_rule_humanized #NOTE: #If any userid in params['administrators']/params['managers']/params['submitters'] does not exist, return 403 #if administartor list is empty, append current user to administartor list #Owner is the superset of adminstrators, managers and submitters existing_users = list_usernames() owners = [] admins = [] managers = [] submitters = [] #if 'owners' in params and params['owners']: # owners = [x.strip() for x in kw['owners'].split(",") if x] if 'administrators' in params and params['administrators']: admins = [x.strip() for x in params['administrators'].split(",") if x] owners.extend(admins) if 'managers' in params and params['managers']: managers = [x.strip() for x in params['managers'].split(",") if x] owners.extend(managers) if 'submitters' in params and params['submitters']: submitters = [x.strip() for x in params['submitters'].split(",") if x] owners.extend(submitters) if not admins: owners.append(ident['user'].user_name) admins.append(ident['user'].user_name) owners = list(set(owners)) for o in owners: if not o in existing_users: abort (403, "User %s does not exist"%o) admins = list(set(admins)) managers = list(set(managers)) submitters = list(set(submitters)) # Create new silo silo = params['silo'] g_root = config.get("granary.uri_root", "info:") c.silo = ag.granary.get_rdf_silo(silo, uri_base="%s%s/datasets/" % (g_root, silo)) ag.granary._register_silos() kw = {} for term in accepted_params: if term in params: kw[term] = params[term] kw['owners'] = ','.join(owners) kw['administrators'] = ','.join(admins) kw['managers'] = ','.join(managers) kw['submitters'] = ','.join(submitters) du = ag.granary.disk_usage_silo(silo) kw['disk_usage'] = du ag.granary.describe_silo(silo, **kw) ag.granary.sync() # Add silo to database add_silo(silo) try: ag.b.silo_creation(silo, ident=ident['repoze.who.userid']) except: pass #Add users belonging to the silo, to the database all_silo_users = [] for a in admins: all_silo_users.append((a, 'administrator')) for a in managers: all_silo_users.append((a, 'manager')) for a in submitters: all_silo_users.append((a, 'submitter')) add_group_users(params['silo'], all_silo_users) ag.granary.state.revert() ag.granary._register_silos() # conneg return accept_list = None if 'HTTP_ACCEPT' in request.environ: try: accept_list = conneg_parse(request.environ['HTTP_ACCEPT']) except: accept_list= [MT("text", "html")] if not accept_list: accept_list= [MT("text", "html")] mimetype = accept_list.pop(0) while(mimetype): if str(mimetype).lower() in ["text/html", "text/xhtml"]: redirect(url(controller="datasets", action="siloview", silo=silo)) elif str(mimetype).lower() in ["text/plain", "application/json"]: response.content_type = "text/plain" response.status_int = 201 response.status = "201 Created" response.headers['Content-Location'] = url(controller="datasets", action="siloview", silo=silo) return "201 Created Silo %s" % silo try: mimetype = accept_list.pop(0) except IndexError: mimetype = None # Whoops - nothing satisfies - return text/plain response.content_type = "text/plain" response.status_int = 201 response.status = "201 Created" response.headers['Content-Location'] = url(controller="datasets", action="siloview", silo=silo) return "201 Created Silo %s" % silo else: response.content_type = "text/plain" response.status_int = 400 response.status = "400 Bad Request" return "400 Bad request. No valid parameters found."
def addSilo(self, silo): add_silo(silo) return
def sync_members(g): # NOTE: g._register_silos() IS AN EXPENSIVE OPERATION. # THIS FUNCTION IS EXPENSIVE AND SHOULD BE CALLED ONLY IF REALLY NECESSARY #g = ag.granary g.state.revert() g._register_silos() granary_list = g.silos granary_list_database = list_silos() usernames = list_usernames() for silo in granary_list: if not silo in granary_list_database: add_silo(silo) kw = g.describe_silo(silo) #Get existing owners, admins, managers and submitters from silo metadata owners = [] admins = [] managers = [] submitters = [] if 'administrators' in kw and kw['administrators']: admins = [x.strip() for x in kw['administrators'].split(",") if x] if 'managers' in kw and kw['managers']: managers = [x.strip() for x in kw['managers'].split(",") if x] if 'submitters' in kw and kw['submitters']: submitters = [x.strip() for x in kw['submitters'].split(",") if x] # Check users in silo metadata are valid users owners = [x for x in owners if x in usernames] admins = [x for x in admins if x in usernames] managers = [x for x in managers if x in usernames] submitters = [x for x in submitters if x in usernames] #Synchronize members in silo metadata with users in database d_admins = [] d_managers = [] d_sunbmitters = [] if silo in granary_list_database: d_admins, d_managers, d_submitters = list_group_usernames(silo) admins.extend(d_admins) managers.extend(d_managers) submitters.extend(d_submitters) # Ensure users are listed just once in silo metadata and owner is superset owners.extend(admins) owners.extend(managers) owners.extend(submitters) admins = list(set(admins)) managers = list(set(managers)) submitters = list(set(submitters)) owners = list(set(owners)) # Add users in silo metadata to the database new_silo_users = [] for a in admins: if not a in d_admins: new_silo_users.append((a, 'administrator')) for a in managers: if not a in d_managers: new_silo_users.append((a, 'manager')) for a in new_submitters: if not a in d_submitters: new_silo_users.append((a, 'submitter')) if new_silo_users: add_group_users(silo, new_silo_users) #Write members into silo kw['owners'] = ','.join(owners) kw['administrators'] = ','.join(admins) kw['managers'] = ','.join(managers) kw['submitters'] = ','.join(submitters) g.describe_silo(silo, **kw) g.sync() return
def sync_members(g): # NOTE: g._register_silos() IS AN EXPENSIVE OPERATION. # THIS FUNCTION IS EXPENSIVE AND SHOULD BE CALLED ONLY IF REALLY NECESSARY #g = ag.granary g.state.revert() g._register_silos() granary_list = g.silos granary_list_database = list_silos() usernames = list_usernames() for silo in granary_list: if not silo in granary_list_database: add_silo(silo) kw = g.describe_silo(silo) #Get existing owners, admins, managers and submitters from silo metadata owners = [] admins = [] managers = [] submitters = [] if 'administrators' in kw and kw['administrators']: admins = [x.strip() for x in kw['administrators'].split(",") if x] if 'managers' in kw and kw['managers']: managers = [x.strip() for x in kw['managers'].split(",") if x] if 'submitters' in kw and kw['submitters']: submitters = [x.strip() for x in kw['submitters'].split(",") if x] # Check users in silo metadata are valid users owners = [x for x in owners if x in usernames] admins = [x for x in admins if x in usernames] managers = [x for x in managers if x in usernames] submitters = [x for x in submitters if x in usernames] #Synchronize members in silo metadata with users in database d_admins = [] d_managers = [] d_sunbmitters = [] if silo in granary_list_database: d_admins, d_managers, d_submitters = list_group_usernames(silo) admins.extend(d_admins) managers.extend(d_managers) submitters.extend(d_submitters) # Ensure users are listed just once in silo metadata and owner is superset owners.extend(admins) owners.extend(managers) owners.extend(submitters) admins = list(set(admins)) managers = list(set(managers)) submitters = list(set(submitters)) owners = list(set(owners)) # Add users in silo metadata to the database new_silo_users = [] for a in admins: if not a in d_admins: new_silo_users.append((a, 'administrator')) for a in managers: if not a in d_managers: new_silo_users.append((a, 'manager')) for a in new_submitters: if not a in d_submitters: new_silo_users.append((a, 'submitter')) if new_silo_users: add_group_users(silo, new_silo_users) #Write members into silo kw['owners'] = ','.join(owners) kw['administrators'] = ','.join(admins) kw['managers'] = ','.join(managers) kw['submitters'] = ','.join(submitters) g.describe_silo(silo, **kw) g.sync() return