def search_groups(self, **kwargs): """ Returns a list of restclients.GroupReference objects matching the passed parameters. Valid parameters are: name: parts_of_name name may include the wild-card (*) character. stem: group_stem member: member netid owner: admin netid instructor: instructor netid stem="course" will be set when this parameter is passed. student: student netid stem="course" will be set when this parameter is passed. affiliate: affiliate_name type: search_type Values are 'direct' to search for direct membership and 'effective' to search for effective memberships. Default is direct membership. scope: search_scope Values are 'one' to limit results to one level of stem name and 'all' to return all groups. """ kwargs = dict((k.lower(), v.lower()) for k,v in kwargs.iteritems()) if 'type' in kwargs and (kwargs['type'] != 'direct' and kwargs['type'] != 'effective'): del(kwargs['type']) if 'scope' in kwargs and (kwargs['scope'] != 'one' and kwargs['scope'] != 'all'): del(kwargs['scope']) if "instructor" in kwargs or "student" in kwargs: kwargs["stem"] = "course" dao = GWS_DAO() url = "/group_sws/v2/search?" + urlencode(kwargs) response = dao.getURL(url, self._headers({"Accept": "text/xhtml"})) if response.status != 200: raise DataFailureException(url, response.status, response.data) root = etree.fromstring(response.data) group_elements = root.findall('.//*[@class="groupreferences"]' + '//*[@class="groupreference"]') groups = [] for element in group_elements: group = GroupReference() group.uwregid = element.find('.//*[@class="regid"]').text group.title = element.find('.//*[@class="title"]').text group.description = element.find('.//*[@class="description"]').text group.name = element.find('.//*[@class="name"]').text group.url = element.find('.//*[@class="name"]').get('href') groups.append(group) return groups
def delete_group(self, group_id): """ Deletes the group identified by the passed group ID. """ if not self._is_valid_group_id(group_id): raise InvalidGroupID(group_id) dao = GWS_DAO() url = "/group_sws/v2/group/%s" % group_id response = dao.deleteURL(url, self._headers({})) if response.status != 200: raise DataFailureException(url, response.status, response.data) return True
def get_group_by_id(self, group_id): """ Returns a restclients.Group object for the group identified by the passed group ID. """ if not self._is_valid_group_id(group_id): raise InvalidGroupID(group_id) dao = GWS_DAO() url = "/group_sws/v2/group/%s" % group_id response = dao.getURL(url, self._headers({"Accept": "text/xhtml"})) if response.status != 200: raise DataFailureException(url, response.status, response.data) return self._group_from_xhtml(response.data)
def get_members(self, group_id): """ Returns a list of restclients.GroupMember objects for the group identified by the passed group ID. """ if not self._is_valid_group_id(group_id): raise InvalidGroupID(group_id) dao = GWS_DAO() url = "/group_sws/v2/group/%s/member" % group_id response = dao.getURL(url, self._headers({"Accept": "text/xhtml"})) if response.status != 200: raise DataFailureException(url, response.status, response.data) return self._members_from_xhtml(response.data)
def create_group(self, group): """ Creates a group from the passed restclients.Group object. """ body = self._xhtml_from_group(group) dao = GWS_DAO() url = "/group_sws/v2/group/%s" % group.name response = dao.putURL(url, self._headers({"Accept": "text/xhtml", "Content-Type": "text/xhtml"}), body) if response.status != 201: raise DataFailureException(url, response.status, response.data) return self._group_from_xhtml(response.data)
def get_effective_member_count(self, group_id): """ Returns a count of effective members for the group identified by the passed group ID. """ if not self._is_valid_group_id(group_id): raise InvalidGroupID(group_id) dao = GWS_DAO() url = "/group_sws/v2/group/%s/effective_member?view=count" % group_id response = dao.getURL(url, self._headers({"Accept": "text/xhtml"})) if response.status != 200: raise DataFailureException(url, response.status, response.data) root = etree.fromstring(response.data) count = root.find('.//*[@class="member_count"]').get("count") return int(count)
def create_group(self, group): """ Creates a group from the passed restclients.Group object. """ body = self._xhtml_from_group(group) dao = GWS_DAO() url = "/group_sws/v2/group/%s" % group.name response = dao.putURL( url, self._headers({ "Accept": "text/xhtml", "Content-Type": "text/xhtml" }), body) if response.status != 201: raise DataFailureException(url, response.status, response.data) return self._group_from_xhtml(response.data)
def is_effective_member(self, group_id, netid): """ Returns True if the netid is in the group, False otherwise. """ if not self._is_valid_group_id(group_id): raise InvalidGroupID(group_id) # GWS doesn't accept EPPNs on effective member checks, for UW users netid = re.sub('@washington.edu', '', netid) dao = GWS_DAO() url = "/group_sws/v2/group/%s/effective_member/%s" % (group_id, netid) response = dao.getURL(url, self._headers({"Accept": "text/xhtml"})) if response.status == 404: return False elif response.status == 200: return True else: raise DataFailureException(url, response.status, response.data)
def update_members(self, group_id, members): """ Updates the membership of the group represented by the passed group id. Returns a list of members not found. """ if not self._is_valid_group_id(group_id): raise InvalidGroupID(group_id) body = self._xhtml_from_members(group_id, members) dao = GWS_DAO() url = "/group_sws/v2/group/%s/member" % group_id response = dao.putURL(url, self._headers({"Content-Type": "text/xhtml", "If-Match": "*"}), body) if response.status != 200: raise DataFailureException(url, response.status, response.data) return self._notfoundmembers_from_xhtml(response.data)
def update_members(self, group_id, members): """ Updates the membership of the group represented by the passed group id. Returns a list of members not found. """ if not self._is_valid_group_id(group_id): raise InvalidGroupID(group_id) body = self._xhtml_from_members(group_id, members) dao = GWS_DAO() url = "/group_sws/v2/group/%s/member" % group_id response = dao.putURL( url, self._headers({ "Content-Type": "text/xhtml", "If-Match": "*" }), body) if response.status != 200: raise DataFailureException(url, response.status, response.data) return self._notfoundmembers_from_xhtml(response.data)
def proxy(request, service, url): if not hasattr(settings, "RESTCLIENTS_ADMIN_GROUP"): print "You must have a group defined as your admin group." print 'Configure that using RESTCLIENTS_ADMIN_GROUP="u_foo_bar"' raise Exception("Missing RESTCLIENTS_ADMIN_GROUP in settings") user_service = UserService() actual_user = user_service.get_original_user() g = Group() is_admin = g.is_member_of_group(actual_user, settings.RESTCLIENTS_ADMIN_GROUP) if not is_admin: return HttpResponseRedirect("/") use_pre = False headers = {} if service == "sws": dao = SWS_DAO() headers["X-UW-Act-as"] = actual_user elif service == "pws": dao = PWS_DAO() elif service == "gws": dao = GWS_DAO() elif service == "nws": dao = NWS_DAO() elif service == "hfs": dao = Hfs_DAO() elif service == "book": dao = Book_DAO() elif service == "canvas": dao = Canvas_DAO() elif service == "grad": dao = Grad_DAO() elif service == "uwnetid": dao = Uwnetid_DAO() elif service == "libraries": dao = MyLibInfo_DAO() elif service == "libcurrics": dao = LibCurrics_DAO() elif service == "myplan": dao = MyPlan_DAO() elif service == "iasystem": dao = IASYSTEM_DAO() headers = {"Accept": "application/vnd.collection+json"} subdomain = None if url.endswith('/evaluation'): if url.startswith('uwb/') or url.startswith('uwt/'): subdomain = url[:3] url = url[4:] else: subdomain = url[:2] url = url[3:] elif service == "calendar": dao = TrumbaCalendar_DAO() use_pre = True else: return HttpResponseNotFound("Unknown service: %s" % service) url = "/%s" % quote(url) if request.GET: try: url = "%s?%s" % (url, urlencode(request.GET)) except UnicodeEncodeError: err = "Bad URL param given to the restclients browser" return HttpResponse(err) start = time() try: if service == "iasystem" and subdomain is not None: response = dao.getURL(url, headers, subdomain) else: response = dao.getURL(url, headers) except Exception as ex: response = MockHTTP() response.status = 500 response.data = str(ex) end = time() # Assume json, and try to format it. try: if not use_pre: content = format_json(service, response.data) json_data = response.data else: content = response.data json_data = None except Exception as e: content = format_html(service, response.data) json_data = None context = { "url": unquote(url), "content": content, "json_data": json_data, "response_code": response.status, "time_taken": "%f seconds" % (end - start), "headers": response.headers, "override_user": user_service.get_override_user(), "use_pre": use_pre, } try: loader.get_template("restclients/extra_info.html") context["has_extra_template"] = True context["extra_template"] = "restclients/extra_info.html" except TemplateDoesNotExist: pass try: loader.get_template("restclients/proxy_wrapper.html") context["wrapper_template"] = "restclients/proxy_wrapper.html" except TemplateDoesNotExist: context["wrapper_template"] = "proxy_wrapper.html" try: search_template_path = re.sub(r"\..*$", "", url) search_template = "proxy/%s%s.html" % (service, search_template_path) loader.get_template(search_template) context["search_template"] = search_template context["search"] = format_search_params(url) except TemplateDoesNotExist: context["search_template"] = None return render_to_response("proxy.html", context, context_instance=RequestContext(request))