Exemple #1
0
def main(j, args, params, tags, tasklet):
    doc = args.doc

    macrostr = args.macrostr.strip().strip('{{').strip('}}')
    tags = j.data.tags.getObject(macrostr, keepcase=True)
    tags = tags.getDict()
    tags.pop(args.macro)

    groupon = tags.pop('groupon', 'assignees')
    data_collection = dict()

    schema = issuemanager.getIssueSchema()
    issue_fileds = schema.schema.fields.keys()
    if groupon not in issue_fileds:
        args.doc.applyTemplate({'data_collection': "Issues cannot be grouped on \"%s\"" % groupon})
        params.result = (args.doc, args.doc)
        return params


    issues = issuemanager.getIssueCollectionFromDB()
    users = issuemanager.getUserCollectionFromDB()

    if 'assignees' in tags:
        userid = users.find(name=tags['assignees'])
        if userid:
            userid = userid[0].key
            tags['assignees'] = userid

    user_to_id = {user.key: user.dbobj.name for user in users.find()}

    for issue in issues.find(**tags):
        if groupon == 'assignees':
            assignees = issue.dbobj.assignees or 'No assignees'
            for assignee in assignees: # list
                assignee = user_to_id.get(assignee, 'no assignees')
                data_collection.setdefault(assignee, {'resolved': [], 'closed': [], 'wontfix': [], 'inprogress': [], 'question':[], 'new':[]})

                issue_dict = issue.to_dict()
                issue_dict.pop('comments', None)
                issue_dict.pop('content', None)
                data_collection[assignee][issue_dict['state']].append(issue_dict)
        else:
            data = str(getattr(issue.dbobj, groupon)) or 'no %s' % groupon
            data_collection.setdefault(data, {'resolved': [], 'closed': [], 'wontfix': [], 'inprogress': [], 'question':[], 'new':[]})
            issue_dict = issue.to_dict()
            issue_dict.pop('comments', None)
            issue_dict.pop('content', None)
            data_collection[data][issue_dict['state']].append(issue_dict)

    data_collection = j.data.serializer.yaml.dumps(data_collection)
    out = "{{report:\n%s \n}}" % data_collection
    params.result = (out, args.doc)

    return params
Exemple #2
0
    def __init__(self, githubclient):
        self.client = githubclient
        self.pool = Pool()
        self.model = None
        # issuemanager.set_namespaceandstore("github", "github")

        self.userCollection = issuemanager.getUserCollectionFromDB()
        self.orgCollection = issuemanager.getOrgCollectionFromDB()
        self.issueCollection = issuemanager.getIssueCollectionFromDB()
        self.repoCollection = issuemanager.getRepoCollectionFromDB()
        self.logger = j.logger.get('issuemanager.sync.github')
Exemple #3
0
 def reset(self):
     self._labels = {}
     self._issue_user_table = {}
     self._users_table = {}
     self._milestones_table = {}
     self._repos_table = {}
     self.userId2userKey = {}
     self.repoId2repoKey = {}
     self.userCollection = issuemanager.getUserCollectionFromDB()
     self.orgCollection = issuemanager.getOrgCollectionFromDB()
     self.issueCollection = issuemanager.getIssueCollectionFromDB()
     self.repoCollection = issuemanager.getRepoCollectionFromDB()
     self.activityCollection = issuemanager.getActivityCollectionFromDB()
Exemple #4
0
def main(j, args, params, tags, tasklet):
    from collections import OrderedDict
    doc = args.doc

    macrostr = args.macrostr.strip().strip('{{').strip('}}')
    tags = j.data.tags.getObject(macrostr, keepcase=True)
    tags = tags.getDict()
    tags.pop(args.macro)

    groupon = tags.pop('groupon', 'creationTime')
    ranges = tags.pop('ranges', '')
    ranges = ranges.split(',')

    data_collection = OrderedDict()

    schema = issuemanager.getIssueSchema()
    issue_fileds = schema.schema.fields.keys()
    if groupon not in issue_fileds:
        args.doc.applyTemplate({'data_collection': "Issues cannot be grouped on \"%s\"" % groupon})
        params.result = (args.doc, args.doc)
        return params

    if groupon not in ['creationTime', 'modTime']:
        args.doc.applyTemplate({'data_collection': "Issues with time cannot be grouped on \"%s\". Can only be grouped on creationTime or modTime. Please use issue_reports macro instead" % groupon})
        params.result = (args.doc, args.doc)
        return params


    issues = issuemanager.getIssueCollectionFromDB()
    users = issuemanager.getUserCollectionFromDB()

    if 'assignees' in tags:
        userid = users.find(name=tags['assignees'])
        if userid:
            userid = userid[0].key
            tags['assignees'] = userid

    user_to_id = {user.key: user.dbobj.name for user in users.find()}

    filtered_issues = OrderedDict()

    def epoch(val):
        if val != '0' and not val.startswith('-'):
            val = "-{}".format(val)
        return j.data.time.getEpochAgo(val)

    slices = [j.data.time.epoch]
    slices.extend([epoch(item) for item in ranges])
    slices.append(0)

    for idx, span in enumerate(slices[:-1]):

        tags[groupon] = [slices[idx + 1], span]

        range_from = ranges[idx - 1] if idx != 0 else 'now'
        range_to = ranges[idx] if slices[idx+1] != 0 else 'the beginning of time'

        filtered_issues['%s -- %s' % (range_from, range_to)] = issues.find(**tags)

    for span, issues in filtered_issues.items():
        for issue in issues:
            data_collection.setdefault(span, {'resolved': [], 'closed': [], 'wontfix': [], 'inprogress': [], 'question':[], 'new':[]})
            issue = issue.to_dict()
            issue['modTime'] = j.data.time.epoch2HRDateTime(issue['modTime'])
            issue.pop('content', None)
            issue.pop('comments', None)
            data_collection[span][issue['state']].append(issue)

    out = "{{report:\n%s \n}}" % j.data.serializer.yaml.dumps(data_collection)
    params.result = (out, args.doc)

    return params
Exemple #5
0
def main(j, args, params, tags, tasklet):
    page = args.page
    modifier = j.portal.tools.html.htmlfactory.getPageModifierGridDataTables(
        page)

    macrostr = args.macrostr.strip().strip('{{').strip('}}')
    tags = j.data.tags.getObject(macrostr, keepcase=True)
    tags = tags.getDict()
    tags.pop(args.macro)

    user_collection = issuemanager.getUserCollectionFromDB()
    users = {user.key: user.dbobj.name for user in user_collection.find()}

    if tags.get('assignees') == '$$assignees':
        tags.pop('assignees')

    loggedin = tags.pop('loggedin', False)
    if loggedin:
        user = j.portal.tools.server.active.getUserFromCTX(args.requestContext)
        tags['assignees'] = user

    if 'assignees' in tags:
        match = user_collection.find(name=tags['assignees'])
        user = match[0].key if match else tags['assignees']
        tags['assignees'] = user

    def _formatdata(issues):
        aaData = list()
        for issue in issues:
            issue = issue.dictFiltered
            itemdata = [
                '<a href=%s> %s </a>' %
                (issue['gitHostRefs'][0]['url'], issue['title'])
            ]
            itemdata.append(issue['repo'])
            itemdata.append(', '.join([
                users.get(key, 'no assignees') for key in issue['assignees']
            ]))

            if issue['priority'] == 'critical':
                priority = "<color style='color:#9e0e23'>CRITICAL</color>"
            elif issue['priority'] == 'major':
                priority = "<color style='color:#d87987'>MAJOR</color>"
            elif issue['priority'] == 'normal':
                priority = "<color style='color:#3085ad'>NORMAL</color>"
            else:
                priority = "<color style='color:#8b8f91'>%s</color>" % issue[
                    'priority'].upper()
            itemdata.append(priority)

            if issue['state'] in ['closed', 'resolved', 'wontfix']:
                state = "<red style='color:red'> {} </red>".format(
                    issue['state'])
            elif issue['state'] in 'new':
                state = "<green style='color:green'> new </green>"
            else:
                state = "<blue style='color:blue'> {} </blue>".format(
                    issue['state'])
            itemdata.append(state)

            itemdata.append(j.data.time.epoch2HRDateTime(
                issue['creationTime']))

            aaData.append(itemdata)
        return aaData

    fieldnames = [
        "Title", "Repo", "Assignees", "Priority", "State", "Creation Time"
    ]

    issue_collection = issuemanager.getIssueCollectionFromDB()
    data = _formatdata(issue_collection.find(**tags))

    tableid = modifier.addTableFromData(data, fieldnames)
    modifier.addSearchOptions('#%s' % tableid)

    params.result = page

    return params
Exemple #6
0
def main(j, args, params, tags, tasklet):
    doc = args.doc
    out = "{{kanban: \n"
    yaml = []
    constants = {}
    dynamics = {}

    macrostr = args.macrostr.strip().strip('{{').strip('}}')
    tags = j.data.tags.getObject(macrostr, keepcase=True)
    tags = tags.getDict()

    if 'assignees' in tags and tags['assignees'] == '$$assignees':
        tags.pop('assignees')

    datatype = tags.pop('kanbandata').strip()
    if datatype == 'issue' or not datatype:
        collection = issuemanager.getIssueCollectionFromDB()
    if datatype == 'user':
        collection = issuemanager.getUserCollectionFromDB()
    if datatype == 'org' or datatype == 'organization':
        collection = issuemanager.getOrgCollectionFromDB()
    if datatype == 'repo' or datatype == 'repository':
        collection = issuemanager.getRepoCollectionFromDB()

    user_collection = issuemanager.getUserCollectionFromDB()
    repo_collection = issuemanager.getRepoCollectionFromDB()

    def emptyInYaml(results, yaml):
        for result in results:
            result = result.dictFiltered
            title_link = '<a href="' + result['gitHostRefs'][0][
                'url'] + '" target="_blank">' + result["title"] + '</a>'
            data = {
                'title': title_link,
                'content': '',
                'key': result['key'],
                'state': 'done' if result['isClosed'] else 'new'
            }
            data['assignees'] = result['assignees'] if result[
                'assignees'] else [0]
            data['state'] = result['state']
            if data['state'] in ['resolved', 'wontfix']:
                data['state'] = 'closed'
            result['labels'] = result.get('labels', [])
            data['priority'] = result['priority']
            data['tags'] = ",".join(result['labels'])
            yaml += [data]

    if datatype in ['issue']:
        if 'assignees' in tags:
            userid = user_collection.find(name=tags['assignees'])
            if userid:
                userid = userid[0].key
                tags['assignees'] = userid

    for tag, val in tags.items():
        if isinstance(val, bool):
            instances = [val]
        else:
            if ',' not in val:
                constants[tag] = val
                continue
            instances = val.split(',')
        for instance in instances:
            dynamics[tag] = instance
            results = collection.find(**dynamics, **constants)
            emptyInYaml(results, yaml)

    if not dynamics:
        results = collection.find(**dynamics, **constants)
        emptyInYaml(results, yaml)

    out += j.data.serializer.yaml.dumps(yaml) + "\n}}"
    params.result = (out, doc)

    return params