def get(self, request): canastas = Canasta.objects.filter( esta_publicada=True, fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)) if canastas: arreglo_canastas = formatear_lista_canastas( canastas, get_id_cooperativa_global(request)) return render(request, 'Cliente/canastas.html', {'canastas_json': json.dumps(arreglo_canastas)}) else: messages.add_message(request, messages.INFO, 'Actualmente no hay canastas disponibles') return redirect(reverse('cliente:index'))
def setUp(self): cooperativa = Cooperativa.objects.create(nombre='Cooperativa', ciudad='Ciudad', departamento='Departamento') cooperativa.save() semana = get_or_create_week() categoria = Categoria( nombre='Nombre de la categoría', descripcion='Descripción de la categoría de pruebas', imagen='categorias/imagen-pruebas.jpg') categoria.save() counter = 1 limit = 10 while counter <= limit: Producto( fk_categoria_id=categoria.id, nombre='Producto de pruebas {0}'.format(counter), descripcion='Descripción del producto de pruebas {0}'.format( counter), imagen='productos/producto-prueba-{0}.png'.format(counter), fecha_creacion=timezone.now(), unidad_medida='Kg').save() counter += 1 catalogo = Catalogo(fk_semana_id=semana.id, fecha_creacion=timezone.now(), fecha_cierre=timezone.now() + timedelta(days=5)) catalogo.save() productos = Producto.objects.all() for producto in productos: Catalogo_Producto(fk_catalogo=catalogo, fk_producto=producto, precio=Decimal('1600')).save() if platform.system() == 'Darwin': self.browser = webdriver.Chrome( os.path.join(BASE_DIR, 'Administrador', 'chromedriver', 'chromedriver')) elif platform.system() == 'Linux': self.browser = webdriver.Chrome() else: self.browser = webdriver.Chrome( os.path.join(BASE_DIR, 'Administrador', 'chromedriver', 'chromedriver.exe')) self.browser.implicitly_wait(2000000000)
def get(self, request): semana = get_or_create_week() ofertas_pro = Oferta_Producto \ .objects.filter(estado=1, fk_oferta__fk_semana=semana, fk_oferta__fk_productor__fk_cooperativa_id=get_id_cooperativa_global(request)) \ .values('fk_producto', 'fk_producto__nombre', 'fk_producto__imagen', 'fk_producto__unidad_medida') \ .annotate(canAceptada=Sum('cantidad_aceptada'), canVendida=Sum('cantidad_vendida'), canDisponible=Sum(F('cantidad_aceptada') - F('cantidad_vendida'))) \ .distinct() return render(request, 'Administrador/Informes/inventario.html', { 'ofertas_pro': ofertas_pro, 'semana': semana })
def post(self, request): sugerir_producto_Json = json.loads(request.POST.get('sugerir-producto-form')) configuracion = sugerir_producto_Json.get('configuracion') num_usuarios = configuracion.get('numUsuarios') productos_actuales = configuracion.get('reemplazar') usuarios = configuracion.get('todos') semana = get_or_create_week() if productos_actuales: ClienteProducto.objects.filter(fk_semana=semana).update(sugerir=False) for producto_id in sugerir_producto_Json.get('sugerir_productos'): if usuarios: self.sugerirProductosTodosClientes(producto_id.get('productos')) else: self.grabarPruductosSugeridos(producto_id.get('productos'), semana, int(num_usuarios)) return redirect(reverse('administrador:consultar-productos-sugeridos'))
def get(self, request, id_canasta): canasta = Canasta.objects.filter(id=id_canasta, fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)).first() if canasta: ids_productos_canasta = CanastaProducto.objects \ .filter(fk_canasta_id=canasta.id) \ .values_list('fk_producto_catalogo_id', flat=True) productos_disponibles = Catalogo_Producto.objects \ .filter(fk_catalogo__fk_semana_id=canasta.fk_semana_id, fk_catalogo__fk_cooperativa_id=get_id_cooperativa_global(request)) \ .exclude(id__in=ids_productos_canasta) \ .distinct() return render(request, 'Administrador/detalles-canasta.html', { 'canasta': canasta, 'productos_disponibles': productos_disponibles }) else: messages.add_message(request, messages.ERROR, 'No existe la canasta que estás buscando') return redirect(reverse('administrador:canastas'))
def actualizar_inventario(producto_catalogo, cantidad, cooperativa_id): cantidad_restante = cantidad ofertas_productos = Oferta_Producto.objects \ .filter(fk_producto=producto_catalogo.fk_producto, fk_oferta__fk_semana=get_or_create_week(), estado=1, fk_oferta__fk_productor__fk_cooperativa_id=cooperativa_id) \ .exclude(cantidad_vendida=F('cantidad_aceptada')) \ .order_by('precioProvedor') for oferta_producto in ofertas_productos: disponible_productos = oferta_producto.cantidad_aceptada - oferta_producto.cantidad_vendida if cantidad_restante == 0: break if disponible_productos >= cantidad_restante: oferta_producto.cantidad_vendida += cantidad_restante cantidad_restante = 0 else: cantidad_restante -= disponible_productos oferta_producto.cantidad_vendida += disponible_productos oferta_producto.save() return cantidad_restante
def sugerirProductosTodosClientes(self, producto_id): productos = Producto.objects.filter(id=producto_id) if productos.exists(): producto = productos[0] for cliente in Cliente.objects.all(): cliente_producto_model=ClienteProducto.objects.filter(fk_producto=producto, fk_cliente=cliente) if cliente_producto_model.exists(): cliente_producto_model.update(sugerir=True) else: cliente_producto_model = ClienteProducto( fk_cliente=cliente, fk_producto=producto, fk_semana=get_or_create_week(), cantidad=0, frecuencia=0, sugerir=True ) cliente_producto_model.save()
def get(self, request): cooperativas = Cooperativa.objects.all() cooperativa_id = get_cooperativa_cliente(request) catalogo = Catalogo.objects.filter(fk_semana=get_or_create_week(), fk_cooperativa_id=cooperativa_id) producto_catalogo = Catalogo_Producto.objects \ .filter(fk_catalogo=catalogo).order_by('fk_producto__nombre') categorias = Categoria.objects.all() productos = formatear_lista_productos(producto_catalogo, request, cooperativa_id) return render( request, 'Cliente/index.html', { 'productos_json': json.dumps(productos), 'productos_catalogo': producto_catalogo, 'categorias': categorias, 'cooperativas': cooperativas, 'solo_favoritos': False, 'cooperativaSeleccionada': get_cooperativa_cliente(request), 'buscarGeolocation': 1 })
def post(self, request): # Se listan los productos por Cooperativa y se ordenan segun filtro cooperativa_id = request.POST.get('cooperativa_id', '') set_cooperativa_cliente(request, cooperativa_id) catalogo = Catalogo.objects.filter(fk_semana=get_or_create_week(), fk_cooperativa_id=cooperativa_id) cliente_model = Cliente.objects.filter( fk_django_user=self.request.user).first() cliente_producto = ClienteProducto.objects.filter( sugerir=True, fk_cliente=cliente_model).values('fk_producto_id') producto_catalogo = Catalogo_Producto.objects.filter(fk_catalogo=catalogo, fk_producto_id__in=cliente_producto)\ .order_by('fk_producto__nombre') categorias = Categoria.objects.all() cooperativas = Cooperativa.objects.all() productos = formatear_lista_productos(producto_catalogo, request, int(cooperativa_id)) mensaje = '' if len(productos) == 0: mensaje = 'La cooperativa seleccionada no cuenta con productos sugeridos para ti.' return render( request, 'Cliente/productos-sugeridos.html', { 'productos_json': json.dumps(productos), 'categorias': categorias, 'cooperativas': cooperativas, 'mensajePython': mensaje, 'cooperativaSeleccionada': get_cooperativa_cliente(request), 'buscarGeolocation': 0 })
def post(self, request): canastas = Canasta.objects.filter(fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)) canastas.update(esta_publicada=True) messages.add_message(request, messages.SUCCESS, 'Las canastas fueron publicadas exitosamente') return redirect(reverse('administrador:canastas'))
def get(self, request): canastas = Canasta.objects.filter(fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)) return render(request, 'Administrador/canastas.html', {'canastas': canastas})
def post(self, request): checkout_Json = json.loads(request.POST.get('checkout_form')) detalles_productos = checkout_Json.get('detalles_productos') detalles_canastas = checkout_Json.get('detalles_canastas') informacion_envio = checkout_Json.get('informacion_envio') informacion_pago = checkout_Json.get('informacion_pago') nombre_envio = informacion_envio.get('nombre') direccion_envio = informacion_envio.get('direccion') email_envio = informacion_envio.get('email') celular_envio = informacion_envio.get('celular') telefono_envio = informacion_envio.get('telefono') observaciones_envio = informacion_envio.get('observaciones') nombre_pago = informacion_pago.get('nombre_completo') numero_identificacion = informacion_pago.get('numero_documento') tipo_identificacion = informacion_pago.get('tipo_documento') cliente_model = Cliente.objects.filter( fk_django_user_id=request.user.id).first() pedido_model = Pedido(fk_cliente=cliente_model, fecha_pedido=datetime.now(), fecha_entrega=datetime.now(), estado='PE', valor_total=0, nombre_envio=nombre_envio, direccion_envio=direccion_envio, email_envio=email_envio, telefono_envio=telefono_envio, observaciones_envio=observaciones_envio, nombre_pago=nombre_pago, tipo_identificacion=tipo_identificacion, numero_identificacion=numero_identificacion) checkpoint = savepoint() pedido_model.save() id_cooperativa = get_id_cooperativa_global(request) valor_total = 0 for item in detalles_productos: producto_catalogo = Catalogo_Producto.objects.get( fk_producto_id=item.get('product_id'), fk_catalogo__fk_cooperativa_id=id_cooperativa, fk_catalogo__fk_semana=get_or_create_week()) cantidad = int(item.get('quantity')) pedido_producto_model = PedidoProducto( fk_catalogo_producto=producto_catalogo, fk_pedido=pedido_model, cantidad=cantidad, fk_oferta_producto=Oferta_Producto.objects.filter( fk_producto=producto_catalogo.fk_producto, fk_oferta__fk_semana=get_or_create_week(), estado=1).first()) pedido_producto_model.save() cliente_producto_model = ClienteProducto.objects.filter( fk_producto=producto_catalogo.fk_producto, fk_cliente=cliente_model) if cliente_producto_model.exists(): total_cantidad = cliente_producto_model[0].cantidad + cantidad total_frecuencia = cliente_producto_model[0].frecuencia + 1 cliente_producto_model.update(cantidad=total_cantidad, frecuencia=total_frecuencia) else: cliente_producto_model = ClienteProducto( fk_cliente=cliente_model, fk_producto=producto_catalogo.fk_producto, fk_semana=get_or_create_week(), cantidad=cantidad, frecuencia=1, sugerir=False) cliente_producto_model.save() cantidad_restante = actualizar_inventario( producto_catalogo, cantidad, get_id_cooperativa_global(request)) if cantidad_restante > 0: cart = get_or_create_cart(request) items = cart.get('items', []) cart['items'] = list( filter( lambda x: x['product_id'] != producto_catalogo. fk_producto_id, items)) request.session['cart'] = cart messages.add_message( request, messages.ERROR, 'El producto {producto} ya no se encuentra disponible'. format(producto=producto_catalogo.fk_producto.nombre)) savepoint_rollback(checkpoint) return redirect(reverse('cliente:checkout')) else: valor_total += producto_catalogo.precio * cantidad canastas_query = Canasta.objects.filter( esta_publicada=True, fk_semana=get_or_create_week(), fk_cooperativa_id=get_id_cooperativa_global(request)) for canasta_carrito in detalles_canastas: canasta = canastas_query.get(id=canasta_carrito.get('canasta_id')) cantidad_canasta = int(canasta_carrito.get('quantity')) pedido_canasta_model = PedidoCanasta( cantidad=cantidad_canasta, fk_pedido=pedido_model, fk_canasta=canasta, ) for canasta_producto in canasta.productos: producto_catalogo = canasta_producto.fk_producto_catalogo cantidad_producto = canasta_producto.cantidad * cantidad_canasta cantidad_restante = actualizar_inventario( producto_catalogo, cantidad_producto, get_id_cooperativa_global(request)) if cantidad_restante > 0: cart = get_or_create_cart(request) canastas_carrito = cart.get('canastas', []) cart['canastas'] = list( filter(lambda x: x['canasta_id'] != canasta.id, canastas_carrito)) request.session['cart'] = cart messages.add_message( request, messages.ERROR, 'La canasta {canasta} ya no se encuentra disponible'. format(canasta=canasta.nombre)) savepoint_rollback(checkpoint) return redirect(reverse('cliente:checkout')) valor_total += canasta.precio * cantidad_canasta pedido_canasta_model.save() pedido_model.valor_total = valor_total pedido_model.save() savepoint_commit(checkpoint) request.session['cart'] = "" messages.add_message(request, messages.SUCCESS, 'La compra se realizó exitosamente') return redirect( reverse('cliente:detalle-mis-pedidos', kwargs={'id_pedido': pedido_model.id}))