class RestrictedUserAdmin(UserAdmin):
    declared_fieldsets = None
    restricted_fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
    )

    def queryset(self, request):
        if request.user.is_superuser:
            return User.objects.all()
        return User.objects.filter(id__exact=request.user.id)

    def get_fieldsets(self, request, obj=None):
        if request.user.is_superuser:
            return super(UserAdmin, self).get_fieldsets(request, obj)
        return self.restricted_fieldsets

    def get_form(self, request, obj=None, **kwargs):
        """
        Workaround bug http://code.djangoproject.com/ticket/9360 (thanks to peritus)
        """
        return super(UserAdmin, self).get_form(request, obj, fields=flatten_fieldsets(self.get_fieldsets(request, obj)))

admin.site.unregister(User)
admin.site.register(User, RestrictedUserAdmin)