I have solved this. If anyone is interested, this is how I did...
Instead of having username and site as two separate fields, I combined
them. This will make the username unique for each site. The username
field will look like this ":". Since this isn't
very nice to display I wrote some methods in the User proxy SiteUser
that will extract the username and the site.
Here are the classes i wrote to make this work:
class SiteUserManager(UserManager):
def create_user(self, username, email, password=None):
return super(SiteUserManager, self).create_user('%d:%s' %
(settings.SITE_ID, username), email, password)
def get_query_set(self):
return super(SiteUserManager, self).get_query_set().filter
(username__startswith = '%d:' % settings.SITE_ID)
class SiteUser(User):
objects = SiteUserManager()
def get_site_id(self):
return int(self.username.split(USERNAME_SEPARATOR, 1)[0])
def get_site(self):
return Site.objects.get(pk = self.get_site_id())
def get_local_username(self):
return self.username.split(':', 1)[1]
def get_global_username(self):
return '%...@%s' % (self.get_local_username(),
self.get_site().domain)
def __unicode__(self):
return self.get_global_username()
class Meta:
proxy = True
class Backend(ModelBackend):
def authenticate(self, username=None, password=None):
try:
user = User.objects.get(username='%d:%s' %
(settings.SITE_ID,
username))
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def get_user(self, user_id):
try:
return SiteUser.objects.get(pk=user_id)
except SiteUser.DoesNotExist:
return None
/Fredrik
On 17 Aug, 10:31, Fredde wrote:
> Hi!
>
> I am working on a project with multiple sites and are using the
> contrib.site app to separate them from eachother. The number of sites
> will be high and changing often, so I don't want to modify the Apache
> config and create a new VirtualHost/Location for each new site. I have
> solved this by writing a middleware that parses the url and changes
> the settings.SITE_ID based on that. Similar
> tohttp://www.djangosnippets.org/snippets/1099/
>
> I'm planing to use contrib.auth for user login on each site, but I
> want to make the username unique together with the site. I tried
> something like this:
>
> class SiteUser(User):
> site = ForeignKey(Site)
>
> class Meta:
> unique_together = (('site', 'username'),)
>
> But this will not work so well, since the username field has to be in
> the same model as the unique_together meta attribute, and the username
> field is still unique across the sites. So I tried to make the User
> model abstract and removing the unique flag:
>
> User._meta.abstract = True
> User._meta.get_field('username')._unique = False
>
> But now the ManyToMany fields in User will complain that it's a
> abstract class, wich makes sence. And I guess you shouldn't modify en
> existing model anyway. Is it possible to do what I am trying to do
> without writing a new auth app? Are there any other problems with the
> multi site approach?
>
> /Fredrik
--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to
django-users+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~--~~~~--~~--~--~---