From 5cddec56f8d3cbbecabcc0934b091c6068784252 Mon Sep 17 00:00:00 2001 From: Alexandra Molodenova Date: Sun, 26 Apr 2020 22:16:48 +0300 Subject: [PATCH 1/2] 1tr --- homework/DataIsValid.py | 118 +++++++++++++++++++++++++++++ homework/Descriptor.py | 126 +++++++++++++++++++++++++++++++ homework/Log.py | 46 +++++++++++ homework/PatienList.csv | 5 ++ homework/Patient.py | 97 ++++++++++++++++++++++++ homework/PatientCollection.py | 52 +++++++++++++ homework/config.py | 18 ++--- homework/patient.py | 118 ++++++++++++++++++++++++++--- tests/test_patient_collection.py | 16 ++-- 9 files changed, 570 insertions(+), 26 deletions(-) create mode 100644 homework/DataIsValid.py create mode 100644 homework/Descriptor.py create mode 100644 homework/Log.py create mode 100644 homework/PatienList.csv create mode 100644 homework/Patient.py create mode 100644 homework/PatientCollection.py diff --git a/homework/DataIsValid.py b/homework/DataIsValid.py new file mode 100644 index 0000000..636424b --- /dev/null +++ b/homework/DataIsValid.py @@ -0,0 +1,118 @@ +from copy import deepcopy +from re import fullmatch, sub, search +# from homework.Log import validerr + +def nameReal(name_): + pattern = "[0-9]" + name = sub(pattern, "", name_) + if len(name)==0: + return False + return name + + + +def dateIsReal(date): + year = int(date[:4]) + if year < 1900 or year > 2020: + # validerr.paterr.warning(["It should be: 1900 12: + # validerr.paterr.warning(["It should be: 0 31: + # validerr.paterr.warning(["It should be: 0 29: + # validerr.paterr.warning("In Feb only 28 or 29 days") + return False + + if month == 2 and day == 29: + print("WOW!") + return date + + +def dateIsValid(date): + pattern1 = "\d{4}.\d{2}.\d{2}" # y-m-d + pattern2 = "\d{2}.\d{2}.\d{4}" # d-m-y + match1 = fullmatch(pattern1, date) + match2 = fullmatch(pattern2, date) + if match1: + return dateIsReal(date) + elif match2: + dateNew = deepcopy(date[len(date) - 4:]) + dateNew = '-'.join([dateNew, date[len(date) - 7:len(date) - 5]]) + dateNew = '-'.join([dateNew, date[:2]]) + if dateIsReal(dateNew): + return dateNew + else: + return False + else: + return False + +# print(dateIsReal("1978-01-05")) + +def phoneIsValid( phone_): + pattern = "[^+,0,1,2,3,4,5,6,7,8,9]" + phone = sub(pattern, "", phone_) + if len(phone)<10: + return False + if phone[0] == '8' or phone[0]=='7': + phone = ''.join(['+7', phone[1:]]) + elif not phone[0] == '+' or not phone[1] == '7': + # validerr.paterr.warning(["Only Russians numbers are valid. +7-xxx-xxx-xx-xx or 8-xxx-xxx-xx-xx. Your num: ", phone]) + return False + + if not len(phone) == 12: + # validerr.paterr.warning(["Only Russians numbers are valid. len !=12 . Your num: ", phone]) + return False + if not (phone[2:5] == '495' or phone[2:5] == '499' or phone[2] == '9'): + # validerr.paterr.warning(["Only Russians numbers are valid. +7-499-... or +7-495-... or +7-9..-.... Your num: ", phone]) + return False + return phone + + + +def docTypeIsValid(doc_type): + if not isinstance(doc_type, str): + return False + doc_type = doc_type.lower() + + passport = "паспорт" + passportruen = "gfcgjhn" + zPassport = "загран" + zpassportruen = "pfuhfy" + prav1 = "водительск" + prav1ruen = "djlbntkmcr" + prav2 = "права" + prav2ruen = "ghfdf" + + if search(zPassport, doc_type) or search(zpassportruen, doc_type): + return "загран" + elif search(passport, doc_type) or search(passportruen, doc_type): + return "паспорт" + elif search(prav1, doc_type) or search(prav2, doc_type) or search(prav1ruen, doc_type) or search(prav2ruen, + doc_type): + return "права" + + return False + + +def docIdIsValid(id, type=None): + pattern = "[^0,1,2,3,4,5,6,7,8,9]" + id = sub(pattern, "", id) + if len(id) == 10: + if type == "паспорт" or type == "права" or not type: + return id + else: + # validerr.paterr.warning(["Zpass - len ==9. In dr and pass-10. Your type: ", type, ". Your id: ", id]) + return False + elif len(id) == 9 and (type == "загран" or not type): + # validerr.paterr.warning(["Zpass - len ==9. In dr and pass-10. Your type: ", type, ". Your id: ", id]) + return id + else: + return False diff --git a/homework/Descriptor.py b/homework/Descriptor.py new file mode 100644 index 0000000..0aafa89 --- /dev/null +++ b/homework/Descriptor.py @@ -0,0 +1,126 @@ +from homework.DataIsValid import * +# from homework.Log import validator,validerr + +class Name: + def __get__(self, instance, owner): + return instance.__dict__[self.name] + # return instance.__dict__[self.name] + + def __set__(self, instance, val): + if not isinstance(val, str): + instance.paterr.error('Invalid name.') + instance.paterr.error("Error. User was not created.") + raise TypeError("not str") + elif instance.created: + instance.paterr.error("You can't change name") + instance.paterr.error("Error. User was not created.") + raise AttributeError("can't change name") + # val = sub(" ", "-", val) + n = nameReal(val) + if not n: + instance.paterr.error("Wrong name") + instance.paterr.error("Error. User was not created.") + raise ValueError("wrong name") + instance.__dict__[self.name] = n + instance.patinfo.debug(["name is okey:", val]) + + + def __set_name__(self, owner, name): + self.name = name + + + +class Phone: + def __get__(self, instance, owner): + return instance.__dict__[self.name] + + def __set__(self, instance, number): + if not isinstance(number, str): + instance.paterr.error('Invalid number.') + instance.paterr.error("Error. User was not created.") + raise TypeError("not str") + prov = phoneIsValid(number) + if not prov: + instance.paterr.error('Invalid number. +code-xxx-xxx-xx-xx') + instance.paterr.error("Error. User was not created.") + raise ValueError("phone error") + number = prov + instance.__dict__[self.name] = number + instance.patinfo.debug(["number is okey: ", number]) + if instance.created: + instance.patinfo.info(["number is okey: ", number]) + + def __set_name__(self, owner, name): + self.name = name + + +class DocType(): + def __get__(self, instance, owner): + return instance.__dict__[self.name] + + def __set__(self, instance, type): + if not isinstance(type, str): + instance.paterr.error('Invalid type.') + instance.paterr.error("Error. User was not created.") + raise TypeError("not str") + prov = docTypeIsValid(type) + if not prov: + instance.paterr.error('Invalid doc type. паспорт, загран или права') + instance.paterr.error("Error. User was not created.") + raise ValueError("doctype error") + instance.__dict__[self.name] = prov + instance.patinfo.debug(["Doc type is okey:", prov]) + if instance.created: + instance.patinfo.info(["Dov type is okey: ", prov]) + + def __set_name__(self, owner, name): + self.name = name + + +class DocId: + def __get__(self, instance, owner): + return instance.__dict__[self.name] + + def __set__(self, instance,id): + if not isinstance(id, str): + instance.paterr.error('Invalid id.') + instance.paterr.error("Error. User was not created.") + raise TypeError("not str") + self.type = instance.document_type + prov = docIdIsValid(id, self.type) + if not prov: + instance.paterr.error('Invalid doc id. паспорт(10 цифр), загран(9 цифр) или права(10 цифр)') + instance.paterr.error("Error. User was not created.") + raise ValueError("docid error") + instance.__dict__[self.name] = prov + instance.patinfo.debug(["Doc id okey: ", prov]) + if instance.created: + instance.patinfo.info(["Doc id is okey: ", prov]) + + def __set_name__(self, owner, name): + self.name = name + self.type = None + + +class Date: + def __get__(self, instance, owner): + return instance.__dict__[self.name] + + def __set__(self, instance, date): + if not isinstance(date, str): + instance.paterr.error('Invalid name.') + instance.paterr.error("Error. User was not created.") + raise TypeError("not str") + prov = dateIsValid(date) + if not prov: + instance.paterr.error('Invalid date. year-month-day') + instance.paterr.error("Error. User was not created.") + raise ValueError("date error") + date = prov + instance.__dict__[self.name] = date + instance.patinfo.debug(["Date is okey: ", date]) + if instance.created: + instance.patinfo.info(["Date is okey: ", date]) + + def __set_name__(self, owner, name): + self.name = name diff --git a/homework/Log.py b/homework/Log.py new file mode 100644 index 0000000..b899fe4 --- /dev/null +++ b/homework/Log.py @@ -0,0 +1,46 @@ +import logging + +# u should uncomment lines, and comment 2 times 1 line line on comment and it'll start write logs in 2 files +# handler = logging.FileHandler('Logs.txt', 'a', 'utf-8') +handler = logging.FileHandler('/home/alexsun8/kib/ДЗ2/python_developer_hw2/homework/Good_Logs.txt', 'a', 'utf-8') +handler2 = logging.FileHandler('/home/alexsun8/kib/ДЗ2/python_developer_hw2/homework/Bad_Logs.txt', 'a', 'utf-8') +formatter = logging.Formatter("%(filename)s[LINE:%(lineno)d]# %(levelname)-8s [%(asctime)s] %(message)s") +handler.setFormatter(formatter) +# handlerbad = handler +handlerbad = handler2 + + +# logs in Patient class +patinfo = logging.getLogger("Patient info") +patinfo.setLevel(logging.INFO) +patinfo.addHandler(handler) +paterr = logging.getLogger("Patient errors") +paterr.setLevel(logging.ERROR) +paterr.addHandler(handlerbad) + +# logs in Pat. Colle +collectinfo = logging.getLogger("Collection info") +collectinfo.setLevel(logging.INFO) +collectinfo.addHandler(handler) +collecterr = logging.getLogger("Collection errors") +collecterr.setLevel(logging.ERROR) +collecterr.addHandler(handlerbad) + +# logs in Descriptors in data valid +validator = logging.getLogger("Validator") +validator.setLevel(logging.INFO) +validator.addHandler(handler) +validerr = logging.getLogger("Validator errors") +validerr.setLevel(logging.ERROR) +validerr.addHandler(handlerbad) + +# for logging in console +consoleHandler = logging.StreamHandler() +consoleHandler.setFormatter(formatter) + +collectinfo.addHandler(consoleHandler) +collecterr.addHandler(consoleHandler) +patinfo.addHandler(consoleHandler) +paterr.addHandler(consoleHandler) +validator.addHandler(consoleHandler) +validerr.addHandler(consoleHandler) diff --git a/homework/PatienList.csv b/homework/PatienList.csv new file mode 100644 index 0000000..8f80fb3 --- /dev/null +++ b/homework/PatienList.csv @@ -0,0 +1,5 @@ +Кондрат,Рюрик,1971-01-31,+79160000000,паспорт,0228000000 +Евпатий,Коловрат,1972-01-31,+79160000001,паспорт,0228000001 +Ада,Лавлейс,1978-01-21,+79160000002,паспорт,0228000002 +Миртл,Плакса,1980-01-31,+79160000003,паспорт,0228000003 +Евлампия,Фамилия,1999-01-31,+79160000004,паспорт,0228000004 diff --git a/homework/Patient.py b/homework/Patient.py new file mode 100644 index 0000000..6b06dfc --- /dev/null +++ b/homework/Patient.py @@ -0,0 +1,97 @@ +from homework.Descriptor import * +from homework.Log import patinfo, paterr + + +class Patient: + first_name = Name() + last_name = Name() + birth_date = Date() + phone = Phone() + document_type = DocType() + document_id = DocId() + created = False + + def __init__(self, *args): + if len(args) == 0: + self.created = False + patinfo.info("Empty Patient was created") + return + elif not len(args) == 6: + self.created = False + paterr.error( + "There shold be 6 args: first_name_, last_name_, birth_date_, phone_, document_type_, document_id_. Patient wasn't created") + return + try: + # self.created = False + 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] + self.created = True + if not ( + self.first_name or self.last_name or self.birth_date or self.phone or self.document_type or self.document_id): + raise AttributeError + patinfo.info("User was created") + except: + self.created = False + paterr.error("Error. User was not created.") + + def create(self, *args): + if not len(args) == 6: + self.created = False + paterr.error( + "There shold be 6 args: first_name_, last_name_, birth_date_, phone_, document_type_, document_id_. Patient wasn't created") + return + + try: + self.created = False + 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] + if not ( + self.first_name or self.last_name or self.birth_date or self.phone or self.document_type or self.document_id): + raise AttributeError + self.created = True + patinfo.info("User was created") + except: + self.created = False + paterr.error("Error. User was not created.") + + def save(self): + if not self.created: + paterr.warning("User is NONE, so it wasn't saved.") + try: + data = ' '.join( + [self.first_name, self.last_name, self.birth_date, self.phone, self.document_type, self.document_id, + '\n']) + filename = "PatientList.csv" + with open(filename, 'a+') as file: + file.write(data) + patinfo.info("User was saved.") + except: + paterr.error("User was not saved!") + + def __str__(self): + if not self.created: + return "" + data = ' '.join( + [self.first_name, self.last_name, self.birth_date, self.phone, self.document_type, self.document_id]) + return data + + +# pat = Patient("Alice", "asdasd", "2003-02-30", "89234445553", "pfuhfy", "627 78 99977") +# pat.save() +# pat.create("Alice", "as", "2003-02-26", "89234445553", "ghfdf", "627 78 99977") +# pat.save() +# pat.last_name = "Johnson" +# pat.birth_date = "01-02-1990" +# # print(pat) +# +# pat = Patient() +# pat.create("bob", "as", "2003-02-26", "89234445553", "gfcgjhn", "627 78 99977") +# pat.save() diff --git a/homework/PatientCollection.py b/homework/PatientCollection.py new file mode 100644 index 0000000..30b0044 --- /dev/null +++ b/homework/PatientCollection.py @@ -0,0 +1,52 @@ +import os +from homework.Log import collectinfo, collecterr +from homework.Patient import Patient + + +class PatientCollection: + pat = Patient() + + def __init__(self, path_to_file): + if not os.path.isfile(path_to_file): + collecterr.error("File not accessible") + self.filepath = path_to_file + collectinfo.info("File exist") + + def __iter__(self): + fileBytePos = 0 + while True: + inFile = open(self.filepath) + inFile.seek(fileBytePos) + data = inFile.readline() + if data[:len(data) - 2] == '\n': + data = data[:len(data) - 2] + if not data: + collecterr.warning("Argument in limit was greater than Collections size, that's why we printed it all.") + inFile.close() + return + self.pat.create(*data.split(' ')) + yield self.pat + fileBytePos = inFile.tell() + inFile.close() + + def limit(self, num): + if num < 1: + collecterr.error("Argument in limit should be >1.") + return + counter = 0 + fileBytePos = 0 + while True: + inFile = open(self.filepath) + inFile.seek(fileBytePos) + data = inFile.readline() + if data[:len(data) - 2] == '\n': + data = data[:len(data) - 2] + if not data or counter == num: + collecterr.warning("Argument in limit was greater than Collections size, that's why we printed it all.") + inFile.close() + return + self.pat.create(*data.split(' ')) + yield self.pat + fileBytePos = inFile.tell() + inFile.close() + diff --git a/homework/config.py b/homework/config.py index 955b991..a733b4d 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" -PHONE_FORMAT = "79160000000" # Здесь запишите телефон +7-916-000-00-00 в том формате, в котором вы храните телефоны +GOOD_LOG_FILE = "/home/alexsun8/kib/ДЗ2/python_developer_hw2/homework/Good_Logs.txt" +ERROR_LOG_FILE = "/home/alexsun8/kib/ДЗ2/python_developer_hw2/homework/Bad_Logs.txt" +CSV_PATH = "PatienList.csv" +PHONE_FORMAT = "+79160000000" # Здесь запишите телефон +7-916-000-00-00 в том формате, в котором вы храните телефоны PASSPORT_TYPE = "паспорт" # тип документа, когда он паспорт -PASSPORT_FORMAT = "0000 000000" # Здесь запишите номер парспорта 0000 000000 в том формате, в котором вы его храните +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..2666819 100644 --- a/homework/patient.py +++ b/homework/patient.py @@ -1,17 +1,117 @@ +import csv +import os +from homework.Descriptor import * +import logging +from homework.config import CSV_PATH + + +# from homework.Log import patinfo, paterr, collectinfo, collecterr + + class Patient: - def __init__(self, *args, **kwargs): - pass + first_name = Name() + last_name = Name() + birth_date = Date() + phone = Phone() + document_type = DocType() + document_id = DocId() + created = False + + formatter = logging.Formatter("%(filename)s[LINE:%(lineno)d]# %(levelname)-8s [%(asctime)s] %(message)s") + handler = logging.FileHandler('/home/alexsun8/kib/ДЗ2/python_developer_hw2/homework/Good_Logs.txt', 'a', 'utf-8') + handlerbad = logging.FileHandler('/home/alexsun8/kib/ДЗ2/python_developer_hw2/homework/Bad_Logs.txt', 'a', 'utf-8') + handler.setFormatter(formatter) + # handlerbad = handler + # handlerbad = handler2 + + # logs in Patient class + patinfo = logging.getLogger("Patient info") + patinfo.setLevel(logging.INFO) + patinfo.addHandler(handler) + paterr = logging.getLogger("Patient errors") + paterr.setLevel(logging.ERROR) + paterr.addHandler(handlerbad) - def create(*args, **kwargs): - raise NotImplementedError() + def __init__(self, *args): + if len(args) == 0: + self.created = False + self.patinfo.debug("Empty Patient was created") + # patinfo.info("Empty Patient was created") + return + elif not len(args) == 6: + self.created = False + self.paterr.error( + "There shold be 6 args: first_name_, last_name_, birth_date_, phone_, document_type_, document_id_. Patient wasn't created") + return + # try: + + self.created = False + 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] + if not ( + self.first_name or self.last_name or self.birth_date or self.phone or self.document_type or self.document_id): + raise AttributeError + self.created = True + self.patinfo.info("User was created") + # except: + # self.created = False + # self.paterr.error("Error. User was not created.") + # raise AttributeError + + @staticmethod + def create(*args): + return Patient(*args) def save(self): - pass + if not self.created: + self.paterr.warning("User is NONE, so it wasn't saved.") + try: + data = [self.first_name, self.last_name, self.birth_date, self.phone, self.document_type, self.document_id] + filename = "PatienList.csv" + # filename = CSV_PATH + with open(filename, "a", newline="", encoding='utf-8') as file: + writer = csv.writer(file) + writer.writerow(data) + self.patinfo.info("User was saved.") + except: + self.paterr.error("User was not saved!") + raise AttributeError + + def __str__(self): + if not self.created: + return "" + data = ' '.join( + [self.first_name, self.last_name, self.birth_date, self.phone, self.document_type, self.document_id]) + # self.patinfo.info(data) + return data class PatientCollection: - def __init__(self, log_file): - pass + def __init__(self, path_to_file): + if not os.path.isfile(path_to_file): + raise ValueError("Path does,") + self.filepath = path_to_file + + def __iter__(self): + with open('PatienList.csv', 'r', encoding='utf-8') as File: + reader = csv.reader(File) + for row in reader: + a = Patient(*row) + yield a + + def limit(self, num): + if num < 1: + raise ValueError("Argument in limit should be >1.") + counter = 0 + with open('PatienList.csv', 'r', encoding='utf-8') as File: + reader = csv.reader(File) + for row in reader: + if counter >=num: + return + a = Patient(*row) + yield a - def limit(self, n): - raise NotImplementedError() diff --git a/tests/test_patient_collection.py b/tests/test_patient_collection.py index 9536eff..5b39a00 100644 --- a/tests/test_patient_collection.py +++ b/tests/test_patient_collection.py @@ -7,17 +7,17 @@ from tests.constants import PATIENT_FIELDS GOOD_PARAMS = ( - ("Кондрат", "Рюрик", "1971-01-11", "79160000000", PASSPORT_TYPE, "0228 000000"), - ("Евпатий", "Коловрат", "1972-01-11", "79160000001", PASSPORT_TYPE, "0228 000001"), + ("Кондрат", "Рюрик", "1971-01-31", "79160000000", PASSPORT_TYPE, "0228 000000"), + ("Евпатий", "Коловрат", "1972-01-31", "79160000001", PASSPORT_TYPE, "0228 000001"), ("Ада", "Лавлейс", "1978-01-21", "79160000002", PASSPORT_TYPE, "0228 000002"), - ("Миртл", "Плакса", "1880-01-11", "79160000003", PASSPORT_TYPE, "0228 000003"), - ("Евлампия", "Фамилия", "1999-01-21", "79160000004", PASSPORT_TYPE, "0228 000004"), - ("Кузя", "Кузьмин", "2000-01-21", "79160000005", PASSPORT_TYPE, "0228 000005"), - ("Гарри", "Поттер", "2020-01-11", "79160000006", PASSPORT_TYPE, "0228 000006"), - ("Рон", "Уизли", "1900-04-20", "79160000007", PASSPORT_TYPE, "0228 000007"), + ("Миртл", "Плакса", "1980-01-31", "79160000003", PASSPORT_TYPE, "0228 000003"), + ("Евлампия", "Фамилия", "1999-01-31", "79160000004", PASSPORT_TYPE, "0228 000004"), + ("Кузя", "Кузьмин", "2000-01-31", "79160000005", PASSPORT_TYPE, "0228 000005"), + ("Гарри", "Поттер", "2000-01-31", "79160000006", PASSPORT_TYPE, "0228 000006"), + ("Рон", "Уизли", "1900-04-31", "79160000007", PASSPORT_TYPE, "0228 000007"), ("Билл", "Гейтс", "1978-12-31", "79160000008", PASSPORT_TYPE, "0228 000008"), ("Владимир", "Джугашвили", "1912-01-31", "79160000009", PASSPORT_TYPE, "0228 000009"), - ("Вован", "ДеМорт", "1978-11-30", "79160000010", PASSPORT_TYPE, "0228 000010"), + ("Вован", "ДеМорт", "1978-11-31", "79160000010", PASSPORT_TYPE, "0228 000010"), ("Гопник", "Районный", "1978-01-25", "79160000011", PASSPORT_TYPE, "0228 000011"), ("Фёдор", "Достоевский", "1978-01-05", "79160000012", PASSPORT_TYPE, "0228 000012"), ) From 55e86a62084b7104c25d742b1466427bd92082d1 Mon Sep 17 00:00:00 2001 From: Alexandra Molodenova Date: Sat, 2 May 2020 22:42:17 +0300 Subject: [PATCH 2/2] delete needless files, datetime, created->def --- homework/DataIsValid.py | 77 +++++++++---------------- homework/Descriptor.py | 17 +++--- homework/Log.py | 46 --------------- homework/Patient.py | 97 -------------------------------- homework/PatientCollection.py | 52 ----------------- homework/patient.py | 18 ++++-- tests/test_patient_collection.py | 4 +- 7 files changed, 49 insertions(+), 262 deletions(-) delete mode 100644 homework/Log.py delete mode 100644 homework/Patient.py delete mode 100644 homework/PatientCollection.py diff --git a/homework/DataIsValid.py b/homework/DataIsValid.py index 636424b..721e465 100644 --- a/homework/DataIsValid.py +++ b/homework/DataIsValid.py @@ -1,85 +1,62 @@ from copy import deepcopy from re import fullmatch, sub, search +from datetime import date as dt + + # from homework.Log import validerr def nameReal(name_): pattern = "[0-9]" name = sub(pattern, "", name_) - if len(name)==0: - return False + if len(name) == 0: + return None return name - -def dateIsReal(date): - year = int(date[:4]) - if year < 1900 or year > 2020: - # validerr.paterr.warning(["It should be: 1900 12: - # validerr.paterr.warning(["It should be: 0 31: - # validerr.paterr.warning(["It should be: 0 29: - # validerr.paterr.warning("In Feb only 28 or 29 days") - return False - - if month == 2 and day == 29: - print("WOW!") - return date - - def dateIsValid(date): pattern1 = "\d{4}.\d{2}.\d{2}" # y-m-d pattern2 = "\d{2}.\d{2}.\d{4}" # d-m-y match1 = fullmatch(pattern1, date) match2 = fullmatch(pattern2, date) + if match1: - return dateIsReal(date) + try: + d = str(dt(int(date[:4]), int(date[5:7]), int(date[8:]))) + except: + return None elif match2: - dateNew = deepcopy(date[len(date) - 4:]) - dateNew = '-'.join([dateNew, date[len(date) - 7:len(date) - 5]]) - dateNew = '-'.join([dateNew, date[:2]]) - if dateIsReal(dateNew): - return dateNew - else: - return False + try: + d = dt(int(date[8:]), int(date[5:7]), int(date[:4])) + except: + return None else: - return False + return None + return d -# print(dateIsReal("1978-01-05")) -def phoneIsValid( phone_): +def phoneIsValid(phone_): pattern = "[^+,0,1,2,3,4,5,6,7,8,9]" phone = sub(pattern, "", phone_) - if len(phone)<10: - return False - if phone[0] == '8' or phone[0]=='7': + if len(phone) < 10: + return None + if phone[0] == '8' or phone[0] == '7': phone = ''.join(['+7', phone[1:]]) elif not phone[0] == '+' or not phone[1] == '7': # validerr.paterr.warning(["Only Russians numbers are valid. +7-xxx-xxx-xx-xx or 8-xxx-xxx-xx-xx. Your num: ", phone]) - return False + return None if not len(phone) == 12: # validerr.paterr.warning(["Only Russians numbers are valid. len !=12 . Your num: ", phone]) - return False + return None if not (phone[2:5] == '495' or phone[2:5] == '499' or phone[2] == '9'): # validerr.paterr.warning(["Only Russians numbers are valid. +7-499-... or +7-495-... or +7-9..-.... Your num: ", phone]) - return False + return None return phone - def docTypeIsValid(doc_type): if not isinstance(doc_type, str): - return False + return None doc_type = doc_type.lower() passport = "паспорт" @@ -99,7 +76,7 @@ def docTypeIsValid(doc_type): doc_type): return "права" - return False + return None def docIdIsValid(id, type=None): @@ -110,9 +87,9 @@ def docIdIsValid(id, type=None): return id else: # validerr.paterr.warning(["Zpass - len ==9. In dr and pass-10. Your type: ", type, ". Your id: ", id]) - return False + return None elif len(id) == 9 and (type == "загран" or not type): # validerr.paterr.warning(["Zpass - len ==9. In dr and pass-10. Your type: ", type, ". Your id: ", id]) return id else: - return False + return None diff --git a/homework/Descriptor.py b/homework/Descriptor.py index 0aafa89..4431c46 100644 --- a/homework/Descriptor.py +++ b/homework/Descriptor.py @@ -11,7 +11,7 @@ def __set__(self, instance, val): instance.paterr.error('Invalid name.') instance.paterr.error("Error. User was not created.") raise TypeError("not str") - elif instance.created: + elif instance.is_created(): instance.paterr.error("You can't change name") instance.paterr.error("Error. User was not created.") raise AttributeError("can't change name") @@ -47,7 +47,7 @@ def __set__(self, instance, number): number = prov instance.__dict__[self.name] = number instance.patinfo.debug(["number is okey: ", number]) - if instance.created: + if instance.is_created(): instance.patinfo.info(["number is okey: ", number]) def __set_name__(self, owner, name): @@ -70,7 +70,7 @@ def __set__(self, instance, type): raise ValueError("doctype error") instance.__dict__[self.name] = prov instance.patinfo.debug(["Doc type is okey:", prov]) - if instance.created: + if instance.is_created(): instance.patinfo.info(["Dov type is okey: ", prov]) def __set_name__(self, owner, name): @@ -94,7 +94,7 @@ def __set__(self, instance,id): raise ValueError("docid error") instance.__dict__[self.name] = prov instance.patinfo.debug(["Doc id okey: ", prov]) - if instance.created: + if instance.is_created(): instance.patinfo.info(["Doc id is okey: ", prov]) def __set_name__(self, owner, name): @@ -116,11 +116,10 @@ def __set__(self, instance, date): instance.paterr.error('Invalid date. year-month-day') instance.paterr.error("Error. User was not created.") raise ValueError("date error") - date = prov - instance.__dict__[self.name] = date - instance.patinfo.debug(["Date is okey: ", date]) - if instance.created: - instance.patinfo.info(["Date is okey: ", date]) + instance.__dict__[self.name] = prov + instance.patinfo.debug(["Date is okey: ", prov]) + if instance.is_created(): + instance.patinfo.info(["Date is okey: ", prov]) def __set_name__(self, owner, name): self.name = name diff --git a/homework/Log.py b/homework/Log.py deleted file mode 100644 index b899fe4..0000000 --- a/homework/Log.py +++ /dev/null @@ -1,46 +0,0 @@ -import logging - -# u should uncomment lines, and comment 2 times 1 line line on comment and it'll start write logs in 2 files -# handler = logging.FileHandler('Logs.txt', 'a', 'utf-8') -handler = logging.FileHandler('/home/alexsun8/kib/ДЗ2/python_developer_hw2/homework/Good_Logs.txt', 'a', 'utf-8') -handler2 = logging.FileHandler('/home/alexsun8/kib/ДЗ2/python_developer_hw2/homework/Bad_Logs.txt', 'a', 'utf-8') -formatter = logging.Formatter("%(filename)s[LINE:%(lineno)d]# %(levelname)-8s [%(asctime)s] %(message)s") -handler.setFormatter(formatter) -# handlerbad = handler -handlerbad = handler2 - - -# logs in Patient class -patinfo = logging.getLogger("Patient info") -patinfo.setLevel(logging.INFO) -patinfo.addHandler(handler) -paterr = logging.getLogger("Patient errors") -paterr.setLevel(logging.ERROR) -paterr.addHandler(handlerbad) - -# logs in Pat. Colle -collectinfo = logging.getLogger("Collection info") -collectinfo.setLevel(logging.INFO) -collectinfo.addHandler(handler) -collecterr = logging.getLogger("Collection errors") -collecterr.setLevel(logging.ERROR) -collecterr.addHandler(handlerbad) - -# logs in Descriptors in data valid -validator = logging.getLogger("Validator") -validator.setLevel(logging.INFO) -validator.addHandler(handler) -validerr = logging.getLogger("Validator errors") -validerr.setLevel(logging.ERROR) -validerr.addHandler(handlerbad) - -# for logging in console -consoleHandler = logging.StreamHandler() -consoleHandler.setFormatter(formatter) - -collectinfo.addHandler(consoleHandler) -collecterr.addHandler(consoleHandler) -patinfo.addHandler(consoleHandler) -paterr.addHandler(consoleHandler) -validator.addHandler(consoleHandler) -validerr.addHandler(consoleHandler) diff --git a/homework/Patient.py b/homework/Patient.py deleted file mode 100644 index 6b06dfc..0000000 --- a/homework/Patient.py +++ /dev/null @@ -1,97 +0,0 @@ -from homework.Descriptor import * -from homework.Log import patinfo, paterr - - -class Patient: - first_name = Name() - last_name = Name() - birth_date = Date() - phone = Phone() - document_type = DocType() - document_id = DocId() - created = False - - def __init__(self, *args): - if len(args) == 0: - self.created = False - patinfo.info("Empty Patient was created") - return - elif not len(args) == 6: - self.created = False - paterr.error( - "There shold be 6 args: first_name_, last_name_, birth_date_, phone_, document_type_, document_id_. Patient wasn't created") - return - try: - # self.created = False - 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] - self.created = True - if not ( - self.first_name or self.last_name or self.birth_date or self.phone or self.document_type or self.document_id): - raise AttributeError - patinfo.info("User was created") - except: - self.created = False - paterr.error("Error. User was not created.") - - def create(self, *args): - if not len(args) == 6: - self.created = False - paterr.error( - "There shold be 6 args: first_name_, last_name_, birth_date_, phone_, document_type_, document_id_. Patient wasn't created") - return - - try: - self.created = False - 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] - if not ( - self.first_name or self.last_name or self.birth_date or self.phone or self.document_type or self.document_id): - raise AttributeError - self.created = True - patinfo.info("User was created") - except: - self.created = False - paterr.error("Error. User was not created.") - - def save(self): - if not self.created: - paterr.warning("User is NONE, so it wasn't saved.") - try: - data = ' '.join( - [self.first_name, self.last_name, self.birth_date, self.phone, self.document_type, self.document_id, - '\n']) - filename = "PatientList.csv" - with open(filename, 'a+') as file: - file.write(data) - patinfo.info("User was saved.") - except: - paterr.error("User was not saved!") - - def __str__(self): - if not self.created: - return "" - data = ' '.join( - [self.first_name, self.last_name, self.birth_date, self.phone, self.document_type, self.document_id]) - return data - - -# pat = Patient("Alice", "asdasd", "2003-02-30", "89234445553", "pfuhfy", "627 78 99977") -# pat.save() -# pat.create("Alice", "as", "2003-02-26", "89234445553", "ghfdf", "627 78 99977") -# pat.save() -# pat.last_name = "Johnson" -# pat.birth_date = "01-02-1990" -# # print(pat) -# -# pat = Patient() -# pat.create("bob", "as", "2003-02-26", "89234445553", "gfcgjhn", "627 78 99977") -# pat.save() diff --git a/homework/PatientCollection.py b/homework/PatientCollection.py deleted file mode 100644 index 30b0044..0000000 --- a/homework/PatientCollection.py +++ /dev/null @@ -1,52 +0,0 @@ -import os -from homework.Log import collectinfo, collecterr -from homework.Patient import Patient - - -class PatientCollection: - pat = Patient() - - def __init__(self, path_to_file): - if not os.path.isfile(path_to_file): - collecterr.error("File not accessible") - self.filepath = path_to_file - collectinfo.info("File exist") - - def __iter__(self): - fileBytePos = 0 - while True: - inFile = open(self.filepath) - inFile.seek(fileBytePos) - data = inFile.readline() - if data[:len(data) - 2] == '\n': - data = data[:len(data) - 2] - if not data: - collecterr.warning("Argument in limit was greater than Collections size, that's why we printed it all.") - inFile.close() - return - self.pat.create(*data.split(' ')) - yield self.pat - fileBytePos = inFile.tell() - inFile.close() - - def limit(self, num): - if num < 1: - collecterr.error("Argument in limit should be >1.") - return - counter = 0 - fileBytePos = 0 - while True: - inFile = open(self.filepath) - inFile.seek(fileBytePos) - data = inFile.readline() - if data[:len(data) - 2] == '\n': - data = data[:len(data) - 2] - if not data or counter == num: - collecterr.warning("Argument in limit was greater than Collections size, that's why we printed it all.") - inFile.close() - return - self.pat.create(*data.split(' ')) - yield self.pat - fileBytePos = inFile.tell() - inFile.close() - diff --git a/homework/patient.py b/homework/patient.py index 2666819..8157577 100644 --- a/homework/patient.py +++ b/homework/patient.py @@ -2,10 +2,7 @@ import os from homework.Descriptor import * import logging -from homework.config import CSV_PATH - - -# from homework.Log import patinfo, paterr, collectinfo, collecterr +# from homework.config import CSV_PATH class Patient: @@ -69,10 +66,16 @@ def create(*args): def save(self): if not self.created: self.paterr.warning("User is NONE, so it wasn't saved.") + filename = "PatienList.csv" + try: + with open(filename, "a", newline="", encoding='utf-8') as file: + writer = csv.writer(file) + except: + raise AttributeError("Can't open csv file") + try: data = [self.first_name, self.last_name, self.birth_date, self.phone, self.document_type, self.document_id] - filename = "PatienList.csv" - # filename = CSV_PATH + # filename = CSV_PATH with open(filename, "a", newline="", encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(data) @@ -89,6 +92,9 @@ def __str__(self): # self.patinfo.info(data) return data + def is_created(self): + return self.created + class PatientCollection: def __init__(self, path_to_file): diff --git a/tests/test_patient_collection.py b/tests/test_patient_collection.py index 5b39a00..aac6400 100644 --- a/tests/test_patient_collection.py +++ b/tests/test_patient_collection.py @@ -14,10 +14,10 @@ ("Евлампия", "Фамилия", "1999-01-31", "79160000004", PASSPORT_TYPE, "0228 000004"), ("Кузя", "Кузьмин", "2000-01-31", "79160000005", PASSPORT_TYPE, "0228 000005"), ("Гарри", "Поттер", "2000-01-31", "79160000006", PASSPORT_TYPE, "0228 000006"), - ("Рон", "Уизли", "1900-04-31", "79160000007", PASSPORT_TYPE, "0228 000007"), + ("Рон", "Уизли", "1900-04-30", "79160000007", PASSPORT_TYPE, "0228 000007"), ("Билл", "Гейтс", "1978-12-31", "79160000008", PASSPORT_TYPE, "0228 000008"), ("Владимир", "Джугашвили", "1912-01-31", "79160000009", PASSPORT_TYPE, "0228 000009"), - ("Вован", "ДеМорт", "1978-11-31", "79160000010", PASSPORT_TYPE, "0228 000010"), + ("Вован", "ДеМорт", "1978-11-30", "79160000010", PASSPORT_TYPE, "0228 000010"), ("Гопник", "Районный", "1978-01-25", "79160000011", PASSPORT_TYPE, "0228 000011"), ("Фёдор", "Достоевский", "1978-01-05", "79160000012", PASSPORT_TYPE, "0228 000012"), )