class Supervisor: """this is a class for supervisor related operations.""" def __init__(self): """ initializing supervisor class. """ self.conn = ConnectDb() self.supervisor_id = '' def __del__(self): """ closing database connection. """ self.conn.close_conn() def supervisor_features(self): """ this method is used to print all supervisor features on console. """ try: while True: print("choose feature :\n") menu = Menu() features = [x.name for x in SupervisorFeatures] features.extend([str(BackButton.EXIT.name)]) feature = menu.draw_menu(features) input() required_feature = getattr(self, feature.lower()) required_feature() # again calling supervisor menu input() os.system('clear') self.supervisor_features() except Exception as e: print(e) sys.exit() def show_accident_complain(self): """ this method is used to show supervisor accident complain. """ cursor = self.conn.show_supervisor_accidents(self.supervisor_id) admin = Admin() temp_dict = dict() print('choose accident to send report') temp_dict['accident_id'] = admin.show_table_menu(cursor) if temp_dict['accident_id'] is None: return cursor = self.conn.show_members() print('choose eye witness') temp_dict['eye_witness'] = admin.show_table_menu(cursor) print('choose victims') victims = admin.choose_multiple_employee() print('choose culprit') temp_dict['victims'] = '' temp_dict['culprit'] = '' culprit = admin.choose_multiple_employee() if culprit != [] and culprit != None: temp_dict['culprit'] = ','.join(culprit) if victims != [] and victims != None: temp_dict['victims'] = ','.join(victims) temp_dict['submitted_by'] = self.supervisor_id temp_dict['reason'] = input('enter reason ') temp_dict['timing'] = input('enter accident timing ') temp_dict['submission_time'] = d.datetime.now() temp_dict['location'] = input('enter location of accident ') temp_dict['action_to_resolve'] = input('enter action to resolve ' ) try: self.conn.register_supervisor_report(temp_dict) self.conn.commit_data() print('report submitted successfully.') except Exception as e: print('some error occured') print(e) self.conn.rollback_data()
class BDO: """this is a class for BDO related operations. Attributes: conn (sqlite connection): connection object. bdo_id (string): bdo id. project_id (string): project id. gpm_id (string): gpm id. member_id (string): member id. """ def __init__(self): """ initializing BDO class . """ self.conn = ConnectDb() self.bdo_id = '' self.project_id = ' ' self.gpm_id = ' ' self.member_id = '' def __del__(self): """ closing database connection. """ self.conn.close_conn() def bdo_features(self): """ this method is used to print all bdo features on console. """ try: while True: print("choose feature :\n") menu = Menu() features = [x.name for x in BdoFeatures] features.extend([str(BackButton.EXIT.name)]) feature = menu.draw_menu(features) input() required_feature = getattr(self, feature.lower()) required_feature() # again calling gpm menu input() os.system('clear') self.bdo_features() except Exception as e: print(e) sys.exit() def show_gpm(self): """ this method is used to print all gpm of current bdo. """ print("GPM's list:\n") result = self.conn.get_subordinate_details(self.bdo_id) data = result.fetchall() if len(data) == 0: print(Color.F_Green + "you don't have any GPM under you" + Base.END) return # converting list of tuples into list of list list_data = [list(elem) for elem in data] for gpm in list_data: gpm[2] = decrypt_pass(gpm[2]) raw_data_to_table(list_data, result) def show_members(self): """ this method is used to print members and gpm of current bdo. """ print("members List:\n") gpm_list = self.conn.get_user_names(self.bdo_id) if len(gpm_list) == 0: print(Color.F_Green + "you don't have any GPM and members under you" + Base.END) return for gpm_detail in gpm_list: print('GPM name ' + gpm_detail[0]) gpm = GPM() gpm.gpm_id = gpm_detail[1] gpm.show_members() def create_gpm(self): """ this method is used to create gpm for current bdo. """ try: name = input("enter gpm name ") id = str(uuid.uuid4()) password = input("enter password for gpm ") user_name = input("enter user name for gpm ") role_id = int(Role.GPM.value) created_at = datetime.datetime.now().date() updated_at = datetime.datetime.now().date() is_deleted = 'False' state = input("enter state ") district = input("enter district ") pincode = input("enter pincode ") if not Validation.pincode(pincode): print("pin code is not valid") input() sys.exit() age = input("enter age ") if not Validation.is_int(age): print("age is not valid") input() sys.exit() gender = input("enter gender ") if not Validation.gender(gender): print("gender is not valid") input() sys.exit() created_by = self.bdo_id encrypted_pass = encrypt_pass(password) self.conn.add_user(id, encrypted_pass, user_name, role_id, created_at, updated_at, name, is_deleted) self.conn.add_personal_details(id, state, district, pincode, age, gender, created_by) self.conn.commit_data() print("\n" + Color.F_Green + "record inserted" + Base.END) except Exception as e: print(e) self.conn.rollback_data() def delete_gpm(self): """ this method is used to delete gpm for current bdo. """ try: print("choose gmp to delete:\n") gpm_list = self.get_gpm_list() menu = Menu() gpm_names = [x for x in gpm_list.keys()] gpm_names.extend( [str(BackButton.EXIT.name), str(BackButton.BACK.name)]) gpm_name = menu.draw_menu(gpm_names) input() if gpm_name == str(BackButton.BACK.name): return self.gpm_id = gpm_list.pop(gpm_name) os.system('clear') print('choose another gpm to assign current gpm members:\n') menu2 = Menu() if len(gpm_list.keys()) == 0: print( Color.F_Red + "Can't delete GPM because you don't have any alternative GPM " + Base.END) return alternative_gpm_names = [x for x in gpm_list.keys()] alternative_gpm_names.extend( [str(BackButton.EXIT.name), str(BackButton.BACK.name)]) alternative_gpm_name = menu2.draw_menu(alternative_gpm_names) input() if alternative_gpm_name == str(BackButton.BACK.name): return # assigning new gpm to members self.conn.update_member_gpm(gpm_list[alternative_gpm_name], self.gpm_id) # completing all gpm projects project_ids = self.conn.get_gpm_projects(self.gpm_id) for project_id in project_ids: self.project_id = project_id member_ids = self.conn.get_project_members(self.project_id) for member_id in member_ids: self.member_id = member_id[0] self.delete_project_members() self.conn.update_user('is_deleted', self.gpm_id, 'True') self.conn.commit_data() except Exception as e: print(e) self.conn.rollback_data() def update_gpm(self): """ this method is used to update gpm for current bdo. """ try: gpm_list = self.get_gpm_list() menu = Menu() gpm_names = [x for x in gpm_list.keys()] gpm_names.extend( [str(BackButton.EXIT.name), str(BackButton.BACK.name)]) gpm_name = menu.draw_menu(gpm_names) input() if str(BackButton.BACK.name) == gpm_name: return gpm_id = gpm_list[gpm_name] print("select the field to update: \n") menu = Menu() details = [x.name for x in GpmUpdateFields] details.extend([str(BackButton.EXIT.name)]) field = menu.draw_menu(details) input() user_input = input("enter new value for " + str(field) + " ") user_table_fields = [1, 2, 3] # validating field if field == str(GpmUpdateFields.AGE.name): if not Validation.is_int(user_input): print("age is not valid") input() sys.exit() if field == str(GpmUpdateFields.PINCODE.name): if not Validation.pincode(user_input): print("pincode is not valid") input() sys.exit() if field == str(GpmUpdateFields.GENDER.name): if not Validation.gender(user_input): print("gender is not valid") input() sys.exit() query = "" # if field belong to user table if user_table_fields.count(GpmUpdateFields[field].value) == 1: self.conn.update_user(str(field), gpm_id, user_input) else: self.conn.update_personal_details(str(field), gpm_id, user_input) self.conn.commit_data() print("\n" + Color.F_Green + "record updated" + Base.END) except Exception as e: print(e) self.conn.rollback_data() def get_gpm_list(self): """ this method is used to get gpm for current bdo. :return: dict, gpm name and id dictionary. """ result = self.conn.get_user_names(self.bdo_id) gpm_dict = {} for data in result: gpm_dict[data[0]] = data[1] return gpm_dict def create_project(self): """ this method is used to create project for current bdo. """ try: print("choose gpm for project\n") gpm_list = self.get_gpm_list() menu = Menu() gpm_names = [x for x in gpm_list.keys()] gpm_names.extend([str(BackButton.EXIT.name)]) gpm_name = menu.draw_menu(gpm_names) input() gpm_id = gpm_list[gpm_name] print("choose project type:\n") menu2 = Menu() project_types = [x.name for x in ProjectType] project_types.extend([str(BackButton.EXIT.name)]) project_type = menu2.draw_menu(project_types) input() project_id = str(uuid.uuid4()) project_name = input("enter project name: ") labours = input("enter expected labours: ") if not Validation.is_int(labours): print("labours count is not valid") input() sys.exit() cost = input("enter estimated project cost: ") if not Validation.is_int(cost): print("cost is not valid") input() sys.exit() area = input("enter estimated project area: ") if not Validation.is_int(area): print("area is not valid") input() sys.exit() start_date = input("enter estimated start date: ") if not Validation.is_date(start_date): print("start date is not valid") input() sys.exit() end_date = input("enter estimated end date: ") if not Validation.is_date(end_date): print("end date is not valid") input() sys.exit() is_deleted = 'False' created_by = self.bdo_id self.conn.create_project(project_id, project_name, labours, cost, area, start_date, end_date, gpm_id, created_by, project_type, is_deleted) self.conn.commit_data() print("\n" + Color.F_Green + "project created" + Base.END) except Exception as e: print(e) self.conn.rollback_data() def update_project(self): """ this method is used to update project for current bdo. """ print("choose project") project_list = self.get_project_list() menu = Menu() project_names = [x for x in project_list.keys()] project_names.extend( [str(BackButton.EXIT.name), str(BackButton.BACK.name)]) project_name = menu.draw_menu(project_names) input() if str(BackButton.BACK.name) == project_name: return project_id = project_list[project_name] print("select the field to update: \n") menu2 = Menu() details = [x.name for x in ProjectsUpdateFields] details.extend([str(BackButton.EXIT.name)]) field = menu2.draw_menu(details) input() user_input = "" if ProjectsUpdateFields[ field].value == ProjectsUpdateFields.PROJECT_TYPE.value: print("choose project type: \n") menu3 = Menu() project_types = [x.name for x in ProjectType] project_types.extend([str(BackButton.EXIT.name)]) user_input = menu3.draw_menu(project_types) input() else: user_input = input("enter new value for " + str(field) + " ") # validations if field == str(ProjectsUpdateFields.AREA_OF_PROJECT.name): if not Validation.is_int(user_input): print("area is not valid") input() sys.exit() if field == str(ProjectsUpdateFields.TOTAL_LABOUR_REQUIRED.name): if not Validation.is_int(user_input): print("labour required is not valid") input() sys.exit() if field == str(ProjectsUpdateFields.ESTIMATED_START_DATE.name): if not Validation.is_date(user_input): print("start date is not valid") input() sys.exit() if field == str(ProjectsUpdateFields.ESTIMATED_END_DATE.name): if not Validation.is_date(user_input): print("end date is not valid") input() sys.exit() if field == str(ProjectsUpdateFields.ESTIMATED_COST.name): if not Validation.is_int(user_input): print("cost is not valid") input() sys.exit() self.conn.update_project(field, user_input, project_id) self.conn.commit_data() print("\n" + Color.F_Green + "record updated" + Base.END) def delete_project(self): """ this method is used to delete project for current bdo. """ print("choose project") project_list = self.get_project_list() menu = Menu() project_names = [x for x in project_list.keys()] project_names.extend( [str(BackButton.EXIT.name), str(BackButton.BACK.name)]) project_name = menu.draw_menu(project_names) input() if project_name == str(BackButton.BACK.name): return project_id = project_list[project_name] self.project_id = project_id self.project_deletion() print(Color.F_Green + "project deleted successfully " + Base.END) def show_projects(self): """ this method is used to print projects for current bdo. """ result = self.conn.get_bdo_project_details(self.bdo_id) raw_data_to_table(result.fetchall(), result) def get_project_list(self): """ this method is used to get projects list for current bdo. :return: dict, project name and id dictionary. """ result = self.conn.get_bdo_project_names(self.bdo_id) gpm_dict = {} for data in result: gpm_dict[data[0]] = data[1] return gpm_dict def show_requests(self): """ this method is used to show and resolve all requests for current bdo. """ try: projects = self.conn.get_requests(self.bdo_id) # adding index column to given result projects_fields = (('index'), ) + projects.description result = projects.fetchall() counter = 0 # request is empty then returning early with a message if len(result) == 0: print(Color.F_Red + "there is no pending request" + Base.END) return print("write index of request to manage:\n") temp = result # converting list of tuples into list of list temp = [list(elem) for elem in temp] for request in temp: if str(RequestType.APPROVAL.name) == str(request[0]): temp2 = str(request[2]).split('|') request[2] = temp2[0] + " request for " + temp2[ 4] + " project for " + temp2[1] + " member" # inserting data for index column request.insert(0, counter) counter += 1 table = PrettyTable() # assigning field names to pretty table object and removing request id column table.field_names = [column[0] for column in projects_fields[:-1]] for row in temp: # removing request id from temp list and adding to table row table.add_row(row[:-1]) print(table) row_number = input("enter index number: ") if not Validation.is_int(row_number): print("index number is not valid") input() sys.exit() menu = Menu() result_names = [x.name for x in RequestResult] result_names.extend([str(BackButton.EXIT.name)]) result_name = menu.draw_menu(result_names) input() status = "NULL" if str(RequestType.APPROVAL.name) == str( result[int(row_number)][0]): temp = str(result[int(row_number)][2]).split('|') req_type = str(temp[0]) self.project_id = str(temp[3]) self.member_id = str(temp[2]) if req_type == str( ApprovalType.WAGE.name) and str(result_name) == str( RequestResult.APPROVED.name): self.delete_project_members() status = "'True'" elif req_type == str( ApprovalType.MEMBER.name) and str(result_name) == str( RequestResult.APPROVED.name): project_members_id = self.conn.get_project_members( self.project_id) members_required = self.conn.get_project_members_required( self.project_id) # checking if total number of members in given project are less then actual project requirement if members_required[0] <= len(project_members_id): print( Color.F_Red + "project members limit exceeded can't accept request" + Base.END) return self.conn.assign_project_members(self.project_id, self.member_id) status = "'True'" elif str(result_name) == str(RequestResult.REJECTED.name): status = "'False'" else: if str(result_name) == str(RequestResult.APPROVED.name): status = "'True'" elif str(result_name) == str(RequestResult.REJECTED.name): status = "'False'" self.conn.resolve_request(status, result[int(row_number)][4]) self.conn.commit_data() print(Color.F_Green + "Request completed successfully" + Base.END) except Exception as e: print(e) self.conn.rollback_data() def delete_project_members(self): """ this method is used to delete project members for current bdo. """ result = self.conn.get_member_project(self.member_id) if result is None: return # removing member from project duration = datetime.datetime.now() - datetime.datetime.strptime( str(result[2]), '%Y-%m-%d') wage = duration.days * 100 self.conn.register_project_completion(result[0], self.member_id, result[2], datetime.datetime.now().date(), wage) self.conn.remove_project_member(self.member_id) # checking if other members are assigned to this project result2 = self.conn.find_project_is_assigned(result[0]) # deleting whole project if len(result2) == 0: self.conn.update_project('is_deleted', 'True', result[0]) def project_deletion(self): """ this method is used to delete project for current bdo. """ try: result = self.conn.get_project_members_list(self.project_id) if len(result) != 0: for project_member in result: duration = datetime.datetime.now( ) - datetime.datetime.strptime(str(project_member[2]), '%Y-%m-%d') wage = duration.days * 100 self.conn.register_project_completion( project_member[0], project_member[1], project_member[2], datetime.datetime.now().date(), wage) self.conn.remove_project_all_members(self.project_id) self.conn.update_project('is_deleted', 'True', self.project_id) # removing project pending requests pending_requests = self.conn.get_bdo_approvals_list(self.bdo_id) pending_requests_ids = [] for request in pending_requests: temp = str(request[1]).split('|') if str(temp[3]) == str(self.project_id): pending_requests_ids.append(request[0]) for pending_requests_id in pending_requests_ids: self.conn.resolve_request("'True'", pending_requests_id) self.conn.commit_data() except Exception as e: print(e) self.conn.rollback_data()
class GPM: """this is a class for GPM related operations. Attributes: conn (sqlite connection): connection object. bdo_id (string): bdo id. project_id (string): project id. gpm_id (string): gpm id. member_id (string): member id. """ def __init__(self): """ initializing GPM class . """ self.conn = ConnectDb() self.project_id = ' ' self.gpm_id = ' ' self.bdo_id = '' self.member_id = '' def __del__(self): """ closing database connection. """ self.conn.close_conn() def gpm_features(self): """ this method is used to print all gpm features on console. """ try: print("choose feature :\n") menu = Menu() features = [x.name for x in GpmFeatures] features.extend([str(BackButton.EXIT.name)]) feature = menu.draw_menu(features) input() required_feature = getattr(self, feature.lower()) required_feature() # again calling gpm menu input() os.system('clear') self.gpm_features() except Exception as e: print(e) sys.exit() def show_projects(self): """ this method is used to print all project of current gpm. """ projects = self.conn.get_gpm_projects_details(self.gpm_id) result = projects.fetchall() raw_data_to_table(result, projects) def project_completion(self): """ this method is used to complete project of current gpm. """ try: print("choose project") project_list = self.get_project_list() menu = Menu() project_names = [x for x in project_list.keys()] project_names.extend([str(BackButton.EXIT.name), str(BackButton.BACK.name)]) project_name = menu.draw_menu(project_names) input() if str(BackButton.BACK.name) == project_name: return project_id = project_list[project_name] self.project_id = project_id member_ids = self.conn.get_project_members(self.project_id) if len(member_ids) == 0: print(Color.F_Red+"Can't send project completion request to BDO \n because " "no member assigned to this project \n"+Base.END) else: for member_id in member_ids: self.member_id = member_id[0] self.delete_project_request() self.conn.commit_data() print(Color.F_Green + "Wage Request sent to BDO for all the assigned members \n "+ Base.END) except sqlite3.Error as e: print(e) self.conn.rollback_data() def assign_members_to_projects(self): """ this method is used to assign member to project of current gpm. """ print("choose project") project_list = self.get_project_list() menu = Menu() project_names = [x for x in project_list.keys()] project_names.extend([str(BackButton.EXIT.name), str(BackButton.BACK.name)]) project_name = menu.draw_menu(project_names) input() if str(BackButton.BACK.name) == project_name: return project_id = project_list[project_name] print("choose member for project") members_list = self.get_members_list() self.project_id = project_id project_members_id = self.conn.get_project_members(self.project_id) # removing already assigned members from the list for id in project_members_id: temp = None for key, value in members_list.items(): if id[0] == value: temp = key break members_list.pop(temp, None) members_required = self.conn.get_project_members_required(self.project_id) # checking if total number of members in given project are less then actual project requirement if int(members_required[0]) <= len(project_members_id): print(Color.F_Red + "members limit exceeded" + Base.END) return menu = Menu() member_names = [x for x in members_list.keys()] member_names.extend([str(BackButton.EXIT.name)]) member_name = menu.draw_menu(member_names) input() member_id = members_list[member_name] self.member_id = member_id self.assign_project_members_request() def complete_member_project(self): """ this method is used to complete project of current gpm. """ try: print("choose project") project_list = self.get_project_list() menu = Menu() project_names = [x for x in project_list.keys()] project_names.extend([str(BackButton.EXIT.name), str(BackButton.BACK.name)]) project_name = menu.draw_menu(project_names) input() if str(BackButton.BACK.name) == project_name: return project_id = project_list[project_name] self.project_id = project_id member_ids = self.conn.get_project_member_name(self.project_id) member_dict = {} for data in member_ids: member_dict[data[1]] = data[0] menu = Menu() member_names = [x for x in member_dict.keys()] member_names.extend([str(BackButton.EXIT.name)]) member_name = menu.draw_menu(member_names) input() member_id = member_dict[member_name] self.member_id = member_id self.delete_project_request() self.conn.commit_data() print(Color.F_Green + "member removal request sent to BDO" + Base.END) except sqlite3.Error as e: print(e) self.conn.rollback_data() def create_members(self): """ this method is used to create member under current gpm. """ try: name = input("enter member name ") id = str(uuid.uuid4()) password = input("enter password for member ") if not Validation.password(password): print("password is weak") input() return user_name = input("enter user name for member ") role_id = int(Role.Member.value) created_at = datetime.datetime.now().date() updated_at = datetime.datetime.now().date() is_deleted = 'False' state = input("enter state ") district = input("enter district ") pincode = input("enter pincode ") if not Validation.pincode(pincode): print("pincode is not valid") input() return age = input("enter age ") if not Validation.age(age): print("age is not valid") input() return gender = input("enter gender ") if not Validation.gender(gender): print("gender is not valid") input() return created_by = self.gpm_id encrypted_pass = encrypt_pass(password) self.conn.add_user(id, encrypted_pass, user_name, role_id, created_at, updated_at, name, is_deleted) self.conn.add_personal_details(id, state, district, pincode, age, gender, created_by) self.conn.commit_data() print("\n" + Color.F_Green + "record inserted" + Base.END) except Exception as e: print(e) self.conn.rollback_data() def update_members(self): """ this method is used to update member details of current gpm. """ try: members_list = self.get_members_list() menu = Menu() members_names = [x for x in members_list.keys()] members_names.extend([str(BackButton.EXIT.name), str(BackButton.BACK.name)]) members_name = menu.draw_menu(members_names) input() if str(BackButton.BACK.name) == members_name: return members_id = members_list[members_name] print("select the field to update: \n") menu = Menu() details = [x.name for x in GpmUpdateFields] details.extend([str(BackButton.EXIT.name)]) field = menu.draw_menu(details) input() user_input = input("enter new value for " + str(field)+" ") user_table_fields = [1, 2, 3] # validations if field == str(GpmUpdateFields.PASSWORD.name): if not Validation.password(user_input): print("password is weak") input() return user_input = encrypt_pass(user_input) if field == str(GpmUpdateFields.GENDER.name): if not Validation.gender(user_input): print("gender is not valid") input() return if field == str(GpmUpdateFields.PINCODE.name): if not Validation.pincode(user_input): print("pincode is not valid") input() return if field == str(GpmUpdateFields.AGE.name): if not Validation.age(user_input): print("age is not valid") input() return # if field belong to user table if user_table_fields.count(GpmUpdateFields[field].value) == 1: self.conn.update_user(str(field), members_id, user_input) else: self.conn.update_personal_details(str(field), members_id, user_input) self.conn.commit_data() print("\n" + Color.F_Green + "record updated" + Base.END) except Exception as e: print(e) self.conn.rollback_data() def show_members(self): """ this method is used to print all members of current gpm. """ details_cursor = self.conn.get_subordinate_details(self.gpm_id) members_list = details_cursor.fetchall() if len(members_list) == 0: print(Color.F_Green + "you don't have any member under you" + Base.END) return # converting list of tuples into list of list list_data = [list(elem) for elem in members_list] for member in list_data: member[2] = decrypt_pass(member[2]) raw_data_to_table(list_data, details_cursor) def get_project_list(self): """ this method is used to get all project of current gpm. :return: dict, project name and id dictionary """ result = self.conn.get_gpm_project_names(self.gpm_id) gpm_dict = {} for data in result: gpm_dict[data[0]] = data[1] return gpm_dict def assign_project_members_request(self): """ this method is used send wage request for given member of current project. """ try: bdo_id = self.conn.get_created_by_id(self.gpm_id) self.bdo_id = bdo_id[0] # check for similar request old_requests = self.conn.get_approvals_list(self.gpm_id) for old_request in old_requests: old_request_data = old_request[0].split('|') if old_request_data[0] == str(ApprovalType.MEMBER.name) and old_request_data[2] == self.member_id and\ old_request_data[3] == self.project_id: print(Color.F_Red + "already have similar request" + Base.END) return request_msg = str(ApprovalType.MEMBER.name) + "|" name = self.conn.get_user_name(self.member_id) project_name = self.conn.get_project_name(self.project_id) request_msg += str(name[0]) + "|" + self.member_id + "|" + self.project_id+'|'+str(project_name[0]) self.conn.register_complain(str(RequestType.APPROVAL.name), self.gpm_id, request_msg, self.bdo_id) self.conn.commit_data() print(Color.F_Green+"member assigned request sent to BDO"+Base.END) except sqlite3.Error as e: print(e) self.conn.rollback_data() def delete_project_request(self): """ this method is used send wage request for all members of current project. """ try: bdo_id = self.conn.get_created_by_id(self.gpm_id) self.bdo_id = bdo_id[0] # check for similar request old_requests = self.conn.get_approvals_list(self.gpm_id) for old_request in old_requests: old_request_data = old_request[0].split('|') if old_request_data[0] == str(ApprovalType.WAGE.name) and old_request_data[2] == self.member_id and \ old_request_data[3] == self.project_id: print(Color.F_Red + "already have similar request" + Base.END) return request_msg = str(ApprovalType.WAGE.name)+"|" name = self.conn.get_user_name(self.member_id) project_name = self.conn.get_project_name(self.project_id) request_msg += str(name[0])+"|"+self.member_id+"|"+self.project_id+'|'+str(project_name[0]) self.conn.register_complain(str(RequestType.APPROVAL.name), self.gpm_id, request_msg, self.bdo_id) self.conn.commit_data() print(Color.F_Green+"member project wage request sent to BDO"+Base.END) except sqlite3.Error as e: print(e) self.conn.rollback_data() def show_requests(self): """ this method is used show request and resolve request of current gpm. """ try: projects = self.conn.get_requests(self.gpm_id) result = projects.fetchall() counter = 0 # getting columns for showing requests and adding index column at first in list projects_fields = (('index'),) + projects.description # request is empty then returning early with a message if len(result) == 0: print(Color.F_Red + "there is no pending request" + Base.END) return temp = result # converting list of tuples into list of list temp = [list(elem) for elem in temp] print("write index of request to manage:\n") for request in temp: request.insert(0, counter) counter += 1 table = PrettyTable() table.field_names = [column[0] for column in projects_fields[:-1]] for row in temp: table.add_row(row[:-1]) print(table) row_number = input("enter index number: ") if not Validation.is_int(row_number): print("row number is not valid") input() return menu = Menu() result_names = [x.name for x in RequestResult] result_names.extend([str(BackButton.EXIT.name)]) result_name = menu.draw_menu(result_names) input() status = "NULL" if str(result_name) == str(RequestResult.APPROVED.name): status = "'True'" elif str(result_name) == str(RequestResult.REJECTED.name): status = "'False'" self.conn.resolve_request(status, result[int(row_number)][4]) self.conn.commit_data() print(Color.F_Green + "Request completed successfully" + Base.END) except Exception as e: print(e) self.conn.rollback_data() def get_members_list(self): """ returns members list under given gpm :return: dict, member names and id dictionary """ result = self.conn.get_user_names(self.gpm_id) gpm_dict = {} for data in result: gpm_dict[data[0]] = data[1] return gpm_dict
def test_commit_data(self, mock_cursor): # act db = ConnectDb() db.commit_data() # assert mock_cursor().commit.assert_called_once()
class Employee: """this is a class for employee related operations.""" def __init__(self): """ initializing Employee class. """ self.conn = ConnectDb() self.employee_id = '' def __del__(self): """ closing database connection. """ self.conn.close_conn() def employee_features(self): """ this method is used to print all employee features on console. """ try: while True: supervisor_role = self.conn.get_user_role(self.employee_id, Role.SUPERVISOR.value) if supervisor_role is not None: print(Color.F_Red, '\nYou are supervisor also.', Base.END) print(Color.F_Red, 'for more info contact admin.', Base.END) print("choose feature :\n") menu = Menu() features = [x.name for x in MemberFeatures] features.extend([str(BackButton.EXIT.name)]) feature = menu.draw_menu(features) input() required_feature = getattr(self, feature.lower()) required_feature() # again calling employee menu input() os.system('clear') self.employee_features() except Exception as e: print(e) sys.exit() def file_complain(self): """ this method is used to file complain. """ accident_types = self.conn.get_accident_types() accident_types_list = [x[1] for x in accident_types] menu = Menu() print("\n Choose accident type: \n") accident_types_list.extend([str(BackButton.BACK.name), str(BackButton.EXIT.name)]) accident_type = menu.draw_menu(accident_types_list) input() os.system('clear') if accident_type == str(BackButton.BACK.name): return accident_id = [x[0] for x in accident_types if x[1] == accident_type] location = input('enter accident location: ') complain_dict = dict() complain_dict['type'] = accident_id[0] complain_dict['timestamp'] = d.datetime.now() complain_dict['created_by'] = self.employee_id complain_dict['location'] = location complain_dict['status'] = AccidentStatus.NEW.name try: self.conn.report_new_accident(complain_dict) self.conn.commit_data() print("\n" + Color.F_Green + "record inserted" + Base.END) except Exception as e: print("\n" + Color.F_Red + "some exception occurred" + Base.END) print("reason:", e)
class Admin: """this is a class for admin related operations.""" def __init__(self): """ initializing Employee class. """ self.conn = ConnectDb() self.admin_id = '' def __del__(self): """ closing database connection. """ self.conn.close_conn() def admin_features(self): """ this method is used to print all admin features on console. """ try: while True: print("choose feature :\n") menu = Menu() features = [x.name for x in AdminFeatures] features.extend([str(BackButton.EXIT.name)]) feature = menu.draw_menu(features) input() required_feature = getattr(self, feature.lower()) required_feature() # again calling admin menu input() os.system('clear') self.admin_features() except Exception as e: print(e) sys.exit() def create_employee(self): """ this method is used to register new employee in system. """ user_dict = dict() user_dict['name'] = input('enter name of employee ') user_dict['password'] = input_validation("enter password for employee ", Validation.password, "Weak Password") user_dict['email'] = input_validation("enter email for employee ", Validation.is_email, "Invalid Email") user_dict['phone_number'] = input_validation("enter employee phone number ", Validation.is_phone, "Invalid Phone Number") user_dict['created_at'] = d.datetime.now() user_dict['updated_at'] = d.datetime.now() user_dict['is_deleted'] = False user_dict['designation'] = input('enter designation of employee ') try: while True: user_dict['user_name'] = input('enter user_name for employee ') try: self.conn.create_employee(user_dict) self.conn.commit_data() print(Color.F_Green, 'Record inserted', Base.END) input() break except sqlite3.IntegrityError: print(Color.F_Red, 'user name is taken by some one else', Base.END) except Exception: print(Color.F_Red, 'some internal error occurred', Base.END) self.conn.rollback_data() def update_employee(self): """ this method is used to update employee details. """ cursor = self.conn.show_members() emp_id = self.show_table_menu(cursor) if emp_id is None: return columns = self.conn.worker_table_fields() print("choose attribute :\n") menu = Menu() columns.extend([str(BackButton.BACK.name), str(BackButton.EXIT.name)]) column = menu.draw_menu(columns) input() user_input = '' if column == str(BackButton.BACK.name): return elif column == str(MemberUpdateColumns.password.name): user_input = encrypt_pass(input_validation("enter new value: ", Validation.password, 'Weak password')) elif column == str(MemberUpdateColumns.email.name): user_input = input_validation("enter new value: ", Validation.is_email, 'Invalid Email') elif column == str(MemberUpdateColumns.phone_number.name) and not Validation.is_phone(user_input): user_input = input_validation("enter new value: ", Validation.is_phone, "Invalid Phone Number") else: user_input = input("enter new value: ") try: self.conn.update_member(emp_id, column, user_input) self.conn.commit_data() print(Color.F_Red, 'Record Updated', Base.END) except sqlite3.IntegrityError: print(Color.F_Red, 'user_name already taken', Base.END) except Exception: print(Color.F_Red, 'some internal error occurred', Base.END) def delete_employee(self): """ this method is used to delete employee details. """ cursor = self.conn.show_members() emp_id = self.show_table_menu(cursor) if emp_id is None: return try: self.conn.delete_member(emp_id) self.conn.delete_user_all_roles(emp_id) self.conn.commit_data() print(Color.F_Red, 'Record Deleted', Base.END) except Exception: print(Color.F_Red, 'some internal error occurred', Base.END) self.conn.rollback_data() def show_final_reports(self): """ this method is used to show final reports. """ cursor = self.conn.show_final_reports() columns = [x[0] for x in cursor.description] data = [list(x) for x in cursor.fetchall()] for x in data: x[3] = [list(x)[0] for x in self.conn.fetch_emails(x[3].split(','))] x[5] = [list(x)[0] for x in self.conn.fetch_emails(x[5].split(','))] raw_data_to_table(columns, data) def accident_complains(self): """ this method is used to see accident complains and also perform necessary actions to it. """ flag = True options = [str(AccidentStatus.NEW.name), str(AccidentStatus.WIP.name), str(BackButton.BACK.name)] menu = Menu() column = menu.draw_menu(options) input() if column == str(BackButton.BACK.name): return cursor = '' if column == str(AccidentStatus.NEW.name): cursor = self.conn.show_status_accidents(str(AccidentStatus.NEW.name)) flag = False if column == str(AccidentStatus.WIP.name): cursor = self.conn.show_status_accidents(str(AccidentStatus.WIP.name)) accident_id = self.show_table_menu(cursor) if accident_id is None: return print('choose operation: \n') menu = Menu() options = [str(AdminSupervisorOperation.ADD_SUPERVISOR.name)] if flag: options.append(str(AdminSupervisorOperation.REMOVE_SUPERVISOR.name)) supervisor_operation = menu.draw_menu(options) input() print('choose a supervisor for given accident') accident_supervisors = self.conn.get_accident_members(accident_id) accident_supervisors = [list(x)[0] for x in accident_supervisors] cursor = self.conn.show_members() if supervisor_operation == str(AdminSupervisorOperation.ADD_SUPERVISOR.name): member_id = self.show_table_menu(cursor, remove_ids=accident_supervisors) if member_id is None: return self.add_supervisor(accident_id, member_id) elif supervisor_operation == str(AdminSupervisorOperation.REMOVE_SUPERVISOR.name): member_id = self.show_table_menu(cursor, take_ids=accident_supervisors) if member_id is None: return self.remove_supervisor(accident_id, member_id) def remove_supervisor(self, accident_id, member_id): """ this method is used to remove supervisor from given project. :param accident_id: string, accident id :param member_id: string, member id """ try: self.conn.remove_supervisor_accident(member_id, accident_id) self.conn.commit_data() if not self.conn.check_supervisor_accident(member_id): self.conn.remove_supervisor_role(member_id) self.conn.commit_data() print(Color.F_Green, 'record changed', Base.END) except: print(Color.F_Red, 'some internal error occurred', Base.END) self.conn.rollback_data() def add_supervisor(self, accident_id, member_id): """ this method is used to add supervisor to given project. :param accident_id: string, accident id :param member_id: string, member id """ try: try: self.conn.change_accident_to_wip(accident_id) self.conn.commit_data() self.conn.add_accident_supervisor(accident_id, member_id) self.conn.commit_data() except sqlite3.IntegrityError: pass try: self.conn.add_supervisor_role(member_id) self.conn.commit_data() print(Color.F_Green, 'record inserted', Base.END) except sqlite3.IntegrityError: print(Color.F_Green, 'record inserted', Base.END) except: print(Color.F_Red, 'some internal error occured', Base.END) self.conn.rollback_data() def show_table_menu(self, cursor, remove_ids=[-1], take_ids=[-1]): """ this method is used to select employee/accidents from existing data. :param: cursor, data cursor. :param: list, ids to be removed from cursor data. :return: int, employee/accident id. """ counter = 0 actual_data = [list(elem) for elem in cursor.fetchall()] if remove_ids != [-1]: actual_data = list(filter(lambda x: x[0] not in remove_ids, actual_data)) if take_ids != [-1]: actual_data = list(filter(lambda x: x[0] in take_ids, actual_data)) raw_data = list() for elem in actual_data: temp = list(elem)[1:] temp.insert(0, counter) raw_data.append(temp) counter += 1 field_names = [column[0] for column in cursor.description][1:] field_names.insert(0, 'index') raw_data_to_table(field_names, raw_data) index = input('write index to choose record: ') try: index = int(index) if 0 <= index < len(raw_data): return actual_data[index][0] else: print('wrong choice') return None except Exception as e: print('wrong choice') return None def choose_multiple_employee(self): """ this method is used to choose multiple employees. :return: list, employees list """ cursor = self.conn.show_members() counter = 0 actual_data = [list(elem) for elem in cursor.fetchall()] raw_data = list() for elem in actual_data: temp = list(elem)[1:] temp.insert(0, counter) raw_data.append(temp) counter += 1 field_names = [column[0] for column in cursor.description][1:] field_names.insert(0, 'index') raw_data_to_table(field_names, raw_data) index = input('write comma separated indexes to choose multiple records: ') temp = list() try: for x in index.split(','): x = int(x) if 0 <= x < len(raw_data): temp.append(str(actual_data[x][0])) return temp except Exception as e: print('wrong choice') return None def manage_supervisor_reports(self): """ this method is used to manage all supervisor reports. """ options = [str(AccidentStatus.WIP.name), str(AccidentStatus.RESOLVED.name), str(BackButton.BACK.name)] menu = Menu() column = menu.draw_menu(options) input() if column == str(BackButton.BACK.name): return if column == str(AccidentStatus.RESOLVED.name): cursor = self.conn.show_status_accident_report(str(AccidentStatus.RESOLVED.name)) raw_data_to_table([list(x)[0] for x in cursor.description], [list(x) for x in cursor.fetchall()]) elif column == str(AccidentStatus.WIP.name): cursor = self.conn.show_status_accident_report(str(AccidentStatus.WIP.name)) print('choose to finalize report (for any accident choose any record with similar accident id)') accident_id = self.show_table_menu(cursor) if accident_id is None: return print('choose victims') victims = self.choose_multiple_employee() print('choose culprit') culprit = self.choose_multiple_employee() temp_dict = dict() temp_dict['victims'] = '' temp_dict['culprit'] = '' if culprit != [] and culprit != None: temp_dict['culprit'] = ','.join(culprit) if victims != [] and victims != None: temp_dict['victims'] = ','.join(victims) temp_dict['location'] = input('write accident location: ') temp_dict['submission_time'] = d.datetime.now() temp_dict['time_of_accident'] = input('write time of accident ') temp_dict['action_to_resolve'] = input('write action to resolve ') temp_dict['reason'] = input('write accident reason ') temp_dict['accident_id'] = accident_id try: self.conn.close_accident_cases(accident_id) self.conn.insert_finalize_report(temp_dict) self.conn.commit_data() print('record inserted') except Exception as e: self.conn.rollback_data() print('some internal error occurred') print(e)
class Member: """this is a class for member related operations. Attributes: conn (sqlite connection): connection object. member_id (string): member id. """ def __init__(self): """ initializing BDO class . """ self.conn = ConnectDb() self.member_id = "" def __del__(self): """ closing database connection. """ self.conn.close_conn() def member_features(self): """ this method is used to print all bdo features on console. """ try: print("choose feature :\n") menu = Menu() features = [x.name for x in MemberFeatures] features.extend([str(BackButton.EXIT.name)]) feature = menu.draw_menu(features) input() required_feature = getattr(self, feature.lower()) required_feature() # calling member features again input() os.system('clear') self.member_features() except Exception as e: print(e) sys.exit() def view_details(self): """ this method is used to print member details on console. """ member_details = self.conn.get_member_details(self.member_id) if member_details is None: print("you are not longer part of this system") input() sys.exit() project_details = self.conn.get_member_project(self.member_id) password = decrypt_pass(member_details[1]) # printing personal details print(Base.BOLD + "Personal Details" + Base.END + "\n") print("Name: " + Color.F_Green + member_details[4] + Base.END) print("Password: "******"User name: " + Color.F_Green + member_details[2] + Base.END) print("Created at: " + Color.F_Green + member_details[3] + Base.END) print("State: " + Color.F_Green + member_details[5] + Base.END) print("District: " + Color.F_Green + member_details[6] + Base.END) print("Pincode: " + Color.F_Green + str(member_details[7]) + Base.END) print("Age: " + Color.F_Green + str(member_details[8]) + Base.END) print("Gender: " + Color.F_Green + member_details[9] + Base.END) print("Assigned Gram Panchayat Member: " + Color.F_Green + member_details[10] + Base.END + "\n") # printing member project details print(Base.BOLD + "Project Details" + Base.END + "\n") if project_details is None: print(Color.F_Red + "you are not assigned to any project\n" + Base.END) else: duration = datetime.datetime.now() - datetime.datetime.strptime( str(project_details[0]), '%Y-%m-%d') wage = duration.days * 100 print("Project Name: " + Color.F_Green + project_details[1] + Base.END) print("assigned Date: " + Color.F_Green + project_details[0] + Base.END) print("Project Type: " + Color.F_Green + project_details[2] + Base.END) print("Total working days: " + Color.F_Green + str(duration) + Base.END) print("Total wage: " + Color.F_Green + str(wage) + Base.END) def file_complain(self): """ this method is used to file complain for current member to bdo/gpm. """ try: print("Choose a complain recipient:\n") menu = Menu() recipients = [x.name for x in ComplainRecipients] recipients.extend( [str(BackButton.EXIT.name), str(BackButton.BACK.name)]) recipient = menu.draw_menu(recipients) input() if str(BackButton.BACK.name) == recipient: return member_details = self.conn.get_bdo_gpm_for_member(self.member_id) if member_details is None: print("you don't have any manager to file complain") return recipient_id = "" if recipient == str(ComplainRecipients.BDO.name): recipient_id = member_details[2] elif recipient == str(ComplainRecipients.GPM.name): recipient_id = member_details[1] else: print(Color.F_Red + "Invalid option" + Base.END) return request_msg = input("enter your request: ") self.conn.register_complain(str(RequestType.ISSUES.name), self.member_id, request_msg, recipient_id) self.conn.commit_data() print(Color.F_Green + "Request sent to " + recipient + Base.END) except sqlite3.Error as e: print(e) self.conn.rollback_data()