diff --git a/task_database.py b/task_database.py index 54c48d6..2b84d02 100644 --- a/task_database.py +++ b/task_database.py @@ -1,4 +1,5 @@ import random +import gspread import re from math import floor import tasklists @@ -496,7 +497,6 @@ def manual_revert_tasks(username, tier, task_id): ''' -DEPRECATED - No replacement import_spreadsheet: The import_spreadsheet function, Imports a spreadsheet into the database. @@ -516,123 +516,123 @@ def manual_revert_tasks(username, tier, task_id): list: each element is a str: of the tier import status. ''' -# def import_spreadsheet(username, url): -# def update_current_task_from_sheet(username, tier, task_id): -# coll = mydb['taskAccounts'] -# task_check = coll.find_one({'username': username, '%s._id' % tier: task_id}, -# {'_id': 0, '%s.status' % tier: 1, '%s._id' % tier: 1}) -# task_updated = False -# if task_check[tier][task_id - 1]['status'] == 'Incomplete': -# task_updated = True -# coll.update_one({'username': username, '%s._id' % tier: task_id}, -# {'$set': {'%s.$.taskCurrent' % tier: True}}) -# return task_updated - -# try: -# error = None -# task_import_logs = [] -# task_current_logs = [] -# speadsheet_key = re.search('\/d\/(.*?)(\/|$)', url) -# if speadsheet_key: -# service = gspread.service_account(filename="service_account.json") -# google_sheet = service.open_by_key(speadsheet_key.group(1)) -# info_sheet = google_sheet.worksheet("Info") - -# current_sheet_tier = info_sheet.get('B13:B14') - -# tier, cell = current_sheet_tier[0][0], current_sheet_tier[1][0].replace('C', "") -# cell = int(cell) - 1 -# sheet_tasks = [] -# sheet_list = [ -# 'Easy', -# 'Medium', -# 'Hard', -# 'Elite', -# 'Pets', -# 'Pets', -# 'Pets', -# 'Extra', -# 'Passive' -# ] - -# cell_range = [ -# 'A2:C137', # Easy -# 'A2:C160', # Medium -# 'A2:C184', # Hard -# 'A2:C165', # Elite -# 'A2:C35', # Pets - Boss -# 'A37:C44', # Pets - Skill -# 'A46:C55', # Pets - Other -# 'A2:C119', # Extra -# 'A2:C44' # Passive -# ] - -# task_list = [ -# tasklists.easy, -# tasklists.medium, -# tasklists.hard, -# tasklists.elite, -# tasklists.boss_pet, -# tasklists.skill_pet, -# tasklists.other_pet, -# tasklists.extra, -# tasklists.passive -# ] - -# taskdb_names = [ -# 'easyTasks', -# 'mediumTasks', -# 'hardTasks', -# 'eliteTasks', -# 'bossPetTasks', -# 'skillPetTasks', -# 'otherPetTasks', -# 'extraTasks', -# 'passiveTasks' -# ] - -# for sheet_name, cells in zip(sheet_list, cell_range): -# ws = google_sheet.worksheet(sheet_name) -# tasks = ws.get(cells) -# sheet_tasks.append(tasks) -# if sheet_name == tier: -# current_list = [] -# current_list.append(tasks) - -# coll = mydb['taskAccounts'] -# user_tasks = coll.find_one({'username': username}) - -# for sheet_task_list, tasks_lists, doc_list_names in zip(sheet_tasks, task_list, taskdb_names): -# if len(sheet_task_list) == len(tasks_lists): -# for i, (task_sheet, task_db) in enumerate(zip(sheet_task_list, tasks_lists), 1): -# if 'x' in task_sheet: -# user_tasks[doc_list_names][i - 1]['status'] = "Complete" -# coll.update_one({'username': username}, {'$set': {doc_list_names: user_tasks[doc_list_names]}}) -# task_import_logs.append('Tasks for %s were updated!' % doc_list_names) -# else: -# task_import_logs.append( -# 'Unable to update %s! Spreadsheet data differs from database!' % doc_list_names) - -# if get_taskCurrent(username) is None: -# for i, (task) in enumerate(current_list[0], 1): -# if i == cell: -# sheets_db_dict = {} -# for i2, (key, value) in enumerate(zip(sheet_list, taskdb_names)): -# sheets_db_dict[key] = value -# if i2 == 3: -# update_current = update_current_task_from_sheet(username, sheets_db_dict[tier], i) -# if update_current is True: -# task_current_logs.append('Updated current task!') -# break -# else: -# task_current_logs.append('Current task already found!') -# else: -# error = "Spreadsheet URL is not valid!" -# return task_import_logs, task_current_logs, error -# except Exception as e: -# print(str(e)) -# error = "There was a problem prcoessing the request. Contact Gerni Task on Discord." -# return task_import_logs, task_current_logs, error +def import_spreadsheet(username, url): + def update_current_task_from_sheet(username, tier, task_id): + coll = mydb['taskAccounts'] + task_check = coll.find_one({'username': username, '%s._id' % tier: task_id}, + {'_id': 0, '%s.status' % tier: 1, '%s._id' % tier: 1}) + task_updated = False + if task_check[tier][task_id - 1]['status'] == 'Incomplete': + task_updated = True + coll.update_one({'username': username, '%s._id' % tier: task_id}, + {'$set': {'%s.$.taskCurrent' % tier: True}}) + return task_updated + + try: + error = None + task_import_logs = [] + task_current_logs = [] + speadsheet_key = re.search('\/d\/(.*?)(\/|$)', url) + if speadsheet_key: + service = gspread.service_account(filename="service_account.json") + google_sheet = service.open_by_key(speadsheet_key.group(1)) + info_sheet = google_sheet.worksheet("Info") + + current_sheet_tier = info_sheet.get('B13:B14') + + tier, cell = current_sheet_tier[0][0], current_sheet_tier[1][0].replace('C', "") + cell = int(cell) - 1 + sheet_tasks = [] + sheet_list = [ + 'Easy', + 'Medium', + 'Hard', + 'Elite', + 'Pets', + 'Pets', + 'Pets', + 'Extra', + 'Passive' + ] + + cell_range = [ + 'A2:C137', # Easy + 'A2:C160', # Medium + 'A2:C184', # Hard + 'A2:C165', # Elite + 'A2:C35', # Pets - Boss + 'A37:C44', # Pets - Skill + 'A46:C55', # Pets - Other + 'A2:C119', # Extra + 'A2:C44' # Passive + ] + + task_list = [ + tasklists.easy, + tasklists.medium, + tasklists.hard, + tasklists.elite, + tasklists.boss_pet, + tasklists.skill_pet, + tasklists.other_pet, + tasklists.extra, + tasklists.passive + ] + + taskdb_names = [ + 'easyTasks', + 'mediumTasks', + 'hardTasks', + 'eliteTasks', + 'bossPetTasks', + 'skillPetTasks', + 'otherPetTasks', + 'extraTasks', + 'passiveTasks' + ] + + for sheet_name, cells in zip(sheet_list, cell_range): + ws = google_sheet.worksheet(sheet_name) + tasks = ws.get(cells) + sheet_tasks.append(tasks) + if sheet_name == tier: + current_list = [] + current_list.append(tasks) + + coll = mydb['taskAccounts'] + user_tasks = coll.find_one({'username': username}) + + for sheet_task_list, tasks_lists, doc_list_names in zip(sheet_tasks, task_list, taskdb_names): + if len(sheet_task_list) == len(tasks_lists): + for i, (task_sheet, task_db) in enumerate(zip(sheet_task_list, tasks_lists), 1): + if 'x' in task_sheet: + user_tasks[doc_list_names][i - 1]['status'] = "Complete" + coll.update_one({'username': username}, {'$set': {doc_list_names: user_tasks[doc_list_names]}}) + task_import_logs.append('Tasks for %s were updated!' % doc_list_names) + else: + task_import_logs.append( + 'Unable to update %s! Spreadsheet data differs from database!' % doc_list_names) + + if get_taskCurrent(username) is None: + for i, (task) in enumerate(current_list[0], 1): + if i == cell: + sheets_db_dict = {} + for i2, (key, value) in enumerate(zip(sheet_list, taskdb_names)): + sheets_db_dict[key] = value + if i2 == 3: + update_current = update_current_task_from_sheet(username, sheets_db_dict[tier], i) + if update_current is True: + task_current_logs.append('Updated current task!') + break + else: + task_current_logs.append('Current task already found!') + else: + error = "Spreadsheet URL is not valid!" + return task_import_logs, task_current_logs, error + except Exception as e: + print(str(e)) + error = "There was a problem prcoessing the request. Contact Gerni Task on Discord." + return task_import_logs, task_current_logs, error # NOT USED only for testing purposes.