def load_locs_json(domain, selected_loc_id=None, include_archived=False, user=None, only_administrative=False): """initialize a json location tree for drill-down controls on the client. tree is only partially initialized and branches will be filled in on the client via ajax. what is initialized: * all top level locs * if a 'selected' loc is provided, that loc and its complete ancestry only_administrative - if False get all locations if True get only administrative locations """ def loc_to_json(loc): return { 'name': loc.name, 'location_type': loc.location_type.name, # todo: remove when types aren't optional 'uuid': loc.location_id, 'is_archived': loc.is_archived, 'can_edit': True } locations = SQLLocation.root_locations( domain, include_archive_ancestors=include_archived ) if only_administrative: locations = locations.filter(location_type__administrative=True) loc_json = [loc_to_json(loc) for loc in locations] # if a location is selected, we need to pre-populate its location hierarchy # so that the data is available client-side to pre-populate the drop-downs if selected_loc_id: selected = SQLLocation.objects.get( domain=domain, location_id=selected_loc_id ) lineage = selected.get_ancestors() parent = {'children': loc_json} for loc in lineage: children = loc.child_locations(include_archive_ancestors=include_archived) if only_administrative: children = children.filter(location_type__administrative=True) # find existing entry in the json tree that corresponds to this loc try: this_loc = [k for k in parent['children'] if k['uuid'] == loc.location_id][0] except IndexError: # if we couldn't find this location the view just break out of the loop. # there are some instances in viewing archived locations where we don't actually # support drilling all the way down. break this_loc['children'] = [loc_to_json(loc) for loc in children] parent = this_loc return loc_json
def load_locs_json(domain, selected_loc_id=None, include_archived=False, user=None, only_administrative=False): """initialize a json location tree for drill-down controls on the client. tree is only partially initialized and branches will be filled in on the client via ajax. what is initialized: * all top level locs * if a 'selected' loc is provided, that loc and its complete ancestry only_administrative - if False get all locations if True get only administrative locations """ def loc_to_json(loc): return { 'name': loc.name, 'location_type': loc.location_type.name, # todo: remove when types aren't optional 'uuid': loc.location_id, 'is_archived': loc.is_archived, 'can_edit': True } locations = SQLLocation.root_locations( domain, include_archive_ancestors=include_archived ) if only_administrative: locations = locations.filter(location_type__administrative=True) loc_json = [loc_to_json(loc) for loc in locations] # if a location is selected, we need to pre-populate its location hierarchy # so that the data is available client-side to pre-populate the drop-downs if selected_loc_id: selected = SQLLocation.objects.get( domain=domain, location_id=selected_loc_id ) lineage = selected.get_ancestors() parent = {'children': loc_json} for loc in lineage: children = loc.child_locations(include_archive_ancestors=include_archived) if only_administrative: children = children.filter(location_type__administrative=True) # find existing entry in the json tree that corresponds to this loc try: this_loc = [k for k in parent['children'] if k['uuid'] == loc.location_id][0] except IndexError: # if we couldn't find this location the view just break out of the loop. # there are some instances in viewing archived locations where we don't actually # support drilling all the way down. break this_loc['children'] = [loc_to_json(loc) for loc in children] parent = this_loc return loc_json
def _get_expand_from_level(domain, user_location, expand_from): """From the users current location, returns the highest location they want to start expanding from """ if user_location.location_type.expand_from_root: return SQLLocation.root_locations(domain=domain) else: ancestors = (user_location.get_ancestors(include_self=True).filter( location_type=expand_from, is_archived=False)) return ancestors
def _get_locs_to_expand_from(domain, user_location, expand_from): """From the users current location, return all locations of the highest level they want to start expanding from. """ if user_location.location_type.expand_from_root: return SQLLocation.root_locations(domain=domain) else: ancestors = (user_location.get_ancestors(include_self=True).filter( location_type=expand_from, is_archived=False).prefetch_related('location_type')) return ancestors
def _get_expand_from_level(domain, user_location, expand_from): """From the users current location, returns the highest location they want to start expanding from """ if user_location.location_type.expand_from_root: return SQLLocation.root_locations(domain=domain) else: ancestors = ( user_location .get_ancestors(include_self=True) .filter(location_type=expand_from, is_archived=False) ) return ancestors
def load_locs_json(domain, selected_loc_id=None, user=None, show_test=False): def loc_to_json(loc, project): return { 'name': loc.name, 'location_type': loc.location_type.name, # todo: remove when types aren't optional 'uuid': loc.location_id, 'is_archived': loc.is_archived, 'can_edit': True } project = Domain.get_by_name(domain) locations = SQLLocation.root_locations(domain) if not show_test: locations = [ loc for loc in locations if loc.metadata.get('is_test_location', 'real') != 'test' ] loc_json = [loc_to_json(loc, project) for loc in locations] # if a location is selected, we need to pre-populate its location hierarchy # so that the data is available client-side to pre-populate the drop-downs if selected_loc_id: selected = SQLLocation.objects.get(domain=domain, location_id=selected_loc_id) lineage = selected.get_ancestors() parent = {'children': loc_json} for loc in lineage: children = loc.child_locations() # find existing entry in the json tree that corresponds to this loc try: this_loc = [ k for k in parent['children'] if k['uuid'] == loc.location_id ][0] except IndexError: # if we couldn't find this location the view just break out of the loop. # there are some instances in viewing archived locations where we don't actually # support drilling all the way down. break this_loc['children'] = [ loc_to_json(loc, project) for loc in children ] parent = this_loc return loc_json
def obj_get_list(self, bundle, **kwargs): domain = kwargs['domain'] project = bundle.request.project parent_id = bundle.request.GET.get('parent_id', None) include_inactive = json.loads(bundle.request.GET.get('include_inactive', 'false')) show_administrative = bundle.request.GET.get('show_administrative', False) viewable = _user_locations_ids(project, show_administrative) if not parent_id: locs = SQLLocation.root_locations(domain, include_inactive) else: parent = get_object_or_not_exist(Location, parent_id, domain) locs = parent.sql_location.child_locations(include_inactive) return [child for child in locs if child.location_id in viewable]
def load_locs_json(domain, selected_loc_id=None, include_archived=False): """initialize a json location tree for drill-down controls on the client. tree is only partially initialized and branches will be filled in on the client via ajax. what is initialized: * all top level locs * if a 'selected' loc is provided, that loc and its complete ancestry """ def loc_to_json(loc): return { 'name': loc.name, 'location_type': loc.location_type, 'uuid': loc.location_id, 'is_archived': loc.is_archived, } loc_json = [ loc_to_json(loc) for loc in SQLLocation.root_locations( domain, include_archive_ancestors=include_archived ) ] # if a location is selected, we need to pre-populate its location hierarchy # so that the data is available client-side to pre-populate the drop-downs if selected_loc_id: selected = SQLLocation.objects.get( domain=domain, location_id=selected_loc_id ) lineage = selected.get_ancestors() parent = {'children': loc_json} for loc in lineage: # find existing entry in the json tree that corresponds to this loc this_loc = [k for k in parent['children'] if k['uuid'] == loc.location_id][0] this_loc['children'] = [ loc_to_json(loc) for loc in loc.child_locations(include_archive_ancestors=include_archived) ] parent = this_loc return loc_json
def obj_get_list(self, bundle, **kwargs): domain = kwargs['domain'] project = getattr(bundle.request, 'project', self.domain_obj(domain)) parent_id = bundle.request.GET.get('parent_id', None) include_inactive = json.loads( bundle.request.GET.get('include_inactive', 'false')) show_administrative = bundle.request.GET.get('show_administrative', False) viewable = _user_locations_ids(project, show_administrative) if not parent_id: locs = SQLLocation.root_locations(domain, include_inactive) else: parent = get_location_or_not_exist(parent_id, domain) locs = parent.sql_location.child_locations(include_inactive) return [child for child in locs if child.location_id in viewable]
def load_locs_json(domain, selected_loc_id=None, user=None, show_test=False): def loc_to_json(loc, project): return { 'name': loc.name, 'location_type': loc.location_type.name, # todo: remove when types aren't optional 'uuid': loc.location_id, 'is_archived': loc.is_archived, 'can_edit': True } project = Domain.get_by_name(domain) locations = SQLLocation.root_locations(domain) if not show_test: locations = [ loc for loc in locations if loc.metadata.get('is_test_location', 'real') != 'test' ] loc_json = [loc_to_json(loc, project) for loc in locations] # if a location is selected, we need to pre-populate its location hierarchy # so that the data is available client-side to pre-populate the drop-downs if selected_loc_id: selected = SQLLocation.objects.get( domain=domain, location_id=selected_loc_id ) lineage = selected.get_ancestors() parent = {'children': loc_json} for loc in lineage: children = loc.child_locations() # find existing entry in the json tree that corresponds to this loc try: this_loc = [k for k in parent['children'] if k['uuid'] == loc.location_id][0] except IndexError: # if we couldn't find this location the view just break out of the loop. # there are some instances in viewing archived locations where we don't actually # support drilling all the way down. break this_loc['children'] = [loc_to_json(loc, project) for loc in children] parent = this_loc return loc_json
def load_locs_json(domain, selected_loc_id=None, include_archived=False, user=None, only_administrative=False): """initialize a json location tree for drill-down controls on the client. tree is only partially initialized and branches will be filled in on the client via ajax. what is initialized: * all top level locs * if a 'selected' loc is provided, that loc and its complete ancestry only_administrative - if False get all locations if True get only administrative locations """ from .permissions import user_can_edit_location, user_can_view_location def loc_to_json(loc, project): ret = { 'name': loc.name, 'location_type': loc.location_type.name, # todo: remove when types aren't optional 'uuid': loc.location_id, 'is_archived': loc.is_archived, 'can_edit': True } if user: ret['can_edit'] = user_can_edit_location(user, loc, project) return ret project = Domain.get_by_name(domain) locations = SQLLocation.root_locations( domain, include_archive_ancestors=include_archived ) if only_administrative: locations = locations.filter(location_type__administrative=True) loc_json = [ loc_to_json(loc, project) for loc in locations if user is None or user_can_view_location(user, loc, project) ] # if a location is selected, we need to pre-populate its location hierarchy # so that the data is available client-side to pre-populate the drop-downs if selected_loc_id: selected = SQLLocation.objects.get( domain=domain, location_id=selected_loc_id ) lineage = selected.get_ancestors() parent = {'children': loc_json} for loc in lineage: children = loc.child_locations(include_archive_ancestors=include_archived) if only_administrative: children = children.filter(location_type__administrative=True) # find existing entry in the json tree that corresponds to this loc this_loc = [k for k in parent['children'] if k['uuid'] == loc.location_id][0] this_loc['children'] = [ loc_to_json(loc, project) for loc in children if user is None or user_can_view_location(user, loc, project) ] parent = this_loc return loc_json