diff --git a/homework/DataIsValid.py b/homework/DataIsValid.py new file mode 100644 index 0000000..721e465 --- /dev/null +++ b/homework/DataIsValid.py @@ -0,0 +1,95 @@ +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 None + return name + + +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: + try: + d = str(dt(int(date[:4]), int(date[5:7]), int(date[8:]))) + except: + return None + elif match2: + try: + d = dt(int(date[8:]), int(date[5:7]), int(date[:4])) + except: + return None + else: + return None + return d + + +def phoneIsValid(phone_): + pattern = "[^+,0,1,2,3,4,5,6,7,8,9]" + phone = sub(pattern, "", phone_) + 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 None + + if not len(phone) == 12: + # validerr.paterr.warning(["Only Russians numbers are valid. len !=12 . Your num: ", phone]) + 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 None + return phone + + +def docTypeIsValid(doc_type): + if not isinstance(doc_type, str): + return None + 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 None + + +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 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 None diff --git a/homework/Descriptor.py b/homework/Descriptor.py new file mode 100644 index 0000000..4431c46 --- /dev/null +++ b/homework/Descriptor.py @@ -0,0 +1,125 @@ +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.is_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.is_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.is_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.is_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") + 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/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/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..8157577 100644 --- a/homework/patient.py +++ b/homework/patient.py @@ -1,17 +1,123 @@ +import csv +import os +from homework.Descriptor import * +import logging +# from homework.config import CSV_PATH + + 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 __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 - def create(*args, **kwargs): - raise NotImplementedError() + @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.") + 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 = 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 + + def is_created(self): + return self.created 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..aac6400 100644 --- a/tests/test_patient_collection.py +++ b/tests/test_patient_collection.py @@ -7,14 +7,14 @@ 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-30", "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"),