def signInUser(): try: username = request.json['username'] password = request.json['password'] sign_in = SignIn(username, password) if sign_in.check_user(): valid = sign_in.check_password() else: valid = "User does not exist" if valid == "User successfully authenticated": token = str(generate_token()) db = connection() presentTime = str(time()) insert_into_token_table(db, username, presentTime, token) message = """You just signed in, is it really you? Stay organized and on track, If not! change your password immediately. For everyone minute spent in organizing, an hour is earned!""" insert_into_recent_table(connection(), username, str(time()), "3:Signed In", message) else: token = False return jsonify({'valid': valid, 'token': token, 'username': username}) 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 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 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 registerUser(): try: username = request.json['username'] password = request.json['password'] is_premium = request.json['premium'] signup = SignUp(username, password, is_premium) registered = signup.add_user_after_authentication() token = False if registered: token = str(generate_token()) db = connection() presentTime = str(time()) message = "Welcome to Costrajectory, our beautiful chaos! You are in for an exhilarating journey with us!" # adding transaction to logs insert_into_recent_table(connection(), username, presentTime, "2:Registered Profile", message) # adding entry to username alias table alias = get_alias(username) add_alias(connection(), username, alias) insert_into_token_table(db, username, presentTime, token) x = jsonify({ 'username': request.json['username'], 'registered': registered, 'token': token }) return x 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 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 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 change_admin(): try: user_name = request.args.get('user_name') pending_groups = get_pending_groups(connection(), user_name) group_admin_approvals = get_pending_admin_approvals( connection(), user_name) return jsonify({ 'personal_requests': pending_groups, 'group_admin_approvals': group_admin_approvals }) 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 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 check_user(): signup = SignUp(request.json['username']) username = request.json['username'] try: group_id = request.json['group_id'] if get_status_for_group(connection(), group_id, username, "rejected") and \ get_group_pending_state_machine(connection(), username, group_id) >= 4: message = 'User has rejected the group too many times' else: message = 'Request successfully sent to user' x = jsonify({ 'username': username, 'available': signup.check_user(), 'message': message }) except KeyError: x = jsonify({'username': username, 'available': signup.check_user()}) return x
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 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 check_validity_token(username, token): """ Function to check validity of a token :param username: Username :param token: Token :return: Validity of a token """ db = connection() date_time = get_datetime_token(db, username, token) present_time = time() timeout = 3600 # seconds (1 hour) return float(present_time) - float(date_time) < timeout
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 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 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 bugs(): """ API for reporting bugs """ try: title = request.json['title'] description = request.json['description'] creation_time = str(time()) bug_id = new_bugs(connection(), title, description, creation_time) email_bug_info(title, description, bug_id, creation_time) return jsonify({'bug_id': bug_id}) 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 signout(): """ API when user signs out. Delete all his transaction Data """ try: upload_db( ) # upload the dropbox server to the latest code (automation) user_name = request.json['username'] message = "There are no goodbyes for us, wherever you are, you data will stay safe in our heart!" # adding transaction to logs insert_into_recent_table(connection(), user_name, str(time()), "4:Signed Out", message) user_data_path = path.join(getcwd(), "temp", "." + user_name) if path.exists(user_data_path): rmtree(user_data_path) 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_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 build_json_recent_transactions(transactions, user_name): response_json = {'username': user_name} # Building the required response json for the recent transactions table_entries = [] image_intermediate_json = {} for each_transaction in transactions: intermediate_json = {'Name': each_transaction[0], 'Description': each_transaction[3], 'Date': each_transaction[1], 'Amount': each_transaction[2], 'uid': each_transaction[5], 'category': each_transaction[6]} if each_transaction[4]: intermediate_json['HasImage'] = True intermediate_json['Identifier'] = each_transaction[4] original_name = get_original_name(connection(), user_name, each_transaction[4]) image_intermediate_json[each_transaction[4]] = original_name else: intermediate_json['HasImage'] = False intermediate_json['Identifier'] = "" table_entries.append(intermediate_json) response_json['TableEntries'] = table_entries response_json['ImageEntries'] = image_intermediate_json return jsonify(response_json)
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 add_users_to_group_non_admin(): 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) group_admin = request.json['group_admin'] response = {'success': [], 'fail': []} if not group_title: return jsonify(False) for user in users: # 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"): 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, "awaiting") response['success'].append(user) if not get_group_admin_approval(connection(), user, group_id): # to avoid duplicates insert_into_admin_approvals_table(connection(), group_admin, "awaiting", "add", user, group_title, group_id) # 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, "awaiting", 0) if not get_group_admin_approval(connection(), user, group_id): insert_into_admin_approvals_table(connection(), group_admin, "awaiting", "add", user, group_title, group_id) # 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()), "7:Added users to group " + group_title, message + str(message_description)) return jsonify(response) 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 __init__(self, username, password=None): self.db = connection() self.user = username self.password = password
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)