def get_databases_values(): app_databases = DATABASES.keys() #para quitar la base de datos default de las bases de datos a sincronizar for i in range(0,len(app_databases)-1): if app_databases[i] == 'default': del app_databases[i] return app_databases
def ArticuloManageView(request, id=None, template_name="articulo.html"): # Si es un articulo que voy a modificar obtengo sus datos: # articulo (datos generales) # precios_articulos, impuestos_articulo, niveles_articulo, claves_articulo (solo tomamos el primer elemento si es que lo tiene) msg = "" if id: articulo = get_object_or_404(Articulos, pk=id) precios_articulo = precios_articulos.objects.filter(articulo=articulo) if precios_articulo.count() > 0: precio_articulo = precios_articulo[0] else: precio_articulo = precios_articulos() impuestos_articulo = ImpuestosArticulo.objects.filter(articulo=articulo) if impuestos_articulo.count() > 0: impuesto_articulo = impuestos_articulo[0] else: impuesto_articulo = ImpuestosArticulo() niveles_articulo = NivelesArticulos.objects.filter(articulo=articulo) if niveles_articulo.count() > 0: nivel_articulo = niveles_articulo[0] else: nivel_articulo = NivelesArticulos() claves_articulo = ClavesArticulos.objects.filter(articulo=articulo) if claves_articulo.count() > 0: clave_articulo = claves_articulo[0] else: clave_articulo = ClavesArticulos() # Si es un articulo nuevo creamos instacia de todos los elementos de un articulo else: articulo = Articulos() precio_articulo = precios_articulos() impuesto_articulo = ImpuestosArticulo() nivel_articulo = NivelesArticulos() clave_articulo = ClavesArticulos() # Si estamos mandando un formulario a la vista if request.method == "POST": articulo_form = articulos_form(request.POST, instance=articulo) precio_articulo_form = precios_articulos_form(request.POST, instance=precio_articulo) impuesto_articulo_form = impuestos_articulos_form(request.POST, instance=impuesto_articulo) nivel_articulo_form = niveles_articulos_form(request.POST, instance=nivel_articulo) clave_articulo_form = claves_articulos_form(request.POST, instance=clave_articulo) # Si los datos de los formularios son correctos if ( articulo_form.is_valid() and precio_articulo_form.is_valid() and impuesto_articulo_form.is_valid() and nivel_articulo_form.is_valid() and clave_articulo_form.is_valid() ): articulo = articulo_form.save(commit=False) # Para sacar nombre y clave anteriores nombre_old = None clave_old = None if articulo.id != None: nombre_old = Articulos.objects.get(pk=articulo.id).nombre try: clave_old = ClavesArticulos.objects.filter(articulo=articulo)[0].clave except IndexError: clave_old = None # Si se modifica la clave y el articulo al mismo tiempo que no permita guardar if ( clave_articulo_form.cleaned_data["clave"] != clave_old and articulo_form.cleaned_data["nombre"] != nombre_old and articulo.id != None ): msg = "No es posible modificar el nombre y la clave de un articulo al mismo tiempo. para guardar modifica uno a la vez" else: if articulo.id == None: articulo.id = c_get_next_key() articulo.save() precio_articulo_1 = precio_articulo_form.save(commit=False) if precio_articulo_1.id == None: precio_articulo_1.id = -1 precio_articulo_1.articulo = articulo precio_articulo_1.save() DB_EXTRA_OPTIONS = DATABASES["default"]["SIC_EXTRA_OPTIONS"] # Para agregar un segundo precio_articulo en ceros solo al crear uno nuevo precio_articulo_2 = precio_articulo_form.save(commit=False) if precio_articulo_2.id == -1: precio_articulo_2.articulo = articulo precio_articulo_2.precio_empresa = precios_empresa.objects.get( pk=DB_EXTRA_OPTIONS["precio_empresa"] ) precio_articulo_2.precio = 0 precio_articulo_2.moneda = precio_articulo_1.moneda precio_articulo_2.save() impuesto_articulo = impuesto_articulo_form.save(commit=False) if impuesto_articulo.id == None: impuesto_articulo.id = -1 impuesto_articulo.articulo = articulo clave_articulo = clave_articulo_form.save(commit=False) if clave_articulo.id == None: clave_articulo.id = -1 clave_articulo.articulo = articulo nivel_articulo = nivel_articulo_form.save(commit=False) if nivel_articulo.id == None: nivel_articulo.id = -1 nivel_articulo.articulo = articulo # Sincronizar articulos de base de datos default con las otras bases de datos app_databases = DATABASES.keys() # para quitar la base de datos default de las bases de datos a sincronizar for i in range(0, len(app_databases) - 1): if app_databases[i] == "default": del app_databases[i] ######################################################### # Guarda datos del articulo en la base de datos 'default'# ######################################################### impuesto_articulo.save() nivel_articulo.save() clave_articulo.save() for database_x in app_databases: DB_EXTRA_OPTIONS = DATABASES[database_x]["SIC_EXTRA_OPTIONS"] linea_articulo_x = LineaArticulos.objects.using(database_x).get(nombre=articulo.linea.nombre) # Si ya existe un articulo en esta base de datos lo modifica try: articulo_x = ( ClavesArticulos.objects.using(database_x).filter(clave=clave_articulo.clave)[0].articulo ) # Si el articulo no existe se crea uno nuevo except IndexError: try: articulo_x = Articulos.objects.using(database_x).get(nombre=articulo.nombre) except ObjectDoesNotExist: articulo_x = Articulos.objects.using(database_x).create( id=c_get_next_key(database_x), nombre=articulo.nombre, linea=linea_articulo_x, unidvta=articulo.unidvta, unidcopra=articulo.unidcopra, ) else: articulo_x.nombre = articulo.nombre articulo_x.linea = linea_articulo_x articulo_x.unidvta = articulo.unidvta articulo_x.unidcopra = articulo.unidcopra articulo_x.save(using=database_x) # Si el articulo si existe modifico sus datos con los nuevos datos else: articulo_x.nombre = articulo.nombre articulo_x.linea = linea_articulo_x articulo_x.unidvta = articulo.unidvta articulo_x.unidcopra = articulo.unidcopra articulo_x.save(using=database_x) ######################################################### # Guarda datos del articulo en la otra base de datos # ######################################################### # Precios moneda_x = Moneda.objects.using(database_x).get( nombre=precio_articulo_form.cleaned_data["moneda"].nombre ) precio_empresa_x = precios_empresa.objects.using(database_x).get( nombre=precio_articulo_form.cleaned_data["precio_empresa"].nombre ) precios_articulo_x = precios_articulos.objects.using(database_x).filter(articulo=articulo_x) # Si precios_articulo_x tiene al menos un precio if precios_articulo_x.count() > 0: precio_articulo_x = precios_articulo_x[0] precio_articulo_x.moneda = moneda_x precio_articulo_x.precio_empresa = precio_empresa_x precio_articulo_x.precio = precio_articulo_form.cleaned_data["precio"] precio_articulo_x.save(using=database_x) else: precios_articulos.objects.using(database_x).create( id=c_get_next_key(database_x), articulo=articulo_x, moneda=moneda_x, precio_empresa=precio_empresa_x, precio=precio_articulo_form.cleaned_data["precio"], ) precios_articulos.objects.using(database_x).create( id=c_get_next_key(database_x), articulo=articulo_x, moneda=moneda_x, precio_empresa=precios_empresa.objects.using(database_x).get( pk=DB_EXTRA_OPTIONS["precio_empresa"] ), precio=0, ) # Impuestos impuesto_x = Impuesto.objects.using(database_x).get(nombre=impuesto_articulo.impuesto.nombre) impuestos_articulo_x = ImpuestosArticulo.objects.using(database_x).filter(articulo=articulo_x) if impuestos_articulo_x.count() > 0: impuesto_articulo_x = impuestos_articulo_x[0] impuesto_articulo_x.impuesto = impuesto_x impuesto_articulo_x.save(using=database_x) else: ImpuestosArticulo.objects.using(database_x).create( id=-1, articulo=articulo_x, impuesto=impuesto_x ) # clave rol_x = RolesClavesArticulos.objects.using(database_x).get(nombre=clave_articulo.rol.nombre) claves_articulo_x = ClavesArticulos.objects.using(database_x).filter(articulo=articulo_x) if claves_articulo_x.count() > 0: clave_articulo_x = claves_articulo_x[0] clave_articulo_x.rol = rol_x clave_articulo_x.clave = clave_articulo.clave clave_articulo_x.save(using=database_x) else: ClavesArticulos.objects.using(database_x).create( id=-1, articulo=articulo_x, rol=rol_x, clave=clave_articulo.clave ) take_defaultdata = DB_EXTRA_OPTIONS.get("take_defaultdata", False) if take_defaultdata: # Puntos de reorden almacen_x = Almacenes.objects.using(database_x).get(nombre=nivel_articulo.almacen.nombre) niveles_articulo_x = NivelesArticulos.objects.using(database_x).filter(articulo=articulo_x) if niveles_articulo_x.count() <= 0: NivelesArticulos.objects.using(database_x).create( id=-1, articulo=articulo_x, almacen=almacen_x, localizacion=nivel_articulo.localizacion, inventario_maximo=nivel_articulo.inventario_maximo, inventario_minimo=nivel_articulo.inventario_minimo, punto_reorden=nivel_articulo.punto_reorden, ) else: nivel_articulo_x = NivelesArticulos.objects.using(database_x).get( pk=niveles_articulo_x[0].id ) nivel_articulo_x.almacen = almacen_x nivel_articulo_x.localizacion = nivel_articulo.localizacion nivel_articulo_x.inventario_maximo = nivel_articulo.inventario_maximo nivel_articulo_x.inventario_minimo = nivel_articulo.inventario_minimo nivel_articulo_x.punto_reorden = nivel_articulo.punto_reorden nivel_articulo_x.save() return HttpResponseRedirect("/articulos/") # Si estamos cargando la vista por primera ves else: articulo_form = articulos_form(instance=articulo) precio_articulo_form = precios_articulos_form(instance=precio_articulo) impuesto_articulo_form = impuestos_articulos_form(instance=impuesto_articulo) nivel_articulo_form = niveles_articulos_form(instance=nivel_articulo) clave_articulo_form = claves_articulos_form(instance=clave_articulo) c = { "articulo_form": articulo_form, "precio_articulo_form": precio_articulo_form, "impuesto_articulo_form": impuesto_articulo_form, "nivel_articulo_form": nivel_articulo_form, "clave_articulo_form": clave_articulo_form, "msg": msg, } return render_to_response(template_name, c, context_instance=RequestContext(request))