diff --git a/base/templatetags/seahub_tags.py b/base/templatetags/seahub_tags.py
index 52e77eef1a..922727e43c 100644
--- a/base/templatetags/seahub_tags.py
+++ b/base/templatetags/seahub_tags.py
@@ -6,4 +6,8 @@ register = template.Library()
@register.filter(name='tsstr_sec')
def tsstr_sec(value):
"""Turn a timestamp to string"""
- return datetime.fromtimestamp(value).strftime("%Y-%m-%d %H:%M:%S")
+ try:
+ return datetime.fromtimestamp(value).strftime("%Y-%m-%d %H:%M:%S")
+ except:
+ return datetime.fromtimestamp(value/1000000).strftime("%Y-%m-%d %H:%M:%S")
+
diff --git a/group/models.py b/group/models.py
index 6823f71807..71a8362390 100644
--- a/group/models.py
+++ b/group/models.py
@@ -1,33 +1,3 @@
from django.db import models
-from django.contrib.auth.models import User
-from django.utils.translation import ugettext_lazy as _
-
-class Group(models.Model):
- """A group is identified uniquely by group_id."""
-
- group_id = models.CharField(max_length=36, primary_key=True, db_column='uuid')
- name = models.CharField(max_length=20, editable=False, unique=True)
- creator = models.ForeignKey(User, verbose_name=_("creator"), related_name="%(class)s_created")
- admin = models.ForeignKey(User, verbose_name=_("admin"), related_name="%(class)s_admined")
- ctime = models.DateTimeField('create time', editable=False)
- description = models.TextField(_("description"))
- users = models.ManyToManyField(User)
-
- def __unicode__(self):
- return self.name
-
-
-class JoinRequest(models.Model):
- """A request for joining a group."""
- group = models.ForeignKey(Group)
- user = models.ForeignKey(User)
- ctime = models.DateTimeField('create time', editable=False)
-
-
-class Invitation(models.Model):
- """An invitation for joining a group."""
-
- group = models.ForeignKey(Group)
- user = models.ForeignKey(User)
- ctime = models.DateTimeField('create time', editable=False)
+# Create your models here.
diff --git a/group/templates/group/group_info.html b/group/templates/group/group_info.html
new file mode 100644
index 0000000000..c6936d2bb4
--- /dev/null
+++ b/group/templates/group/group_info.html
@@ -0,0 +1,118 @@
+{% extends "myhome_base.html" %}
+{% load seahub_tags %}
+
+{% block nav_group_class %}class="cur"{% endblock %}
+{% block left_panel %}
+
+{% endblock %}
+
+{% block right_panel %}
+
+小组里共享的同步目录
+{% if repos %}
+
+
+ 名字 |
+ 描述 |
+ 共享来源 |
+ 操作 |
+
+
+ {% for repo in repos %}
+
+ {{ repo.props.name }} |
+ {{ repo.props.desc }} |
+ {{ repo.share_from }} |
+
+
+ {% if is_creator or repo.share_from_me %}
+
+ {% endif %}
+ |
+
+ {% endfor %}
+
+{% else %}
+暂无
+{% endif %}
+
+
+
+
+
+
+
+
+{% endblock %}
+
+{% block extra_script %}
+
+{% endblock %}
diff --git a/group/templates/group/groups.html b/group/templates/group/groups.html
new file mode 100644
index 0000000000..300f03c21b
--- /dev/null
+++ b/group/templates/group/groups.html
@@ -0,0 +1,49 @@
+{% extends "myhome_base.html" %}
+{% load seahub_tags %}
+
+{% block nav_group_class %}class="cur"{% endblock %}
+{% block left_panel %}
+
+{% endblock %}
+
+{% block right_panel %}
+
+我参加的小组
+{% if groups %}
+
+
+ 名字 |
+ 创建者 |
+ 创建时间 |
+
+
+ {% for group in groups %}
+
+ {{ group.props.group_name }} |
+ {{ group.props.creator_name }} |
+ {{ group.props.timestamp|tsstr_sec }} |
+
+ {% endfor %}
+
+{% else %}
+暂无
+{% endif %}
+
+
+
+{% endblock %}
+
+{% block extra_script %}
+
+{% endblock %}
diff --git a/group/tests.py b/group/tests.py
new file mode 100644
index 0000000000..2247054b35
--- /dev/null
+++ b/group/tests.py
@@ -0,0 +1,23 @@
+"""
+This file demonstrates two different styles of tests (one doctest and one
+unittest). These will both pass when you run "manage.py test".
+
+Replace these with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+class SimpleTest(TestCase):
+ def test_basic_addition(self):
+ """
+ Tests that 1 + 1 always equals 2.
+ """
+ self.failUnlessEqual(1 + 1, 2)
+
+__test__ = {"doctest": """
+Another way to test that 1 + 1 is equal to 2.
+
+>>> 1 + 1 == 2
+True
+"""}
+
diff --git a/group/urls.py b/group/urls.py
new file mode 100644
index 0000000000..d6645bc236
--- /dev/null
+++ b/group/urls.py
@@ -0,0 +1,15 @@
+from django.conf.urls.defaults import *
+
+from views import group_list, group_add, group_info, \
+ group_add_member, group_remove_member, \
+ group_quit, group_remove
+
+urlpatterns = patterns('',
+ url(r'^$', group_list, name='group_list'),
+ (r'^add/$', group_add),
+ (r'^rm/$', group_remove),
+ (r'^memberadd/$', group_add_member),
+ (r'^memberrm/$', group_remove_member),
+ (r'^quit/$', group_quit),
+ url(r'^(?P[^/]+)/$', group_info, name='group_info'),
+)
diff --git a/group/views.py b/group/views.py
index 65f283ad74..9faf2034cb 100644
--- a/group/views.py
+++ b/group/views.py
@@ -1,4 +1,153 @@
+# encoding: utf-8
-from django.contrib.auth.decorators import login_required
-from django.contrib.auth.models import User
+from django.http import HttpResponse, HttpResponseRedirect, Http404
+from django.shortcuts import render_to_response, redirect
+from django.core.urlresolvers import reverse
+from django.template import RequestContext
+from auth.decorators import login_required
+from seaserv import ccnet_rpc, seafserv_threaded_rpc, get_repo, \
+ get_group_repoids
+
+from seahub.views import validate_emailuser
+from seahub.utils import go_error, go_permission_error
+
+from pysearpc import SearpcError
+
+@login_required
+def group_list(request):
+ groups = ccnet_rpc.get_groups(request.user.username);
+
+ return render_to_response("group/groups.html", {
+ "groups": groups,
+ }, context_instance=RequestContext(request))
+
+@login_required
+def group_add(request):
+ error_msg = None
+ if request.method == 'POST':
+ group_name = request.POST.get('group_name')
+ if group_name.find('@') >= 0:
+ return go_error(request, u'小组名称不能包含@')
+
+ try:
+ ccnet_rpc.create_group(group_name.encode('utf-8'), request.user.username)
+ except SearpcError, e:
+ error_msg = e.msg
+ return go_error(request, error_msg)
+
+ return HttpResponseRedirect(reverse('group_list', args=[]))
+
+@login_required
+def group_remove(request):
+ group_id = request.GET.get('gid')
+
+ try:
+ group_id_int = int(group_id)
+ except ValueError:
+ group_id_int = -1
+
+ try:
+ ccnet_rpc.remove_group(group_id_int, request.user.username)
+ seafserv_threaded_rpc.remove_repo_group(group_id_int, None)
+ except SearpcError, e:
+ return go_error(request, e.msg)
+
+ return HttpResponseRedirect(reverse('group_list', args=[]))
+
+@login_required
+def group_info(request, group_id):
+ try:
+ group_id_int = int(group_id)
+ except ValueError:
+ return HttpResponseRedirect(reverse('group_list', args=[]))
+
+ group = ccnet_rpc.get_group(group_id_int)
+ if not group:
+ return HttpResponseRedirect(reverse('group_list', args=[]))
+
+ if group.props.creator_name == request.user.username:
+ is_creator = True
+ else:
+ is_creator = False
+
+ members = ccnet_rpc.get_group_members(group_id_int)
+
+ repos = []
+ repo_ids = get_group_repoids(group_id=group_id_int)
+ for repo_id in repo_ids:
+ if not repo_id:
+ continue
+ repo = get_repo(repo_id)
+ repo.share_from = seafserv_threaded_rpc.get_group_repo_share_from(repo_id)
+ if request.user.username == repo.share_from:
+ repo.share_from_me = True
+ else:
+ repo.share_from_me = False
+ repos.append(repo)
+
+ return render_to_response("group/group_info.html", {
+ "members": members,
+ "repos": repos,
+ "group_id": group_id,
+ "is_creator": is_creator,
+ }, context_instance=RequestContext(request));
+
+@login_required
+def group_add_member(request):
+ if request.method == 'POST':
+ group_id = request.POST.get('group_id')
+ member_name = request.POST.get('user_name')
+ if not validate_emailuser(member_name):
+ err_msg = u'用户不存在'
+ return go_error(request, err_msg)
+ else:
+ try:
+ group_id_int = int(group_id)
+ except ValueError:
+ return go_error(request, u'group id 不是有效参数')
+ try:
+ ccnet_rpc.group_add_member(group_id_int, request.user.username,
+ member_name)
+ except SearpcError, e:
+ return go_error(request, e.msg)
+
+ return HttpResponseRedirect(reverse('group_info', args=[group_id]))
+
+@login_required
+def group_remove_member(request):
+ if request.method == 'POST':
+ group_id = request.POST.get('group_id')
+ member_name = request.POST.get('user_name')
+ if not validate_emailuser(member_name):
+ err_msg = u'用户不存在'
+ return go_error(request, err_msg)
+ else:
+ try:
+ group_id_int = int(group_id)
+ except ValueError:
+ raise Http404
+ try:
+ ccnet_rpc.group_remove_member(group_id_int, request.user.username,
+ member_name)
+ seafserv_threaded_rpc.remove_repo_group(group_id_int, member_name)
+ except SearpcError, e:
+ return go_error(request, e.msg)
+
+ return HttpResponseRedirect(reverse('group_info', args=[group_id]))
+
+@login_required
+def group_quit(request):
+ group_id = request.GET.get('gid')
+ try:
+ group_id_int = int(group_id)
+ except ValueError:
+ raise Http404
+
+ try:
+ ccnet_rpc.quit_group(group_id_int, request.user.username)
+ seafserv_threaded_rpc.remove_repo_group(group_id_int, request.user.username)
+ except SearpcError, e:
+ return go_error(request, e.msg)
+
+ return HttpResponseRedirect(reverse('group_list', args=[]))
diff --git a/settings.py b/settings.py
index e15e83e73b..aade832304 100644
--- a/settings.py
+++ b/settings.py
@@ -103,7 +103,7 @@ INSTALLED_APPS = (
'seahub.base',
'seahub.profile',
'seahub.contacts',
-# 'seahub.group',
+ 'seahub.group',
# 'seahub.share',
)
diff --git a/templates/error.html b/templates/error.html
new file mode 100644
index 0000000000..761ad3cc21
--- /dev/null
+++ b/templates/error.html
@@ -0,0 +1,8 @@
+{% extends "myhome_base.html" %}
+
+{% block title %}错误{% endblock %}
+
+{% block main_panel %}
+
+{{ error_msg }}
+{% endblock %}
diff --git a/templates/groups.html b/templates/groups.html
deleted file mode 100644
index b2931319cf..0000000000
--- a/templates/groups.html
+++ /dev/null
@@ -1,33 +0,0 @@
-{% extends "base.html" %}
-
-{% block title %}Groups{% endblock %}
-
-{% block left_panel %}
-
-{% endblock %}
-
-{% block right_panel %}
-
-Use the following command to add a group:
-ccnet-tool group-follow <group-id> <rendevous-id>
-
-Groups
-
-
-
- Name |
- ID |
- Rendezvous |
- Maintainer |
-
- {% for group in groups %}
-
- {{ group.props.name }} |
- {{ group.props.id }} |
- {{ group.props.rendezvous }} |
- {{ group.props.maintainers }} |
-
- {% endfor %}
-
-
-{% endblock %}
diff --git a/templates/myhome.html b/templates/myhome.html
index 443e8b8f7c..b693578648 100644
--- a/templates/myhome.html
+++ b/templates/myhome.html
@@ -70,7 +70,7 @@
{% endif %}