1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-09 19:01:42 +00:00

Add discuss module to public group, do not show email in user profile

This commit is contained in:
plt
2013-03-30 10:26:49 +08:00
parent ab35c26728
commit 16570c746e
9 changed files with 110 additions and 81 deletions

View File

@@ -14,7 +14,7 @@ from registration import signals
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 profile.models import Profile from profile.models import Profile
from seahub.utils import get_user_repos
UNUSABLE_PASSWORD = '!' # This will never be a valid hash UNUSABLE_PASSWORD = '!' # This will never be a valid hash
@@ -155,6 +155,7 @@ class User(object):
""" """
Remove all repo decryption passwords stored on server. Remove all repo decryption passwords stored on server.
""" """
from seahub.utils import get_user_repos
owned_repos, shared_repos, groups_repos, public_repos = get_user_repos(self) owned_repos, shared_repos, groups_repos, public_repos = get_user_repos(self)
def has_repo(repos, repo): def has_repo(repos, repo):

View File

@@ -14,10 +14,12 @@ from django.utils.translation import ungettext
from django.utils.translation import pgettext from django.utils.translation import pgettext
from profile.models import Profile from profile.models import Profile
from profile.settings import NICKNAME_CACHE_TIMEOUT, NICKNAME_CACHE_PREFIX from profile.settings import NICKNAME_CACHE_TIMEOUT, NICKNAME_CACHE_PREFIX, \
EMAIL_ID_CACHE_TIMEOUT, EMAIL_ID_CACHE_PREFIX
from seahub.cconvert import CConvert from seahub.cconvert import CConvert
from seahub.po import TRANSLATION_MAP from seahub.po import TRANSLATION_MAP
from seahub.shortcuts import get_first_object_or_none from seahub.shortcuts import get_first_object_or_none
from base.accounts import User
register = template.Library() register = template.Library()
@@ -228,6 +230,25 @@ def email2nickname(value):
cache.set(NICKNAME_CACHE_PREFIX+value, nickname, NICKNAME_CACHE_TIMEOUT) cache.set(NICKNAME_CACHE_PREFIX+value, nickname, NICKNAME_CACHE_TIMEOUT)
return nickname return nickname
@register.filter(name='email2id')
def email2id(value):
"""
Return the user id of an email or -1.
"""
if not value:
return -1
user_id = cache.get(EMAIL_ID_CACHE_PREFIX+value)
if not user_id:
try:
user = User.objects.get(email=value)
user_id = user.id
except User.DoesNotExist:
user_id = -1
cache.set(EMAIL_ID_CACHE_PREFIX+value, user_id, EMAIL_ID_CACHE_TIMEOUT)
return user_id
@register.filter(name='url_target_blank') @register.filter(name='url_target_blank')
def url_target_blank(text): def url_target_blank(text):
return text.replace('<a ', '<a target="_blank" ') return text.replace('<a ', '<a target="_blank" ')

View File

@@ -30,7 +30,7 @@
<ul> <ul>
{% for member in members %} {% for member in members %}
{% if forloop.counter0 < group_members_default_display %} {% if forloop.counter0 < group_members_default_display %}
<li class="member">{% avatar member.user_name 16 %}<a class="name" href="{{ SITE_ROOT }}profile/{{ member.user_name }}/">{{ member.user_name|email2nickname }}</a></li> <li class="member">{% avatar member.user_name 16 %}<a class="name" href="{{ SITE_ROOT }}profile/{{ member.user_name|email2id }}/">{{ member.user_name|email2nickname }}</a></li>
{% else %} {% else %}
{% if forloop.last %} {% if forloop.last %}
<li>...</li> <li>...</li>
@@ -74,7 +74,7 @@
{% if is_staff or msg.from_email == request.user.username %} {% if is_staff or msg.from_email == request.user.username %}
<span class="msg-del op fright vh" data-url="{% url 'group_message_remove' group.id msg.id %}">{% trans "Delete" %}</span> <span class="msg-del op fright vh" data-url="{% url 'group_message_remove' group.id msg.id %}">{% trans "Delete" %}</span>
{% endif %} {% endif %}
<a href="{% url 'user_profile' msg.from_email %}" title="{{ msg.from_email }}" class="author">{{ msg.from_email|email2nickname }}</a> <a href="{{ SITE_ROOT }}profile/{{ msg.from_email|email2id }}/" title="{{ msg.from_email }}" class="author">{{ msg.from_email|email2nickname }}</a>
<span class="time">{{ msg.timestamp|translate_seahub_time }}</span> <span class="time">{{ msg.timestamp|translate_seahub_time }}</span>
</div> </div>
<p class="msg-con">{{ msg.message|seahub_urlize|find_at|linebreaksbr }}</p> <p class="msg-con">{{ msg.message|seahub_urlize|find_at|linebreaksbr }}</p>
@@ -114,7 +114,7 @@
<li class="reply w100 ovhd"> <li class="reply w100 ovhd">
<a href="{% url 'user_profile' r.from_email %}" class="pic fleft">{% avatar r.from_email 28 %}</a> <a href="{% url 'user_profile' r.from_email %}" class="pic fleft">{% avatar r.from_email 28 %}</a>
<div class="txt fright"> <div class="txt fright">
<a href="{% url 'user_profile' r.from_email %}">{{ r.from_email|email2nickname }}</a> <a href="{{ SITE_ROOT }}profile/{{ r.from_email|email2id }}/">{{ r.from_email|email2nickname }}</a>
<span class="time">{{ r.timestamp|translate_seahub_time }}</span> <span class="time">{{ r.timestamp|translate_seahub_time }}</span>
<span class="reply-at op vh" data="{{ r.from_email|email2nickname }}">{% trans 'Reply' %}</span> <span class="reply-at op vh" data="{{ r.from_email|email2nickname }}">{% trans 'Reply' %}</span>
<p class="reply-con">{{ r.message|seahub_urlize|find_at }}</p> <p class="reply-con">{{ r.message|seahub_urlize|find_at }}</p>

View File

@@ -59,6 +59,12 @@ from seahub.forms import RepoCreateForm, SharedRepoCreateForm
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def is_group_staff(group, user):
if user.is_anonymous():
return False
return ccnet_threaded_rpc.check_group_staff(group.id, user.username)
def group_check(func): def group_check(func):
""" """
Decorator for initial group permission check tasks Decorator for initial group permission check tasks
@@ -89,8 +95,7 @@ def group_check(func):
joined = is_group_user(group_id_int, request.user.username) joined = is_group_user(group_id_int, request.user.username)
if joined: if joined:
group.view_perm = "joined" group.view_perm = "joined"
if check_group_staff(group.id, request.user): group.is_staff = is_group_staff(group, user)
group.is_staff = True
return func(request, group, *args, **kwargs) return func(request, group, *args, **kwargs)
if request.user.is_staff: if request.user.is_staff:
# viewed by system admin # viewed by system admin
@@ -187,31 +192,23 @@ def group_dismiss(request, group_id):
""" """
Dismiss a group, only group staff can perform this operation. Dismiss a group, only group staff can perform this operation.
""" """
next = request.META.get('HTTP_REFERER', None)
if not next:
next = SITE_ROOT
try: try:
group_id_int = int(group_id) group_id_int = int(group_id)
except ValueError: except ValueError:
return HttpResponseRedirect(next) return HttpResponseRedirect(reverse('group_list', args=[]))
group = get_group(group_id_int)
if not group:
return HttpResponseRedirect(reverse('group_list', args=[]))
# Check whether user is group staff # Check whether user is group staff
user = request.user.username if not is_group_staff(group, request.user):
if not ccnet_threaded_rpc.check_group_staff(group_id_int, user):
return render_permission_error(request, _(u'Only administrators can dismiss the group')) return render_permission_error(request, _(u'Only administrators can dismiss the group'))
username = request.user.username
try: try:
ccnet_threaded_rpc.remove_group(group_id_int, user) ccnet_threaded_rpc.remove_group(group.id, username)
seafserv_threaded_rpc.remove_repo_group(group_id_int, None) seafserv_threaded_rpc.remove_repo_group(group.id, None)
if request.user.org:
org_id = request.user.org['org_id']
url_prefix = request.user.org['url_prefix']
ccnet_threaded_rpc.remove_org_group(org_id, group_id_int)
return HttpResponseRedirect(reverse('org_groups',
args=[url_prefix]))
except SearpcError, e: except SearpcError, e:
return render_error(request, _(e.msg)) return render_error(request, _(e.msg))
@@ -222,7 +219,7 @@ def group_quit(request, group_id):
try: try:
group_id_int = int(group_id) group_id_int = int(group_id)
except ValueError: except ValueError:
return render_error(request, _(u'group id is not a valid argument.')) return HttpResponseRedirect(reverse('group_list', args=[]))
try: try:
ccnet_threaded_rpc.quit_group(group_id_int, request.user.username) ccnet_threaded_rpc.quit_group(group_id_int, request.user.username)
@@ -239,11 +236,14 @@ def group_message_remove(request, group_id, msg_id):
Remove group message and all message replies and attachments. Remove group message and all message replies and attachments.
""" """
# Checked by URL Conf # Checked by URL Conf
group_id = int(group_id) group_id_int = int(group_id)
msg_id = int(msg_id) msg_id = int(msg_id)
group = get_group(group_id_int)
if not group:
raise Http404
# Test whether user is in the group # Test whether user is in the group
if not is_group_user(group_id, request.user.username): if not is_group_user(group, request.user):
raise Http404 raise Http404
try: try:
@@ -253,7 +253,7 @@ def group_message_remove(request, group_id, msg_id):
content_type='application/json; charset=utf-8') content_type='application/json; charset=utf-8')
else: else:
# Test whether user is group admin or message owner. # Test whether user is group admin or message owner.
if check_group_staff(group_id, request.user) or \ if check_group_staff(group.id, request.user) or \
gm.from_email == request.user.username: gm.from_email == request.user.username:
gm.delete() gm.delete()
return HttpResponse(json.dumps({'success': True}), return HttpResponse(json.dumps({'success': True}),
@@ -362,18 +362,18 @@ def msg_reply_new(request):
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
def group_info_for_anonymous(request, group): def group_info_for_pub(request, group):
return render_to_response("group/group_info_for_anonymous.html", { return render_to_response("group/group_info_for_pub.html", {
"repos": [], "repos": [],
"group" : group, "group": group,
}, context_instance=RequestContext(request)); }, context_instance=RequestContext(request))
@group_check @group_check
def group_info(request, group): def group_info(request, group):
if group.view_perm == "pub": if group.view_perm == "pub":
return group_info_for_anonymous(request, group) return group_info_for_pub(request, group)
# Get all group members. # Get all group members.
members = get_group_members(group.id) members = get_group_members(group.id)
@@ -414,9 +414,11 @@ def group_info(request, group):
@login_required @login_required
@group_staff_required @group_staff_required
@group_check def group_manage(request, group_id):
def group_manage(request, group): group_id_int = int(group_id) # Checked by URL Conf
group = get_group(group_id_int)
if not group:
return HttpResponseRedirect(reverse('group_list', args=[]))
user = request.user.username user = request.user.username
if request.method == 'POST': if request.method == 'POST':
@@ -602,21 +604,25 @@ def group_member_operations(request, group_id, user_name):
else: else:
return HttpResponseRedirect(reverse('group_manage', args=[group_id])) return HttpResponseRedirect(reverse('group_manage', args=[group_id]))
@login_required
def group_remove_member(request, group_id, user_name): def group_remove_member(request, group_id, user_name):
try: try:
group_id_int = int(group_id) group_id_int = int(group_id)
except ValueError: except ValueError:
return render_error(request, _(u'group id is not valid')) return render_error(request, _(u'group id is not valid'))
if not check_group_staff(group_id_int, request.user): group = get_group(group_id_int)
if not group:
raise Http404
if not is_group_staff(group, request.user):
raise Http404 raise Http404
try: try:
ccnet_threaded_rpc.group_remove_member(group_id_int, ccnet_threaded_rpc.group_remove_member(group.id,
request.user.username, request.user.username,
user_name) user_name)
seafserv_threaded_rpc.remove_repo_group(group_id_int, user_name) seafserv_threaded_rpc.remove_repo_group(group.id, user_name)
messages.success(request, _(u'Operation succeeded.')) messages.success(request, _(u'Operation succeeded.'))
except SearpcError, e: except SearpcError, e:
messages.error(request, _(u'Failed%s') % _(e.msg)) messages.error(request, _(u'Failed%s') % _(e.msg))
@@ -728,7 +734,8 @@ def create_group_repo(request, group_id):
return HttpResponseBadRequest(json.dumps(result), return HttpResponseBadRequest(json.dumps(result),
content_type=content_type) content_type=content_type)
group_id = int(group_id) group_id = int(group_id)
if not get_group(group_id): group = get_group(group_id)
if not group:
return json_error(_(u'Failed to create: the group does not exist.')) return json_error(_(u'Failed to create: the group does not exist.'))
# Check whether user belongs to the group. # Check whether user belongs to the group.
@@ -746,7 +753,7 @@ def create_group_repo(request, group_id):
passwd = form.cleaned_data['passwd'] passwd = form.cleaned_data['passwd']
user = request.user.username user = request.user.username
org, base_template = check_and_get_org_by_group(group_id, user) org, base_template = check_and_get_org_by_group(group.id, user)
if org: if org:
# create group repo in org context # create group repo in org context
try: try:
@@ -760,7 +767,7 @@ def create_group_repo(request, group_id):
try: try:
status = seafserv_threaded_rpc.add_org_group_repo(repo_id, status = seafserv_threaded_rpc.add_org_group_repo(repo_id,
org.org_id, org.org_id,
group_id, group.id,
user, user,
permission) permission)
except SearpcError, e: except SearpcError, e:
@@ -782,7 +789,7 @@ def create_group_repo(request, group_id):
try: try:
status = seafserv_threaded_rpc.group_share_repo(repo_id, status = seafserv_threaded_rpc.group_share_repo(repo_id,
group_id, group.id,
user, user,
permission) permission)
except SearpcError, e: except SearpcError, e:
@@ -809,7 +816,7 @@ def group_joinrequest(request, group_id):
content_type = 'application/json; charset=utf-8' content_type = 'application/json; charset=utf-8'
group_id = int(group_id) group_id = int(group_id)
group =get_group(group_id) group = get_group(group_id)
if not group: if not group:
raise Http404 raise Http404
@@ -933,10 +940,7 @@ def group_discuss(request, group):
detail=str(group.id)).delete() detail=str(group.id)).delete()
# Get all group members. # Get all group members.
if group.view_perm == "pub": members = get_group_members(group.id)
members = []
else:
members = get_group_members(group.id)
"""group messages""" """group messages"""
# Show 15 group messages per page. # Show 15 group messages per page.

View File

@@ -2,3 +2,6 @@ from django.conf import settings
NICKNAME_CACHE_TIMEOUT = getattr(settings, 'NICKNAME_CACHE_TIMEOUT', 24 * 60 * 60) NICKNAME_CACHE_TIMEOUT = getattr(settings, 'NICKNAME_CACHE_TIMEOUT', 24 * 60 * 60)
NICKNAME_CACHE_PREFIX = getattr(settings, 'NICKNAME_CACHE_PREFIX', 'NICKNAME_') NICKNAME_CACHE_PREFIX = getattr(settings, 'NICKNAME_CACHE_PREFIX', 'NICKNAME_')
EMAIL_ID_CACHE_TIMEOUT = getattr(settings, 'EMAIL_ID_CACHE_TIMEOUT', 24 * 60 * 60)
EMAIL_ID_CACHE_PREFIX = getattr(settings, 'EMAIL_ID_CACHE_PREFIX', 'EMAIL_ID_')

View File

@@ -1,12 +1,16 @@
{% extends "profile/profile_base.html" %} {% extends "profile/profile_base.html" %}
{% load avatar_tags i18n %} {% load avatar_tags i18n seahub_tags %}
{% block main_panel %} {% block main_panel %}
{% if not err_msg %}
<div class="user-profile narrow-panel ovhd"> <div class="user-profile narrow-panel ovhd">
<div class="pic fleft"> <div class="pic fleft">
{% avatar email 80 %} {% if user %}
{% if new_user %} {% avatar user.username 80 %}
{% else %}
{% avatar "" 80 %}
{% endif %}
{% if add_to_contact %}
<button id="add">{% trans "Add to contacts" %}</button> <button id="add">{% trans "Add to contacts" %}</button>
{% endif %} {% endif %}
</div> </div>
@@ -14,17 +18,17 @@
<div class="txt fright"> <div class="txt fright">
{% if nickname %} {% if nickname %}
<p>{{ nickname }}</p> <p>{{ nickname }}</p>
{% else %}
<p>{{ email|email2nickname }}</p>
{% endif %} {% endif %}
<p>{{ email }}</p>
{% if intro %} {% if intro %}
<p class="intro">{{ intro }}</p> <p class="intro">{{ intro }}</p>
{% endif %} {% endif %}
</div> </div>
</div> </div>
{% if new_user %} {% if add_to_contact %}
<form id="add-as-contact" class="hide" action="{{ SITE_ROOT }}contacts/add/" method="post"> <form id="add-as-contact" class="hide" action="{{ SITE_ROOT }}contacts/add/" method="post">
<input type="hidden" name="user_email" value="{{ request.user.username }}" id="id_user_email" /> <input type="hidden" name="user_email" value="{{ request.user.username }}" id="id_user_email" />
<label>{% trans "Email: " %}</label><br /> <label>{% trans "Email: " %}</label><br />
@@ -37,11 +41,6 @@
</form> </form>
{% endif %} {% endif %}
{% else %}
<div class="text-panel">
<p class="error">{{ err_msg }}</p>
</div>
{% endif %}
{% endblock %} {% endblock %}
{% block extra_script %} {% block extra_script %}

View File

@@ -3,7 +3,7 @@ from django.conf.urls.defaults import *
urlpatterns = patterns('profile.views', urlpatterns = patterns('profile.views',
# url(r'^list_user/$', 'list_userids', name="list_userids"), # url(r'^list_user/$', 'list_userids', name="list_userids"),
url(r'^$', 'edit_profile', name="edit_profile"), url(r'^$', 'edit_profile', name="edit_profile"),
url(r'^(?P<user>[^/]+)/$', 'user_profile', name="user_profile"), url(r'^(?P<username_or_id>[^/]+)/$', 'user_profile', name="user_profile"),
url(r'^(?P<user>[^/]+)/get/$', 'get_user_profile', name="get_user_profile"), url(r'^(?P<user>[^/]+)/get/$', 'get_user_profile', name="get_user_profile"),
# url(r'^logout/$', 'logout_relay', name="logout_relay"), # url(r'^logout/$', 'logout_relay', name="logout_relay"),
) )

View File

@@ -60,37 +60,38 @@ def edit_profile(request):
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
@login_required @login_required
def user_profile(request, user): def user_profile(request, username_or_id):
user_nickname = '' user_nickname = ''
user_intro = '' user_intro = ''
user = None
# fetch the user by username or id, try id first
try: try:
user_check = User.objects.get(email=user) user_id = int(username_or_id)
except User.DoesNotExist: try:
user_check = None user = User.objects.get(id=user_id)
except:
pass
except ValueError:
try:
user = User.objects.get(email=username_or_id)
except User.DoesNotExist:
pass
if user_check: if user:
profile = Profile.objects.filter(user=user) profile = Profile.objects.filter(user=user)
if profile: if profile:
profile = profile[0] profile = profile[0]
user_nickname = profile.nickname user_nickname = profile.nickname
user_intro = profile.intro user_intro = profile.intro
else: else:
nickname = user user_nickname = ""
user_intro = _(u'Has not accepted invitation yet') user_intro = _(u'Has not accepted invitation yet')
if user == request.user.username or \
Contact.objects.filter(user_email=request.user.username,
contact_email=user).count() > 0:
new_user = False
else:
new_user = True
print new_user
return render_to_response('profile/user_profile.html', { return render_to_response('profile/user_profile.html', {
'email': user, 'email': user.username,
'nickname': user_nickname, 'nickname': user_nickname,
'intro': user_intro, 'intro': user_intro,
'new_user': new_user,
}, context_instance=RequestContext(request)) }, context_instance=RequestContext(request))
@login_required @login_required