Beispiel #1
0
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')
Beispiel #2
0
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')
Beispiel #3
0
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')
Beispiel #4
0
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
Beispiel #5
0
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')
Beispiel #6
0
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]))
Beispiel #7
0
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]))
Beispiel #8
0
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')
Beispiel #9
0
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())
Beispiel #10
0
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)
Beispiel #11
0
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')
Beispiel #12
0
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)
Beispiel #13
0
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)
Beispiel #14
0
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)
Beispiel #15
0
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))
Beispiel #16
0
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]))
Beispiel #17
0
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])
Beispiel #18
0
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])
Beispiel #19
0
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]))
Beispiel #20
0
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
Beispiel #21
0
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')
Beispiel #22
0
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()
Beispiel #23
0
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')
Beispiel #24
0
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
Beispiel #25
0
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()
Beispiel #26
0
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')
Beispiel #27
0
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')
Beispiel #28
0
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')
Beispiel #29
0
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
Beispiel #30
0
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']))
Beispiel #31
0
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']))
Beispiel #32
0
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')
Beispiel #33
0
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
Beispiel #34
0
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')
Beispiel #35
0
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
Beispiel #36
0
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')
Beispiel #37
0
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')
Beispiel #38
0
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]))