mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-02 15:38:15 +00:00
Add business groups
This commit is contained in:
@@ -6,8 +6,7 @@ and returns a dictionary to add to the context.
|
|||||||
These are referenced from the setting TEMPLATE_CONTEXT_PROCESSORS and used by
|
These are referenced from the setting TEMPLATE_CONTEXT_PROCESSORS and used by
|
||||||
RequestContext.
|
RequestContext.
|
||||||
"""
|
"""
|
||||||
from settings import SEAFILE_VERSION
|
from settings import SEAFILE_VERSION, SEAHUB_TITLE, BUSINESS_MODE
|
||||||
from settings import SEAHUB_TITLE
|
|
||||||
|
|
||||||
def base(request):
|
def base(request):
|
||||||
"""
|
"""
|
||||||
@@ -25,6 +24,7 @@ def base(request):
|
|||||||
return {
|
return {
|
||||||
'seafile_version': SEAFILE_VERSION,
|
'seafile_version': SEAFILE_VERSION,
|
||||||
'seahub_title': SEAHUB_TITLE,
|
'seahub_title': SEAHUB_TITLE,
|
||||||
|
'business_mode': BUSINESS_MODE,
|
||||||
'cloud_mode': request.cloud_mode,
|
'cloud_mode': request.cloud_mode,
|
||||||
'org': org,
|
'org': org,
|
||||||
'base_template': base_template,
|
'base_template': base_template,
|
||||||
|
@@ -33,6 +33,17 @@ class MessageAttachment(models.Model):
|
|||||||
path = models.TextField()
|
path = models.TextField()
|
||||||
src = models.CharField(max_length=20) # `recommend` or `filecomment`
|
src = models.CharField(max_length=20) # `recommend` or `filecomment`
|
||||||
|
|
||||||
|
class BusinessGroup(models.Model):
|
||||||
|
"""
|
||||||
|
Model used to represents department group or project group in business
|
||||||
|
mode.
|
||||||
|
"""
|
||||||
|
group_id = models.IntegerField()
|
||||||
|
group_type = models.CharField(max_length=10) # `dept` or `proj`
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = ("group_id", "group_type")
|
||||||
|
|
||||||
at_pattern = re.compile(r'(\s|^)(@\w+)', flags=re.U)
|
at_pattern = re.compile(r'(\s|^)(@\w+)', flags=re.U)
|
||||||
|
|
||||||
@receiver(post_save, sender=MessageReply)
|
@receiver(post_save, sender=MessageReply)
|
||||||
|
28
group/templates/group/dept_groups.html
Normal file
28
group/templates/group/dept_groups.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{% extends "myhome_base.html" %}
|
||||||
|
{% load url from future %}
|
||||||
|
|
||||||
|
{% block nav_deptgroup_class %}class="cur"{% endblock %}
|
||||||
|
{% block left_panel %}
|
||||||
|
<!-- 操作 -->
|
||||||
|
{% include "group/groups_left_panel.html" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block right_panel %}
|
||||||
|
<!-- 我的小组 -->
|
||||||
|
{% include "group/groups_right_panel.html" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block extra_script %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
$("#group-add").click(function() {
|
||||||
|
$("#group-add-form").modal({appendTo: "#main"});
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
{% url 'dept_group_list' as group_add_url %}
|
||||||
|
{% with post_url=group_add_url %}
|
||||||
|
{% include "snippets/group_add_js.html" %}
|
||||||
|
{% endwith %}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
@@ -1,42 +1,15 @@
|
|||||||
{% extends "myhome_base.html" %}
|
{% extends "myhome_base.html" %}
|
||||||
{% load seahub_tags group_avatar_tags %}
|
|
||||||
{% load url from future %}
|
{% load url from future %}
|
||||||
|
|
||||||
{% block nav_group_class %}class="cur"{% endblock %}
|
{% block nav_group_class %}class="cur"{% endblock %}
|
||||||
{% block left_panel %}
|
{% block left_panel %}
|
||||||
<h3>操作</h3>
|
<!-- 操作 -->
|
||||||
<ul class="with-bg">
|
{% include "group/groups_left_panel.html" %}
|
||||||
<li><a id="group-add" href="#">添加小组</a></li>
|
|
||||||
</ul>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block right_panel %}
|
{% block right_panel %}
|
||||||
|
<!-- 我的小组 -->
|
||||||
<h3>我的小组</h3>
|
{% include "group/groups_right_panel.html" %}
|
||||||
{% if groups %}
|
|
||||||
<ul class="group-list w100 ovhd">
|
|
||||||
{% for group in groups %}
|
|
||||||
<li class="group fleft">
|
|
||||||
<div class="pic fleft">
|
|
||||||
<a href="{{ SITE_ROOT }}group/{{ group.props.id }}/" class="no-deco">
|
|
||||||
<img src="{% grp_avatar_url group.props.id 48 %}" alt="{{ group.props.group_name }}的图标" title="{{ group.props.group_name }}" class="avatar" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="txt fright">
|
|
||||||
<h4><a href="{{ SITE_ROOT }}group/{{ group.props.id }}/">{{ group.props.group_name }}</a></h4>
|
|
||||||
<p><span class="item-name">创建者:</span>{{ group.props.creator_name }}</p>
|
|
||||||
<p><span class="item-name">创建时间:</span>{{ group.props.timestamp|tsstr_sec }}</p>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% else %}
|
|
||||||
<p>暂无</p>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<!-- 添加小组 -->
|
|
||||||
{% include "snippets/group_add_form.html" %}
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block extra_script %}
|
{% block extra_script %}
|
||||||
|
4
group/templates/group/groups_left_panel.html
Normal file
4
group/templates/group/groups_left_panel.html
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<h3>操作</h3>
|
||||||
|
<ul class="with-bg">
|
||||||
|
<li><a id="group-add" href="#">添加小组</a></li>
|
||||||
|
</ul>
|
30
group/templates/group/groups_right_panel.html
Normal file
30
group/templates/group/groups_right_panel.html
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{% load seahub_tags group_avatar_tags %}
|
||||||
|
{% load url from future %}
|
||||||
|
|
||||||
|
<h3>我的小组</h3>
|
||||||
|
{% if groups %}
|
||||||
|
<ul class="group-list w100 ovhd">
|
||||||
|
{% for group in groups %}
|
||||||
|
<li class="group fleft">
|
||||||
|
<div class="pic fleft">
|
||||||
|
<a href="{{ SITE_ROOT }}group/{{ group.props.id }}/" class="no-deco">
|
||||||
|
<img src="{% grp_avatar_url group.props.id 48 %}" alt="{{ group.props.group_name }}的图标" title="{{ group.props.group_name }}" class="avatar" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="txt fright">
|
||||||
|
<h4><a href="{{ SITE_ROOT }}group/{{ group.props.id }}/">{{ group.props.group_name }}</a></h4>
|
||||||
|
<p><span class="item-name">创建者:</span>{{ group.props.creator_name }}</p>
|
||||||
|
<p><span class="item-name">创建时间:</span>{{ group.props.timestamp|tsstr_sec }}</p>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p>暂无</p>
|
||||||
|
{% endif %}
|
||||||
|
<form id="group-add-form" action="" method="post" name="group-add-form" class="hide">
|
||||||
|
<label>小组名称:</label><br />
|
||||||
|
<input id="group_name" name="group_name" value="" /><br />
|
||||||
|
<p class="error hide"></p>
|
||||||
|
<input id="group-add-submit" type="submit" value="提交" />
|
||||||
|
</form>
|
28
group/templates/group/proj_groups.html
Normal file
28
group/templates/group/proj_groups.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
{% extends "myhome_base.html" %}
|
||||||
|
{% load url from future %}
|
||||||
|
|
||||||
|
{% block nav_projgroup_class %}class="cur"{% endblock %}
|
||||||
|
{% block left_panel %}
|
||||||
|
<!-- 操作 -->
|
||||||
|
{% include "group/groups_left_panel.html" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block right_panel %}
|
||||||
|
<!-- 我的小组 -->
|
||||||
|
{% include "group/groups_right_panel.html" %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block extra_script %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
$("#group-add").click(function() {
|
||||||
|
$("#group-add-form").modal({appendTo: "#main"});
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
{% url 'proj_group_list' as group_add_url %}
|
||||||
|
{% with post_url=group_add_url %}
|
||||||
|
{% include "snippets/group_add_js.html" %}
|
||||||
|
{% endwith %}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
@@ -18,7 +18,7 @@ from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \
|
|||||||
get_org_group_repos, get_org_groups_by_user
|
get_org_group_repos, get_org_groups_by_user
|
||||||
from pysearpc import SearpcError
|
from pysearpc import SearpcError
|
||||||
|
|
||||||
from models import GroupMessage, MessageReply, MessageAttachment
|
from models import GroupMessage, MessageReply, MessageAttachment, BusinessGroup
|
||||||
from forms import MessageForm, MessageReplyForm, GroupRecommendForm
|
from forms import MessageForm, MessageReplyForm, GroupRecommendForm
|
||||||
from signals import grpmsg_added, grpmsg_reply_added
|
from signals import grpmsg_added, grpmsg_reply_added
|
||||||
from base.decorators import ctx_switch_required
|
from base.decorators import ctx_switch_required
|
||||||
@@ -36,7 +36,6 @@ from seahub.forms import RepoCreateForm
|
|||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def group_list(request):
|
def group_list(request):
|
||||||
error_msg = None
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
"""
|
"""
|
||||||
Add new group.
|
Add new group.
|
||||||
@@ -64,6 +63,90 @@ def group_list(request):
|
|||||||
"groups": groups,
|
"groups": groups,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
def is_dept_group(group_id):
|
||||||
|
try:
|
||||||
|
BusinessGroup.objects.get(group_id=group_id, group_type='dept')
|
||||||
|
ret = True
|
||||||
|
except BusinessGroup.DoesNotExist:
|
||||||
|
ret = False
|
||||||
|
return ret
|
||||||
|
|
||||||
|
def is_proj_group(group_id):
|
||||||
|
try:
|
||||||
|
BusinessGroup.objects.get(group_id=group_id, group_type='proj')
|
||||||
|
ret = True
|
||||||
|
except BusinessGroup.DoesNotExist:
|
||||||
|
ret = False
|
||||||
|
return ret
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def dept_group_list(request):
|
||||||
|
if request.method == 'POST':
|
||||||
|
"""
|
||||||
|
Add new department group.
|
||||||
|
"""
|
||||||
|
result = {}
|
||||||
|
content_type = 'application/json; charset=utf-8'
|
||||||
|
|
||||||
|
group_name = request.POST.get('group_name')
|
||||||
|
if not validate_group_name(group_name):
|
||||||
|
result['error'] = u'小组名称只能包含中英文字符,数字及下划线。'
|
||||||
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||||
|
|
||||||
|
try:
|
||||||
|
group_id = ccnet_threaded_rpc.create_group(group_name.encode('utf-8'),
|
||||||
|
request.user.username)
|
||||||
|
bg = BusinessGroup()
|
||||||
|
bg.group_id = group_id
|
||||||
|
bg.group_type = 'dept'
|
||||||
|
bg.save()
|
||||||
|
except SearpcError, e:
|
||||||
|
result['error'] = _(e.msg)
|
||||||
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||||
|
return HttpResponse(json.dumps({'success': True}),
|
||||||
|
content_type=content_type)
|
||||||
|
|
||||||
|
groups = [ g for g in get_personal_groups(request.user.username) \
|
||||||
|
if is_dept_group(g.id)]
|
||||||
|
|
||||||
|
return render_to_response("group/dept_groups.html", {
|
||||||
|
"groups": groups,
|
||||||
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def proj_group_list(request):
|
||||||
|
if request.method == 'POST':
|
||||||
|
"""
|
||||||
|
Add new department group.
|
||||||
|
"""
|
||||||
|
result = {}
|
||||||
|
content_type = 'application/json; charset=utf-8'
|
||||||
|
|
||||||
|
group_name = request.POST.get('group_name')
|
||||||
|
if not validate_group_name(group_name):
|
||||||
|
result['error'] = u'小组名称只能包含中英文字符,数字及下划线。'
|
||||||
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||||
|
|
||||||
|
try:
|
||||||
|
group_id = ccnet_threaded_rpc.create_group(group_name.encode('utf-8'),
|
||||||
|
request.user.username)
|
||||||
|
bg = BusinessGroup()
|
||||||
|
bg.group_id = group_id
|
||||||
|
bg.group_type = 'proj'
|
||||||
|
bg.save()
|
||||||
|
except SearpcError, e:
|
||||||
|
result['error'] = _(e.msg)
|
||||||
|
return HttpResponse(json.dumps(result), content_type=content_type)
|
||||||
|
return HttpResponse(json.dumps({'success': True}),
|
||||||
|
content_type=content_type)
|
||||||
|
|
||||||
|
groups = [ g for g in get_personal_groups(request.user.username) \
|
||||||
|
if is_proj_group(g.id)]
|
||||||
|
|
||||||
|
return render_to_response("group/proj_groups.html", {
|
||||||
|
"groups": groups,
|
||||||
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def group_remove(request, group_id):
|
def group_remove(request, group_id):
|
||||||
"""
|
"""
|
||||||
|
@@ -202,6 +202,8 @@ SEAHUB_TITLE = 'SeaHub'
|
|||||||
|
|
||||||
USE_SUBDOMAIN = False
|
USE_SUBDOMAIN = False
|
||||||
|
|
||||||
|
BUSINESS_MODE = True
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import local_settings
|
import local_settings
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
|
{% load url from future %}
|
||||||
{% block top_bar_myaccount_class %} class="cur"{% endblock %}
|
{% block top_bar_myaccount_class %} class="cur"{% endblock %}
|
||||||
{% block nav %}
|
{% block nav %}
|
||||||
<ul class="nav">
|
<ul class="nav">
|
||||||
@@ -7,12 +8,21 @@
|
|||||||
</li>
|
</li>
|
||||||
{% if not request.cloud_mode %}
|
{% if not request.cloud_mode %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url public_home %}" {% block nav_publichome_class %}{% endblock %}>公共页面</a>
|
<a href="{% url 'public_home' %}" {% block nav_publichome_class %}{% endblock %}>公共页面</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if business_mode %}
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'dept_group_list' %}" {% block nav_deptgroup_class %}{% endblock %}>部门组</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'proj_group_list' %}" {% block nav_projgroup_class %}{% endblock %}>项目组</a>
|
||||||
|
</li>
|
||||||
|
{% else %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ SITE_ROOT }}groups/" {% block nav_group_class %}{% endblock %}>小组</a>
|
<a href="{{ SITE_ROOT }}groups/" {% block nav_group_class %}{% endblock %}>小组</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% endif %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ SITE_ROOT }}shareadmin/" {% block nav_shareadmin_class %}{% endblock %}>共享管理</a>
|
<a href="{{ SITE_ROOT }}shareadmin/" {% block nav_shareadmin_class %}{% endblock %}>共享管理</a>
|
||||||
</li>
|
</li>
|
||||||
|
@@ -1,6 +0,0 @@
|
|||||||
<form id="group-add-form" action="" method="post" name="group-add-form" class="hide">
|
|
||||||
<label>小组名称:</label><br />
|
|
||||||
<input id="group_name" name="group_name" value="" /><br />
|
|
||||||
<p class="error hide"></p>
|
|
||||||
<input id="group-add-submit" type="submit" value="提交" />
|
|
||||||
</form>
|
|
4
urls.py
4
urls.py
@@ -5,7 +5,7 @@ from django.views.generic.simple import direct_to_template
|
|||||||
from seahub.views import *
|
from seahub.views import *
|
||||||
from notifications.views import notification_list
|
from notifications.views import notification_list
|
||||||
from share.views import share_admin
|
from share.views import share_admin
|
||||||
from group.views import group_list
|
from group.views import group_list, dept_group_list, proj_group_list
|
||||||
|
|
||||||
# Uncomment the next two lines to enable the admin:
|
# Uncomment the next two lines to enable the admin:
|
||||||
#from django.contrib import admin
|
#from django.contrib import admin
|
||||||
@@ -89,6 +89,8 @@ urlpatterns = patterns('',
|
|||||||
(r'^contacts/', include('contacts.urls')),
|
(r'^contacts/', include('contacts.urls')),
|
||||||
(r'^group/', include('seahub.group.urls')),
|
(r'^group/', include('seahub.group.urls')),
|
||||||
url(r'^groups/', group_list, name='group_list'),
|
url(r'^groups/', group_list, name='group_list'),
|
||||||
|
url(r'^deptgroups/', dept_group_list, name='dept_group_list'),
|
||||||
|
url(r'^projgroups/', proj_group_list, name='proj_group_list'),
|
||||||
(r'^organizations/', include('seahub.organizations.urls')),
|
(r'^organizations/', include('seahub.organizations.urls')),
|
||||||
(r'^profile/', include('seahub.profile.urls')),
|
(r'^profile/', include('seahub.profile.urls')),
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user