def run(self): parser = argparse.ArgumentParser( description='a sms console helper to manage sms' ) parser.add_argument('--create', '-c', action='store_true', help='create a new database') parser.add_argument('--list-messages', '-l', action='store_true', help='list all messages') parser.add_argument('--update-contact', '-u', action='store_true', help='update sms that contact is none') parser.add_argument('--import-best-message-storer', '-B', type=argparse.FileType('r'), metavar='FILE', nargs='+', help='import messages from Best MessageStorer backups') parser.add_argument('--import-sms-backup-and-restore', '-S', type=argparse.FileType('r'), metavar='FILE', nargs='+', help='import messages from Sms Backup & Restore') args = parser.parse_args() if args.create: self.create_all() elif args.list_messages: self.list_messages() elif args.update_contact: update_sms() elif args.import_best_message_storer != None: for text in args.import_best_message_storer: best_message_storer_parser = Best_message_storer_parser( text.read().decode('utf-16le') ) smses = best_message_storer_parser.parse() session.add_all(smses) session.commit() best_message_storer_parser.print_result() elif not args.import_sms_backup_and_restore is None: for xml in args.import_sms_backup_and_restore: sms_backup_restore_parser = SmsBackupAndRestoreParser( xml.read().decode('utf-8') ) smses = sms_backup_restore_parser.parse() session.add_all(smses) session.commit() sms_backup_restore_parser.print_result() else: parser.print_help()
def add_records(target_meets_ids): # 大会IDのリストから1大会ごとにRecordの行を生成しDBに追加 notify_line( f"目標大会をセット。{target_meets_ids[0]}から{target_meets_ids[-1]}。{len(target_meets_ids)}大会の全記録調査開始" ) record_length = 0 # 追加した行数 erased = 0 # 削除した行数 skipped = 0 # 飛ばした種目数 events_count = 0 # 対象の種目数 for meet_id in Takenoko(target_meets_ids): events_list = scraper.all_events(meet_id) # Eventインスタンスのリスト events_count += (sub_total := len(events_list)) # 既にDBにある同一大会IDの記録を抽出し、それぞれの種目IDが何行あるかを調べる # しかしこれでは記録数変わらずに記録の中身(タイムが空白からアップデートされたとき)に対応できない existing_records_in_meet = session.query( Record.event).filter_by(meet_id=meet_id).all() existing_event_id_list = [e.event for e in existing_records_in_meet] for event in events_list: event.crawl() # print(f'{event.event_id} / {sub_total} in {event.meet_id}') if existing_event_id_list.count(event.event_id) != len( event.rows): # 記録数が一致していなかったら削除して登録し直し erased += session.query(Record).filter_by( meet_id=event.meet_id, event=event.event_id).delete() records = [Record(*args) for args in event.parse_table()] for rc in records: rc.set_team() rc.set_swimmer() session.add_all(records) record_length += len(records) session.commit() else: skipped += 1 notify_line( f'{erased}件を削除 {record_length}件を新規に保存 現在:{format(count_records(), ",")}件\n{events_count}種目中{skipped}をスキップ' )
def scan(self): # init scan model scan = Scan() scan.scan_started_at = datetime.now() scan.scan_by = User.current_user() for key, value in self.selectMapper.iteritems(): for plug in value['plugins']: options = getFormValue(plug.options) for ret in plug.execute(options): finding = Finding(**ret) if not finding.name: finding.name = plug.name finding.scan = scan finding.plugin_name = plug.name finding.plugin_group = plug.group finding.plugin_options = str(options) scan.findings.append(finding) scan.scan_finished_at = datetime.now() try: session.add(scan) session.add_all(scan.findings) session.commit() except IntegrityError, e: QMessageBox.information(self, u"SQL错误", u"扫描结果储存失败\n" + e.message)
def add_meets(year, force=False): notify_line(f"各地域の大会情報の収集を開始。対象:20{year}年") meet_ids = [] # for area_int in Takenoko(range(14,15)): # ローカル用 for area_int in Takenoko(list(range(1, 54)) + [70, 80]): # 本番用 1から53までと全国70国際80がarea番号になる meet_ids.extend(scraper.find_meet(year, area_int)) saved_meets = session.query(func.sum( Meet.meet_id)).filter_by(year=year).scalar() if force or sum(meet_ids) != saved_meets: # 大会IDの合計値が一致しないか、強制実行の場合 notify_line(f'全{len(meet_ids)}の大会を検出') meets = [] for id in Takenoko(meet_ids, 20): area = id // 100000 year = (id % 100000) // 1000 start, end, name, place, pool = scraper.meet_info(id) meets.append( Meet(meet_id=id, meet_name=name, place=place, pool=pool, start=start, end=end, area=area, year=year)) erased = session.query(Meet).filter_by( year=year).delete() # 同じ年度を二重に登録しないように削除する session.add_all(meets) session.commit() notify_line(f'{erased}件を削除 全{len(meets)}の大会情報を保存') else: notify_line(f'大会情報に更新はありませんでした')
def run(self): parser = argparse.ArgumentParser( description='a sms console helper to manage sms') parser.add_argument('--create', '-c', action='store_true', help='create a new database') parser.add_argument('--list-messages', '-l', action='store_true', help='list all messages') parser.add_argument('--update-contact', '-u', action='store_true', help='update sms that contact is none') parser.add_argument('--merge-contact', '-m', type=str, metavar='CONTACT', nargs=2, help='merge A contact to B contact') parser.add_argument( '--import-best-message-storer', '-B', type=argparse.FileType('r'), metavar='FILE', nargs='+', help='import messages from Best MessageStorer backups') parser.add_argument('--import-sms-backup-and-restore', '-S', type=argparse.FileType('r'), metavar='FILE', nargs='+', help='import messages from Sms Backup & Restore') args = parser.parse_args() if args.create: self.create_all() elif args.list_messages: self.list_messages() elif args.update_contact: update_sms() elif args.merge_contact: try: merge_contact( args.merge_contact[0].decode(sys.getfilesystemencoding()), args.merge_contact[1].decode(sys.getfilesystemencoding())) except ValueError: print 'Error keyword' elif args.import_best_message_storer != None: for text in args.import_best_message_storer: best_message_storer_parser = Best_message_storer_parser( text.read().decode('utf-16le')) smses = best_message_storer_parser.parse() session.add_all(smses) session.commit() best_message_storer_parser.print_result() elif not args.import_sms_backup_and_restore is None: for xml in args.import_sms_backup_and_restore: sms_backup_restore_parser = SmsBackupAndRestoreParser( xml.read().decode('utf-8')) smses = sms_backup_restore_parser.parse() session.add_all(smses) session.commit() sms_backup_restore_parser.print_result() else: parser.print_help()
def save_to_db(objs): session.add_all(objs) session.commit()