mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-01 23:20:51 +00:00
Use email-user and binding in ccnet instead of userprofile in seahub
* Remove UserProfile from profile/models. * Disable ccnet user id binding in profile page
This commit is contained in:
@@ -13,7 +13,6 @@ from django import forms
|
|||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from seahub.profile.models import UserProfile
|
|
||||||
from seaserv import ccnet_rpc
|
from seaserv import ccnet_rpc
|
||||||
|
|
||||||
class EmailOrUsernameModelBackend(object):
|
class EmailOrUsernameModelBackend(object):
|
||||||
@@ -108,11 +107,12 @@ class RegistrationBackend(object):
|
|||||||
new_user = RegistrationProfile.objects.create_inactive_user(username, email,
|
new_user = RegistrationProfile.objects.create_inactive_user(username, email,
|
||||||
password, site,
|
password, site,
|
||||||
send_email=settings.REGISTRATION_SEND_MAIL)
|
send_email=settings.REGISTRATION_SEND_MAIL)
|
||||||
|
# save email and password to EmailUser table
|
||||||
|
ccnet_rpc.add_emailuser(email, password)
|
||||||
|
|
||||||
userid = kwargs['userid']
|
userid = kwargs['userid']
|
||||||
if userid:
|
if userid:
|
||||||
profile = UserProfile(user=new_user, ccnet_user_id=userid)
|
ccnet_rpc.add_binding(new_user.username, userid)
|
||||||
profile.save()
|
|
||||||
|
|
||||||
signals.user_registered.send(sender=self.__class__,
|
signals.user_registered.send(sender=self.__class__,
|
||||||
user=new_user,
|
user=new_user,
|
||||||
@@ -139,8 +139,7 @@ class RegistrationBackend(object):
|
|||||||
activated.backend='django.contrib.auth.backends.ModelBackend'
|
activated.backend='django.contrib.auth.backends.ModelBackend'
|
||||||
login(request, activated)
|
login(request, activated)
|
||||||
try:
|
try:
|
||||||
profile = request.user.get_profile()
|
if request.user.user_id:
|
||||||
if profile.ccnet_user_id:
|
|
||||||
ccnet_rpc.add_client(ccnet_user_id)
|
ccnet_rpc.add_client(ccnet_user_id)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
|
from seaserv import ccnet_rpc
|
||||||
from seahub.profile.models import UserProfile
|
|
||||||
|
|
||||||
class UseridMiddleware(object):
|
class UseridMiddleware(object):
|
||||||
"""Store ccnet user id in request.user.user_id"""
|
"""Store ccnet user id in request.user.user_id"""
|
||||||
@@ -9,9 +8,8 @@ class UseridMiddleware(object):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
profile = request.user.get_profile()
|
request.user.user_id = ccnet_rpc.get_binding_userid(request.user.username)
|
||||||
request.user.user_id = profile.ccnet_user_id
|
except:
|
||||||
except UserProfile.DoesNotExist:
|
|
||||||
request.user.user_id = ''
|
request.user.user_id = ''
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from profile.models import UserProfile
|
#from profile.models import UserProfile
|
||||||
|
|
||||||
admin.site.register(UserProfile)
|
#admin.site.register(UserProfile)
|
||||||
|
@@ -2,9 +2,9 @@ from django.db import models
|
|||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
|
|
||||||
class UserProfile(models.Model):
|
#class UserProfile(models.Model):
|
||||||
user = models.ForeignKey(User, unique=True)
|
# user = models.ForeignKey(User, unique=True)
|
||||||
ccnet_user_id = models.CharField(max_length=40, blank=True)
|
# ccnet_user_id = models.CharField(max_length=40, blank=True)
|
||||||
|
|
||||||
class UserCcnetConf(models.Model):
|
class UserCcnetConf(models.Model):
|
||||||
user = models.ForeignKey(User, unique=True)
|
user = models.ForeignKey(User, unique=True)
|
||||||
|
@@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
{% block left_panel %}
|
{% block left_panel %}
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="{% url profile_setting %}">绑定个人 ID</a></li>
|
|
||||||
<li><a href="{{ SITE_ROOT }}accounts/password/change/">修改网站帐号密码</a></li>
|
<li><a href="{{ SITE_ROOT }}accounts/password/change/">修改网站帐号密码</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@@ -13,14 +12,12 @@
|
|||||||
|
|
||||||
<h2>当前设置</h2>
|
<h2>当前设置</h2>
|
||||||
<ul>
|
<ul>
|
||||||
{% if profile.ccnet_user_id %}
|
{% if user_id %}
|
||||||
<li><span class="bold">个人 ID:</span>{{ profile.ccnet_user_id }}</li>
|
<li><span class="bold">个人 ID:</span>{{ user_id }}</li>
|
||||||
{% else %}
|
|
||||||
<li><span class="bold">个人 ID:</span>您还没绑定。<a href="{% url profile_setting %}">现在绑定</a></li>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if profile_timestamp %}
|
{% if profile_timestamp %}
|
||||||
<li><span class="bold">帐号文件:</span>您的加密后的帐号文件上传于{{ profile_timestamp }} <a href="{{ SITE_ROOT }}profile/download/?user_id={{profile.ccnet_user_id}}">点此下载</a></li>
|
<li><span class="bold">帐号文件:</span>您的加密后的帐号文件上传于{{ profile_timestamp }} <a href="{{ SITE_ROOT }}profile/download/?user_id={{ user_id }}">点此下载</a></li>
|
||||||
{% else %}
|
{% else %}
|
||||||
<li><span class="bold">帐号文件:</span>您的帐号文件还未上传,请在本地 seafile 界面 "帐号" 标签下上传</li>
|
<li><span class="bold">帐号文件:</span>您的帐号文件还未上传,请在本地 seafile 界面 "帐号" 标签下上传</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@@ -3,7 +3,7 @@ from django.conf.urls.defaults import *
|
|||||||
urlpatterns = patterns('profile.views',
|
urlpatterns = patterns('profile.views',
|
||||||
url(r'^$', 'show_profile'),
|
url(r'^$', 'show_profile'),
|
||||||
url(r'^ccnet/$', 'get_ccnet_profile'),
|
url(r'^ccnet/$', 'get_ccnet_profile'),
|
||||||
url(r'^edit/$', 'set_profile', name="profile_setting"),
|
# url(r'^edit/$', 'set_profile', name="profile_setting"),
|
||||||
url(r'^edit/ccnet/$', 'set_ccnet_profile', name="ccnet_profile_setting"),
|
url(r'^edit/ccnet/$', 'set_ccnet_profile', name="ccnet_profile_setting"),
|
||||||
url(r'^download/$', 'download_profile', name="profile_download"),
|
url(r'^download/$', 'download_profile', name="profile_download"),
|
||||||
)
|
)
|
||||||
|
@@ -8,16 +8,13 @@ from django.core.urlresolvers import reverse
|
|||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from forms import SetUserProfileForm
|
from forms import SetUserProfileForm
|
||||||
from models import UserProfile, UserCcnetConf
|
from models import UserCcnetConf
|
||||||
|
|
||||||
from seaserv import ccnet_rpc, translate_time_usec
|
from seaserv import ccnet_rpc, translate_time_usec
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def show_profile(request):
|
def show_profile(request):
|
||||||
try:
|
user_id = ccnet_rpc.get_binding_userid(request.user.username)
|
||||||
profile = request.user.get_profile()
|
|
||||||
except UserProfile.DoesNotExist:
|
|
||||||
profile = UserProfile(user=request.user)
|
|
||||||
profile.save()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
profile_timestamp = ccnet_rpc.get_user_profile_timestamp(profile.ccnet_user_id)
|
profile_timestamp = ccnet_rpc.get_user_profile_timestamp(profile.ccnet_user_id)
|
||||||
@@ -25,51 +22,42 @@ def show_profile(request):
|
|||||||
except:
|
except:
|
||||||
profile_timestamp = None
|
profile_timestamp = None
|
||||||
|
|
||||||
return render_to_response('profile/profile.html',
|
return render_to_response('profile/profile.html', {
|
||||||
{ 'profile': profile,
|
'user_id': user_id,
|
||||||
'profile_timestamp': profile_timestamp},
|
'profile_timestamp': profile_timestamp},
|
||||||
context_instance=RequestContext(request))
|
context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
#@login_required
|
||||||
def set_profile(request):
|
#def set_profile(request):
|
||||||
error_msg = None
|
# error_msg = None
|
||||||
origin_id = None
|
# origin_id = None
|
||||||
if request.method == 'POST':
|
# if request.method == 'POST':
|
||||||
ccnet_user_id = request.POST.get('ccnet_user_id', '').strip()
|
# ccnet_user_id = request.POST.get('ccnet_user_id', '').strip()
|
||||||
origin_id = ccnet_user_id
|
# origin_id = ccnet_user_id
|
||||||
if not ccnet_user_id:
|
# if not ccnet_user_id:
|
||||||
error_msg = "You must specify Key ID"
|
# error_msg = "You must specify Key ID"
|
||||||
elif len(ccnet_user_id) != 40:
|
# elif len(ccnet_user_id) != 40:
|
||||||
error_msg = "Key ID must be of length 40"
|
# error_msg = "Key ID must be of length 40"
|
||||||
elif UserProfile.objects.filter(ccnet_user_id=ccnet_user_id).count() != 0:
|
# elif ccnet_rpc.get_binding_email(ccnet_user_id) != None:
|
||||||
error_msg = "Key ID has been used"
|
# email = ccnet_rpc.get_binding_email(ccnet_user_id)
|
||||||
else:
|
# # user id has been binded by an email
|
||||||
try:
|
# error_msg = ("Key ID has been used by %s" % email)
|
||||||
profile = request.user.get_profile()
|
# else:
|
||||||
except UserProfile.DoesNotExist:
|
# try:
|
||||||
profile = UserProfile(user=request.user)
|
# ccnet_rpc.add_client(ccnet_user_id)
|
||||||
profile.save()
|
# except Exception, e:
|
||||||
try:
|
# error_msg = "Ccnet Daemon is not available, try again later"
|
||||||
ccnet_rpc.add_client(ccnet_user_id)
|
# else:
|
||||||
except Exception, e:
|
# ccnet_rpc.add_binding(request.user.username, ccnet_user_id)
|
||||||
error_msg = "Ccnet Daemon is not available, try again later"
|
# return HttpResponseRedirect(reverse(show_profile))
|
||||||
else:
|
# else:
|
||||||
profile.ccnet_user_id = ccnet_user_id
|
# origin_id = ccnet_rpc.get_binding_userid(request.user.username)
|
||||||
profile.save()
|
#
|
||||||
return HttpResponseRedirect(reverse(show_profile))
|
# return render_to_response('profile/set_profile.html',
|
||||||
else:
|
# { 'error_msg': error_msg,
|
||||||
try:
|
# 'origin_id': origin_id },
|
||||||
profile = request.user.get_profile()
|
# context_instance=RequestContext(request))
|
||||||
except UserProfile.DoesNotExist:
|
|
||||||
profile = UserProfile(user=request.user)
|
|
||||||
profile.save()
|
|
||||||
origin_id = profile.ccnet_user_id
|
|
||||||
|
|
||||||
return render_to_response('profile/set_profile.html',
|
|
||||||
{ 'error_msg': error_msg,
|
|
||||||
'origin_id': origin_id },
|
|
||||||
context_instance=RequestContext(request))
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@@ -83,12 +71,8 @@ def get_ccnet_profile(request):
|
|||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def set_ccnet_profile(request):
|
def set_ccnet_profile(request):
|
||||||
try:
|
ccnet_id = request.user.user_id
|
||||||
profile = request.user.get_profile()
|
|
||||||
except UserProfile.DoesNotExist:
|
|
||||||
return HttpResponse("Error: You have not set seafile id yet.")
|
|
||||||
ccnet_id = profile.ccnet_user_id
|
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
ccnet_profile = request.POST.get('ccnet_profile', None)
|
ccnet_profile = request.POST.get('ccnet_profile', None)
|
||||||
try:
|
try:
|
||||||
@@ -107,7 +91,7 @@ def set_ccnet_profile(request):
|
|||||||
ccnet_profile = ccnet_conf.ccnet_profile
|
ccnet_profile = ccnet_conf.ccnet_profile
|
||||||
except UserCcnetConf.DoesNotExist:
|
except UserCcnetConf.DoesNotExist:
|
||||||
ccnet_profile = ""
|
ccnet_profile = ""
|
||||||
|
|
||||||
return render_to_response('profile/set_ccnet_conf.html',
|
return render_to_response('profile/set_ccnet_conf.html',
|
||||||
{ 'ccnet_profile': ccnet_profile },
|
{ 'ccnet_profile': ccnet_profile },
|
||||||
context_instance=RequestContext(request))
|
context_instance=RequestContext(request))
|
||||||
|
@@ -145,4 +145,4 @@ else:
|
|||||||
LOGIN_URL = SITE_ROOT + 'accounts/login'
|
LOGIN_URL = SITE_ROOT + 'accounts/login'
|
||||||
|
|
||||||
# profile
|
# profile
|
||||||
AUTH_PROFILE_MODULE = "profile.UserProfile"
|
#AUTH_PROFILE_MODULE = "profile.UserProfile"
|
||||||
|
@@ -9,12 +9,6 @@
|
|||||||
|
|
||||||
{% block right_panel %}
|
{% block right_panel %}
|
||||||
|
|
||||||
{% if not user.user_id %}
|
|
||||||
<div class="notification">
|
|
||||||
你还没有绑定 Ccnet/Seafile 公钥 ID。 现在<a href="{{ SITE_ROOT }}profile/edit/">绑定</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<h3>我拥有的同步目录</h3>
|
<h3>我拥有的同步目录</h3>
|
||||||
{% if owned_repos %}
|
{% if owned_repos %}
|
||||||
<table class="repo-list">
|
<table class="repo-list">
|
||||||
|
@@ -28,17 +28,16 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
<td><button data="{{ SITE_ROOT }}useradmin/activate/{{ user.id }}/" class="activate">激活</button></td>
|
<td><button data="{{ SITE_ROOT }}useradmin/activate/{{ user.id }}/" class="activate">激活</button></td>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if user.profile %}
|
{% if user.user_id %}
|
||||||
<td>{{ user.profile.ccnet_user_id }}</td>
|
<td>{{ user.user_id }}</td>
|
||||||
|
{% else %}
|
||||||
|
<td></td>
|
||||||
|
{% endif %}
|
||||||
<td>
|
<td>
|
||||||
{% for role in user.role_list %}
|
{% for role in user.role_list %}
|
||||||
{{ role }} <!--<button data="{{ SITE_ROOT }}useradmin/{{ user.profile.ccnet_user_id }}/role/remove/?role={{ role }}" class="role-delete-btn">删除</button>--><br />
|
{{ role }} <!--<button data="{{ SITE_ROOT }}useradmin/{{ user.profile.ccnet_user_id }}/role/remove/?role={{ role }}" class="role-delete-btn">删除</button>--><br />
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</td>
|
</td>
|
||||||
{% else %}
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
{% endif %}
|
|
||||||
<td>
|
<td>
|
||||||
{% if user.profile %}
|
{% if user.profile %}
|
||||||
<!-- <button class="add-role-btn" userid="{{ user.profile.ccnet_user_id }}" email="{{ user.email }}">添加角色</button> -->
|
<!-- <button class="add-role-btn" userid="{{ user.profile.ccnet_user_id }}" email="{{ user.email }}">添加角色</button> -->
|
||||||
|
@@ -27,6 +27,8 @@ from django.conf.urls.defaults import *
|
|||||||
|
|
||||||
from django.contrib.auth import views as auth_views
|
from django.contrib.auth import views as auth_views
|
||||||
|
|
||||||
|
from seahub.views import password_change
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
url(r'^login/$',
|
url(r'^login/$',
|
||||||
@@ -38,7 +40,7 @@ urlpatterns = patterns('',
|
|||||||
{'template_name': 'registration/logout.html'},
|
{'template_name': 'registration/logout.html'},
|
||||||
name='auth_logout'),
|
name='auth_logout'),
|
||||||
url(r'^password/change/$',
|
url(r'^password/change/$',
|
||||||
auth_views.password_change,
|
password_change,
|
||||||
name='auth_password_change'),
|
name='auth_password_change'),
|
||||||
url(r'^password/change/done/$',
|
url(r'^password/change/done/$',
|
||||||
auth_views.password_change_done,
|
auth_views.password_change_done,
|
||||||
|
46
views.py
46
views.py
@@ -5,12 +5,13 @@ from django.template import RequestContext
|
|||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
from django.views.decorators.csrf import csrf_protect
|
||||||
|
from django.contrib.auth.forms import AuthenticationForm, PasswordResetForm, SetPasswordForm, PasswordChangeForm
|
||||||
|
|
||||||
from seaserv import cclient, ccnet_rpc, get_groups, get_users, get_repos, \
|
from seaserv import cclient, ccnet_rpc, get_groups, get_users, get_repos, \
|
||||||
get_repo, get_commits, get_branches, \
|
get_repo, get_commits, get_branches, \
|
||||||
seafserv_threaded_rpc
|
seafserv_threaded_rpc
|
||||||
|
|
||||||
from seahub.profile.models import UserProfile
|
|
||||||
from seahub.share.models import GroupShare, UserShare
|
from seahub.share.models import GroupShare, UserShare
|
||||||
from seahub.share.forms import GroupAddRepoForm
|
from seahub.share.forms import GroupAddRepoForm
|
||||||
from forms import AddUserForm
|
from forms import AddUserForm
|
||||||
@@ -237,8 +238,7 @@ def seafadmin(request):
|
|||||||
for repo in repos:
|
for repo in repos:
|
||||||
try:
|
try:
|
||||||
owner_id = seafserv_threaded_rpc.get_repo_owner(repo.props.id)
|
owner_id = seafserv_threaded_rpc.get_repo_owner(repo.props.id)
|
||||||
owner = UserProfile.objects.get(ccnet_user_id=owner_id).user
|
repo.owner = ccnet_rpc.get_binding_email(owner_id)
|
||||||
repo.owner = owner.email
|
|
||||||
repo.owner_id = owner_id
|
repo.owner_id = owner_id
|
||||||
except:
|
except:
|
||||||
repo.owner = None
|
repo.owner = None
|
||||||
@@ -262,11 +262,10 @@ def useradmin(request):
|
|||||||
users = User.objects.all()
|
users = User.objects.all()
|
||||||
for user in users:
|
for user in users:
|
||||||
try:
|
try:
|
||||||
user.profile = user.get_profile()
|
user.user_id = ccnet_rpc.get_binding_userid(user.username)
|
||||||
user.ccnet_user = ccnet_rpc.get_user(user.profile.ccnet_user_id)
|
user.ccnet_user = ccnet_rpc.get_user(user.profile.ccnet_user_id)
|
||||||
user.role_list = user.ccnet_user.props.role_list.split(',')
|
user.role_list = user.ccnet_user.props.role_list.split(',')
|
||||||
except:
|
except:
|
||||||
user.profile = None
|
|
||||||
user.ccnet_user = None
|
user.ccnet_user = None
|
||||||
|
|
||||||
return render_to_response(
|
return render_to_response(
|
||||||
@@ -307,6 +306,10 @@ def user_remove(request, user_id):
|
|||||||
|
|
||||||
user = User.objects.get(id=user_id)
|
user = User.objects.get(id=user_id)
|
||||||
user.delete()
|
user.delete()
|
||||||
|
|
||||||
|
# Also remove from ccnet EmailUser table and Binding table
|
||||||
|
ccnet_rpc.remove_emailuser(user.username)
|
||||||
|
ccnet_rpc.remove_binding(user.username)
|
||||||
|
|
||||||
return HttpResponseRedirect(request.META['HTTP_REFERER'])
|
return HttpResponseRedirect(request.META['HTTP_REFERER'])
|
||||||
|
|
||||||
@@ -343,6 +346,10 @@ def user_add(request):
|
|||||||
new_user = User.objects.create_user(username, email, password)
|
new_user = User.objects.create_user(username, email, password)
|
||||||
new_user.is_active = True
|
new_user.is_active = True
|
||||||
new_user.save()
|
new_user.save()
|
||||||
|
|
||||||
|
# Also save to ccnet EmailUser table
|
||||||
|
ccnet_rpc.add_emailuser(username, password)
|
||||||
|
|
||||||
return HttpResponseRedirect(reverse('useradmin', args=[]))
|
return HttpResponseRedirect(reverse('useradmin', args=[]))
|
||||||
else:
|
else:
|
||||||
form = AddUserForm()
|
form = AddUserForm()
|
||||||
@@ -350,3 +357,32 @@ def user_add(request):
|
|||||||
return render_to_response("add_user_form.html", {
|
return render_to_response("add_user_form.html", {
|
||||||
'form': form,
|
'form': form,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
@csrf_protect
|
||||||
|
@login_required
|
||||||
|
def password_change(request,
|
||||||
|
template_name='registration/password_change_form.html',
|
||||||
|
post_change_redirect=None,
|
||||||
|
password_change_form=PasswordChangeForm,
|
||||||
|
current_app=None, extra_context=None):
|
||||||
|
if post_change_redirect is None:
|
||||||
|
post_change_redirect = reverse('django.contrib.auth.views.password_change_done')
|
||||||
|
if request.method == "POST":
|
||||||
|
form = password_change_form(user=request.user, data=request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
form.save()
|
||||||
|
|
||||||
|
# Also change ccnet EmailUser table
|
||||||
|
email = request.user.username
|
||||||
|
passwd = request.POST.get('new_password1')
|
||||||
|
ccnet_rpc.change_emailuser(email, passwd)
|
||||||
|
|
||||||
|
return HttpResponseRedirect(post_change_redirect)
|
||||||
|
else:
|
||||||
|
form = password_change_form(user=request.user)
|
||||||
|
context = {
|
||||||
|
'form': form,
|
||||||
|
}
|
||||||
|
context.update(extra_context or {})
|
||||||
|
return render_to_response(template_name, context,
|
||||||
|
context_instance=RequestContext(request, current_app=current_app))
|
||||||
|
Reference in New Issue
Block a user