def check_user_share_quota(username, repo, users=[], groups=[]): """Check whether user has enough quota when share repo to users/groups. """ if not users and not groups: return True if not seaserv.CALC_SHARE_USAGE: return True check_pass = False quota = seafile_api.get_user_quota(username) self_usage = seafile_api.get_user_self_usage(username) current_share_usage = seafile_api.get_user_share_usage(username) share_usage = 0 if users: share_usage += seafile_api.get_repo_size(repo.id) * (len(users)) if groups: grp_members = [] for group in groups: grp_members += [ e.user_name for e in seaserv.get_group_members(group.id) ] grp_members = set(grp_members) share_usage += seafile_api.get_repo_size( repo.id) * (len(grp_members) - 1) if share_usage + self_usage + current_share_usage < quota: check_pass = True return check_pass
def get_data_from_db(self): grp_data_db = None groups = get_ldap_groups(-1, -1) if groups is None: logger.warning('get ldap groups from db failed.') return grp_data_db grp_data_db = {} for group in groups: members = get_group_members(group.id) if members is None: logger.warning('get members of group %d from db failed.' % group.id) grp_data_db = None break nor_members = [] for member in members: nor_members.append(member.user_name) if (group.parent_group_id == 0): grp_data_db[group.id] = LdapGroup(None, group.creator_name, sorted(nor_members)) else: grp_data_db[group.id] = LdapGroup(None, group.creator_name, sorted(nor_members), None, 0, True) return grp_data_db
def get(self, request, group_id, format=None): """ Get all group members. """ try: avatar_size = int(request.GET.get('avatar_size', AVATAR_DEFAULT_SIZE)) except ValueError: avatar_size = AVATAR_DEFAULT_SIZE try: # only group member can get info of all group members if not is_group_member(group_id, request.user.username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) members = seaserv.get_group_members(group_id) except SearpcError as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) group_members = [] is_admin = request.GET.get('is_admin', 'false') for m in members: # only return group admins if is_admin == 'true' and not m.is_staff: continue member_info = get_group_member_info(request, group_id, m.user_name, avatar_size) group_members.append(member_info) return Response(group_members)
def check_user_share_quota(username, repo, users=[], groups=[]): """Check whether user has enough quota when share repo to users/groups. """ if not users and not groups: return True if not seaserv.CALC_SHARE_USAGE: return True check_pass = False quota = seafile_api.get_user_quota(username) self_usage = seafile_api.get_user_self_usage(username) current_share_usage = seafile_api.get_user_share_usage(username) share_usage = 0 if users: share_usage += seafile_api.get_repo_size(repo.id) * (len(users)) if groups: grp_members = [] for group in groups: grp_members += [ e.user_name for e in seaserv.get_group_members(group.id)] grp_members = set(grp_members) share_usage += seafile_api.get_repo_size(repo.id) * (len(grp_members) -1) if share_usage + self_usage + current_share_usage < quota: check_pass = True return check_pass
def setUp(self): self.user2 = self.create_user() ccnet_api.group_add_member(self.group.id, self.user.username, self.user2.username) g_members = [ x.user_name for x in seaserv.get_group_members(self.group.id) ] assert self.user2.username in g_members
def _get_group_admins(self, group_id): members = seaserv.get_group_members(group_id) admin_members = filter(lambda m: m.is_staff, members) admins = [] for u in admin_members: admins.append(u.user_name) return admins
def get_group_admins(group_id): members = seaserv.get_group_members(group_id) admin_members = filter(lambda m: m.is_staff, members) admins = [] for u in admin_members: admins.append(u.user_name) return admins
def get_group_admins(group_id): members = seaserv.get_group_members(group_id) admin_members = [m for m in members if m.is_staff] admins = [] for u in admin_members: admins.append(u.user_name) return admins
def grpmsg_added_cb(sender, **kwargs): group_id = kwargs['group_id'] from_email = kwargs['from_email'] group_members = seaserv.get_group_members(int(group_id)) notify_members = [ x.user_name for x in group_members if x.user_name != from_email ] detail = group_msg_to_json(group_id, email2nickname(from_email)) UserNotification.objects.bulk_add_group_msg_notices(notify_members, detail)
def grpmsg_added_cb(sender, **kwargs): group_id = kwargs["group_id"] from_email = kwargs["from_email"] message = kwargs["message"] group_members = seaserv.get_group_members(int(group_id)) notify_members = [x.user_name for x in group_members if x.user_name != from_email] detail = group_msg_to_json(group_id, from_email, message) UserNotification.objects.bulk_add_group_msg_notices(notify_members, detail)
def grpmsg_added_cb(sender, **kwargs): group_id = kwargs['group_id'] from_email = kwargs['from_email'] message = kwargs['message'] group_members = seaserv.get_group_members(int(group_id)) notify_members = [x.user_name for x in group_members if x.user_name != from_email] detail = group_msg_to_json(group_id, from_email, message) UserNotification.objects.bulk_add_group_msg_notices(notify_members, detail)
def get_repo_shared_users(repo_id, repo_owner, include_groups=True): """Return a list contains users and group users. Repo owner is ommited. """ ret = [] users = seafile_api.list_repo_shared_to(repo_owner, repo_id) ret += [x.user for x in users] if include_groups: for e in seafile_api.list_repo_shared_group_by_user(repo_owner, repo_id): g_members = seaserv.get_group_members(e.group_id) ret += [x.user_name for x in g_members if x.user_name != repo_owner] return list(set(ret))
def org_admin_group_info(request, group_id): group_id = int(group_id) group = get_group(group_id) org_id = request.user.org.org_id repos = seafile_api.get_org_group_repos(org_id, group_id) members = get_group_members(group_id) return render(request, 'organizations/org_admin_group_info.html', { 'group': group, 'repos': repos, 'members': members, })
def attention(request): """ Handle ajax request to query group members used in autocomplete. """ if not request.is_ajax(): raise Http404 user = request.user.username name_str = request.GET.get('name_startsWith') gids = request.GET.get('gids', '') result = [] members = [] for gid in gids.split('_'): try: gid = int(gid) except ValueError: continue if not is_group_user(gid, user): continue # Get all group users members += get_group_members(gid) member_names = [] for m in members: if len(result) == 10: # Return at most 10 results. break if m.user_name == user: continue if m.user_name in member_names: # Remove duplicated member names continue else: member_names.append(m.user_name) from base.templatetags.seahub_tags import email2nickname, char2pinyin nickname = email2nickname(m.user_name) pinyin = char2pinyin(nickname) if nickname.startswith(name_str) or pinyin.startswith(name_str): result.append({'contact_name': nickname}) content_type = 'application/json; charset=utf-8' return HttpResponse(json.dumps(result), content_type=content_type)
def attention(request): """ Handle ajax request to query group members used in autocomplete. """ user = request.user.username name_str = request.GET.get('name_startsWith') gids = request.GET.get('gids', '') result = [] members = [] for gid in gids.split('_'): try: gid = int(gid) except ValueError: continue if not is_group_user(gid, user): continue # Get all group users members += get_group_members(gid) member_names = [] for m in members: if len(result) == 10: # Return at most 10 results. break if m.user_name == user: continue if m.user_name in member_names: # Remove duplicated member names continue else: member_names.append(m.user_name) from seahub.base.templatetags.seahub_tags import email2nickname, char2pinyin nickname = email2nickname(m.user_name) pinyin = char2pinyin(nickname) if nickname.startswith(name_str) or pinyin.startswith(name_str): result.append({'contact_name': nickname}) content_type = 'application/json; charset=utf-8' return HttpResponse(json.dumps(result), content_type=content_type)
def grpmsg_added_cb(sender, **kwargs): group_id = kwargs['group_id'] from_email = kwargs['from_email'] group_members = get_group_members(int(group_id)) if len(group_members) > 15: # No need to send notification when group is return # too large for m in group_members: if from_email == m.user_name: continue try: UserNotification.objects.get(to_user=m.user_name, msg_type='group_msg', detail=group_id) except UserNotification.DoesNotExist: n = UserNotification(to_user=m.user_name, msg_type='group_msg', detail=group_id) n.save()
def msgreply_save_handler(sender, instance, **kwargs): """ Handle sending notification to '@<user>' when reply messages. """ from_email = instance.from_email reply_msg = instance.message group_msg = instance.reply_to to_user = '' from base.templatetags.seahub_tags import at_pattern m = re.match(at_pattern, reply_msg) if m: nickname_or_emailprefix = m.group()[1:] for member in get_group_members(group_msg.group_id): # For every group member, get his username and nickname if # it exists, check whether match. username = member.user_name if username == from_email: continue p = get_first_object_or_none( Profile.objects.filter(user=username)) nickname = p.nickname if p else '' if nickname == nickname_or_emailprefix or \ username.split('@')[0] == nickname_or_emailprefix: to_user = username break if to_user: # Send notification to the user if he replies someone else' # message. try: UserNotification.objects.get(to_user=to_user, msg_type='grpmsg_reply', detail=group_msg.id) except UserNotification.DoesNotExist: n = UserNotification(to_user=to_user, msg_type='grpmsg_reply', detail=group_msg.id) n.save()
def msgreply_save_handler(sender, instance, **kwargs): """ Handle sending notification to '@<user>' when reply messages. """ from_email = instance.from_email reply_msg = instance.message group_msg = instance.reply_to to_user = '' from seahub.base.templatetags.seahub_tags import at_pattern m = re.match(at_pattern, reply_msg) if m: nickname_or_emailprefix = m.group()[1:] for member in get_group_members(group_msg.group_id): # For every group member, get his username and nickname if # it exists, check whether match. username = member.user_name if username == from_email: continue p = get_first_object_or_none( Profile.objects.filter(user=username)) nickname = p.nickname if p else '' if nickname == nickname_or_emailprefix or \ username.split('@')[0] == nickname_or_emailprefix: to_user = username break if to_user: # Send notification to the user if he replies someone else' # message. try: UserNotification.objects.get(to_user=to_user, msg_type='grpmsg_reply', detail=group_msg.id) except UserNotification.DoesNotExist: n = UserNotification(to_user=to_user, msg_type='grpmsg_reply', detail=group_msg.id) n.save()
def get(self, request, group_id, format=None): """ Get all group members. """ try: avatar_size = int( request.GET.get('avatar_size', AVATAR_DEFAULT_SIZE)) except ValueError: avatar_size = AVATAR_DEFAULT_SIZE try: members = seaserv.get_group_members(group_id) except SearpcError as e: logger.error(e) error_msg = _(u'Internal Server Error') return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) try: only_admin = int(request.GET.get('only_admin', 0)) except ValueError: only_admin = 0 if only_admin not in (0, 1): error_msg = _(u'Argument is not valid') return api_error(status.HTTP_400_BAD_REQUEST, error_msg) group_members = [] for m in members: # only return group admins if only_admin and not m.is_staff: continue member_info = get_group_member_info(request, group_id, m.user_name, avatar_size) group_members.append(member_info) return Response(group_members)
def get(self, request, group_id, format=None): """ Get all group members. """ try: avatar_size = int(request.GET.get('avatar_size', AVATAR_DEFAULT_SIZE)) except ValueError: avatar_size = AVATAR_DEFAULT_SIZE try: members = seaserv.get_group_members(group_id) except SearpcError as e: logger.error(e) error_msg = _(u'Internal Server Error') return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) try: only_admin = int(request.GET.get('only_admin', 0)) except ValueError: only_admin = 0 if only_admin not in (0, 1): error_msg = _(u'Argument is not valid') return api_error(status.HTTP_400_BAD_REQUEST, error_msg) group_members = [] for m in members: # only return group admins if only_admin and not m.is_staff: continue member_info = get_group_member_info(request, group_id, m.user_name, avatar_size) group_members.append(member_info) return Response(group_members)
def get(self, request, group_id, format=None): """ Get all group members. """ try: avatar_size = int( request.GET.get('avatar_size', AVATAR_DEFAULT_SIZE)) except ValueError: avatar_size = AVATAR_DEFAULT_SIZE try: # only group member can get info of all group members if not is_group_member(group_id, request.user.username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) members = seaserv.get_group_members(group_id) except SearpcError as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) group_members = [] is_admin = request.GET.get('is_admin', 'false') for m in members: # only return group admins if is_admin == 'true' and not m.is_staff: continue member_info = get_group_member_info(request, group_id, m.user_name, avatar_size) group_members.append(member_info) return Response(group_members)
def render_group_info(request, group_id, form): group_id_int = int(group_id) # Checkeb by URL Conf # remove user notifications UserNotification.objects.filter(to_user=request.user.username, msg_type='group_msg', detail=str(group_id)).delete() group = get_group(group_id_int) if not group: return HttpResponseRedirect(reverse('group_list', args=[])) # Get all group members. members = get_group_members(group_id_int) # Check whether user belongs to the group. joined = is_group_user(group_id_int, request.user.username) if not joined and not request.user.is_staff: # Return group public info page. return render_to_response('group/group_pubinfo.html', { 'members': members, 'group': group, }, context_instance=RequestContext(request)) is_staff = True if check_group_staff(group.id, request.user) else False managers = [] common_members = [] for member in members: if member.is_staff == 1: managers.append(member) else: common_members.append(member) org = request.user.org if org: repos = get_org_group_repos(org['org_id'], group_id_int, request.user.username) else: repos = get_group_repos(group_id_int, request.user.username) for repo in repos: repo.user_perm = check_permission(repo.props.id, request.user.username) """group messages""" # Make sure page request is an int. If not, deliver first page. try: current_page = int(request.GET.get('page', '1')) per_page= int(request.GET.get('per_page', '15')) except ValueError: current_page = 1 per_page = 15 msgs_plus_one = GroupMessage.objects.filter( group_id=group_id).order_by( '-timestamp')[per_page*(current_page-1) : per_page*current_page+1] if len(msgs_plus_one) == per_page + 1: page_next = True else: page_next = False group_msgs = msgs_plus_one[:per_page] attachments = MessageAttachment.objects.filter(group_message__in=group_msgs) msg_replies = MessageReply.objects.filter(reply_to__in=group_msgs) reply_to_list = [ r.reply_to_id for r in msg_replies ] for msg in group_msgs: msg.reply_cnt = reply_to_list.count(msg.id) for att in attachments: if msg.id == att.group_message_id: # Attachment name is file name or directory name. # If is top directory, use repo name instead. path = att.path if path == '/': repo = get_repo(att.repo_id) if not repo: # TODO: what should we do here, tell user the repo # is no longer exists? continue att.name = repo.name else: # cut out last '/' if path[-1] == '/': path = path[:-1] att.name = os.path.basename(path) msg.attachment = att contacts = Contact.objects.filter(user_email=request.user.username) return render_to_response("group/group_info.html", { "managers": managers, "common_members": common_members, "members": members, "repos": repos, "group_id": group_id, "group" : group, "is_staff": is_staff, "is_join": joined, "group_msgs": group_msgs, "form": form, 'current_page': current_page, 'prev_page': current_page-1, 'next_page': current_page+1, 'per_page': per_page, 'page_next': page_next, 'create_shared_repo': True, 'contacts': contacts, 'group_members_default_display': GROUP_MEMBERS_DEFAULT_DISPLAY, }, context_instance=RequestContext(request));
def group_discuss(request, group_id): if request.method == 'POST': form = MessageForm(request.POST) if form.is_valid(): msg = form.cleaned_data['message'] message = GroupMessage() message.group_id = group_id message.from_email = request.user.username message.message = msg message.save() # send signal grpmsg_added.send(sender=GroupMessage, group_id=group_id, from_email=request.user.username) # Always return an HttpResponseRedirect after successfully dealing # with POST data. return HttpResponseRedirect(reverse('group_discuss', args=[group_id])) else: form = MessageForm() op = request.GET.get('op', '') if op == 'delete': return group_remove(request, group_id) elif op == 'dismiss': return group_dismiss(request, group_id) elif op == 'quit': return group_quit(request, group_id) group_id_int = int(group_id) # Checkeb by URL Conf # remove user notifications UserNotification.objects.filter(to_user=request.user.username, msg_type='group_msg', detail=str(group_id)).delete() group = get_group(group_id_int) if not group: return HttpResponseRedirect(reverse('group_list', args=[])) # Check whether user belongs to the group. joined = is_group_user(group_id_int, request.user.username) if not joined and not request.user.is_staff: # Return group public info page. return render_to_response('group/group_pubinfo.html', { 'members': members, 'group': group, }, context_instance=RequestContext(request)) # Get all group members. members = get_group_members(group_id_int) is_staff = True if check_group_staff(group.id, request.user) else False """group messages""" # Show 15 group messages per page. paginator = Paginator(GroupMessage.objects.filter( group_id=group_id).order_by('-timestamp'), 15) # Make sure page request is an int. If not, deliver first page. try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 # If page request (9999) is out of range, deliver last page of results. try: group_msgs = paginator.page(page) except (EmptyPage, InvalidPage): group_msgs = paginator.page(paginator.num_pages) group_msgs.page_range = paginator.get_page_range(group_msgs.number) # Force evaluate queryset to fix some database error for mysql. group_msgs.object_list = list(group_msgs.object_list) attachments = MessageAttachment.objects.filter(group_message__in=group_msgs.object_list) msg_replies = MessageReply.objects.filter(reply_to__in=group_msgs.object_list) reply_to_list = [ r.reply_to_id for r in msg_replies ] for msg in group_msgs.object_list: msg.reply_cnt = reply_to_list.count(msg.id) msg.replies = [] for r in msg_replies: if msg.id == r.reply_to_id: msg.replies.append(r) msg.replies = msg.replies[-3:] for att in attachments: if msg.id == att.group_message_id: # Attachment name is file name or directory name. # If is top directory, use repo name instead. path = att.path if path == '/': repo = get_repo(att.repo_id) if not repo: # TODO: what should we do here, tell user the repo # is no longer exists? continue att.name = repo.name else: # cut out last '/' if path[-1] == '/': path = path[:-1] att.name = os.path.basename(path) msg.attachment = att return render_to_response("group/group_discuss.html", { "members": members, "group_id": group_id, "group" : group, "is_staff": is_staff, "group_msgs": group_msgs, "form": form, 'group_members_default_display': GROUP_MEMBERS_DEFAULT_DISPLAY, }, context_instance=RequestContext(request));
def group_discuss(request, group): if group.is_pub: raise Http404 username = request.user.username form = MessageForm() # remove user notifications UserNotification.objects.seen_group_msg_notices(username, group.id) # Get all group members. members = get_group_members(group.id) """group messages""" # Show 15 group messages per page. paginator = Paginator(GroupMessage.objects.filter( group_id=group.id).order_by('-timestamp'), 15) # Make sure page request is an int. If not, deliver first page. try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 # If page request (9999) is out of range, deliver last page of results. try: group_msgs = paginator.page(page) except (EmptyPage, InvalidPage): group_msgs = paginator.page(paginator.num_pages) group_msgs.page_range = paginator.get_page_range(group_msgs.number) # Force evaluate queryset to fix some database error for mysql. group_msgs.object_list = list(group_msgs.object_list) msg_attachments = MessageAttachment.objects.filter(group_message__in=group_msgs.object_list) msg_replies = MessageReply.objects.filter(reply_to__in=group_msgs.object_list) reply_to_list = [ r.reply_to_id for r in msg_replies ] for msg in group_msgs.object_list: msg.reply_cnt = reply_to_list.count(msg.id) msg.replies = [] for r in msg_replies: if msg.id == r.reply_to_id: msg.replies.append(r) msg.replies = msg.replies[-3:] msg.attachments = [] for att in msg_attachments: if att.group_message_id != msg.id: continue # Attachment name is file name or directory name. # If is top directory, use repo name instead. path = att.path if path == '/': repo = get_repo(att.repo_id) if not repo: # TODO: what should we do here, tell user the repo # is no longer exists? continue att.name = repo.name else: path = path.rstrip('/') # cut out last '/' if possible att.name = os.path.basename(path) # Load to discuss page if attachment is a image and from recommend. if att.attach_type == 'file' and att.src == 'recommend': att.filetype, att.fileext = get_file_type_and_ext(att.name) if att.filetype == IMAGE: att.obj_id = get_file_id_by_path(att.repo_id, path) if not att.obj_id: att.err = _(u'File does not exist') else: att.token = seafile_api.get_fileserver_access_token( att.repo_id, att.obj_id, 'view', username) att.img_url = gen_file_get_url(att.token, att.name) msg.attachments.append(att) # get available modules(wiki, etc) mods_available = get_available_mods_by_group(group.id) mods_enabled = get_enabled_mods_by_group(group.id) return render_to_response("group/group_discuss.html", { "group" : group, "is_staff": group.is_staff, "group_msgs": group_msgs, "form": form, "mods_enabled": mods_enabled, "mods_available": mods_available, }, context_instance=RequestContext(request))
def render_group_info(request, group_id, form): group_id_int = int(group_id) # Checkeb by URL Conf # remove user notifications UserNotification.objects.filter(to_user=request.user.username, msg_type='group_msg', detail=str(group_id)).delete() group = get_group(group_id_int) if not group: return HttpResponseRedirect(reverse('group_list', args=[])) # Get all group members. members = get_group_members(group_id_int) # Check whether user belongs to the group. joined = is_group_user(group_id_int, request.user.username) if not joined and not request.user.is_staff: # Return group public info page. return render_to_response('group/group_pubinfo.html', { 'members': members, 'group': group, }, context_instance=RequestContext(request)) is_staff = True if check_group_staff(group.id, request.user) else False org = request.user.org if org: repos = get_org_group_repos(org['org_id'], group_id_int, request.user.username) else: repos = get_group_repos(group_id_int, request.user.username) recent_commits = [] cmt_repo_dict = {} for repo in repos: repo.user_perm = check_permission(repo.props.id, request.user.username) cmmts = get_commits(repo.props.id, 0, 10) for c in cmmts: cmt_repo_dict[c.id] = repo recent_commits += cmmts recent_commits.sort(lambda x, y : cmp(y.props.ctime, x.props.ctime)) recent_commits = recent_commits[:15] for cmt in recent_commits: cmt.repo = cmt_repo_dict[cmt.id] cmt.repo.password_set = is_passwd_set(cmt.props.repo_id, request.user.username) cmt.tp = cmt.props.desc.split(' ')[0] return render_to_response("group/group_info.html", { "members": members, "repos": repos, "recent_commits": recent_commits, "group_id": group_id, "group" : group, "is_staff": is_staff, "is_join": joined, "form": form, 'create_shared_repo': True, 'group_members_default_display': GROUP_MEMBERS_DEFAULT_DISPLAY, }, context_instance=RequestContext(request));
def setUp(self): self.user2 = self.create_user() ccnet_api.group_add_member(self.group.id, self.user.username, self.user2.username) g_members = [x.user_name for x in seaserv.get_group_members(self.group.id)] assert self.user2.username in g_members
def group_discuss(request, group): if group.is_pub: raise Http404 username = request.user.username form = MessageForm() # remove user notifications UserNotification.objects.seen_group_msg_notices(username, group.id) # Get all group members. members = get_group_members(group.id) """group messages""" # Show 15 group messages per page. paginator = Paginator(GroupMessage.objects.filter(group_id=group.id).order_by("-timestamp"), 15) # Make sure page request is an int. If not, deliver first page. try: page = int(request.GET.get("page", "1")) except ValueError: page = 1 # If page request (9999) is out of range, deliver last page of results. try: group_msgs = paginator.page(page) except (EmptyPage, InvalidPage): group_msgs = paginator.page(paginator.num_pages) group_msgs.page_range = paginator.get_page_range(group_msgs.number) # Force evaluate queryset to fix some database error for mysql. group_msgs.object_list = list(group_msgs.object_list) msg_attachments = MessageAttachment.objects.filter(group_message__in=group_msgs.object_list) msg_replies = MessageReply.objects.filter(reply_to__in=group_msgs.object_list) reply_to_list = [r.reply_to_id for r in msg_replies] for msg in group_msgs.object_list: msg.reply_cnt = reply_to_list.count(msg.id) msg.replies = [] for r in msg_replies: if msg.id == r.reply_to_id: msg.replies.append(r) msg.replies = msg.replies[-3:] msg.attachments = [] for att in msg_attachments: if att.group_message_id != msg.id: continue # Attachment name is file name or directory name. # If is top directory, use repo name instead. path = att.path if path == "/": repo = get_repo(att.repo_id) if not repo: # TODO: what should we do here, tell user the repo # is no longer exists? continue att.name = repo.name else: path = path.rstrip("/") # cut out last '/' if possible att.name = os.path.basename(path) # Load to discuss page if attachment is a image and from recommend. if att.attach_type == "file" and att.src == "recommend": att.filetype, att.fileext = get_file_type_and_ext(att.name) if att.filetype == IMAGE: att.obj_id = get_file_id_by_path(att.repo_id, path) if not att.obj_id: att.err = _(u"File does not exist") else: att.token = seafile_api.get_fileserver_access_token(att.repo_id, att.obj_id, "view", username) att.img_url = gen_file_get_url(att.token, att.name) msg.attachments.append(att) # get available modules(wiki, etc) mods_available = get_available_mods_by_group(group.id) mods_enabled = get_enabled_mods_by_group(group.id) return render_to_response( "group/group_discuss.html", { "group": group, "is_staff": group.is_staff, "group_msgs": group_msgs, "form": form, "mods_enabled": mods_enabled, "mods_available": mods_available, }, context_instance=RequestContext(request), )