def get_user(self): """ Returns the user using the Graph API. """ if not self.accessToken(): return None if not self.graph: self.graph = self.GraphAPI((self.accessToken())) user = None try: user = self.graph.get_object_c("me") except self.GraphAPIError: current.session.token = None self.graph = None if user: # Check if a user with this email has already registered #session = current.session #session.facebooklogin = True auth = current.auth table = auth.settings.table_user query = (table.email == user["email"]) existent = current.db(query).select(table.id, table.password, limitby=(0, 1)).first() if existent: #session["%s_setpassword" % existent.id] = existent.password _user = dict(first_name = user.get("first_name", ""), last_name = user.get("last_name", ""), facebookid = user["id"], facebook = user.get("username", user["id"]), email = user["email"], password = existent.password ) return _user else: # b = user["birthday"] # birthday = "%s-%s-%s" % (b[-4:], b[0:2], b[-7:-5]) # if 'location' in user: # session.flocation = user['location'] #session["is_new_from"] = "facebook" auth.s3_send_welcome_email(user) # auth.initial_user_permission(user) # Called on profile page _user = dict(first_name = user.get("first_name", ""), last_name = user.get("last_name", ""), facebookid = user["id"], facebook = user.get("username", user["id"]), nickname = IS_SLUG()(user.get("username", "%(first_name)s-%(last_name)s" % user) + "-" + user['id'][:5])[0], email = user["email"], # birthdate = birthday, about = user.get("bio", ""), website = user.get("website", ""), # gender = user.get("gender", "Not specified").title(), photo_source = 3, tagline = user.get("link", ""), registration_type = 2, ) return _user
def get_user(self): """ Returns the user using the Graph API. """ token = self.accessToken() if not token: return None if not self.graph: self.graph = self.GraphAPI(token) user = None try: user = self.graph.get_object_c("me") except self.GraphAPIError: current.session.token = None self.graph = None user_dict = None if user: # Check if a user with this email has already registered #session = current.session #session.facebooklogin = True table = current.auth.settings.table_user query = (table.email == user["email"]) existing = current.db(query).select(table.id, table.password, limitby=(0, 1)).first() if existing: #session["%s_setpassword" % existing.id] = existing.password user_dict = { "first_name": user.get("first_name", ""), "last_name": user.get("last_name", ""), "facebookid": user["id"], "facebook": user.get("username", user["id"]), "email": user["email"], "password": existing.password, } else: # b = user["birthday"] # birthday = "%s-%s-%s" % (b[-4:], b[0:2], b[-7:-5]) # if 'location' in user: # session.flocation = user['location'] #session["is_new_from"] = "facebook" # Done in s3_approve_user() #auth.s3_send_welcome_email(user) user_dict = { "first_name": user.get("first_name", ""), "last_name": user.get("last_name", ""), "facebookid": user["id"], "facebook": user.get("username", user["id"]), "nickname": IS_SLUG()(user.get("username", "%(first_name)s-%(last_name)s" % user) + "-" + user['id'][:5])[0], "email": user["email"], #"birthdate": birthday, "about": user.get("bio", ""), "website": user.get("website", ""), #"gender": user.get("gender", "Not specified").title(), "photo_source": 3, "tagline": user.get("link", ""), "registration_type": 2, } return user_dict
def process(self,request,response,policies=None): """ the main method, processes a request, filters by policies and produces a JSON response """ self.request = request self.response = response self.policies = policies db = self.db tablename = request.args(0) r = OrderedDict() r['version'] = self.VERSION tablenames = policies.keys() if policies else db.tables # if there is no tables if not tablename: r['href'] = URL(scheme=True), # https://github.com/collection-json/extensions/blob/master/model.md r['links'] = [{'rel' : t, 'href' : URL(args=t,scheme=True), 'model':t} for t in tablenames] response.headers['Content-Type'] = 'application/vnd.collection+json' return response.json({'collection':r}) # or if the tablenames is invalid if not tablename in tablenames: return self.error(400,'BAD REQUEST','Invalid table name') # of if the method is invalid if not request.env.request_method in policies[tablename]: return self.error(400,'BAD REQUEST','Method not recognized') # get the policies self.table_policy = policies[tablename][request.env.request_method] # process GET if request.env.request_method=='GET': table = db[tablename] r['href'] = URL(args=tablename) r['items'] = items = [] try: (query, limitby, orderby) = self.request2query(table,request.get_vars) fields = [table[fn] for fn in (self.table_policy.get('fields', table.fields))] fields = filter(lambda field: field.readable, fields) rows = db(query).select(*fields,**dict(limitby=limitby, orderby=orderby)) except: db.rollback() return self.error(400,'BAD REQUEST','Invalid Query') r['items_found'] = db(query).count() delta = limitby[1]-limitby[0]-1 r['links'] = self.row2links(table,None) if self.compact else [] text = r['items_found']<2 for row in rows[:delta]: id = row.id for name in ('slug','fullname','title','name'): if name in row: href = URL(args=(tablename,id,IS_SLUG.urlify(row[name] or '')), scheme=True) break else: href = URL(args=(tablename,id),scheme=True) if self.compact: items.append(self.row2data(table,row,text)) else: items.append({ 'href':href, 'data':self.row2data(table,row,text), 'links':self.row2links(table,row) }); if self.extensions and len(rows)>delta: vars = dict(request.get_vars) vars['_offset'] = limitby[1]-1 vars['_limit'] = limitby[1]-1+delta r['next'] = {'rel':'next', 'href':URL(args=request.args,vars=vars,scheme=True)} if self.extensions and limitby[0]>0: vars = dict(request.get_vars) vars['_offset'] = max(0,limitby[0]-delta) vars['_limit'] = limitby[0] r['previous'] = {'rel':'previous', 'href':URL(args=request.args,vars=vars,scheme=True)} data = [] if not self.compact: r['queries'] = self.table2queries(table, r['href']) r['template'] = self.table2template(table) response.headers['Content-Type'] = 'application/vnd.collection+json' return response.json({'collection':r}) # process DELETE elif request.env.request_method=='DELETE': table = db[tablename] if not request.get_vars: return self.error(400, "BAD REQUEST", "Nothing to delete") else: try: (query, limitby, orderby) = self.request2query(table, request.vars) n = db(query).delete() # MAY FAIL response.status = 204 return '' except: db.rollback() return self.error(400,'BAD REQUEST','Invalid Query') return response.json(r) # process POST and PUT (on equal footing!) elif request.env.request_method in ('POST','PUT'): # we treat them the same! table = db[tablename] if 'json' in request.env.content_type: data = request.post_vars.data if request.get_vars or len(request.args)>1: # update # ADD validate fields and return error try: (query, limitby, orderby) = self.request2query(table, request.get_vars) fields = filter(lambda (fn,value):table[fn].writable,data.items()) res = db(query).validate_and_update(**dict(fields)) # MAY FAIL if res.errors: return self.error(400,'BAD REQUEST','Validation Error',res.errors) else: response.status = 200 return '' except: db.rollback() return self.error(400,'BAD REQUEST','Invalid Query') else: # create # ADD validate fields and return error try: fields = filter(lambda (fn,value):table[fn].writable,data.items()) res = table.validate_and_insert(**dict(fields)) # MAY FAIL if res.errors: return self.error(400,'BAD REQUEST','Validation Error',res.errors) else: response.status = 201 response.headers['location'] = \ URL(args=(tablename,res.id),scheme=True) return '' except SyntaxError,e: #Exception,e: db.rollback() return self.error(400,'BAD REQUEST','Invalid Query:'+e)
def process(self, request, response, policies=None): """ the main method, processes a request, filters by policies and produces a JSON response """ self.request = request self.response = response self.policies = policies db = self.db tablename = request.args(0) r = OrderedDict() r['version'] = self.VERSION tablenames = policies.keys() if policies else db.tables # if there is no tables if not tablename: r['href'] = URL(scheme=True), # https://github.com/collection-json/extensions/blob/master/model.md r['links'] = [{ 'rel': t, 'href': URL(args=t, scheme=True), 'model': t } for t in tablenames] response.headers[ 'Content-Type'] = 'application/vnd.collection+json' return response.json({'collection': r}) # or if the tablenames is invalid if not tablename in tablenames: return self.error(400, 'BAD REQUEST', 'Invalid table name') # of if the method is invalid if not request.env.request_method in policies[tablename]: return self.error(400, 'BAD REQUEST', 'Method not recognized') # get the policies self.table_policy = policies[tablename][request.env.request_method] # process GET if request.env.request_method == 'GET': table = db[tablename] r['href'] = URL(args=tablename) r['items'] = items = [] try: (query, limitby, orderby) = self.request2query(table, request.get_vars) fields = [ table[fn] for fn in (self.table_policy.get('fields', table.fields)) ] fields = filter(lambda field: field.readable, fields) rows = db(query).select( *fields, **dict(limitby=limitby, orderby=orderby)) except: db.rollback() return self.error(400, 'BAD REQUEST', 'Invalid Query') r['items_found'] = db(query).count() delta = limitby[1] - limitby[0] - 1 r['links'] = self.row2links(table, None) if self.compact else [] text = r['items_found'] < 2 for row in rows[:delta]: id = row.id for name in ('slug', 'fullname', 'title', 'name'): if name in row: href = URL(args=(tablename, id, IS_SLUG.urlify(row[name] or '')), scheme=True) break else: href = URL(args=(tablename, id), scheme=True) if self.compact: items.append(self.row2data(table, row, text)) else: items.append({ 'href': href, 'data': self.row2data(table, row, text), 'links': self.row2links(table, row) }) if self.extensions and len(rows) > delta: vars = dict(request.get_vars) vars['_offset'] = limitby[1] - 1 vars['_limit'] = limitby[1] - 1 + delta r['next'] = { 'rel': 'next', 'href': URL(args=request.args, vars=vars, scheme=True) } if self.extensions and limitby[0] > 0: vars = dict(request.get_vars) vars['_offset'] = max(0, limitby[0] - delta) vars['_limit'] = limitby[0] r['previous'] = { 'rel': 'previous', 'href': URL(args=request.args, vars=vars, scheme=True) } data = [] if not self.compact: r['queries'] = self.table2queries(table, r['href']) r['template'] = self.table2template(table) response.headers[ 'Content-Type'] = 'application/vnd.collection+json' return response.json({'collection': r}) # process DELETE elif request.env.request_method == 'DELETE': table = db[tablename] if not request.get_vars: return self.error(400, "BAD REQUEST", "Nothing to delete") else: try: (query, limitby, orderby) = self.request2query(table, request.vars) n = db(query).delete() # MAY FAIL response.status = 204 return '' except: db.rollback() return self.error(400, 'BAD REQUEST', 'Invalid Query') return response.json(r) # process POST and PUT (on equal footing!) elif request.env.request_method in ('POST', 'PUT'): # we treat them the same! table = db[tablename] if 'json' in request.env.content_type: data = request.post_vars.data else: data = request.post_vars if request.get_vars or len(request.args) > 1: # update # ADD validate fields and return error try: (query, limitby, orderby) = self.request2query(table, request.get_vars) fields = filter( lambda fn_value: table[fn_value[0]].writable, data.items()) res = db(query).validate_and_update(**dict( fields)) # MAY FAIL if res.errors: return self.error(400, 'BAD REQUEST', 'Validation Error', res.errors) else: response.status = 200 return '' except: db.rollback() return self.error(400, 'BAD REQUEST', 'Invalid Query') else: # create # ADD validate fields and return error try: fields = filter( lambda fn_value1: table[fn_value1[0]].writable, data.items()) res = table.validate_and_insert(**dict(fields)) # MAY FAIL if res.errors: return self.error(400, 'BAD REQUEST', 'Validation Error', res.errors) else: response.status = 201 response.headers['location'] = \ URL(args=(tablename,res.id),scheme=True) return '' except SyntaxError as e: #Exception,e: db.rollback() return self.error(400, 'BAD REQUEST', 'Invalid Query:' + e)