Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions homework/config.py
Original file line number Diff line number Diff line change
@@ -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_FORMAT = "000000000" # формат хранения заграна для номера 00 0000000

DRIVER_LICENSE_TYPE = "водительское удостоверение" # тип документа, если это водительское удостоверение
DRIVER_LICENSE_FORMAT = "00 00 000000" # формат хранения номера ВУ
DRIVER_LICENSE_TYPE = "Водительские права" # тип документа, если это водительское удостоверение
DRIVER_LICENSE_FORMAT = "0000000000" # формат хранения номера ВУ
14 changes: 14 additions & 0 deletions homework/logs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import logging

logger = logging.getLogger("inf")
logger.setLevel(logging.INFO)
handler_inf = logging.FileHandler('inf.log', 'w', 'utf-8')
formatter = logging.Formatter("%(filename)s[LINE:%(lineno)d]# %(levelname)-8s [%(asctime)s] %(message)s")
handler_inf.setFormatter(formatter)
logger.addHandler(handler_inf)

err = logging.getLogger("err")
err.setLevel(logging.ERROR)
handler_err = logging.FileHandler('err.log', 'w', 'utf-8')
handler_err.setFormatter(formatter)
err.addHandler(handler_err)
66 changes: 58 additions & 8 deletions homework/patient.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,67 @@
import csv
import logging
import homework.logs as logs
import homework.validators as validators

path = "data.csv"

class Patient:
def __init__(self, *args, **kwargs):
pass
first_name = validators.NotRen()
last_name = validators.NotRen()
birth_date = validators.Date()
phone = validators.Phone()
document_type = validators.DocType()
document_id = validators.DocId()

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
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(','))
173 changes: 173 additions & 0 deletions homework/validators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
import datetime
import time


class PatientName():
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():
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():
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 DocType():
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 DocId():
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 NotRen(PatientName):
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)