def wiki_content(request, name, path): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.project = project rc.navmenus = build_prj_nav_menu(request, project, 'wiki') rc.pagename = path rc.can_op = can_write(project, request.user) rc.wiki = q_get(WikiContent, project=project, path=path) if request.method == 'POST' and rc.can_op: atts = request.FILES.getlist('attachment') fc = 0 for f in atts: if fc <= prj_key.get(project, prj_key.UPLOAD_LIMIT_COUNT, 5): add_file(request, project, 'wiki', rc.wiki.id, f) fc += 1 if rc.wiki is not None: rc.wiki.content = safe_esc(rc.wiki.content) rc.files = q_gets(ProjectAttachment, project=project, ftype='wiki', ftid=int(rc.wiki.id), status=consts.FILE_ENABLE).order_by('-ctime') return send_response(request, 'wiki/view.html')
def diff_log_wiki(request, name, logid): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.project = project rc.navmenus = build_prj_nav_menu(request, project, 'wiki') log = q_get(WikiContentLog, pk=int(logid)) if log is None: raise Http404 rc.log = log c = log.content oldc = log.old_content and log.old_content or '' diff_text = '\n'.join(unified_diff(oldc.split('\n'), c.split('\n'))) rc.content = diff_text return send_response(request, 'wiki/view_change.html')
def diff_log_wiki(request, name, logid): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.project = project rc.navmenusSource = build_prj_nav_menu(request, project, 'wiki') log = q_get(WikiContentLog, pk=int(logid)) if log is None: raise Http404 rc.log = log c = log.content oldc = log.old_content and log.old_content or '' diff_text = '\n'.join(unified_diff(oldc.split('\n'), c.split('\n'))) rc.content = diff_text return send_response(request, 'wiki/view_change.html')
def view_issue(request, name, issue_id): rc = request.rc rc.project = q_get(Project, name=name) resp = can_access(rc.project, request.user) if resp != None: return resp issue = q_get(Issue, pk=issue_id) if issue.status == consts.ISSUE_DELETED: raise Http404 if request.method == 'POST': content = request.POST.get('content') if content is not None: comment = IssueComment() comment.issue = issue comment.owner = request.user comment.content = content comment.status = consts.COMMENT_ENABLE comment.save() activity.new_comment(issue.project, request.user, comment) return redirect( reverse('apps.issue.views.view_issue', args=[name, issue.id])) rc.issue = issue rc.pagename = '#%s - %s' % (rc.issue.id, rc.issue.title) rc.navmenusSource = build_prj_nav_menu(request, rc.project, 'issues') rc.comments = q_gets(IssueComment, issue=rc.issue, status=consts.COMMENT_ENABLE).order_by('ctime') rc.files = q_gets(ProjectAttachment, project=rc.project, ftype='issue', ftid=rc.issue.id, status=consts.FILE_ENABLE) projectmember = q_gets(ProjectMember, project=rc.project) rc.issueowner = request.user in (rc.issue.creator, rc.project.owner) rc.commowner = False if request.user == rc.project.owner: rc.commowner = True for m in projectmember: if request.user == m.user: rc.issueowner = True rc.commowner = True return send_response(request, 'issue/view.html')
def wiki_list(request, name): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.project = project rc.navmenus = build_prj_nav_menu(request, project, 'wiki') rc.wikis = q_gets(WikiContent, project=project) return send_response(request, 'wiki/list.html')
def wiki_list(request, name): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.project = project rc.navmenus = build_prj_nav_menu(request, project, 'wiki') rc.wikis = q_gets(WikiContent, project = project) return send_response(request, 'wiki/list.html')
def new_issue(request, name): rc = request.rc project = q_get(Project, name = name) resp = can_access(project, request.user) if resp != None: return resp rc.project = project rc.pagename = 'create issue' rc.navmenus = build_prj_nav_menu(request, rc.project, 'issues') if request.method != 'POST': return send_response(request, 'issue/new.html') title = request.POST.get('title', '') content = request.POST.get('content', '') if len(title) <= 0: return send_response(request, 'issue/new.html') if len(content) <= 0: return send_response(request, 'issue/new.html') issue = Issue() issue.project = rc.project issue.creator = request.user issue.title = title issue.content = content issue.status = consts.ISSUE_OPEN issue.vote_count = 0 issue.save() # add file atts = request.FILES.getlist('attachment') fc = 0 for f in atts: if fc <= prj_key.get(project, prj_key.UPLOAD_LIMIT_COUNT, 5): add_file(request, project, 'issue', issue.id, f) fc += 1 activity.new_issue(rc.project, request.user, issue) return redirect(reverse('apps.issue.views.view_issue', args=[name, issue.id]))
def new_issue(request, name): rc = request.rc project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc.project = project rc.pagename = 'create issue' rc.navmenus = build_prj_nav_menu(request, rc.project, 'issues') if request.method != 'POST': return send_response(request, 'issue/new.html') title = request.POST.get('title', '') content = request.POST.get('content', '') if len(title) <= 0: return send_response(request, 'issue/new.html') if len(content) <= 0: return send_response(request, 'issue/new.html') issue = Issue() issue.project = rc.project issue.creator = request.user issue.title = title issue.content = content issue.status = consts.ISSUE_OPEN issue.vote_count = 0 issue.save() # add file atts = request.FILES.getlist('attachment') fc = 0 for f in atts: if fc <= prj_key.get(project, prj_key.UPLOAD_LIMIT_COUNT, 5): add_file(request, project, 'issue', issue.id, f) fc += 1 activity.new_issue(rc.project, request.user, issue) return redirect( reverse('apps.issue.views.view_issue', args=[name, issue.id]))
def wiki_changes(request, name, path): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.project = project rc.navmenus = build_prj_nav_menu(request, project, 'wiki') rc.pagename = path rc.wiki = q_get(WikiContent, project=project, path=path) if rc.wiki is not None: rc.logs = q_gets(WikiContentLog, wiki=rc.wiki).order_by('-ctime') return send_response(request, 'wiki/changes.html')
def del_wiki(request, name): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.project = project rc.navmenus = build_prj_nav_menu(request, project, 'wiki') rc.can_op = can_write(project, request.user) if request.method == 'POST': wiki = q_get(WikiContent, project = project, pk=int(request.POST.get('wiki_id'))) wiki.delete() return redirect(reverse('apps.wiki.views.wiki_index', args=[name])) return HttpResponseForbidden()
def del_wiki(request, name): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.project = project rc.navmenusSource = build_prj_nav_menu(request, project, 'wiki') rc.can_op = can_write(project, request.user) if request.method == 'POST': wiki = q_get(WikiContent, project = project, pk=int(request.POST.get('wiki_id'))) wiki.delete() return redirect(reverse('apps.wiki.views.wiki_index', args=[name])) return HttpResponseForbidden()
def view_issue(request, name, issue_id): rc = request.rc rc.project = q_get(Project, name = name) resp = can_access(rc.project, request.user) if resp != None: return resp issue = q_get(Issue, pk = issue_id) if issue.status == consts.ISSUE_DELETED: raise Http404 if request.method == 'POST': content = request.POST.get('content') if content is not None: comment = IssueComment() comment.issue = issue comment.owner = request.user comment.content = content comment.status = consts.COMMENT_ENABLE comment.save() activity.new_comment(issue.project, request.user, comment) return redirect(reverse('apps.issue.views.view_issue', args=[name, issue.id])) rc.issue = issue rc.pagename = '#%s - %s'%(rc.issue.id, rc.issue.title) rc.navmenus = build_prj_nav_menu(request, rc.project, 'issues') rc.comments = q_gets(IssueComment, issue=rc.issue, status = consts.COMMENT_ENABLE).order_by('ctime') rc.files = q_gets(ProjectAttachment, project=rc.project, ftype='issue', ftid=rc.issue.id, status = consts.FILE_ENABLE) rc.issueowner = request.user in (rc.issue.creator, rc.project.owner) return send_response(request, 'issue/view.html')
def wiki_changes(request, name, path): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.project = project rc.navmenus = build_prj_nav_menu(request, project, 'wiki') rc.pagename = path rc.wiki = q_get(WikiContent, project = project, path = path) if rc.wiki is not None: rc.logs = q_gets(WikiContentLog, wiki = rc.wiki).order_by('-ctime') return send_response(request, 'wiki/changes.html')
def check_acl(request, name, path): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp, None, request.rc path = svn.safe_path(path) rc = request.rc rc.navmenus = build_prj_nav_menu(request, project, 'src') rc.project = project rc.pagename = path rc.pagedesc = project.title rc.path = path rc.paths = build_paths(path) if path != '/' and path[-1] == '/': rc.parent = os.path.split(path[:-1])[0] if rc.parent != '/': rc.parent += '/' r = svn.ADMIN_REPOS(name, path) return resp, r, rc
def wiki_content(request, name, path): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.project = project rc.navmenus = build_prj_nav_menu(request, project, 'wiki') rc.pagename = path rc.can_op = can_write(project, request.user) rc.wiki = q_get(WikiContent, project = project, path=path) if request.method == 'POST' and rc.can_op: atts = request.FILES.getlist('attachment') fc = 0 for f in atts: if fc <= prj_key.get(project, prj_key.UPLOAD_LIMIT_COUNT, 5): add_file(request, project, 'wiki', rc.wiki.id, f) fc += 1 if rc.wiki is not None: rc.wiki.content = safe_esc(rc.wiki.content) rc.files = q_gets(ProjectAttachment, project = project, ftype = 'wiki', ftid = int(rc.wiki.id), status = consts.FILE_ENABLE).order_by('-ctime') return send_response(request, 'wiki/view.html')
def query_issues(request, name, pagenum, key, st=None): rc = request.rc project = q_get(Project, name=name) rc.navmenus = build_prj_nav_menu(request, project, 'issues') rc.bodymenus = [{ 'uri': 'issues/', 'text': 'all' }, { 'uri': 'issues/opened/', 'text': 'opened' }, { 'uri': 'issues/closed/', 'text': 'closed' }] prefix = 'issues' if st == consts.ISSUE_OPEN: rc.pagename = "Opened issues" prefix += '/opened' rc.bodymenus[1]['choice'] = True elif st == consts.ISSUE_CLOSED: rc.pagename = "Closed issues" prefix += '/closed' rc.bodymenus[2]['choice'] = True else: rc.pagename = "All issues" rc.bodymenus[0]['choice'] = True if request.method == 'POST': q = request.POST.get('q', None) return redirect(SITE_ROOT + '/p/%s/%s/1/%s' % (name, prefix, q)) resp = can_access(project, request.user) if resp != None: return resp rc.project_name = name rc.project = project update_my_project_status(request, [rc.project]) if project is None: return send_response(request, 'project/notfound.html') pagenum = int(pagenum) if key is not None: q = Q(Q(project=project), Q(Q(title__contains=key) | Q(content__contains=key))) else: q = Q(project=project) if st is not None: q = q & Q(status=st) q = q & ~Q(status=consts.ISSUE_DELETED) key_text = key and key.encode('utf8') or '' build_page(rc, Issue, q, pagenum, '/p/{0}/{1}'.format(name, prefix), key_text, order=['-mtime']) for i in rc.page.object_list: if request.user in (project.owner, i.creator): i.can_op = True else: i.can_op = False vls = IssueComment.objects.filter(issue=i).values('id').annotate( ic=Count("id")) i.comments_count = (len(vls) > 0 and vls[0]['ic'] or 0) rc.key_text = key_text return send_response(request, 'issue/list.html')
def new_issue(request, name): rc = request.rc project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc.project = project rc.pagename = 'create issue' rc.navmenusSource = build_prj_nav_menu(request, rc.project, 'issues') if request.method != 'POST': return send_response(request, 'issue/new.html') title = request.POST.get('title', '') content = request.POST.get('content', '') if len(title) <= 0: return send_response(request, 'issue/new.html') if len(content) <= 0: return send_response(request, 'issue/new.html') issue = Issue() issue.project = rc.project issue.creator = request.user issue.title = title issue.content = content issue.status = consts.ISSUE_OPEN issue.vote_count = 0 issue.save() #admin = q_get(User, name='taocodeadmin') admin = q_get(User, name=request.user) project = q_get(Project, name=rc.project) owner = q_get(User, name=project.owner) content = "System message: The project " + rc.project.name + " have an issue . http://code.taobao.org/p/" + project.name + "/issues/ . Please check it." send_newissuemsg(request, owner, admin, content) members = q_gets(ProjectMember, project=project, member_type=consts.PM_ACCEPT_INV) for m in members: send_newissuemsg(request, m.user, admin, content) # add file atts = request.FILES.getlist('attachment') fc = 0 for f in atts: if fc <= prj_key.get(project, prj_key.UPLOAD_LIMIT_COUNT, 5): add_file(request, project, 'issue', issue.id, f) fc += 1 activity.new_issue(rc.project, request.user, issue) return redirect( reverse('apps.issue.views.view_issue', args=[name, issue.id]))
def query_issues(request, name, pagenum, key, st=None): rc = request.rc project = q_get(Project, name=name) rc.navmenus = build_prj_nav_menu(request, project, 'issues') rc.bodymenus = [{'uri':'issues/', 'text':'all'}, {'uri':'issues/opened/', 'text':'opened'}, {'uri':'issues/closed/', 'text':'closed'}] prefix = 'issues' if st == consts.ISSUE_OPEN: rc.pagename = "Opened issues" prefix += '/opened' rc.bodymenus[1]['choice'] = True elif st == consts.ISSUE_CLOSED: rc.pagename = "Closed issues" prefix += '/closed' rc.bodymenus[2]['choice'] = True else: rc.pagename = "All issues" rc.bodymenus[0]['choice'] = True if request.method == 'POST': q = request.POST.get('q', None) return redirect(SITE_ROOT + '/p/%s/%s/1/%s'%(name, prefix, q)) resp = can_access(project, request.user) if resp != None: return resp rc.project_name = name rc.project = project update_my_project_status(request,[rc.project]) if project is None: return send_response(request, 'project/notfound.html') pagenum = int(pagenum) if key is not None: q = Q(Q(project=project), Q(Q(title__contains=key) | Q(content__contains=key))) else: q = Q(project=project) if st is not None: q = q & Q(status = st) q = q & ~Q(status = consts.ISSUE_DELETED) key_text = key and key.encode('utf8') or '' build_page(rc, Issue, q, pagenum, '/p/{0}/{1}'.format(name, prefix), key_text, order=['-mtime']) for i in rc.page.object_list: if request.user in (project.owner, i.creator): i.can_op = True else: i.can_op = False vls = IssueComment.objects.filter(issue=i).values('id').annotate(ic = Count("id")) i.comments_count = (len(vls) > 0 and vls[0]['ic'] or 0) rc.key_text = key_text return send_response(request, 'issue/list.html')
def edit_wiki(request, name, path=None): project = q_get(Project, name=name) can_op = can_write(project, request.user) if can_op is False: return HttpResponseForbidden() rc = request.rc rc.project = project rc.navmenus = build_prj_nav_menu(request, project, 'wiki') rc.can_op = can_op rc.pagename = 'Edit [' + path +']' wiki = q_get(WikiContent, project=project, path=path) if request.method == 'POST': doval = request.POST.get('do',None) if doval == 'preview': # rc.content = request.POST.get('content') rc.preview = safe_esc(rc.content) rc.wiki = wiki if rc.wiki is None: rc.wiki = project elif doval == 'save': # create page if wiki is None: wiki = WikiContent() wiki.project = project wiki.path = path wiki.status = consts.WIKI_ENABLE wiki.user = request.user old_content = None else: old_content = wiki.content wiki.last_user = request.user wiki.content = request.POST.get('content') if wiki.content != old_content: wiki.save() log = WikiContentLog(project = project, user = request.user, wiki = wiki, content = wiki.content, old_content = old_content) log.save() return redirect(reverse('apps.wiki.views.wiki_content', args=[name, path])) else: wiki = q_get(WikiContent, project=project, path=path) if wiki is not None: rc.content = wiki.content return send_response(request, 'wiki/edit.html')
def edit_wiki(request, name, path=None): project = q_get(Project, name=name) can_op = can_write(project, request.user) if can_op is False: return HttpResponseForbidden() rc = request.rc rc.project = project rc.navmenus = build_prj_nav_menu(request, project, 'wiki') rc.can_op = can_op rc.pagename = 'Edit [' + path + ']' wiki = q_get(WikiContent, project=project, path=path) if request.method == 'POST': doval = request.POST.get('do', None) if doval == 'preview': # rc.content = request.POST.get('content') rc.preview = safe_esc(rc.content) rc.wiki = wiki if rc.wiki is None: rc.wiki = project elif doval == 'save': # create page if wiki is None: wiki = WikiContent() wiki.project = project wiki.path = path wiki.status = consts.WIKI_ENABLE wiki.user = request.user old_content = None else: old_content = wiki.content wiki.last_user = request.user wiki.content = request.POST.get('content') if wiki.content != old_content: wiki.save() log = WikiContentLog(project=project, user=request.user, wiki=wiki, content=wiki.content, old_content=old_content) log.save() return redirect( reverse('apps.wiki.views.wiki_content', args=[name, path])) else: wiki = q_get(WikiContent, project=project, path=path) if wiki is not None: rc.content = wiki.content return send_response(request, 'wiki/edit.html')