diff --git a/group/forms.py b/group/forms.py index 19d0575bb2..546dfa89d4 100644 --- a/group/forms.py +++ b/group/forms.py @@ -3,8 +3,15 @@ import os from django import forms class MessageForm(forms.Form): - message = forms.CharField(max_length=500) + message = forms.CharField(max_length=5) class MessageReplyForm(forms.Form): message = forms.CharField(max_length=150) +class FileRecommendForm(MessageForm): + """ + A form used to recommend a file. + """ + groups = forms.CharField() + repo_id = forms.CharField(max_length=40) + file_path = forms.CharField() diff --git a/group/models.py b/group/models.py index c6d2b13c7d..e927459ddb 100644 --- a/group/models.py +++ b/group/models.py @@ -23,6 +23,17 @@ class MessageReply(models.Model): message = models.CharField(max_length=150) timestamp = models.DateTimeField(default=datetime.datetime.now) +class MessageAttachment(models.Model): + """ + + """ + group_message = models.ForeignKey(GroupMessage) + repo_id = models.CharField(max_length=40) + file_path = models.TextField() + + + + at_pattern = re.compile(r'(\s|^)(@\w+)', flags=re.U) @receiver(post_save, sender=MessageReply) diff --git a/group/templates/group/group_info.html b/group/templates/group/group_info.html index 904a346577..9963379565 100644 --- a/group/templates/group/group_info.html +++ b/group/templates/group/group_info.html @@ -102,7 +102,17 @@ {{ msg.from_email|email2nickname }}
-

{{ msg.message|linebreaksbr|seahub_urlize|find_at }}

+ {% if msg.attachment %} + (推荐) + {% endif %} +

+ {{ msg.message|linebreaksbr|seahub_urlize|find_at }} +

+ {% if msg.attachment %} + + 附件: 查看 + + {% endif %} {% if msg.reply_cnt == 0 %} 回复 {% else %} diff --git a/group/urls.py b/group/urls.py index 5cece91865..8d1089831b 100644 --- a/group/urls.py +++ b/group/urls.py @@ -1,7 +1,7 @@ from django.conf.urls.defaults import * from views import group_list, group_info, group_member_operations, \ - group_members, msg_reply, msg_reply_new + group_members, msg_reply, msg_reply_new, group_recommend urlpatterns = patterns('', url(r'^(?P[\d]+)/$', group_info, name='group_info'), @@ -9,4 +9,5 @@ urlpatterns = patterns('', url(r'^reply/new/$', msg_reply_new, name='msg_reply_new'), url(r'^(?P[\d]+)/members/$', group_members, name='group_members'), (r'^(?P[\d]+)/member/(?P[^/]+)/$', group_member_operations), + url(r'^recommend/$', group_recommend, name='group_recommend'), ) diff --git a/group/views.py b/group/views.py index c6ee6a7c18..50bebcfb1a 100644 --- a/group/views.py +++ b/group/views.py @@ -1,6 +1,7 @@ # encoding: utf-8 import simplejson as json from django.core.urlresolvers import reverse +from django.contrib import messages from django.http import HttpResponse, HttpResponseRedirect, Http404, \ HttpResponseBadRequest from django.shortcuts import render_to_response, redirect @@ -13,16 +14,17 @@ from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \ get_personal_groups, get_group, get_group_members from pysearpc import SearpcError -from models import GroupMessage, MessageReply -from forms import MessageForm, MessageReplyForm +from models import GroupMessage, MessageReply, MessageAttachment +from forms import MessageForm, MessageReplyForm, FileRecommendForm from signals import grpmsg_added, grpmsg_reply_added from seahub.contacts.models import Contact from seahub.contacts.signals import mail_sended from seahub.notifications.models import UserNotification from seahub.profile.models import Profile from seahub.settings import SITE_ROOT +from seahub.shortcuts import get_first_object_or_none from seahub.utils import render_error, render_permission_error, \ - validate_group_name, emails2list + validate_group_name, string2list from seahub.views import is_registered_user @login_required @@ -209,7 +211,9 @@ def render_group_info(request, group_id, form): group_msgs = msgs_plus_one[:per_page] for msg in group_msgs: msg.reply_cnt = len(MessageReply.objects.filter(reply_to=msg)) - + msg.attachment = get_first_object_or_none( + MessageAttachment.objects.filter(group_message=msg)) + return render_to_response("group/group_info.html", { "managers": managers, "common_members": common_members, @@ -370,7 +374,7 @@ def group_members(request, group_id): """ member_name_str = request.POST.get('user_name', '') - member_list = emails2list(member_name_str) + member_list = string2list(member_name_str) if request.user.org: for member_name in member_list: @@ -489,3 +493,65 @@ def group_unshare_repo(request, repo_id, group_id, from_email): if seafserv_threaded_rpc.group_unshare_repo(repo_id, group_id, from_email) != 0: return render_error(request, u'共享失败:内部错误') + +@login_required +def group_recommend(request): + """ + Recommend a file to a group. + """ + if request.method != 'POST': + raise Http404 + + next = request.META.get('HTTP_REFERER', None) + if not next: + next = SITE_ROOT + + form = FileRecommendForm(request.POST) + if form.is_valid(): + groups = form.cleaned_data['groups'] + repo_id = form.cleaned_data['repo_id'] + file_path = form.cleaned_data['file_path'] + message = form.cleaned_data['message'] + + group_list = string2list(groups) + for e in group_list: + group_name = e.split(' ')[0] + try: + group_creator = e.split(' ')[1] + except IndexError: + messages.add_message(request, messages.ERROR, + u'推荐到 %s 失败,请检查是否参加了该小组。' % \ + group_name) + continue + + # get all the groups the user joined + groups = get_personal_groups(request.user.username) + find = False + for group in groups: + # for every group that user joined, if group name and + # group creator matchs, then has find the group + if group.group_name == group_name and \ + group_creator.find(group.creator_name) >= 0: + find = True + # save message to group + gm = GroupMessage(group_id=int(group.id), + from_email=request.user.username, + message=message) + gm.save() + + # save attachment + ma = MessageAttachment(group_message=gm, repo_id=repo_id, + file_path=file_path) + ma.save() + + messages.add_message(request, messages.INFO, + u'推荐成功,请到该小组页面查看。') + break + if not find: + messages.add_message(request, messages.ERROR, + u'推荐到 %s 失败,请检查是否参加了该小组。' % \ + group_name) + else: + # TODO: need more clear error message + messages.add_message(request, messages.ERROR, '推荐失败') + return HttpResponseRedirect(next) diff --git a/media/css/seahub.css b/media/css/seahub.css index 037857e13e..c730ad3da4 100644 --- a/media/css/seahub.css +++ b/media/css/seahub.css @@ -118,6 +118,7 @@ p { .w100 { width: 100%; } +.info, .notification { padding:5px; background:#FDF; @@ -559,6 +560,10 @@ p { #recommend-msg { width:260px; height:80px; + display:block; +} +#groups { + width:260px; } /* group, org */ .group-list { @@ -690,6 +695,10 @@ p { .msg-bd .op:hover { text-decoration:none; } +.msg-bd .recommend { + font-size:12px; + color: #880088; +} .msg-bd p a { color: #666666; font-weight: normal; diff --git a/organizations/views.py b/organizations/views.py index e50c8af736..1dd7139c29 100644 --- a/organizations/views.py +++ b/organizations/views.py @@ -28,7 +28,7 @@ from seahub.contacts import Contact from seahub.forms import RepoCreateForm import seahub.settings as seahub_settings from seahub.utils import render_error, render_permission_error, gen_token, \ - validate_group_name, emails2list, set_cur_ctx, calculate_repo_last_modify,\ + validate_group_name, string2list, set_cur_ctx, calculate_repo_last_modify,\ MAX_INT from seahub.views import myhome @@ -155,7 +155,7 @@ def org_useradmin(request, url_prefix): if request.method == 'POST': emails = request.POST.get('added-member-name') - email_list = emails2list(emails) + email_list = string2list(emails) for email in email_list: if not email or email.find('@') <= 0 : continue diff --git a/settings.py b/settings.py index cc22477f0b..4cac556b48 100644 --- a/settings.py +++ b/settings.py @@ -105,7 +105,7 @@ INSTALLED_APPS = ( # 'django.contrib.admin', 'django.contrib.messages', - 'auth', + # 'auth', 'avatar', 'registration', diff --git a/share/views.py b/share/views.py index 62cda0256f..05691b7c7d 100644 --- a/share/views.py +++ b/share/views.py @@ -11,7 +11,7 @@ from django.contrib import messages from django.contrib.sites.models import Site, RequestSite from pysearpc import SearpcError from seaserv import seafserv_threaded_rpc, get_repo, ccnet_rpc, \ - ccnet_threaded_rpc + ccnet_threaded_rpc, get_personal_groups from forms import RepoShareForm from models import AnonymousShare @@ -20,7 +20,7 @@ from tokens import anon_share_token_generator from seahub.contacts.signals import mail_sended from seahub.share.models import FileShare from seahub.views import validate_owner, is_registered_user -from seahub.utils import render_permission_error, emails2list +from seahub.utils import render_permission_error, string2list @login_required def share_repo(request): @@ -43,7 +43,7 @@ def share_repo(request): if not validate_owner(request, repo_id): return render_permission_error(request, u'只有目录拥有者有权共享目录') - to_email_list = emails2list(email_or_group) + to_email_list = string2list(email_or_group) for to_email in to_email_list: # if to_email is user name, the format is: 'example@mail.com'; # if to_email is group, the format is 'group_name ' @@ -57,7 +57,7 @@ def share_repo(request): group_name = to_email.split(' ')[0] group_creator = to_email.split(' ')[1] # get all the groups the user joined - groups = ccnet_threaded_rpc.get_groups(request.user.username) + groups = get_personal_groups(request.user.username) find = False for group in groups: # for every group that user joined, if group name and diff --git a/templates/repo_view_file.html b/templates/repo_view_file.html index c5fefee4a6..f48e137f61 100644 --- a/templates/repo_view_file.html +++ b/templates/repo_view_file.html @@ -11,6 +11,16 @@ {% endif %} {% endblock %} +{% block right_panel %} +{% if messages %} +
    + {% for message in messages %} +
  • {{ message }}
  • + {% endfor %} +
+{% endif %} +{% endblock %} + {% block main_panel %}

{% if not view_history %} @@ -68,17 +78,20 @@

-
+

推荐 - {% for name, link in zipped %} + {% for name, link in zipped %} {% if not forloop.last %} {{ name }} / {% else %} {{ name }} {% endif %} - {% endfor %} : + {% endfor %} 到小组:

-
+ +
+ +
@@ -195,6 +208,16 @@ $("#link-send-form").submit(function(event) { return false; }); +$(function() { + // recommend form autocomplete + var group_list = [] + {% for group in groups %} + group_list.push('{{ group.props.group_name }} <{{ group.props.creator_name }}>'); + {% endfor %} + addAutocomplete('#groups', '#recommend-form', group_list); + $('.ui-autocomplete').css({'max-height': window.innerHeight - $('.ui-autocomplete-input').offset().top - $('.ui-autocomplete-input').height() - 10, 'overflow': 'auto'}); + +}); {% include "snippets/bottom_bar.html" %} {% endif %} diff --git a/templates/snippets/bottom_bar.html b/templates/snippets/bottom_bar.html index 6d6abfb81a..423d0d7805 100644 --- a/templates/snippets/bottom_bar.html +++ b/templates/snippets/bottom_bar.html @@ -1,4 +1,4 @@ -var Bottom_bar = '
'; +var Bottom_bar = '
'; $('#wrapper').append(Bottom_bar); $('#bottom-bar').css({'position':'fixed', 'bottom':0, 'left':$('#main').offset().left + $('#main').width() + 15}); $('#recommend').click(function() { diff --git a/utils.py b/utils.py index 4fe2f589b5..c594e5ff74 100644 --- a/utils.py +++ b/utils.py @@ -297,14 +297,15 @@ def get_ccnet_server_addr_port(): """get ccnet server host and port""" return CCNET_SERVER_ADDR, CCNET_SERVER_PORT -def emails2list(emails): +def string2list(string): """ - Split email strings contacted with diffent separator. + Split strings contacted with diffent separator to a list, and remove + duplicated string. """ - email_str = emails.replace(';', ',').replace('\n', ',').replace('\r', ',') - # Remove empty strings and duplicate emails + tmp_str = string.replace(';', ',').replace('\n', ',').replace('\r', ',') + # Remove empty and duplicate strings s = set() - for e in email_str.split(','): + for e in tmp_str.split(','): e = e.strip(' ') if not e: continue diff --git a/views.py b/views.py index 60b9ea9f77..776f93b459 100644 --- a/views.py +++ b/views.py @@ -48,7 +48,7 @@ from utils import render_permission_error, render_error, list_to_string, \ calculate_repo_last_modify, valid_previewed_file, \ check_filename_with_rename, get_accessible_repos, EMPTY_SHA1, \ get_file_revision_id_size, get_ccnet_server_addr_port, \ - gen_file_get_url, emails2list, set_cur_ctx, MAX_INT + gen_file_get_url, string2list, set_cur_ctx, MAX_INT from seahub.profile.models import Profile try: from settings import CROCODOC_API_TOKEN @@ -822,6 +822,9 @@ def repo_view_file(request, repo_id): # my constacts contacts = Contact.objects.filter(user_email=request.user.username) + + # my groups + groups = get_personal_groups(request.user.username) return render_to_response('repo_view_file.html', { 'repo': repo, @@ -843,6 +846,7 @@ def repo_view_file(request, repo_id): 'contacts': contacts, 'err': err, 'file_content': file_content, + 'groups': groups, }, context_instance=RequestContext(request)) def repo_file_get(raw_path): @@ -1582,7 +1586,7 @@ def repo_create(request): repo_name = form.cleaned_data['repo_name'] repo_desc = form.cleaned_data['repo_desc'] encrypted = form.cleaned_data['encryption'] - passwd = form.cleaned_data['passwd'] + passwd = form.cleasened_data['passwd'] passwd_again = form.cleaned_data['passwd_again'] user = request.user.username @@ -1856,7 +1860,7 @@ def send_shared_link(request): file_shared_link = form.cleaned_data['file_shared_link'] t = loader.get_template('shared_link_email.html') - to_email_list = emails2list(email) + to_email_list = string2list(email) for to_email in to_email_list: # Add email to contacts mail_sended.send(sender=None, user=request.user.username,