def add_users_to_group(): try: group_admin = request.json['user_name'] refresh_token(connection(), group_admin) users = request.json['users'] users = list( set(users)) # Avoid adding same users multiple times to the groups group_id = request.json['group_id'] group_title = get_group_title(connection(), group_id) if not group_title: return jsonify(False) for user in users: try: # resolving admin approvals resolve_admin_approval(connection(), group_admin, "remove", user, group_id) except: pass # adding transaction to logs message = "You as a group admin of the group " + group_title + " rejected the claim to remove the users" message_description = "The users are " + str(users) insert_into_recent_table( connection(), group_admin, str(time()), "17:Rejected claim to remove users from group" + group_title, message + message_description) return jsonify(True) except: return jsonify(False)
def deleteTransaction(): """ API to delete a particular transaction """ user_name = request.json['username'] bill_id = request.json['bill_id'] group_id = request.json['group_id'] refresh_token(connection(), user_name) mapped_name = request.json['mapped_name'] try: title = get_bill_name(connection(), bill_id) bill_data = get_bill_data(connection(), bill_id) message = "You deleted this group bill " + title message_description = str(bill_data) # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "11:Deleted group bill " + title, message + message_description) delete_from_group_bills_table(connection(), bill_id) delete_from_groups_table(connection(), bill_id, group_id) if mapped_name: delete_file(mapped_name) # deleting that image from dropbox return jsonify(True) except: return jsonify(False)
def edit_transaction(): try: if 'image' in request.files: # Image has to be uploaded file = request.files['image'] file_name = file.filename file_extension = file_name.split('.')[-1] original_file_name = file_name present_time = str(time()) file_name = present_time + '.' + file_extension mapped_file_name = file_name # adding image mapping for cross referencing later insert_into_image_mapping_table(connection(), request.form['username'], original_file_name, mapped_file_name) # uploading the file to dropbox uploadFile(file, mapped_file_name) file.seek(0, SEEK_END) file_size = file.tell() / (10**6) # file_size in mb # adding entry to image size table insert_into_image_size_table(connection(), mapped_file_name, file_size) else: # Image not a part of the transaction mapped_file_name = str(False) user_name = request.form['username'] uid = request.form['uid'] title = request.form['Name'] date_time = request.form['Date'] description = request.form['Description'] amount = request.form['Amount'] category = request.form['category'] # adding the transaction record edit_transactions_image_table(connection(), uid, user_name, title, date_time, amount, description, mapped_file_name, category) # refresh the token, needs to be added to other API Calls refresh_token(connection(), request.form['username']) message = "You edited this transaction " message_description = { 'Title': title, 'DateTime': date_time, 'Description': description, 'Amount': amount, 'Category': category, } # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "19:Edit Transaction " + title, message + str(message_description)) return jsonify({'editStatus': True}) except: return jsonify(False)
def previewImage(): """ API to preview the image for a particular transaction """ user_name = request.json['username'] mapped_image_name = request.json['mapped_name'] try: original_image_name = request.json['original_name'] # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "20:Previewed Bill", original_image_name) except KeyError: original_image_name = "" bill_title = request.json['bill_title'] # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "21:Previewed Group Bill", bill_title) refresh_token(connection(), user_name) try: # downloading the image to cacheable region user_name = str('.' + user_name) file = path.join(getcwd(), "temp", user_name, mapped_image_name) if not path.exists(file): download_file(user_name, mapped_image_name, original_image_name) with open(file, "rb") as f: Image_data = f.read() encoded_string = b64encode(Image_data) return jsonify({'Image': str(encoded_string.decode('utf-8'))}) except: return jsonify(False)
def create_sharing_group(): try: group_admin = request.json['user_name'] refresh_token(connection(), request.json['user_name']) group_title = request.json['group_title'] group_description = request.json['group_description'] users = request.json['users'] users = list( set(users)) # Avoid adding same users multiple times to the groups pending_users = users[:] current_users = str([group_admin]) # only adding admin to the group group_creation_time = str(time()) group_id = insert_into_group_table(connection(), group_admin, current_users, group_title, group_description, group_creation_time, pending_users) # adding admin to accepted list insert_into_pending_requests_table(connection(), group_id, group_admin, "accepted") for user in pending_users: insert_into_pending_requests_table(connection(), group_id, user, "pending") message = "You created a new group, enjoy! " + group_title # adding transaction to logs insert_into_recent_table(connection(), group_admin, str(time()), "9:Created Group " + group_title, message) return jsonify(True) except: return jsonify(False)
def remove_users_from_group(): try: user_name = request.json['user_name'] refresh_token(connection(), user_name) users = request.json['users'] users = list(set(users)) # Avoid adding same users multiple times to the groups group_id = request.json['group_id'] group_admin = request.json['group_admin'] group_title = get_group_title(connection(), group_id) if not group_title: return jsonify(False) for user in users: if not get_group_admin_approval(connection(), user, group_id): insert_into_admin_approvals_table(connection(), group_admin, "awaiting", "remove", user, group_title, group_id) # adding transaction to logs message = "The users were waiting for the admins approval to be removed from the group " + group_title message_description = " The users are " + str(users) insert_into_recent_table(connection(), user_name, str(time()), "16:Awaiting approval for removed users from group " + group_title, message + message_description) return jsonify(True) except: return jsonify(False)
def api_is_user_premium(): try: username = request.json['username'] refresh_token(connection(), request.json['username']) bool_is_user_premium = is_user_premium(connection(), username) if bool_is_user_premium == -1: bool_is_user_premium = 'Username not found' except KeyError: bool_is_user_premium = 'Username not found' return jsonify({'isPremium': bool_is_user_premium})
def add_users_to_group(): try: user_name = request.json['user_name'] refresh_token(connection(), user_name) users = request.json['users'] users = list(set(users)) # Avoid adding same users multiple times to the groups group_id = request.json['group_id'] group_title = get_group_title(connection(), group_id) # updating list of pending users pending_users = get_group_pending_users(connection(), group_id) new_set_users = literal_eval(pending_users) new_set_users = list(set(new_set_users + users)) add_new_pending_users_group(connection(), group_id, str(new_set_users)) response = {'success': [], 'fail': []} if not group_title: return jsonify(False) for user in users: try: # resolving admin approvals group_admin = request.json['group_admin'] resolve_admin_approval(connection(), group_admin, "add", user, group_id) except: pass # if user has rejected the group, or exited, or has been removed, update the status to pending if get_status_for_group(connection(), group_id, user, "rejected") or \ get_status_for_group(connection(), group_id, user, "removed") or \ get_status_for_group(connection(), group_id, user, "exited") or \ get_status_for_group(connection(), group_id, user, "pending") or \ get_status_for_group(connection(), group_id, user, "awaiting"): if get_status_for_group(connection(), group_id, user, "rejected") and \ get_group_pending_state_machine(connection(), user, group_id) >= 4: # user has rejected the group too many times, can't be added response['fail'].append(user) else: # successfully add the user to the group update_group_status(connection(), group_id, user, "pending") response['success'].append(user) # if user entry does not exist in the group, then add a new entry elif not get_status_for_group(connection(), group_id, user, "accepted"): response['success'].append(user) insert_into_pending_requests_table(connection(), group_id, user, "pending", 0) # adding transaction to logs if response['success']: message = "You added a few users to the group " + group_title + ". The users are: " message_description = response['success'] insert_into_recent_table(connection(), user_name, str(time()), "6:Added users to group " + group_title, message + str(message_description)) return jsonify(response) except: return jsonify(False)
def user_space_usage(): """ API for usage details """ try: user_name = request.json['username'] refresh_token(connection(), user_name) size = space_usage(connection(), user_name) + group_space_usage(connection(), user_name) bool_is_user_premium = is_user_premium(connection(), user_name) premium = False if bool_is_user_premium == 'True': premium = True total_quota = get_total_size(premium) return jsonify({'TotalQuota': total_quota, 'UsedQuota': size}) except: return jsonify(False)
def api_go_premium(): try: username = request.json['username'] refresh_token(connection(), request.json['username']) message = "Now, we're talking, you are premium, way to go!" # adding transaction to logs insert_into_recent_table(connection(), username, str(time()), "1:Premium User", message) bool_is_user_premium = is_user_premium(connection(), username) if bool_is_user_premium == 'False': user_go_premium(connection(), username) bool_is_user_premium = is_user_premium(connection(), username) except KeyError: bool_is_user_premium = 'Username not found' return jsonify({'isPremium': bool_is_user_premium})
def recentLogs(): """ Api to get the recent logs of a particular user. :return: 10 transactions for now. """ user_name = request.args.get('user_name') refresh_token(connection(), user_name) limit_transactions = request.args.get('limit') if limit_transactions is None: limit_transactions = 10 # limit of the transaction to be retrieved try: transactions = get_recent_logs(connection(), user_name, limit_transactions) if not transactions: return jsonify(False) return jsonify(transactions) except: return jsonify(False)
def change_admin(): try: group_admin = request.json['group_admin'] refresh_token(connection(), request.json['user_name']) group_id = request.json['group_id'] group_title = get_group_title(connection(), group_id) if not group_title: return jsonify(False) change_group_admin(connection(), group_id, group_admin) # adding transaction to logs message = "Group: %s, New Admin: %s" % (group_title, group_admin) insert_into_recent_table(connection(), group_admin, str(time()), "8:Changed group admin of " + group_title, message) return jsonify(True) except: return jsonify(False)
def profile_pic_random(): try: user_name = request.json['user_name'] refresh_token(connection(), request.json['user_name']) profile_pic_path = path.join(getcwd(), "temp", "." + user_name, "profile_pic", 'pic') if not path.exists(profile_pic_path): # Caching and Saving profile pic profile_pic = generate_image() if not path.exists(path.split(profile_pic_path)[0]): makedirs(path.split(profile_pic_path)[0]) with open(profile_pic_path, 'w') as fp: pass dump(profile_pic, file=open(profile_pic_path, "wb")) # Profile pic already cached profile_pic = load(open(profile_pic_path, "rb")) return profile_pic except: return jsonify({'Error': 'Failed to get profile Picture'})
def recentTransactions(): """ Api to get the recent transactions of a particular user. :return: 5 transactions for now. #TODO need to make it more dynamic and generalized later on. """ user_name = request.json['username'] refresh_token(connection(), user_name) try: limit_transactions = request.json['limit'] except KeyError: limit_transactions = 1000 # limit of the transaction to be retrieved try: transactions = query_recent_transaction(connection(), user_name, limit_transactions) if not transactions: return jsonify([]) return build_json_recent_transactions(transactions, user_name) except: return jsonify(False)
def group_status_update(): try: user_name = request.json['user_name'] refresh_token(connection(), request.json['user_name']) group_id = request.json['group_id'] group_title = get_group_title(connection(), group_id) if not group_title: return jsonify(False) delete_group(connection(), group_id) delete_users_in_group(connection(), group_id) message = "You just deleted the group " + group_title message_description = "Hope it's purpose served you well!" # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "10:Deleted Group " + group_title, message + message_description) return jsonify(True) except: return jsonify(False)
def viewing_group(): try: user_name = request.json['user_name'] refresh_token(connection(), user_name) # get all the accepted groups for a user groups = get_groups_user(connection(), user_name, "accepted") all_group_info = [] # for each group, get all the information pertinent to the group for group in groups: try: group_info = get_group_info(connection(), group) user_details = get_user_details(connection(), group_info['users']) if group_info: bills = [] settlements = [] for bill_id in group_info['bills']: bill_data = get_bill_data(connection(), bill_id) if bill_data: if bill_data['category'] == 'settlement': settlements.append(bill_data) else: bills.append(bill_data) cost_sharing_info = cost_sharing_split(bills, settlements) cost_sharing_info['settlement_history'] = settlements group_payload = { 'group_info': group_info, 'bill_data': bills, 'user_details': user_details, 'cost_sharing': cost_sharing_info } all_group_info.append(group_payload) except: continue return jsonify({'body': all_group_info}) except: return jsonify(False)
def remove_users_from_group(): try: user_name = request.json['user_name'] refresh_token(connection(), user_name) users = request.json['users'] users = list( set(users)) # Avoid adding same users multiple times to the groups group_id = request.json['group_id'] group_title = get_group_title(connection(), group_id) if not group_title: return jsonify(False) for user in users: try: # resolving admin approvals group_admin = request.json['group_admin'] resolve_admin_approval(connection(), group_admin, "remove", user, group_id) resolve_admin_approval(connection(), group_admin, "add", user, group_id) except: pass update_group_status(connection(), group_id, user, "removed") try: current_users = get_group_current_users(connection(), group_id) new_users = literal_eval(current_users) new_users.remove(user) add_new_users_group(connection(), group_id, str(new_users)) except: pass message = "You removed users from the group " + group_title + ". The users removed were " + str( users) # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "15:Removed users from group " + group_title, message) return jsonify(True) except: return jsonify(False)
def delete_transaction(): """ API to delete a particular transaction """ user_name = request.json['username'] uid = request.json['uid'] refresh_token(connection(), user_name) mapped_name = request.json['mapped_name'] try: title = get_bill_name(connection(), uid) # adding transaction to logs bill_data = query_particular_transaction(connection(), uid) message = "You just deleted this transaction " insert_into_recent_table(connection(), user_name, str(time()), "18:Deleted Transaction " + title, message + str(bill_data)) message = delete_from_image_table(connection(), uid, user_name) delete_file(mapped_name) # deleting that image from dropbox return jsonify(message) except: return jsonify("Deleting the transaction failed.")
def exit_group(): try: user_name = request.json['user_name'] refresh_token(connection(), request.json['user_name']) group_id = request.json['group_id'] group_title = get_group_title(connection(), group_id) if not group_title: return jsonify(False) current_users = get_group_current_users(connection(), group_id) new_users = literal_eval(current_users) new_users.remove(user_name) add_new_users_group(connection(), group_id, str(new_users)) update_group_status(connection(), group_id, user_name, "exited") message = "You left the group " + group_title + ". Why did you leave it? :(" # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "13:Exited group " + group_title, message) return jsonify(True) except: return jsonify(False)
def profile_details(): """ API for querying and updating profile details """ try: # Post request for updating the details if request.method == 'POST': user_name = request.form['user_name'] # refreshing token for sign in refresh_token(connection(), user_name) first_name = request.form['first_name'] last_name = request.form['last_name'] alias = form_username_alias(first_name, last_name) if alias: update_alias(connection(), user_name, alias) email = request.form['email'] address = request.form['address'] address2 = request.form['address2'] dob = request.form['dob'] gender = request.form['gender'] country = request.form['country'] state = request.form['state'] zip_code = request.form['zip_code'] description = { 'First Name': first_name, 'Last Name': last_name, 'Email Address': email, 'Address': address, 'Address2': address2, 'Date of Birth': dob, 'Gender': gender, 'Country': country, 'State': state, 'Zip Code': zip_code } message = "You just updated your profile details! " # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "23:Profile Details Updated", message + str(description)) if not query_profile_details( connection(), user_name): # User entry does not exist return jsonify( insert_into_profile_details(connection(), user_name, first_name, last_name, email, address, address2, dob, gender, country, state, zip_code)) else: return jsonify( edit_profile_table(connection(), user_name, first_name, last_name, email, address, address2, dob, gender, country, state, zip_code)) else: user_name = request.args.get('user_name') refresh_token(connection(), user_name) if not query_profile_details( connection(), user_name): # User entry does not exist response = { 'user_name': user_name, 'first_name': '', 'last_name': '', 'email': '', 'address': '', 'address2': '', 'dob': '', 'gender': '', 'country': '', 'state': '', 'zip_code': None } else: data = query_profile_details(connection(), user_name) response = { 'user_name': user_name, 'first_name': data[1], 'last_name': data[2], 'email': data[3], 'address': data[4], 'address2': data[5], 'dob': data[6], 'gender': data[7], 'country': data[8], 'state': data[9], 'zip_code': data[10] } return jsonify(response) except: return jsonify(False)
def edit_group_bill_api(): try: if 'image' in request.files: # Image has to be uploaded file = request.files['image'] file_name = file.filename file_extension = file_name.split('.')[-1] original_file_name = file_name present_time = str(time()) file_name = present_time + '.' + file_extension mapped_file_name = file_name # adding image mapping for cross referencing later insert_into_image_mapping_table(connection(), request.form['username'], original_file_name, mapped_file_name) # uploading the file to dropbox uploadFile(file, mapped_file_name) file.seek(0, SEEK_END) file_size = file.tell() / (10**6) # file_size in mb # adding entry to image size table insert_into_image_size_table(connection(), mapped_file_name, file_size) else: # Image not a part of the transaction mapped_file_name = str(False) user_name = request.form['username'] title = request.form['title'] date_time = request.form['date'] description = request.form['description'] amount = request.form['amount'] category = request.form['category'] payer = request.form['payer'] group_id = request.form['group_id'] shares = request.form['shares'] bill_id = request.form['bill_id'] # editing the transaction record edit_group_bill(connection(), title, date_time, amount, description, mapped_file_name, category, shares, payer, group_id, bill_id) # refresh the token, needs to be added to other API Calls refresh_token(connection(), request.form['username']) message = "You added a group bill " message_description = { 'Title': title, 'DateTime': date_time, 'Description': description, 'Amount': amount, 'Category': category, 'Payer': payer, 'Shares': shares, 'Group': title } # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "12:Edit Group Bill " + title, message + str(message_description)) return jsonify({'editStatus': True}) except: return jsonify(False)
def upload(): try: usage_exceeded = None if 'image' in request.files: # Image has to be uploaded file = request.files['image'] file_name = file.filename # If user quota has been exceeded user_name = request.form['username'] size = space_usage(connection(), user_name) + group_space_usage( connection(), user_name) bool_is_user_premium = is_user_premium(connection(), user_name) premium = False if bool_is_user_premium == 'True': premium = True total_quota = get_total_size(premium) usage_exceeded = quota_exceeded(size, total_quota) if not usage_exceeded: # Upload image if user has not exceeded his quota file_extension = file_name.split('.')[-1] original_file_name = file_name present_time = str(time()) file_name = present_time + '.' + file_extension mapped_file_name = file_name # adding image mapping for cross referencing later insert_into_image_mapping_table(connection(), request.form['username'], original_file_name, mapped_file_name) # uploading the file to dropbox uploadFile(file, mapped_file_name) file.seek(0, SEEK_END) file_size = file.tell() / (10**6) # file_size in mb # adding entry to image size table insert_into_image_size_table(connection(), mapped_file_name, file_size) else: mapped_file_name = str(False) else: # Image not a part of the transaction mapped_file_name = str(False) user_name = request.form['username'] title = request.form['Name'] date_time = request.form['Date'] description = request.form['Description'] amount = request.form['Amount'] category = request.form['category'] # adding the transaction record insert_into_image_table(connection(), user_name, title, date_time, amount, description, mapped_file_name, category) message_description = { 'Title': title, 'DateTime': date_time, 'Description': description, 'Amount': amount, 'Category': category, } message = "You added a new bill " # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "22:Added Transaction " + title, message + str(message_description)) # refresh the token, needs to be added to other API Calls refresh_token(connection(), request.form['username']) if usage_exceeded is not None and usage_exceeded: message = "User Quota Exceeded" return jsonify({'uploadStatus': True, 'message': message}) return jsonify({'uploadStatus': True}) except: return jsonify(False)
def group_bill(): try: usage_exceeded = None if 'image' in request.files: # Image has to be uploaded file = request.files['image'] file_name = file.filename # If user quota has been exceeded user_name = request.form['username'] # Personal Bill Usage + Group Bill Usage size = space_usage(connection(), user_name) + group_space_usage(connection(), user_name) bool_is_user_premium = is_user_premium(connection(), user_name) premium = False if bool_is_user_premium == 'True': premium = True total_quota = get_total_size(premium) usage_exceeded = quota_exceeded(size, total_quota) if not usage_exceeded: # Upload image if user has not exceeded his quota file_extension = file_name.split('.')[-1] original_file_name = file_name present_time = str(time()) file_name = present_time + '.' + file_extension mapped_file_name = file_name # adding image mapping for cross referencing later insert_into_image_mapping_table(connection(), request.form['username'], original_file_name, mapped_file_name) # uploading the file to dropbox uploadFile(file, mapped_file_name) file.seek(0, SEEK_END) file_size = file.tell() / (10 ** 6) # file_size in mb # adding entry to image size table insert_into_image_size_table(connection(), mapped_file_name, file_size) else: mapped_file_name = str(False) else: # Image not a part of the transaction mapped_file_name = str(False) user_name = request.form['username'] title = request.form['title'] date_time = request.form['date'] description = request.form['description'] amount = request.form['amount'] category = request.form['category'] uploader = user_name payer = request.form['payer'] group_id = request.form['group_id'] shares = request.form['shares'] # adding the transaction record bill_id = insert_into_group_bills_table(connection(), uploader, title, date_time, amount, description, mapped_file_name, category, shares, payer, group_id) group_title = get_group_title(connection(), group_id) # add the bill_id to the groups table current_bills = get_groups_bills(connection(), group_id) new_bills = literal_eval(current_bills) new_bills.append(bill_id) add_new_bill_id(connection(), group_id, str(new_bills)) message = "You added a group bill " message_description = {'Title': title, 'DateTime': date_time, 'Description': description, 'Amount': amount, 'Category': category, 'Uploader': uploader, 'Payer': payer, 'Shares': shares, 'Group': group_title } # adding transaction to logs if category == 'settlement': insert_into_recent_table(connection(), user_name, str(time()), "24:Settled amount in group " + group_title, message + str(message_description)) else: insert_into_recent_table(connection(), user_name, str(time()), "5:Added Group Transaction " + title, message + str(message_description)) # refresh the token, needs to be added to other API Calls refresh_token(connection(), request.form['username']) if usage_exceeded is not None and usage_exceeded: message = "User Quota Exceeded" return jsonify({'uploadStatus': True, 'message': message}) return jsonify({'uploadStatus': True}) except: return jsonify(False)