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 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.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 get_file(request, name, fid): item = q_get(ProjectAttachment, id=int(fid)) if item is None or item.status != consts.FILE_ENABLE: raise Http404 resp = can_access(item.project, request.user) if resp is not None: return resp fname = item.fname.encode('utf8') if safe_ext(item.orig_name) is True: return Http404 fdata = None if item.fname.startswith('oss://'): ores = oss_store.get_file(item.fname[len('oss://'):]) if ores.status != 200: return HttpResponse(status=ores.status) fdata = ores.read() else: fdata = file(os.path.join(get_upload_root(), fname), 'rb').read() resp = HttpResponse(fdata, content_type="application/oct-stream") resp['Content-Disposition'] = 'attachment; filename="%s"' % (urllib.quote( item.orig_name.encode('utf8')), ) resp['X-Content-Type-Options'] = 'nosniff' resp['X-XSS-Protection'] = '1; mode=block' return resp
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_index(request, name): #list all page project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp path = prj_key.get(project, prj_key.WIKI_INDEX, 'index') return redirect(reverse('apps.wiki.views.wiki_content', args=[name, path]))
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 get_file(request, name, fid): item = q_get(ProjectAttachment, id=int(fid)) resp = can_access(item.project, request.user) if resp is not None: return resp if item is None or item.status != consts.FILE_ENABLE: raise Http404 return serve(request, item.fname, get_upload_root())
def raw_wiki(request, name, path): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp wiki = q_get(WikiContent, project=project, path=path) if wiki is None: raise Http404 return HttpResponse(wiki.content)
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 raw_wiki(request, name, path): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp wiki = q_get(WikiContent, project = project, path = path) if wiki is None: raise Http404 return HttpResponse(wiki.content)
def raw_log_wiki(request, name, logid): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp log = q_get(WikiContentLog, pk=int(logid)) if log is None: raise Http404 return HttpResponse(log.content)
def get_comment_count(request, issue_id): issue = q_get(Issue, pk=issue_id) if issue is None: return False if issue.status == consts.ISSUE_DELETED: return False if can_access(issue.project, request.user) != None: return False comments = q_gets(IssueComment, issue=issue, status=consts.COMMENT_ENABLE) return (True, len(comments))
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 get_comments(request, issue_id): issue = q_get(Issue, pk=issue_id) if issue is None: return False if issue.status == consts.ISSUE_DELETED: return False if can_access(issue.project, request.user) != None: return False comments = q_gets(IssueComment, issue=issue, status=consts.COMMENT_ENABLE) return (True, [(c.id, c.owner.name, escape(c.content), str(c.ctime), str(c.mtime)) for c in comments])
def get_comments(request, issue_id): issue = q_get(Issue, pk=issue_id) if issue is None: return False if issue.status == consts.ISSUE_DELETED: return False if can_access(issue.project, request.user) != None: return False comments = q_gets(IssueComment, issue=issue, status = consts.COMMENT_ENABLE) return (True, [(c.id, c.owner.name, escape(c.content), str(c.ctime), str(c.mtime)) for c in comments])
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 raw_log_wiki(request, name, logid): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp log = q_get(WikiContentLog, pk=int(logid)) if log is None: raise Http404 resp = HttpResponse(log.content, content_type="text/plain") resp['X-Content-Type-Options'] = 'nosniff' resp['X-XSS-Protection'] = '1; mode=block' return resp
def project_info(request, name, pagenum=1, key=None): if request.method == 'POST': pagenum = request.POST.get('jump', None) pagenum = int(pagenum) project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.pagename = 'Info' rc.project = project rc.logs = get_prj_activitys(project) rc.members = q_gets(ProjectMember, project=project, member_type=consts.PM_ACCEPT_INV) update_my_project_status(request, [project]) rc.navmenusSource = build_prj_nav_menu(request, project, 'info') rc.REPOS = svn.REPOS(project.part, name, '/trunk') q = Q(project=project) build_page( rc, Activity, q, pagenum, '/p/{0}/{1}'.format(name, 'info'), order=['-ctime'], ) cc = [] for i in rc.page.object_list: if i.act_type == 'new_commit': cc = i.content.split(' ') rev = cc[0] tmp = cc[1:len(cc)] msg = ' '.join(tmp) i.commit = {'rev': int(rev), 'msg': msg} return send_response(request, 'project/view.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 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 raw_wiki(request, name, path): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp wiki = q_get(WikiContent, project = project, path = path) if wiki is None: raise Http404 resp = HttpResponse(wiki.content, content_type="text/plain") resp['X-Content-Type-Options'] = 'nosniff' resp['X-XSS-Protection'] = '1; mode=block' return resp
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 project_info(request, name): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.pagename = 'Info' rc.project = project rc.logs = get_prj_activitys(project) rc.members = q_gets(ProjectMember, project = project, member_type = consts.PM_ACCEPT_INV) update_my_project_status(request, [project]) rc.navmenus = build_prj_nav_menu(request, project, 'info') rc.REPOS = svn.REPOS(name, '/trunk') return send_response(request, 'project/view.html')
def new_comment(request, issue_id): if request.method != 'POST': return False c = request.POST.get('c', None) if c is None or len(c) <= 0: return False issue = q_get(Issue, pk=issue_id) if issue is None: return False if issue.status != consts.ISSUE_OPEN: return False if can_access(issue.project, request.user) != None: return False return True
def watch_project(request, name): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return False pw = q_get(ProjectWatcher, project=project, user=request.user) if pw is None: pw = ProjectWatcher(user=request.user, project=project) pw.save() activity.watch_prj(project, request.user) result_text = 'unwatch' else: pw.delete() result_text = 'watch' rs = ProjectWatcher.objects.filter(project=project).aggregate( watchers=Count('id')) return (True, (rs['watchers'], rs['watchers']))
def watch_project(request, name): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return False pw = q_get(ProjectWatcher, project=project, user=request.user) if pw is None: pw = ProjectWatcher(user = request.user, project = project) pw.save() activity.watch_prj(project, request.user) result_text = 'unwatch' else: pw.delete() result_text = 'watch' rs = ProjectWatcher.objects.filter(project = project).aggregate(watchers = Count('id')) return (True, (result_text, rs['watchers']))
def project_info(request, name): project = q_get(Project, name=name) resp = can_access(project, request.user) if resp != None: return resp rc = request.rc rc.pagename = 'Info' rc.project = project rc.logs = get_prj_activitys(project) rc.members = q_gets(ProjectMember, project=project, member_type=consts.PM_ACCEPT_INV) update_my_project_status(request, [project]) rc.navmenus = build_prj_nav_menu(request, project, 'info') rc.REPOS = svn.REPOS(name, '/trunk') return send_response(request, 'project/view.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 new_comment(request, issue_id): if request.method != 'POST': return False c = request.POST.get('c', None) if c is None or len(c) <= 0: return False issue = q_get(Issue, pk = issue_id) if issue is None: return False if issue.status != consts.ISSUE_OPEN: return False if can_access(issue.project, request.user) != None: return False return True
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 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]))