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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,5 @@ dmypy.json


.idea

create_db.py
43 changes: 43 additions & 0 deletions CLI.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import click

from homework.patient import Patient, PatientCollection


@click.group()
def cli():
pass

@cli.command()
@click.argument("first_name")
@click.argument("last_name")
@click.option("--birth-date", help="Birth day")
@click.option("--phone", help="Phone")
@click.option("--document-type", help="Document type")
@click.option("--document-number", help="Document id")
def create(first_name, last_name, birth_date, phone, document_type, document_number):
par = Patient.create(first_name, last_name, birth_date, phone, document_type, document_number)
print(par.save())
click.echo(par)


@cli.command()
@click.option("--val", default=10, help="limit")
def show(val):
Pc = PatientCollection()
for pat in Pc.limit(val):
click.echo(pat)


@cli.command()
def count():
click.echo(PatientCollection().count())
# print(PatientCollection().count())
#
#
# cli.command(create)
# cli.command(show)
# cli.command(count)

cli()
# if __name__ == 'main':
# pass
Empty file added homework/Bad_Logs.txt
Empty file.
95 changes: 95 additions & 0 deletions homework/DataIsValid.py
Original file line number Diff line number Diff line change
@@ -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
107 changes: 107 additions & 0 deletions homework/Decorators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import os
import psycopg2


def Pat_create_logs(ini):
def wrapper_pc(self, *args):
if len(args) == 0:
self.patinfo.debug("Empty Patient was created")
return
elif not len(args) == 6:
self.paterr.error(
"There should be 6 args: first_name_, last_name_, birth_date_, phone_, document_type_, document_id_. Patient wasn't created")
return
ini(self, *args)
if not (
self.first_name or self.last_name or self.birth_date or self.phone or self.document_type or self.document_id):
self.created = False
raise AttributeError
self.patinfo.info("User was created")

return wrapper_pc


def Pat_save_logs(save):
def wrapper_ps(self):
if not self.created:
self.paterr.warning("User is NONE, so it wasn't saved.")
# try:
# with open(filename, "a", newline="", encoding='utf-8') as file:
# writer = wr(file)
# except:
# raise AttributeError("Can't open csv file")
try:
save(self)
self.patinfo.info("User was saved.")
except:
self.paterr.error("User was not saved!")
raise AttributeError

return wrapper_ps


def PC_create(ini):
def wrapper_pcc(self, path):
if not os.path.isfile(path):
raise ValueError("Path does exist")
ini(self, path)

return wrapper_pcc


def Name_set(set):
def wrapper_ns(self, instance, val):
# raise TypeError
if not isinstance(val, str):
instance.paterr.error('Invalid name.')
instance.paterr.error("Error. User was not created.")
raise TypeError("not str")

if 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")

if not set(self, instance, val):
instance.paterr.error("Wrong name")
instance.paterr.error("Error. User was not created.")
raise ValueError("wrong name")

instance.patinfo.debug(["name is okey:", instance.__dict__[self.name]])

return wrapper_ns


def set_descr(set):
def wrapper_sd(self, instance, val):
d_t = self.name
if not isinstance(val, str):
instance.paterr.error(['Invalid ', d_t])
instance.paterr.error("Error. User was not created.")
raise TypeError("not str")

if not set(self, instance, val):
instance.paterr.error(['Invalid value ', d_t])
instance.paterr.error("Error. User was not created.")
raise ValueError([d_t, " error"])

instance.patinfo.debug([d_t, " is okey: ", instance.__dict__[self.name]])
if instance.is_created():
instance.patinfo.info([d_t, " is okey: ", instance.__dict__[self.name]])

return wrapper_sd


def PC_create_db(ini):
def wrapper_pcidb(self, db="postgres", user_="alex", password_="1234", host_="127.0.0.1", port_="5432"):
with psycopg2.connect(
database="postgres",
user="alex",
password="1234",
host="127.0.0.1",
port="5432") as con:
pass

ini(self, db, user_, password_, host_, port_)

return wrapper_pcidb
89 changes: 89 additions & 0 deletions homework/Descriptor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
from homework.DataIsValid import *
from homework.Decorators import Name_set, set_descr


class Name:
def __get__(self, instance, owner):
return instance.__dict__[self.name]

@Name_set
def __set__(self, instance, val):
n = nameReal(val)
if not n:
return None

instance.__dict__[self.name] = n
return n

def __set_name__(self, owner, name):
self.name = name


class Phone:
def __get__(self, instance, owner):
return instance.__dict__[self.name]

@set_descr
def __set__(self, instance, number):
prov = phoneIsValid(number)
if not prov:
return None

instance.__dict__[self.name] = prov
return prov

def __set_name__(self, owner, name):
self.name = name


class DocType():
def __get__(self, instance, owner):
return instance.__dict__[self.name]

@set_descr
def __set__(self, instance, type):
prov = docTypeIsValid(type)
if not prov:
return None

instance.__dict__[self.name] = prov
return prov

def __set_name__(self, owner, name):
self.name = name


class DocId:
def __get__(self, instance, owner):
return instance.__dict__[self.name]

@set_descr
def __set__(self, instance, id):
self.type = instance.document_type
prov = docIdIsValid(id, self.type)

if not prov:
return None

instance.__dict__[self.name] = prov
return 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]

@set_descr
def __set__(self, instance, date):
prov = dateIsValid(date)
if not prov:
return None
instance.__dict__[self.name] = prov
return prov

def __set_name__(self, owner, name):
self.name = name
Empty file added homework/Good_Logs.txt
Empty file.
7 changes: 7 additions & 0 deletions homework/PatienList.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Кондрат,Рюрик,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
Фёдор,Достоевский,1978-01-05,+79160000012,паспорт,0228000012
Фёдор,Достоевский,1978-01-05,+79160000012,паспорт,0228000012
18 changes: 9 additions & 9 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"
PHONE_FORMAT = "79160000000" # Здесь запишите телефон +7-916-000-00-00 в том формате, в котором вы храните телефоны
GOOD_LOG_FILE = "/home/alexsun8/kib/python_developer_hw2/homework/Good_Logs.txt"
ERROR_LOG_FILE = "/home/alexsun8/kib/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" # формат хранения номера ВУ
22 changes: 22 additions & 0 deletions homework/create_db.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# import psycopg2
#
# #
#
# # # Creating a cursor object using the cursor() method
# # cursor = con.cursor()
# #
# # # Doping EMPLOYEE table if already exists.
# # cursor.execute("DROP TABLE IF EXISTS PATIENTS")
# #
# # # Creating table as per requirement
# # sql = '''CREATE TABLE PATIENTS(
# # FIRST_NAME CHAR(20) NOT NULL,
# # LAST_NAME CHAR(20) NOT NULL,
# # BIRTH_DATE CHAR(10) NOT NULL,
# # PHONE CHAR(12) NOT NULL,
# # DOCUMENT_TYPE CHAR(20) NOT NULL,
# # DOCUMENT_ID CHAR(20) NOT NULL
# # )'''
# # cursor.execute(sql)
# # print("Table created successfully........")
#
Loading