Hi.

I'm using Django in a website and I need to use a given app in the website 
more than one time. I know this is kind of tricky to do in Django since 
there can be no name collisions.

*What I'm searching* is more or less equivalent to what stack exchange 
network does: a "framework" applied on specific topics. In my case I want 
this to be on the same website, for instance for *different topics*, or 
*different 
languages/communities* (in the sense that the app is translated differently 
*and* the users also add content in different languages/tables that *are 
not meant* to be translated/shared between communities). However, like in 
stack, I want most of the the server-side code and logic to be preserved 
(what I here call the framework).

Notice that each specific instance of the framework must be a Django's app 
since it needs specific tables.

*The problem* I'm already able to implement this, but the way I'm doing is 
not easily maintainable.

*The question:* I'm asking for help and general suggestions on the 
approach. Ultimately, I would like to know: is this because I'm having some 
bad design choice on web development in general, am I doing a bad design 
choice in Django in particular, or is this because Django was not prepared 
for this situation?

Next I explain how I did this, in the bottom I explain the maintainability 
issue.

Implementation

The idea is: I have a main app for controlling the website and its 
authentication (with a MainUser model with a one-to-one to the default 
user) and I attach apps.

The app I want to repeat on the website has a specific name appname(something 
that cannot possibly collide with any string), and a specific 
user (appname.User), a subclass of main.MainUser.

What I learn during this whole process:

One requirement for repeating an app is that every connection of itself to 
other app requires a custom related_name, as explained in django docs 
be-careful-with-related-name<https://docs.djangoproject.com/en/dev/topics/db/models/#be-careful-with-related-name>.
 
In my case, *so far* there is only one connection, the appname.User, that 
has a field of the form:
 
# this is because a copy of this app would make mainuser.user to clash
mainuser_ptr = models.OneToOneField(MainUser, 
related_name="%(app_label)s_%(class)s", parent_link=True)

The next requirement is avoiding url collisions: I use names for every url 
and I prefixed them with appname_.

The next requirement is static and templates. They are set to be of the 
form static/appname/<appname_static> and equivalent to templates.

Given these requirements, I can repeat the app by doing the following magic:

1. I make a copy of the app's directory.
2. Change its name to the new app's name, newappname, and every directory 
herein from appname to newappname (e.g. static,templates).
3. For every string in the app's directory, I substitute the appname with 
newappname.
4. I run ./manage.py syncdb (if it was the first time the app was created, 
or use south to migrate the tables, since the migrations are already made).

I can then change templates, static and translations for the new app (in 
templates/, static/, locale/ respectively).

Maintainability

If I want to implement a new feature in the framework (a feature that is 
new to all apps), I have to implement it on one app and then re-deploy it 
on every app. That or code the implementation on each app. As you might 
understand, this is not efficient: by design this is code difficult to 
maintain (e.g. the version control will have lots of changes that are only 
due to copy/paste).

So, bottom line, I have a copy of the same framework with different names. 
I made this choice because I needed the same logic with different databases 
and static content (static, translations). It seems to me that I'm 
searching for an Abstract app, in the same spirit of an Abstract model. 
However, I'm not sure this even makes sense, either in Django or in Web 
development in general.

Thank you for your time,
Jorge

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to