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 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 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 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 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 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 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 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 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 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 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 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)