From 717110ce75fd885cdab017512abb83b4fd9cdd02 Mon Sep 17 00:00:00 2001 From: PAN Lei Date: Wed, 16 Mar 2022 22:17:11 +0100 Subject: [PATCH] exported all the valid profiles --- check_results.py | 1 - db/DbManager.py | 5 ++- export_valid_profiles.py | 57 ++++++++++++++++++++++++++++ main.py | 4 +- ModemPool.py => modems/ModemPool.py | 0 card_pool.py => modems/card_pool.py | 0 reset_all_sim_card.py | 2 +- valid_profile.xlsx | Bin 0 -> 18016 bytes 8 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 export_valid_profiles.py rename ModemPool.py => modems/ModemPool.py (100%) rename card_pool.py => modems/card_pool.py (100%) create mode 100644 valid_profile.xlsx diff --git a/check_results.py b/check_results.py index 586a715..884a2a7 100644 --- a/check_results.py +++ b/check_results.py @@ -3,7 +3,6 @@ from enum import Enum from playwright.sync_api import sync_playwright import params -from db.DbManager import DataManager from logs.LogSender import TYPE_EVENT_CHECK_RESULTS, LOG_SUBJECT_EVENT from pojo.ReserveResultPojo import ReserveResultPojo diff --git a/db/DbManager.py b/db/DbManager.py index 9bb0740..bf60153 100644 --- a/db/DbManager.py +++ b/db/DbManager.py @@ -39,7 +39,10 @@ class DataManager: return sim_info_collection def get_all_successful_items(self): - doc_ref = self._db.collection(str(datetime.date.today())) + return self.get_all_successful_items_for_day(str(datetime.date.today())) + + def get_all_successful_items_for_day(self, day): + doc_ref = self._db.collection(day) return doc_ref def save_sim_info(self, simInfoPojo: SimInfoPojo): diff --git a/export_valid_profiles.py b/export_valid_profiles.py new file mode 100644 index 0000000..13b8650 --- /dev/null +++ b/export_valid_profiles.py @@ -0,0 +1,57 @@ +import xlsxwriter + +import params +from pojo.ReserveResultPojo import ReserveResultPojo +from pojo.contact_pojo import ContactPojo +from utils.excel_reader import ExcelHelper + + +def write_the_valid_profiles_to_excel(): + day_list = ['2022-03-04', '2022-03-07', '2022-03-08', '2022-03-09', '2022-03-10', '2022-03-11', '2022-03-14', + '2022-03-15', '2022-03-16'] + collection = [] + for day in day_list: + collection.extend(params.firebase_store_manager.get_all_successful_items_for_day(day).stream()) + + valid_contacts = [] + exist_contacts = ExcelHelper().read_contacts() + for valid_appointment in collection: + reserve_pojo = ReserveResultPojo.from_firestore_dict(valid_appointment.to_dict()) + # check whether the contact exists already + exist = [contact for contact in valid_contacts if contact.mail == reserve_pojo.email] + if len(exist) == 0: + contact = ContactPojo(reserve_pojo.phone, passport_number=reserve_pojo.passport, + last_name=reserve_pojo.lastName, first_name=reserve_pojo.firstName, ccid="", + mail=reserve_pojo.email, position=0) + if contact.passport == None or len(contact.passport) == 0: + old_contact = [item for item in exist_contacts if item.mail == contact.mail] + if len(old_contact) > 0: + contact.passport = old_contact[0].passport + + print(contact) + valid_contacts.append(contact) + + row = 0 + col = 0 + # Create a workbook and add a worksheet. + workbook = xlsxwriter.Workbook('valid_profile.xlsx') + header_data = ['name', 'phone', 'passport', 'email', 'ccid', 'position'] + worksheet = workbook.add_worksheet() + header_format = workbook.add_format({'bold': True}) + + for col_num, data in enumerate(header_data): + worksheet.write(row, col_num, data, header_format) + row = row + 1 + for info in valid_contacts: + # Iterate over the data and write it out row by row. + worksheet.write(row, col, "{} {}".format(info.last_name, info.first_name)) + worksheet.write(row, col + 1, info.phone) + worksheet.write(row, col + 2, info.passport) + worksheet.write(row, col + 3, info.mail) + worksheet.write(row, col + 4, info.ccid) + row += 1 + workbook.close() + + +if __name__ == '__main__': + write_the_valid_profiles_to_excel() diff --git a/main.py b/main.py index 029ec77..2303ef1 100644 --- a/main.py +++ b/main.py @@ -8,8 +8,8 @@ from typing import Union from gsmmodem import GsmModem import params -from ModemPool import ModemPool -from card_pool import CardPool +from modems.ModemPool import ModemPool +from modems.card_pool import CardPool from commandor import Commandor from logs.LogSender import LOG_APPOINTMENT_TIMEOUT, LOG_SUBJECT_EVENT, TYPE_EVENT_RESET_ALL_SIM_CARDS from params import MODEM_POOL_PORTS, CARD_POOL_PORT, firebase_store_manager, oracle_log_sender diff --git a/ModemPool.py b/modems/ModemPool.py similarity index 100% rename from ModemPool.py rename to modems/ModemPool.py diff --git a/card_pool.py b/modems/card_pool.py similarity index 100% rename from card_pool.py rename to modems/card_pool.py diff --git a/reset_all_sim_card.py b/reset_all_sim_card.py index ca9320a..aa40c6a 100644 --- a/reset_all_sim_card.py +++ b/reset_all_sim_card.py @@ -1,7 +1,7 @@ import logging import params -from ModemPool import ModemPool +from modems.ModemPool import ModemPool from logs.AppLogging import init_logger from logs.LogSender import LOG_SUBJECT_EVENT, TYPE_EVENT_RESET_ALL_SIM_CARDS from main import card_pool, get_devices_ports diff --git a/valid_profile.xlsx b/valid_profile.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..45e7b9da47a896542b74f8c9e2656bde90c83bbd GIT binary patch literal 18016 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