-
Notifications
You must be signed in to change notification settings - Fork 0
/
funciones_cliente.py
153 lines (145 loc) · 6.08 KB
/
funciones_cliente.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import socket
import sys
import time
from funciones_generales import control_filtro, procesamiento_csv
from modelo import Ticket
from validaciones import validar_estado
import json
def ingresar_ticket(client_socket):
"""
Toma los datos para crear un nuevo ticket, enviando un json al servidor.
:param client_socket: socket que representa el cliente.
:return: Nada
"""
sys.stdin.flush() # debemos limpiar el buffer
autor = input("\nIngrese autor del Ticket: ")
titulo = input("\nIngrese titulo del ticket: ")
descripcion = input("\nIngrese descripcion del ticket: ")
estado = input("\nIngrese estado del ticket (pendiente, en procesamiento o resuelto): ")
while validar_estado(estado):
estado = input("Estado debe ser uno de los pedidos, intentelo nuevamente: ")
data = {"autor": autor, "titulo": titulo, "descripcion": descripcion, "estado": estado}
json_data = json.dumps(data) # Convertimos el diccionario a JSON
client_socket.send(json_data.encode())
print(client_socket.recv(36).decode()) # Mensaje de feedback satisfactorio.
def consultar_tickets(client_socket,opcion,test):
"""
Metodo que abarca tanto el filtrado como la lista completa de tickets.
:param client_socket: socket que representa el cliente.
:param opcion: La cual fue elegida por el cliente.
:param test: Puede ser True en caso de la lista completa, o un diccionario
que contiene los filtros a aplicar.
:return: Nada
"""
if opcion == 'FILTRAR':
time.sleep(0.02)
client_socket.send(json.dumps(test).encode('ascii'))
if control_filtro(test):
return False
total_paginas = int(client_socket.recv(1024).decode('ascii'))
control = "-s"
num_pagina = -1
while control == "-s":
num_pagina += 1
time.sleep(0.02)
tickets = client_socket.recv(2000).decode('ascii')
dict_tickets = json.loads(tickets)
if len(dict_tickets) == 0 and total_paginas == 0:
print("¡No hay resultados para esa búsqueda/consulta!")
break
for k, v in dict_tickets.items():
for key, value in v.items():
print(f"{key}: {value}\t")
print("\n")
if num_pagina == total_paginas:
break
control = input("¿Desea ver más paginas? -s/-n: ")
while control not in ("-s", '-n'):
control = input("Opción incorrecto, recuerde: -s/-n: ")
client_socket.send(control.encode('ascii'))
def editar_ticket_cliente(test,client_socket):
"""
Toma los parametros del ticket a editar y los envia al servidor.
:param test: ID del ticket a editar o False
:param client_socket: socket que representa el cliente.
:return: Nada
"""
time.sleep(0.05)
client_socket.send(str(test).encode('ascii')) # Envio ID ticket al servidor
if test is False:
return False
menu = client_socket.recv(1024).decode() # Recibo el Menu desde el metodo menu_edicion
print(menu)
edit_option = input("Opcion: ")
while edit_option not in ('1', '2', '3'):
edit_option = input("Opcion incorrecta, intentelo nuevamente: ")
client_socket.send(edit_option.encode('ascii')) # Enviamos eleccion.
nuevo_dato = input(client_socket.recv(64).decode('ascii')) # Recibimos mensaje en funcion de la eleccion.
if edit_option == '2':
while validar_estado(nuevo_dato):
nuevo_dato = input("El estado es incorrecto, intentelo nuevamente: ")
client_socket.send(nuevo_dato.encode()) # Enviamos nuevo dato.
mensaje_exito = client_socket.recv(1024).decode()
print(mensaje_exito)
def exportar_tickets_cliente(client_socket,test):
"""
Se encarga de recibir y exportar los tickets mediante un proceso.
:param client_socket: socket que representa el cliente.
:param test: Diccionario con filtro o True.
:return: Nada
"""
time.sleep(0.02)
client_socket.send(json.dumps(test).encode('ascii')) # Mandamos datos de filtro o Boolean lista compelta
if control_filtro(test):
return False
total_paginas = int(client_socket.recv(5).decode('ascii'))
num_pagina = -1
lista_tickets = list()
while True:
num_pagina += 1
try: # Debido a que puede pasar que no se reciba el JSON completo de una vez.
datos = client_socket.recv(2000).decode('ascii')
tickets = json.loads(datos)
except json.JSONDecodeError:
datos = f"{datos}{client_socket.recv(2000).decode('ascii')}"
tickets = json.loads(datos)
if len(tickets) == 0 and total_paginas == 0:
print("¡No hay resultados para esa búsqueda!")
break
for k, v in tickets.items():
lista_tickets.append(Ticket(ticketId=v["ticketId"], fecha=v["fecha"], titulo=v["titulo"], autor=v["autor"],
descripcion=v["descripcion"], estado=v["estado"]))
if num_pagina == total_paginas:
break
datos=None
if len(lista_tickets) > 0:
procesamiento_csv(lista_tickets)
mensaje_exito = client_socket.recv(36).decode()
print(mensaje_exito)
def configurar_cliente(host,port):
"""
Configura y devuelve un socket destinado a ser cliente.
:param host: IP o alias al cual el socket se conectará
:param port: Puerto al cual el socket se conectará
:return: Objeto socket configurado.
"""
try:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
print('Fallo al crear el socket!')
sys.exit(1)
try:
client_socket.connect((host, port))
except NameError:
print("¡Nunca se especifico el puerto o host!")
sys.exit(1)
except TypeError:
print("¡La IP ingresada es invalida!")
sys.exit(1)
except OverflowError:
print("El puerto ingresado es invalido, recuerde: ¡el puerto debe estar entre 0-65535!")
sys.exit(1)
except ConnectionRefusedError:
print("¡Fallo en la conexion!, revise su configuracion e intente nuevamente.")
sys.exit(1)
return client_socket