def get(self): args = parser.parse_args() if not args['house_id']: return {"reason" : "no house id"}, 400 cursor, conn = connect_db() cursor.execute("""select * from unavailable_date where item_id = {}""".format(args['house_id'])) rows = cursor.fetchall() today = datetime.now().strftime("%Y-%m-%d") result = {"unavailable": []} for row in rows: format_date = row[2].strftime("%Y-%m-%d") if today > format_date: print(row) try: cursor.execute("""delete from unavailable_date where id = {}""".format(row[0])) cursor.commit() except: continue else: result['unavailable'].append(format_date) if not args['start_date']: return result result['unavailable'].sort() start_time = args['start_date'] if start_time > result['unavailable'][-1]: return {"unavailable" : []}, 200 else: for end_d in result["unavailable"]: if end_d > start_time: end_date = end_d break return {"unavailable" : [(datetime.strptime(end_date, "%Y-%m-%d") + timedelta(n)).strftime("%Y-%m-%d") for n in range(60)]}
def get(self): args = parser.parse_args() item = args['item_id'] error = None if item == None: error = 'Item ID required.' return {'review': [], 'result': error}, 400 cursor, conn = connect_db() cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) cursor.execute( "select * from item_comment where item_id={};".format(item)) reviews = cursor.fetchall() for r in reviews: cursor.execute( "select position from user_photo where user_id={};".format( r['user_id'])) results = cursor.fetchall() if len(results) == 0: r['user_photo'] = None else: r['user_photo'] = results[0]['position'] r['date'] = str(r['date']) r.pop('id') r.pop('item_id') close_db(conn) return {'review': reviews, 'result': error}, 200
def get(self): args = parser.parse_args() token = args['token'] cursor, conn = connect_db() cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) timepoint = float(re.sub(r'.*_', '', token)) userID = int(re.search(r"id(\d+)_", token).group(1)) if time.time() - timepoint > 600: error = "Request timeout." return { "name": None, "gender": None, "phone": None, "date_of_birth": None, "self_description": None, "photo": None, "reason": error }, 400 cursor.execute( "select id,name,gender,phone,date_of_birth,self_description from user_information where id = '{}';" .format(userID)) results = cursor.fetchall() user_info = results[0] cursor.execute( "select position from user_photo where user_id='{}';".format( user_info['id'])) results = cursor.fetchall() user_info.pop('id') user_info['date_of_birth'] = str(user_info['date_of_birth']) user_info['photo'] = results[0]['position'] user_info['reason'] = None close_db(conn) return user_info, 200
def post(self): args = parser.parse_args() token = args['token'] host = args['host_id'] transaction = args['transaction_id'] status = args['status'] error = None userID, timepoint = token_parser(token) if time.time() - timepoint > 600: error = 'Request timeout.' elif host == None: error = 'Host id required.' elif host != userID: error = 'Request rejected.' elif transaction == None: error = 'Transaction id required.' elif status == None or not status in ('accept', 'decline'): error = 'Invalid status required.' if error != None: return {'reason': error}, 400 cursor, conn = connect_db() cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) if status == 'accept': status_code = 'A' cursor.execute( "select start_date,end_date,item_id from transaction where id={};" .format(transaction)) results = cursor.fetchall() start = results[0]['start_date'] end = results[0]['end_date'] date = start item = results[0]['item_id'] while date <= end: cursor.execute( "insert into unavailable_date (item_id,date) values({},'{}')" .format(item, date)) conn.commit() date += datetime.timedelta(1) elif status == 'decline': status_code = 'U' cursor.execute( "update transaction set status='{}' where id={};".format( status_code, transaction)) conn.commit() cursor.execute( "select user_id from transaction where id={};".format(transaction)) user = cursor.fetchall()[0]['user_id'] cursor.execute( "update user_information set unread_trip = unread_trip+1 where id = {};" .format(user)) conn.commit() close_db(conn) return {'reason': error}, 200
def post(self): args = parser.parse_args() email = args['email'] password = args['password'] name = args['name'] gender = args['gender'] birthday = args['date_of_birth'] description = args['self_description'] photo = args['photo'] phone = args['phone'] error = None cursor, conn = connect_db() cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) if email == None: error = 'Email is required.' elif password == None: error = 'Password is required.' elif name == None: error = 'Username is required.' elif not gender in ('F', 'M'): error = 'Gender should be F or M' if error != None: return {'reason': error}, 400 cursor.execute( "select * from user_information where email='{}';".format(email)) results = cursor.fetchall() if len(results) != 0: error = 'User already exists.\nCreate user with another email.' return {'reason': error}, 403 current_date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) cursor.execute("insert into user_information \ (email,password,name,gender,date_of_birth,self_description,create_date,unread_message,unread_trip,verified,phone)\ values('{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}');".format( email, password, name, gender, birthday, description, current_date, 0, 0, False, phone)) conn.commit() if not photo: photo = "https://a0.muscache.com/im/pictures/20180027/bb9ccce5_original.jpg?aki_policy=large" cursor.execute( "select id from user_information where email='{}';".format(email)) results = cursor.fetchall() user_ID = results[0]['id'] cursor.execute( "insert into user_photo (user_id,position) values('{}','{}');". format(user_ID, photo)) conn.commit() close_db(conn) return {'reason': error}, 200
def get(self): args = parser.parse_args() if not args['page_number']: return {"reason": "no page number"}, 400 # house_list = [] # if not house_list: cursor, conn = connect_db() cursor_dict = conn.cursor( cursor_factory=psycopg2.extras.RealDictCursor) cursor_dict.execute( """select name, id, accuracy, communication, cleanliness, location, check_in, value, rating_number, price from item""") house_list = cursor_dict.fetchall() for row in house_list: if row['rating_number']: row['rating'] = (row.pop('accuracy') + row.pop('communication') + row.pop('cleanliness') + \ row.pop('location') + row.pop('check_in') + row.pop('value')) / ( 6 * row['rating_number']) else: row['rating'] = (row.pop('accuracy') + row.pop('communication') + row.pop('cleanliness') + \ row.pop('location') + row.pop('check_in') + row.pop('value')) row['price'] = float(row['price']) cursor.execute( """select position from item_photo where item_id = {}""". format(row['id'])) image_result = cursor.fetchone() if image_result: row['image'] = cursor.fetchone()[0] else: row['image'] = '' if (args['page_number'] - 1) * 6 >= len(house_list) or args['page_number'] <= 0: return {"reason": "incorrect page number"}, 400 end_flag = min(args['page_number'] * 6, len(house_list)) if args['page_number'] == 1: start_flag = 0 else: start_flag = (args['page_number'] - 1) * 6 dict_return = {} dict_return['items'] = house_list[start_flag:end_flag] if (args['page_number'] * 6) >= len(house_list): dict_return['exist_next_pages'] = 0 else: dict_return['exist_next_pages'] = 1 return dict_return, 200
def post(self): args = parser.parse_args() token = args['token'] user = args['user_id'] transaction = args['transaction_id'] date = args['date'] comment = args['comment'] accuracy = args['accuracy'] communication = args['communication'] cleanliness = args['cleanliness'] location = args['location'] checkin = args['check_in'] value = args['value'] error = None userID, timepoint = token_parser(token) if time.time() - timepoint > 600: error = 'Request timeout.' elif user == None: error = 'User ID required.' elif user != userID: error = 'Request rejected.' elif transaction == None: error = 'Transaction required.' if error != None: return {'result': error}, 400 cursor, conn = connect_db() cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) cursor.execute( "select item_id from transaction where id={} and status='{}';". format(transaction, 'S')) results = cursor.fetchall() if len(results) == 0: error = "Transaction is not existing or not completed." return {'result': error}, 400 cursor.execute( "update transaction set rating_or_not=true where id={} and status='{}';" .format(transaction, 'S')) conn.commit() item = results[0]['item_id'] cursor.execute( "insert into item_comment (user_id,item_id,date,comment,accuracy,communication,cleanliness,location,check_in,value) values({},{},'{}','{}','{}','{}','{}','{}','{}','{}');" .format(user, item, date, comment, accuracy, communication, cleanliness, location, checkin, value)) conn.commit() close_db(conn) return {'reason': error}, 200
def post(self,request): args = parser.parse_args() token = args['token'] sender = args['sender_id'] receiver = args['receiver_id'] content = args['message_content'] date = args['date'] error = None timepoint = float(re.sub(r'.*_','',token)) userID = int(re.search(r"id(\d+)_",token).group(1)) if time.time()-timepoint > 600 : error = "Request timeout." return {'reason': error},400 if userID != sender: error = "Request rejected." return {'reason': error},400 cursor, conn = connect_db() cursor.execute("insert into message (sender,receiver,content,date,read_or_not) values ('{}','{}','{}','{}','{}');".format(sender,receiver,content,date,False)) conn.commit() close_db(conn) return {'reason': error},200
def put(self): args = parser.parse_args() token = args['token'] name = args['name'] gender = args['gender'] phone = args['phone'] birthday = args['date_of_birth'] description = args['self_description'] photo = args['photo'] error = None timepoint = float(re.sub(r'.*_', '', token)) userID = int(re.search(r"id(\d+)_", token).group(1)) if time.time() - timepoint > 600: error = "Request timeout." return {'reason': error}, 400 if name == None: error = 'Username is required.' return {'reason': error}, 404 elif not gender in ('F', 'M'): error = 'Incorrect gender type.' return {'reason': error}, 404 cursor, conn = connect_db() cursor.execute( "update user_information set name='{}', gender='{}', phone='{}',\ date_of_birth='{}',self_description='{}' where id='{}';".format( name, gender, phone, birthday, description, userID)) conn.commit() cursor.execute( "update user_photo set position='{}' where user_id='{}';".format( photo, userID)) conn.commit() close_db(conn) return {'reason': error}, 200
parser.add_argument("suburb", type=str) parser.add_argument("address", type=str) parser.add_argument("type", type=str) parser.add_argument("price", type=float) parser.add_argument("postcode", type=int) # lack room arrangement parser.add_argument("room_arrangement", type=str, action='append') parser.add_argument("common_space", type=str, action='append') parser.add_argument("bath_number", type=int) parser.add_argument("max_people", type=int) parser.add_argument("amenities", type=str, action='append') cursor, conn = connect_db() class Item_specific_user(Resource): def get(self): args = parser.parse_args() if not args['user_id']: return {"reason": "no user id input"}, 400 host_id = args['user_id'] token = args['token'] if not token: return {"reason": "no token"}, 400 user_check = int(re.search(r"id(\d+)_", token).group(1)) timepoint = float(re.sub(r'.*_', '', token)) if time.time() - timepoint > 600:
def get(self): args = parser.parse_args() token = args['token'] user = args['user_id'] error = None timepoint = float(re.sub(r'.*_','',token)) user_check = int(re.search(r"id(\d+)_",token).group(1)) if time.time()-timepoint > 600 : error = 'Request timeout.' elif user==None: error = 'User required.' elif user != user_check: error = 'Request rejected.' if error != None: return {'transaction':[], 'reason': error},400 cursor, conn = connect_db() cursor = conn.cursor(cursor_factory = psycopg2.extras.RealDictCursor) cursor.execute("select id,item_id,user_id,host_id,status,start_date,end_date,rating_or_not from transaction where user_id = {} or host_id={};".format(user,user)) trips = cursor.fetchall() current_date = datetime.date.today() for t in trips: if t['user_id'] == user: cursor.execute("select name from user_information where id={};".format(t['host_id'])) user_name = cursor.fetchall()[0]['name'] cursor.execute("select position from user_photo where user_id={};".format(t['host_id'])) results = cursor.fetchall() if len(results)==0: user_photo = None else: user_photo = results[0]['position'] t['trip_or_not'] = True t['user_id']=t['host_id'] else: cursor.execute("select name from user_information where id={};".format(t['user_id'])) user_name = cursor.fetchall()[0]['name'] cursor.execute("select position from user_photo where user_id={};".format(t['user_id'])) results = cursor.fetchall() if len(results)==0: user_photo = None else: user_photo = results[0]['position'] t['trip_or_not'] = False t['user_name'] = user_name t['user_photo'] = user_photo cursor.execute("select name from item where id={};".format(t['item_id'])) item_name = cursor.fetchall()[0]['name'] t['house_name'] = item_name t['transaction_id'] = t['id'] t['house_id'] = t['item_id'] t['review_or_not'] = t['rating_or_not'] if t['status'] == 'A': if current_date > t['end_date']: cursor.execute("update transaction set status='{}' where id={};".format('S',t['id'])) conn.commit() t['status'] = 'completed' else: t['status'] = 'accepted' elif t['status'] == 'U': t['status'] = 'declined' elif t['status'] == 'P': t['status'] = 'pending' elif t['status'] == 'S': t['status'] = 'completed' t['start_date'] = str(t['start_date']) t['end_date'] = str(t['end_date']) t.pop('id') t.pop('item_id') t.pop('host_id') t.pop('rating_or_not') cursor.execute("update user_information set unread_trip=0 where id ={};".format(user)) conn.commit() close_db(conn) return {'transaction': trips, 'reason': error},200
def post(self): args = parser.parse_args() email = args['email'] password = args['password'] error = None token = None photo = None unread_message = None unread_trip = None verified = None user_id = None cursor, conn = connect_db() cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) cursor.execute( "select password,verified,id,unread_message,unread_trip from user_information where email = '{}';" .format(email)) results = cursor.fetchall() if len(results) != 0: user = results[0] if password == user['password']: token = "id" + str(user['id']) + "_" + str(int(time.time())) verified = user['verified'] user_id = user['id'] unread_message = user['unread_message'] unread_trip = user['unread_trip'] cursor.execute( "select position from user_photo where user_id = '{}';". format(user['id'])) results = cursor.fetchall() if len(results) != 0: photo = results[0]['position'] else: photo = None else: error = 'incorrect password' else: error = 'no such user' close_db(conn) if error == None: return { "reason": error, "user_id": user_id, "photo": photo, 'unread_message': unread_message, 'unread_trip': unread_trip, "token": token, "verified": verified }, 200 else: return { "reason": error, "user_id": user_id, "photo": photo, 'unread_message': unread_message, 'unread_trip': unread_trip, "token": token, "verified": verified }, 400
def post(self): args = parser.parse_args() token = args['token'] user = args['user_id'] transaction = args['transaction_id'] status = args['status'] error = None userID, timepoint = token_parser(token) if time.time() - timepoint > 600: error = 'Request timeout.' elif user == None: error = 'User id required.' elif user != userID: error = 'Request rejected.' elif transaction == None: error = 'Transaction id required.' elif status == None or status != 'cancel': error = 'Invalid status required.' if error != None: return {'reason': error}, 400 cursor, conn = connect_db() cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) cursor.execute( "select status from transaction where id={};".format(transaction)) origin_status = cursor.fetchall()[0]['status'] if origin_status == 'S': error = 'Transaction already completed.' return {'reason': error}, 400 elif origin_status == 'U': error = 'Transaction already declined.' return {'reason': error}, 400 elif origin_status == 'A': cursor.execute( "select start_date,end_date,item_id from transaction where id={};" .format(transaction)) results = cursor.fetchall() start = results[0]['start_date'] end = results[0]['end_date'] date = start item = results[0]['item_id'] while date <= end: cursor.execute( "delete from unavailable_date where item_id={} and date='{}';" .format(item, date)) conn.commit() date += datetime.timedelta(1) cursor.execute( "update transaction set status='{}' where id={};".format( 'U', transaction)) conn.commit() cursor.execute( "select host_id from transaction where id={};".format(transaction)) host = cursor.fetchall()[0]['host_id'] cursor.execute( "update user_information set unread_trip = unread_trip+1 where id = {};" .format(host)) conn.commit() close_db(conn) return {'reason': error}, 200
def get(self,request): if request == 'detail': args = parser.parse_args() token = args['token'] user1_ID = args['user_id'] user2_ID = args['receiver_id'] error = None userID = int(re.search(r"id(\d+)_",token).group(1)) timepoint = float(re.sub(r'.*_','',token)) if time.time()-timepoint > 600 or user1_ID != userID: return {'message':None, 'sender':None, 'receiver':None},400 cursor, conn = connect_db() cursor = conn.cursor(cursor_factory = psycopg2.extras.RealDictCursor) cursor.execute("select id,name from user_information where id='{}';".format(user1_ID)) results = cursor.fetchall() if len(results) == 0: return {'message':None, 'sender':None, 'receiver':None},400 user1 = results[0] cursor.execute("select position from user_photo where user_id='{}';".format(user1_ID)) results = cursor.fetchall() if len(results) == 0: user1['photo'] = None else: user1['photo'] = results[0]['position'] cursor.execute("select id,name from user_information where id='{}';".format(user2_ID)) results = cursor.fetchall() if len(results) == 0: return {'message':None, 'sender':None, 'receiver':None},400 user2 = results[0] cursor.execute("select position from user_photo where user_id='{}';".format(user2_ID)) results = cursor.fetchall() if len(results) == 0: user2['photo'] = None else: user2['photo'] = results[0]['position'] cursor.execute("select content,sender,date from message where sender='{}' and receiver='{}' or sender='{}' and receiver='{}';".format(user1_ID,user2_ID,user2_ID,user1_ID)) results = cursor.fetchall() message = sorted(results,key=lambda message:message["date"],reverse=True) for m in message: m['date'] = str(m['date']) cursor.execute("select count(*) as nums from message where sender='{}' and receiver='{}' and read_or_not = '{}';".format(user2_ID,user1_ID,False)) results = cursor.fetchall() count = results[0]['nums'] cursor.execute("update message set read_or_not=True where sender = '{}' and receiver = '{}' and read_or_not = '{}';".format(user2_ID,user1_ID,False)) conn.commit() cursor.execute("update user_information set unread_message = unread_message-'{}' where id = '{}';".format(count,user1_ID)) conn.commit() close_db(conn) return {'message':message, 'user':user1, 'sender':user2},200 elif request == 'preview': args = parser.parse_args() token = args['token'] userID_check = args['user_id'] error = None userID = int(re.search(r"id(\d+)_",token).group(1)) timepoint = float(re.sub(r'.*_','',token)) if time.time()-timepoint > 600 or userID_check != userID: return {'message':None},400 cursor, conn = connect_db() cursor.execute("select * from message where sender = '{}' or receiver = '{}';".format(userID,userID)) results = cursor.fetchall() close_db(conn) messages_dict = {} for record in results: if record[1] == userID: chat_with = record[2] else: chat_with = record[1] if not chat_with in messages_dict.keys(): messages_dict[chat_with] = record elif str(record[4]) > str(messages_dict[chat_with][4]): messages_dict[chat_with] = record messages_list=[] message={} for m in messages_dict.values(): message['last_message'] = m[3] message['user_id'] = userID message['receiver_id'] = m[2] message['sender_id'] = m[1] message['read_or_not'] = m[6] messages_list.append(message) message ={} return {'message' :messages_list},200