1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-18 16:36:15 +00:00

Added detailed user profile

This commit is contained in:
zhengxie
2013-12-18 13:56:20 +08:00
parent c953003852
commit b2e70423cf
11 changed files with 165 additions and 40 deletions

View File

@@ -12,7 +12,7 @@ from registration import signals
#from registration.forms import RegistrationForm #from registration.forms import RegistrationForm
from seaserv import ccnet_threaded_rpc, unset_repo_passwd, is_passwd_set from seaserv import ccnet_threaded_rpc, unset_repo_passwd, is_passwd_set
from seahub.profile.models import Profile from seahub.profile.models import Profile, DetailedProfile
UNUSABLE_PASSWORD = '!' # This will never be a valid hash UNUSABLE_PASSWORD = '!' # This will never be a valid hash
@@ -295,9 +295,19 @@ class RegistrationBackend(object):
password, site, password, site,
send_email=settings.REGISTRATION_SEND_MAIL) send_email=settings.REGISTRATION_SEND_MAIL)
userid = kwargs['userid'] # userid = kwargs['userid']
if userid: # if userid:
ccnet_threaded_rpc.add_binding(new_user.username, userid) # ccnet_threaded_rpc.add_binding(new_user.username, userid)
if settings.REQUIRE_DETAIL_ON_REGISTRATION:
name = kwargs['name']
department = kwargs['department']
telephone = kwargs['telephone']
note = kwargs['note']
Profile.objects.add_profile(new_user.username, name, note)
DetailedProfile.objects.add_detailed_profile(new_user.username,
department,
telephone)
signals.user_registered.send(sender=self.__class__, signals.user_registered.send(sender=self.__class__,
user=new_user, user=new_user,
@@ -416,3 +426,14 @@ class RegistrationForm(forms.Form):
raise forms.ValidationError(_("The two password fields didn't match.")) raise forms.ValidationError(_("The two password fields didn't match."))
return self.cleaned_data return self.cleaned_data
class DetailedRegistrationForm(RegistrationForm):
attrs_dict = { 'class': 'required' }
name = forms.CharField(widget=forms.TextInput(
attrs=dict(attrs_dict, maxlength=64)), label=_("name"))
department = forms.CharField(widget=forms.TextInput(
attrs=dict(attrs_dict, maxlength=512)), label=_("department"))
telephone = forms.CharField(widget=forms.TextInput(
attrs=dict(attrs_dict, maxlength=100)), label=_("telephone"))
note = forms.CharField(widget=forms.TextInput(
attrs=dict(attrs_dict, maxlength=100)), label=_("note"))

View File

@@ -6,11 +6,13 @@ from django.conf import settings
from registration.views import activate from registration.views import activate
from registration.views import register from registration.views import register
from seahub.base.accounts import RegistrationForm from seahub.base.accounts import RegistrationForm, DetailedRegistrationForm
from seahub.base.generic import DirectTemplateView from seahub.base.generic import DirectTemplateView
form_class = DetailedRegistrationForm if settings.REQUIRE_DETAIL_ON_REGISTRATION \
else RegistrationForm
reg_dict = { 'backend': 'seahub.base.accounts.RegistrationBackend', reg_dict = { 'backend': 'seahub.base.accounts.RegistrationBackend',
'form_class': RegistrationForm, 'form_class': form_class,
} }
if settings.ACTIVATE_AFTER_REGISTRATION == True: if settings.ACTIVATE_AFTER_REGISTRATION == True:

View File

@@ -2,7 +2,25 @@
from django import forms 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 Profile, DetailedProfile
class ProfileForm(forms.Form): class ProfileForm(forms.Form):
nickname = forms.CharField(max_length=64, required=False) nickname = forms.CharField(max_length=64, required=False)
intro = forms.CharField(max_length=256, required=False) intro = forms.CharField(max_length=256, required=False)
def save(self, username):
nickname = self.cleaned_data['nickname']
intro = self.cleaned_data['intro']
Profile.objects.add_or_update(username, nickname, intro)
class DetailedProfileForm(ProfileForm):
department = forms.CharField(max_length=512)
telephone = forms.CharField(max_length=100)
def save(self, username):
super(DetailedProfileForm, self).save(username)
department = self.cleaned_data['department']
telephone = self.cleaned_data['telephone']
DetailedProfile.objects.add_or_update(username, department, telephone)

View File

@@ -2,10 +2,28 @@ from django.db import models
from django.core.cache import cache from django.core.cache import cache
from django.dispatch import receiver from django.dispatch import receiver
from settings import EMAIL_ID_CACHE_PREFIX, EMAIL_ID_CACHE_TIMEOUT from seahub.base.fields import LowerCaseCharField
from seahub.profile.settings import EMAIL_ID_CACHE_PREFIX, EMAIL_ID_CACHE_TIMEOUT
from registration.signals import user_registered from registration.signals import user_registered
class ProfileManager(models.Manager): class ProfileManager(models.Manager):
def add_profile(self, username, nickname, intro):
"""
"""
profile = self.model(user=username, nickname=nickname, intro=intro)
profile.save(using=self._db)
return profile
def add_or_update(self, username, nickname, intro):
try:
profile = self.get(user=username)
profile.nickname = nickname
profile.intro = intro
except Profile.DoesNotExist:
profile = self.model(user=username, nickname=nickname, intro=intro)
profile.save(using=self._db)
return profile
def get_profile_by_user(self, username): def get_profile_by_user(self, username):
"""Get a user's profile. """Get a user's profile.
""" """
@@ -20,6 +38,39 @@ class Profile(models.Model):
intro = models.TextField(max_length=256, blank=True) intro = models.TextField(max_length=256, blank=True)
objects = ProfileManager() objects = ProfileManager()
class DetailedProfileManager(models.Manager):
def add_detailed_profile(self, username, department, telephone):
d_profile = self.model(user=username, department=department,
telephone=telephone)
d_profile.save(using=self._db)
return d_profile
def add_or_update(self, username, department, telephone):
try:
d_profile = self.get(user=username)
d_profile.department = department
d_profile.telephone = telephone
except DetailedProfile.DoesNotExist:
d_profile = self.model(user=username, department=department,
telephone=telephone)
d_profile.save(using=self._db)
return d_profile
def get_detailed_profile_by_user(self, username):
"""Get a user's profile.
"""
try:
return super(DetailedProfileManager, self).get(user=username)
except DetailedProfile.DoesNotExist:
return None
class DetailedProfile(models.Model):
user = LowerCaseCharField(max_length=255)
department = models.CharField(max_length=512)
telephone = models.CharField(max_length=100)
objects = DetailedProfileManager()
########## signal handler
@receiver(user_registered) @receiver(user_registered)
def clean_email_id_cache(sender, **kwargs): def clean_email_id_cache(sender, **kwargs):
from seahub.utils import normalize_cache_key from seahub.utils import normalize_cache_key

View File

@@ -54,6 +54,14 @@
{% endfor %} {% endfor %}
<br/> <br/>
<label>{% trans "About me:" %}</label><textarea name="intro">{{ form.data.intro }}</textarea> <label>{% trans "About me:" %}</label><textarea name="intro">{{ form.data.intro }}</textarea>
<br/>
{% if form.department and form.telephone %}
<label>{% trans "Department:" %}</label><input type="text" name="department" value="{{ form.data.department }}" class="text-input" />
<br/>
<label>{% trans "Telephone:" %}</label><input type="text" name="telephone" value="{{ form.data.telephone }}" class="text-input" />
{% endif %}
{% for error in form.intro.errors %} {% for error in form.intro.errors %}
<span class="error">{{ error|escape }}</span> <span class="error">{{ error|escape }}</span>
{% endfor %} {% endfor %}

View File

@@ -15,6 +15,10 @@
<div class="txt fright"> <div class="txt fright">
<p>{{ nickname }}</p> <p>{{ nickname }}</p>
<p class="intro">{{ intro }}</p> <p class="intro">{{ intro }}</p>
{% if d_profile %}
<p>{{ d_profile.department }}</p>
<p>{{ d_profile.telephone }}</p>
{% endif %}
{% if add_to_contacts %} {% if add_to_contacts %}
<button class="add-to-contacts" data-email="{{user.username}}">{% trans "Add to Contacts" %}</button> <button class="add-to-contacts" data-email="{{user.username}}">{% trans "Add to Contacts" %}</button>
{% endif %} {% endif %}

View File

@@ -12,8 +12,8 @@ from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_binding_peerids, \
seafile_api seafile_api
from pysearpc import SearpcError from pysearpc import SearpcError
from forms import ProfileForm from forms import ProfileForm, DetailedProfileForm
from models import Profile from models import Profile, DetailedProfile
from utils import refresh_cache from utils import refresh_cache
from seahub.auth.decorators import login_required from seahub.auth.decorators import login_required
from seahub.utils import render_error from seahub.utils import render_error
@@ -29,20 +29,13 @@ def edit_profile(request):
""" """
username = request.user.username username = request.user.username
form_class = DetailedProfileForm if settings.REQUIRE_DETAIL_ON_REGISTRATION \
else ProfileForm
if request.method == 'POST': if request.method == 'POST':
form = ProfileForm(request.POST) form = form_class(request.POST)
if form.is_valid(): if form.is_valid():
nickname = form.cleaned_data['nickname'] form.save(username=username)
intro = form.cleaned_data['intro']
try:
profile = Profile.objects.get(user=request.user.username)
except Profile.DoesNotExist:
profile = Profile()
profile.user = username
profile.nickname = nickname
profile.intro = intro
profile.save()
messages.success(request, _(u'Successfully edited profile.')) messages.success(request, _(u'Successfully edited profile.'))
# refresh nickname cache # refresh nickname cache
refresh_cache(request.user.username) refresh_cache(request.user.username)
@@ -51,15 +44,19 @@ def edit_profile(request):
else: else:
messages.error(request, _(u'Failed to edit profile')) messages.error(request, _(u'Failed to edit profile'))
else: else:
try: profile = Profile.objects.get_profile_by_user(username)
profile = Profile.objects.get(user=request.user.username) d_profile = DetailedProfile.objects.get_detailed_profile_by_user(
form = ProfileForm({ username)
'nickname': profile.nickname,
'intro': profile.intro,
})
except Profile.DoesNotExist:
form = ProfileForm()
init_dict = {}
if profile:
init_dict['nickname'] = profile.nickname
init_dict['intro'] = profile.intro
if d_profile:
init_dict['department'] = d_profile.department
init_dict['telephone'] = d_profile.telephone
form = form_class(init_dict)
# common logic # common logic
try: try:
server_crypto = UserOptions.objects.is_server_crypto(username) server_crypto = UserOptions.objects.is_server_crypto(username)
@@ -106,11 +103,14 @@ def user_profile(request, username_or_id):
if user is not None: if user is not None:
profile = Profile.objects.get_profile_by_user(user.username) profile = Profile.objects.get_profile_by_user(user.username)
intro = profile.intro if profile else '' intro = profile.intro if profile else ''
d_profile = DetailedProfile.objects.get_detailed_profile_by_user(
user.username)
c = Contact.objects.get_contact_by_user(request.user.username, c = Contact.objects.get_contact_by_user(request.user.username,
user.username) user.username)
add_to_contacts = True if c is None else False add_to_contacts = True if c is None else False
else: else:
intro = _(u'Has not accepted invitation yet') intro = _(u'Has not accepted invitation yet')
d_profile = None
add_to_contacts = False add_to_contacts = False
return render_to_response('profile/user_profile.html', { return render_to_response('profile/user_profile.html', {
@@ -119,6 +119,7 @@ def user_profile(request, username_or_id):
'nickname': nickname, 'nickname': nickname,
'intro': intro, 'intro': intro,
'add_to_contacts': add_to_contacts, 'add_to_contacts': add_to_contacts,
'd_profile': d_profile,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
@login_required @login_required

View File

@@ -263,6 +263,8 @@ ACTIVATE_AFTER_REGISTRATION = True
# This option will be ignored if ``ACTIVATE_AFTER_REGISTRATION`` set to ``True``. # This option will be ignored if ``ACTIVATE_AFTER_REGISTRATION`` set to ``True``.
REGISTRATION_SEND_MAIL = False REGISTRATION_SEND_MAIL = False
REQUIRE_DETAIL_ON_REGISTRATION = False
# Seafile-applet address and port, used in repo download # Seafile-applet address and port, used in repo download
CCNET_APPLET_ROOT = "http://127.0.0.1:13420" CCNET_APPLET_ROOT = "http://127.0.0.1:13420"

View File

@@ -8,12 +8,27 @@
{% else %} {% else %}
<h2>{% trans "Signup" %}</h2> <h2>{% trans "Signup" %}</h2>
<form action="" method="post">{% csrf_token %} <form action="" method="post">{% csrf_token %}
{% if form.name %}
<label for="id_name">{% trans "Name" %}</label>
{{ form.name }} {{ form.name.errors }}
{% endif %}
<label for="id_email">{% trans "Email" %}</label> <label for="id_email">{% trans "Email" %}</label>
{{ form.email }} {{ form.email.errors }} {{ form.email }} {{ form.email.errors }}
<label for="id_password1">{% trans "Password" %}</label> <label for="id_password1">{% trans "Password" %}</label>
{{ form.password1 }} {{ form.password1.errors }} {{ form.password1 }} {{ form.password1.errors }}
<label for="id_password2">{% trans "Confirm Password" %}</label> <label for="id_password2">{% trans "Confirm Password" %}</label>
{{ form.password2 }} {{ form.password2.errors }} {{ form.password2 }} {{ form.password2.errors }}
{% if form.department and form.telephone %}
<label for="id_department">{% trans "Department" %}</label>
{{ form.department }} {{ form.department.errors }}
<label for="id_telephone">{% trans "Telephone" %}</label>
{{ form.telephone }} {{ form.telephone.errors }}
<label for="id_note">{% trans "Note" %}</label>
{{ form.note }} {{ form.note.errors }}
{% endif %}
<p class="error hide"></p> <p class="error hide"></p>
<input type="submit" value="{% trans "Submit" %}" class="submit" /> <input type="submit" value="{% trans "Submit" %}" class="submit" />
</form> </form>

View File

@@ -19,8 +19,13 @@
<div class="info-item-bottom home-profile ovhd"> <div class="info-item-bottom home-profile ovhd">
{% avatar email 48 %} {% avatar email 48 %}
<p class="txt fright"> <p class="txt fright">
{% if nickname %} {% if profile %}
{{ nickname }} <p>{{ profile.nickname }}</p>
<p>{{ profile.intro }}</p>
{% endif %}
{% if d_profile %}
<p>{{ d_profile.department }}</p>
<p>{{ d_profile.telephone }}</p>
{% endif %} {% endif %}
</p> </p>
</div> </div>

View File

@@ -27,7 +27,7 @@ from seahub.auth.decorators import login_required
from seahub.utils import IS_EMAIL_CONFIGURED from seahub.utils import IS_EMAIL_CONFIGURED
from seahub.views import get_system_default_repo_id from seahub.views import get_system_default_repo_id
from seahub.forms import SetUserQuotaForm, AddUserForm from seahub.forms import SetUserQuotaForm, AddUserForm
from seahub.profile.models import Profile from seahub.profile.models import Profile, DetailedProfile
from seahub.share.models import FileShare from seahub.share.models import FileShare
import seahub.settings as settings import seahub.settings as settings
@@ -275,13 +275,10 @@ def user_info(request, email):
# Repos that are share to user # Repos that are share to user
in_repos = seafile_api.get_share_in_repo_list(email, -1, -1) in_repos = seafile_api.get_share_in_repo_list(email, -1, -1)
# get nickname # get user profile
if not Profile.objects.filter(user=email): profile = Profile.objects.get_profile_by_user(email)
nickname = '' d_profile = DetailedProfile.objects.get_detailed_profile_by_user(email)
else:
profile = Profile.objects.filter(user=email)[0]
nickname = profile.nickname
return render_to_response( return render_to_response(
'sysadmin/userinfo.html', { 'sysadmin/userinfo.html', {
'owned_repos': owned_repos, 'owned_repos': owned_repos,
@@ -292,7 +289,8 @@ def user_info(request, email):
'my_usage': my_usage, 'my_usage': my_usage,
'in_repos': in_repos, 'in_repos': in_repos,
'email': email, 'email': email,
'nickname': nickname, 'profile': profile,
'd_profile': d_profile,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
@login_required @login_required