From 3fc7a8efc943ae7f0d8889b6a8ab2e07460d3200 Mon Sep 17 00:00:00 2001 From: Millks Date: Wed, 29 Apr 2020 03:55:58 +0300 Subject: [PATCH 1/4] first try --- homework/validators.py | 175 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 homework/validators.py diff --git a/homework/validators.py b/homework/validators.py new file mode 100644 index 0000000..6193574 --- /dev/null +++ b/homework/validators.py @@ -0,0 +1,175 @@ +import datetime +import time + + + + +class Name_discr(object): + def __set_name__(self, owner, name): + self.name = name + + def __set__(self, instance, value): + if not isinstance(value, str): + instance.logger_err.error("TypeError: 'Неверный тип имени'") + raise TypeError('Неверный тип имени') + value = value.strip() + for i in value: + if value.isalpha(): + instance.__dict__[self.name] = value + else: + instance.logger_err.error("ValueError: 'Неверное имя'") + raise ValueError("ValueError: 'Неверное имя'") + + def __get__(self, instance, owner): + return instance.__dict__[self.name] + +class Date_discr(object): + def __set_name__(self, owner, name): + self.name = name + + def __set__(self, instance, value): + month_dict = {'Января': '01', 'Февраля': '02', 'Марта': '03', 'Апреля': '04', 'Мая': '05', 'Июня': '06', + 'Июля': '07', 'Августа': '08', 'Сентября': '09', 'Октября': '10', 'Ноября': '11', 'Декабря': '12'} + if not isinstance(value, str): + instance.logger_err.error("TypeError: 'Неверный тип данных'") + raise TypeError('Неверный тип данных') + value = value.strip() + for symbol in value: + if symbol == ' ' or symbol == "-": + value = value.replace(symbol, '.') + birth_lst = value.split('.') + if len(birth_lst) == 3: + if not birth_lst[1].isdigit() and birth_lst[1].title() in month_dict: + birth_lst[1] = month_dict[birth_lst[1].title()] + try: + datetime.date(int(birth_lst[0]), int(birth_lst[1]), int(birth_lst[2])) + except ValueError: + birth_lst[0], birth_lst[2] = birth_lst[2], birth_lst[0] + + f = True # флаг, указание на то, что есть число из четырех цифр + for i in range(len(birth_lst)): + if len(birth_lst[i]) == 1: + birth_lst[i] = '0' + birth_lst[i] + if len(birth_lst[i]) == 4: + if birth_lst[i][0:2] == "19" or "20": + f = False + else: + instance.logger_err.error("AttributeError: 'Неверный формат года'") + raise AttributeError('Неверный формат года') + + if f: + if (len(birth_lst[2]) == 2 and int(birth_lst[2]) > 20): + birth_lst[2] = '19' + birth_lst[2] + elif len(birth_lst[2]) == 2 and int(birth_lst[2]) <= 20: + birth_lst[2] = '20' + birth_lst[2] + value = "-".join(birth_lst) + try: + + if self.name in instance.__dict__ and getattr(instance, self.name): + instance.logger_inf.info("Дата рождения изменена") + instance.__dict__[self.name] = time.strftime("%Y-%m-%d", time.strptime(str(value), "%Y-%m-%d")) + except ValueError: + instance.logger_err.error("ValueError: 'Неверный формат даты'") + raise ValueError('Неверный формат даты') + else: + instance.logger_err.error("ValueError: 'Неверный формат даты'") + raise ValueError(f'Неверный формат даты {birth_lst}') + + def __get__(self, instance, owner): + return instance.__dict__[self.name] + + +class Phone_discr(object): + def __set_name__(self, owner, name): + self.name = name + + def __set__(self, instance, value): + if not isinstance(value, str): + instance.logger_err.error("TypeError: 'Неверный тип данных'") + raise TypeError('Неверный тип данных') + value = value.strip() + new_value = "" + for i in value: + if i.isdigit(): + new_value += i + if len(new_value) != 11: + instance.logger_err.error("ValueError: 'Неверный формат номера телефона'") + raise ValueError('Неверный формат номера телефона') + else: + new_value = "7" + new_value[1:] + if self.name in instance.__dict__ and getattr(instance, self.name): + instance.logger_inf.info("Телефон изменен") + instance.__dict__[self.name] = new_value + + def __get__(self, instance, owner): + return instance.__dict__[self.name] + + +class Doc_type_discr(object): + def __set_name__(self, owner, name): + self.name = name + + def __set__(self, instance, value): + white_lst = ['Паспорт', 'Заграничный паспорт', 'Водительские права'] + if not isinstance(value, str): + instance.logger_err.error("TypeError: 'Неверный тип данных'") + raise TypeError('Неверный тип данных') + value = str(value) + value = value.strip() + if value.capitalize() in white_lst: + value = value.capitalize() + if self.name in instance.__dict__ and getattr(instance, self.name): + instance.logger_inf.info("Тип документа изменен") + instance.__dict__[self.name] = value + else: + instance.logger_err.error("ValueError: 'Неверный формат документа'") + raise ValueError('Неверный формат документа') + + def __get__(self, instance, owner): + return instance.__dict__[self.name] + + +class Doc_id_discr(object): + def __set_name__(self, owner, name): + self.name = name + + def __set__(self, instance, value): + if not isinstance(value, str): + instance.logger_err.error("TypeError: 'Неверный тип данных'") + raise TypeError('Неверный тип данных') + value = str(value) + value = value.strip() + + doc_dict = {'Паспорт': 10, 'Водительские права': 10, 'Заграничный паспорт': 9} + wrong_symbls = r"\/- " + for symbol in value: + if symbol in wrong_symbls or symbol == '\n': + value = value.replace(symbol, '') + for i in value: + if not i.isdigit(): + instance.logger_err.error("ValueError: 'Неверный формат номера документа'") + raise ValueError(f'Неверный формат номера документа {value}') + + if len(value) == doc_dict[getattr(instance, 'document_type')]: + if self.name in instance.__dict__ and getattr(instance, self.name): + instance.logger_inf.info("Тип документа изменен") + instance.__dict__[self.name] = value + else: + instance.logger_err.error("ValueError: 'Неверный формат номера документа'") + raise ValueError(f'Неверный формат номера документа {value}') + + def __get__(self, instance, owner): + return instance.__dict__[self.name] + +class Not_renamalbe(Name_discr): + def __set_name__(self, owner, name): + self.name = name + + def __set__(self, instance, value): + if self.name in instance.__dict__ and getattr(instance, self.name): + instance.logger_err.error("AttributeError: 'Переназначение не предусмотрено'") + raise AttributeError('Переназначение не предусмотрено') + else: + super().__set__(instance, value) + + From eb92d2462865f800b95b55b264adf053b90104e2 Mon Sep 17 00:00:00 2001 From: Millks Date: Wed, 29 Apr 2020 04:07:11 +0300 Subject: [PATCH 2/4] final changes --- homework/config.py | 18 +++++----- homework/patient.py | 83 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/homework/config.py b/homework/config.py index 955b991..91c1d10 100644 --- a/homework/config.py +++ b/homework/config.py @@ -1,13 +1,13 @@ -GOOD_LOG_FILE = "good_log.txt" -ERROR_LOG_FILE = "error_log.txt" -CSV_PATH = "csv.csv" +GOOD_LOG_FILE = "inf.log" +ERROR_LOG_FILE = "err.log" +CSV_PATH = "data.csv" PHONE_FORMAT = "79160000000" # Здесь запишите телефон +7-916-000-00-00 в том формате, в котором вы храните телефоны -PASSPORT_TYPE = "паспорт" # тип документа, когда он паспорт -PASSPORT_FORMAT = "0000 000000" # Здесь запишите номер парспорта 0000 000000 в том формате, в котором вы его храните +PASSPORT_TYPE = "Паспорт" # тип документа, когда он паспорт +PASSPORT_FORMAT = "0000000000" # Здесь запишите номер парспорта 0000 000000 в том формате, в котором вы его храните -INTERNATIONAL_PASSPORT_TYPE = "заграничный паспорт" # тип документа, если это загран -INTERNATIONAL_PASSPORT_FORMAT = "00 0000000" # формат хранения заграна для номера 00 0000000 +INTERNATIONAL_PASSPORT_TYPE = "Заграничный паспорт" # тип документа, если это загран +INTERNATIONAL_PASSPORT_FORMAT = "000000000" # формат хранения заграна для номера 00 0000000 -DRIVER_LICENSE_TYPE = "водительское удостоверение" # тип документа, если это водительское удостоверение -DRIVER_LICENSE_FORMAT = "00 00 000000" # формат хранения номера ВУ +DRIVER_LICENSE_TYPE = "Водительские права" # тип документа, если это водительское удостоверение +DRIVER_LICENSE_FORMAT = "0000000000" # формат хранения номера ВУ diff --git a/homework/patient.py b/homework/patient.py index dad2526..ab67422 100644 --- a/homework/patient.py +++ b/homework/patient.py @@ -1,17 +1,82 @@ + +import logging +import csv +import homework.validators as validators +logger = logging.getLogger("inf") +logger.setLevel(logging.INFO) +handler = logging.FileHandler('inf.log', 'w', 'utf-8') +formatter = logging.Formatter("%(filename)s[LINE:%(lineno)d]# %(levelname)-8s [%(asctime)s] %(message)s") +handler.setFormatter(formatter) +logger.addHandler(handler) + +err = logging.getLogger("err") +err.setLevel(logging.ERROR) +handler2 = logging.FileHandler('err.log', 'w', 'utf-8') +handler2.setFormatter(formatter) +err.addHandler(handler2) + +path = "data.csv" + + + class Patient: - def __init__(self, *args, **kwargs): - pass + first_name = validators.Not_renamalbe() + last_name = validators.Not_renamalbe() + birth_date = validators.Date_discr() + phone = validators.Phone_discr() + document_type = validators.Doc_type_discr() + document_id = validators.Doc_id_discr() + + def __init__(self, *args): + self.logger_inf = logging.getLogger("inf") + self.logger_err = logging.getLogger("err") + self.first_name = args[0] + self.last_name = args[1] + self.birth_date = args[2] + self.phone = args[3] + self.document_type = args[4] + self.document_id = args[5] - def create(*args, **kwargs): - raise NotImplementedError() + self.logger_inf.info('Был создан новый пациент') + + @staticmethod + def create(fname, lname, bdate, number, doc_type, doc_id): + return Patient(fname, lname, bdate, number, doc_type, doc_id) def save(self): - pass + + myData = [str(self).split(",")] + + myFile = open(path, 'a', newline="") + with myFile: + writer = csv.writer(myFile) + writer.writerows(myData) + self.logger_inf.info('Запись о новом пациенте сохранена') + + def __str__(self): + return f"{self.first_name}, {self.last_name}, {self.birth_date}, {self.phone}, {self.document_type}, {self.document_id}" -class PatientCollection: - def __init__(self, log_file): - pass +class PatientCollection(object): + def __init__(self, path): + self.path = path + self.cursor = 0 + self.count = -1 + + def __iter__(self): + return self def limit(self, n): - raise NotImplementedError() + self.count = n + return self.__iter__() + + def __next__(self): + with open(self.path,'r') as File: + File.seek(self.cursor) + data = File.readline() + self.cursor = File.tell() + + if not data or not self.count: + raise StopIteration + self.count -= 1 + return Patient(*data.split(',')) From a841434a05e850ca58592640f24cfb957a302818 Mon Sep 17 00:00:00 2001 From: Millks Date: Sun, 3 May 2020 00:46:30 +0300 Subject: [PATCH 3/4] decorators made --- homework/decs.py | 30 ++++++++++++++++++++++++++++++ homework/patient.py | 9 +++++++-- homework/validators.py | 39 +++++++++++++++------------------------ 3 files changed, 52 insertions(+), 26 deletions(-) create mode 100644 homework/decs.py diff --git a/homework/decs.py b/homework/decs.py new file mode 100644 index 0000000..56f6963 --- /dev/null +++ b/homework/decs.py @@ -0,0 +1,30 @@ +def my_logging_decorator(func): + def wrapper(*args): #self, instance, value + + if func.__name__ == '__init__': + func(*args) + args[0].logger_inf.info('Был создан новый пациент') + + elif func.__name__ == 'save': + func(*args) + args[0].logger_inf.info('Запись о новом пациенте сохранена') + + else: + f = False # флаг на изменение + if func.__name__ == '__set__': + if args[0].name in args[1].__dict__ and getattr(args[1], args[0].name): + f = True + try: + func(*args) + if f: + args[1].logger_inf.info(f'{args[0].name} изменен') + except TypeError: + args[1].logger_err.error(f'TypeError: {args[2]} must be string') + raise TypeError + except ValueError: + args[1].logger_err.error(f'ValueError: wrong value - {args[2]}') + raise ValueError + except AttributeError: + args[1].logger_err.error(f'AttributeError: Переназначение не предусмотрено - {args[2]}') + raise AttributeError + return wrapper \ No newline at end of file diff --git a/homework/patient.py b/homework/patient.py index ab67422..a1b9b21 100644 --- a/homework/patient.py +++ b/homework/patient.py @@ -1,7 +1,10 @@ import logging import csv +import sqlite3 import homework.validators as validators +import homework.decs as decs + logger = logging.getLogger("inf") logger.setLevel(logging.INFO) handler = logging.FileHandler('inf.log', 'w', 'utf-8') @@ -27,6 +30,7 @@ class Patient: document_type = validators.Doc_type_discr() document_id = validators.Doc_id_discr() + @decs.my_logging_decorator def __init__(self, *args): self.logger_inf = logging.getLogger("inf") self.logger_err = logging.getLogger("err") @@ -37,12 +41,13 @@ def __init__(self, *args): self.document_type = args[4] self.document_id = args[5] - self.logger_inf.info('Был создан новый пациент') + @staticmethod def create(fname, lname, bdate, number, doc_type, doc_id): return Patient(fname, lname, bdate, number, doc_type, doc_id) + @decs.my_logging_decorator def save(self): myData = [str(self).split(",")] @@ -51,7 +56,7 @@ def save(self): with myFile: writer = csv.writer(myFile) writer.writerows(myData) - self.logger_inf.info('Запись о новом пациенте сохранена') + def __str__(self): return f"{self.first_name}, {self.last_name}, {self.birth_date}, {self.phone}, {self.document_type}, {self.document_id}" diff --git a/homework/validators.py b/homework/validators.py index 6193574..0065d54 100644 --- a/homework/validators.py +++ b/homework/validators.py @@ -1,23 +1,21 @@ import datetime import time - - +import homework.decs as decs class Name_discr(object): def __set_name__(self, owner, name): self.name = name + @decs.my_logging_decorator def __set__(self, instance, value): if not isinstance(value, str): - instance.logger_err.error("TypeError: 'Неверный тип имени'") raise TypeError('Неверный тип имени') value = value.strip() for i in value: if value.isalpha(): instance.__dict__[self.name] = value else: - instance.logger_err.error("ValueError: 'Неверное имя'") raise ValueError("ValueError: 'Неверное имя'") def __get__(self, instance, owner): @@ -27,11 +25,11 @@ class Date_discr(object): def __set_name__(self, owner, name): self.name = name + @decs.my_logging_decorator def __set__(self, instance, value): month_dict = {'Января': '01', 'Февраля': '02', 'Марта': '03', 'Апреля': '04', 'Мая': '05', 'Июня': '06', 'Июля': '07', 'Августа': '08', 'Сентября': '09', 'Октября': '10', 'Ноября': '11', 'Декабря': '12'} if not isinstance(value, str): - instance.logger_err.error("TypeError: 'Неверный тип данных'") raise TypeError('Неверный тип данных') value = value.strip() for symbol in value: @@ -54,7 +52,6 @@ def __set__(self, instance, value): if birth_lst[i][0:2] == "19" or "20": f = False else: - instance.logger_err.error("AttributeError: 'Неверный формат года'") raise AttributeError('Неверный формат года') if f: @@ -65,14 +62,12 @@ def __set__(self, instance, value): value = "-".join(birth_lst) try: - if self.name in instance.__dict__ and getattr(instance, self.name): - instance.logger_inf.info("Дата рождения изменена") + #if self.name in instance.__dict__ and getattr(instance, self.name): + # instance.logger_inf.info("Дата рождения изменена") instance.__dict__[self.name] = time.strftime("%Y-%m-%d", time.strptime(str(value), "%Y-%m-%d")) except ValueError: - instance.logger_err.error("ValueError: 'Неверный формат даты'") raise ValueError('Неверный формат даты') else: - instance.logger_err.error("ValueError: 'Неверный формат даты'") raise ValueError(f'Неверный формат даты {birth_lst}') def __get__(self, instance, owner): @@ -83,9 +78,9 @@ class Phone_discr(object): def __set_name__(self, owner, name): self.name = name + @decs.my_logging_decorator def __set__(self, instance, value): if not isinstance(value, str): - instance.logger_err.error("TypeError: 'Неверный тип данных'") raise TypeError('Неверный тип данных') value = value.strip() new_value = "" @@ -93,12 +88,11 @@ def __set__(self, instance, value): if i.isdigit(): new_value += i if len(new_value) != 11: - instance.logger_err.error("ValueError: 'Неверный формат номера телефона'") raise ValueError('Неверный формат номера телефона') else: new_value = "7" + new_value[1:] - if self.name in instance.__dict__ and getattr(instance, self.name): - instance.logger_inf.info("Телефон изменен") + #if self.name in instance.__dict__ and getattr(instance, self.name): + # instance.logger_inf.info("Телефон изменен") instance.__dict__[self.name] = new_value def __get__(self, instance, owner): @@ -109,20 +103,19 @@ class Doc_type_discr(object): def __set_name__(self, owner, name): self.name = name + @decs.my_logging_decorator def __set__(self, instance, value): white_lst = ['Паспорт', 'Заграничный паспорт', 'Водительские права'] if not isinstance(value, str): - instance.logger_err.error("TypeError: 'Неверный тип данных'") raise TypeError('Неверный тип данных') value = str(value) value = value.strip() if value.capitalize() in white_lst: value = value.capitalize() - if self.name in instance.__dict__ and getattr(instance, self.name): - instance.logger_inf.info("Тип документа изменен") + #if self.name in instance.__dict__ and getattr(instance, self.name): + # instance.logger_inf.info("Тип документа изменен") instance.__dict__[self.name] = value else: - instance.logger_err.error("ValueError: 'Неверный формат документа'") raise ValueError('Неверный формат документа') def __get__(self, instance, owner): @@ -133,9 +126,9 @@ class Doc_id_discr(object): def __set_name__(self, owner, name): self.name = name + @decs.my_logging_decorator def __set__(self, instance, value): if not isinstance(value, str): - instance.logger_err.error("TypeError: 'Неверный тип данных'") raise TypeError('Неверный тип данных') value = str(value) value = value.strip() @@ -147,15 +140,13 @@ def __set__(self, instance, value): value = value.replace(symbol, '') for i in value: if not i.isdigit(): - instance.logger_err.error("ValueError: 'Неверный формат номера документа'") raise ValueError(f'Неверный формат номера документа {value}') if len(value) == doc_dict[getattr(instance, 'document_type')]: - if self.name in instance.__dict__ and getattr(instance, self.name): - instance.logger_inf.info("Тип документа изменен") + #if self.name in instance.__dict__ and getattr(instance, self.name): + # instance.logger_inf.info("Тип документа изменен") instance.__dict__[self.name] = value else: - instance.logger_err.error("ValueError: 'Неверный формат номера документа'") raise ValueError(f'Неверный формат номера документа {value}') def __get__(self, instance, owner): @@ -165,9 +156,9 @@ class Not_renamalbe(Name_discr): def __set_name__(self, owner, name): self.name = name + @decs.my_logging_decorator def __set__(self, instance, value): if self.name in instance.__dict__ and getattr(instance, self.name): - instance.logger_err.error("AttributeError: 'Переназначение не предусмотрено'") raise AttributeError('Переназначение не предусмотрено') else: super().__set__(instance, value) From 17630be6d535fffaa9badaedc67ed3a32660737b Mon Sep 17 00:00:00 2001 From: Millks Date: Mon, 4 May 2020 00:36:03 +0300 Subject: [PATCH 4/4] CLI and SQlite done --- homework/cli.py | 42 ++++++++++++++++++++++++++++++++ homework/config.py | 2 +- homework/covid19.db | Bin 0 -> 10240 bytes homework/patient.py | 53 +++++++++++++++++++++++------------------ homework/validators.py | 2 +- 5 files changed, 74 insertions(+), 25 deletions(-) create mode 100644 homework/cli.py create mode 100644 homework/covid19.db diff --git a/homework/cli.py b/homework/cli.py new file mode 100644 index 0000000..092490a --- /dev/null +++ b/homework/cli.py @@ -0,0 +1,42 @@ +import click +import sqlite3 +from patient import Patient, PatientCollection + +@click.group() +def cli(): + pass + +@click.command() +@click.argument('f_name') +@click.argument('s_name') +@click.option('--birth-date') +@click.option('--phone') +@click.option('--document-type') +@click.option('--document-number', type=(str, str)) +def create(f_name, s_name, birth_date, phone, document_type, document_number): + document_number = ''.join(document_number) + p = Patient(f_name, s_name, birth_date, phone, document_type, document_number) + p.save() + +@click.command() +@click.argument('limit', default = 10) +def show(limit): + conn = sqlite3.connect('covid19.db') + cursor = conn.cursor() + cursor.execute(f"SELECT * FROM covid19 ORDER BY ROWID DESC LIMIT {limit}") + print(*cursor.fetchall()[::-1], sep="\n") + +@click.command() +def count(): + k=0 + collection = PatientCollection('covid19.db') + for i in collection: + k+=1 + print(k) + +cli.add_command(create) +cli.add_command(show) +cli.add_command(count) + +if __name__ == '__main__': + cli() \ No newline at end of file diff --git a/homework/config.py b/homework/config.py index 91c1d10..395f68b 100644 --- a/homework/config.py +++ b/homework/config.py @@ -1,6 +1,6 @@ GOOD_LOG_FILE = "inf.log" ERROR_LOG_FILE = "err.log" -CSV_PATH = "data.csv" +CSV_PATH = "covid19.db" PHONE_FORMAT = "79160000000" # Здесь запишите телефон +7-916-000-00-00 в том формате, в котором вы храните телефоны PASSPORT_TYPE = "Паспорт" # тип документа, когда он паспорт diff --git a/homework/covid19.db b/homework/covid19.db new file mode 100644 index 0000000000000000000000000000000000000000..8b8ed35742b6ea89105279a84907f70357c06cd0 GIT binary patch literal 10240 zcmeHLU2GIZ9G}@~Sz0;Kh(W069_6E_J=opr^==h~15R2F(4$usL%baAkyfugC|3g^ zlC~sjly5L9LLkbE@=~F-AJ;2}7-D>JHpUndeeuP}gKs_&jsMxbp+~P*Yn(OFbT@PR z+uga}&i`}%GfmMg?U|&qJKfch$S6KkhA>9!6a^u)7+NK?Ir&x&*D`4Qz#L3-U5r)* z=enQ+CL0miDD7eAH2wc~ucQn3zJ*m)`0(CLVpl5Jl76kdRWtIJvJKnAp;%anh1PEg zEBS|&%H*SFcYD{qOuRGEkyKjR5?wVu)uVK#GfHQ7Dpjkb64Sig)!vn9i?=4g#@1i8 z!oL=OYEN6bllRmnKBCkrt?8ETj$~&ho;k25-$O6pD(unTTKp}gd0S(&IqU&XI1#GC zsJ*i_xqsi@6gXcz(Var@BqS*Gc``>M`NzcGW z?1_g3H72)N+{xrN`HB3jZGEu61PQt()xQAR4_^X^-Y~FqLJ|0y2LoGJjLK?6t|>1ywUMjDg*Uf%KAvE#;fXHN!9_lh&0Y zt&5a#anCV(f{RjiHc;1Ld%aPTk(RU9nN1Nd5n{SAB_mE$xb+X%*K@`*HrufsWl zJ=34CIw&~lDX4jcZmEHh=h(XYhg)hO=?#krz&Do2>C036sP1#y0JAU~m70`n6(FDyTy?JPev+-sL*Zu&kQn_~CS+VE2g zcIhT>!?4W~>-ewiF*my$siExp-;c;;@-nRdzm|HX75FB81FuFm(c8!m-c@`wH8@ep zZW3F`KI2Fw8+ODB(T(CO*$pBq+4aswqG literal 0 HcmV?d00001 diff --git a/homework/patient.py b/homework/patient.py index a1b9b21..734dde0 100644 --- a/homework/patient.py +++ b/homework/patient.py @@ -1,9 +1,9 @@ import logging -import csv +import click import sqlite3 -import homework.validators as validators -import homework.decs as decs +import validators as validators +import decs as decs logger = logging.getLogger("inf") logger.setLevel(logging.INFO) @@ -18,8 +18,14 @@ handler2.setFormatter(formatter) err.addHandler(handler2) -path = "data.csv" +conn = sqlite3.connect('covid19.db') +cursor = conn.cursor() +#path = "data.csv" +cursor.execute("""CREATE TABLE IF NOT EXISTS covid19 + (first_name text, last_name text, birth_date text, + phone text, document_type text, document_id text) + """) class Patient: @@ -41,21 +47,16 @@ def __init__(self, *args): self.document_type = args[4] self.document_id = args[5] - - @staticmethod def create(fname, lname, bdate, number, doc_type, doc_id): return Patient(fname, lname, bdate, number, doc_type, doc_id) @decs.my_logging_decorator def save(self): + my_data = [self.first_name, self.last_name, self.birth_date, self.phone, self.document_type, self.document_id] + cursor.execute("INSERT INTO covid19 VALUES (?,?,?,?,?,?)", my_data) + conn.commit() - myData = [str(self).split(",")] - - myFile = open(path, 'a', newline="") - with myFile: - writer = csv.writer(myFile) - writer.writerows(myData) def __str__(self): @@ -64,9 +65,10 @@ def __str__(self): class PatientCollection(object): def __init__(self, path): - self.path = path - self.cursor = 0 - self.count = -1 + self.conn = sqlite3.connect(path) + self.cursor = conn.cursor() + self.id = 1 + self.count = None def __iter__(self): return self @@ -76,12 +78,17 @@ def limit(self, n): return self.__iter__() def __next__(self): - with open(self.path,'r') as File: - File.seek(self.cursor) - data = File.readline() - self.cursor = File.tell() - - if not data or not self.count: + if self.count: + if self.id == self.count + 1: + self.cursor.close() + self.conn.close() + raise StopIteration + data = list(*self.cursor.execute(f"SELECT * FROM covid19 WHERE ROWID = {self.id}")) + + if not data: + self.cursor.close() + self.conn.close() raise StopIteration - self.count -= 1 - return Patient(*data.split(',')) + self.id += 1 + return Patient(*data) + diff --git a/homework/validators.py b/homework/validators.py index 0065d54..47bcb7b 100644 --- a/homework/validators.py +++ b/homework/validators.py @@ -1,6 +1,6 @@ import datetime import time -import homework.decs as decs +import decs as decs class Name_discr(object):