[pyar] Usar un único programa desde más de una empresa (encarar el problema)

Matías Bellone matiasbellone en gmail.com
Lun Jun 13 18:50:47 ART 2011


2011/6/13 Daniel <dmlistapython en gmail.com>:
> El día 13 de junio de 2011 18:19, Matías Bellone
> <matiasbellone en gmail.com> escribió:
>> 2011/6/13 Daniel <dmlistapython en gmail.com>:
>>> Gente:
>>>    Tengo alguna duda respecto a cuál sería la mejor forma de encarar
>>> el problema
>>>
>>> -Un programa en hecho en django necesita ser usado por más de una empresa
>>> -lo posible quiero mantenerlo cómo un único programa
>>> -Necesito "aislamiento" de la información,  es decir que cada uno use
>>> SUS productos, SUS proveedores
>>>  y no interfiera la información de algún otro usuario de empresa.
>>>
>>> No se bien como encarar el problema, no se me ocurre otra que poner
>>> una "bandera" en cada
>>> registro para saber de que empresa es, pero no me parece muy pythonica la forma
>>
>> La única forma de *garantizar* la división es tener dos instancias
>> separadas de Django, dos bases de datos distintas.
>>
>> Si no querés/podés hacer eso, usá "Sites":
>>   https://docs.djangoproject.com/en/1.3/ref/contrib/sites/
>>
> Si uso sites, no tendría un programa distinto para cada empresa y
> mantenerlo por separado?

No.

Sites es un framework (que incluye middleware, modelo, un par de
funciones útiles y un model manager al menos) que incorporás en tu
aplicación. Modificás tus modelos para que tengan una ForeignKey a un
Site y lo separás de esa forma.

Y luego, normalmente, modificarías la lógica de tu aplicación para que
sólo tenga en cuenta las cosas que son del mismo Site. Sin embargo,
Sites ya viene con un Model Manager (como está bien explicado en la
documentación pertinente:
https://docs.djangoproject.com/en/1.3/ref/contrib/sites/#the-currentsitemanager
) por lo que lo agregás a tus modelos de la siguiente forma:

# arriba de todo
from django.contrib.sites.models import Site
from django.contrib.sites.managers import CurrentSiteManager

class mi_modelo(models.Model):
    [acá van todas tus cosas]
    site = models.ForeignKey(Site)
    on_site = CurrentSiteManager

Y después modificás tus vistas para que en lugar de usar
"mi_modelo.objects", usen "mi_modelo.on_site". Si hacés eso en todos
lados, Sites se encarga que al cargar un objeto sólo se carguen las
cosas que tienen el mismo "Site".

Sites fue justamente creado para ser usado en algo como lo que vos
querés (y un par de situaciones más raras también). Es parte del
"batteries included" de Django :P

Saludos,
Toote
-- 
Web: http://www.enespanol.com.ar



More information about the pyar mailing list