def json(value, parameters): """{ "id": integer, // the object's unique id "review": integer, "changeset": integer, "file": integer, "deleted_lines": integer, "inserted_lines": integer, "is_reviewed": boolean, "reviewed_by": integer, "assigned_reviewers": integer[], "draft_changes": DraftChanges or null, } DraftChanges { "author": integer, // author of draft changes "new_is_reviewed": boolean, "new_reviewed_by": integer, }""" draft_changes = value.draft_changes if draft_changes: draft_changes_json = { "author": draft_changes.author, "new_is_reviewed": draft_changes.new_is_reviewed, "new_reviewed_by": draft_changes.new_reviewed_by, } else: draft_changes_json = None return parameters.filtered( "reviewablefilechanges", { "id": value.id, "review": value.review, "changeset": value.changeset, "file": value.file, "deleted_lines": value.deleted_lines, "inserted_lines": value.inserted_lines, "is_reviewed": value.is_reviewed, "reviewed_by": value.reviewed_by, "assigned_reviewers": jsonapi.sorted_by_id(value.assigned_reviewers), "draft_changes": draft_changes_json, })
def json(value, parameters): """Filter { "id": integer, // the filter's id "type": string, // "reviewer", "watcher" or "ignored" "path": string, // the filtered path "repository": integer, // the filter's repository's id "delegates": integer[], // list of user ids }""" return parameters.filtered("filters", { "id": value.id, "type": value.type, "path": value.path, "repository": value.repository, "delegates": jsonapi.sorted_by_id(value.delegates) })
def multiple(parameters): """All repository filters. repository : REPOSITORY : - Include only filters for the specified repository, identified by its unique numeric id or short-name.""" user = parameters.context["users"] repository = jsonapi.deduce("v1/repositories", parameters) if repository: repository_filters = user.repository_filters.get(repository, []) else: repository_filters = itertools.chain( *user.repository_filters.values()) return jsonapi.sorted_by_id(repository_filters)
def multiple(parameters): """All repository filters. repository : REPOSITORY : - Include only filters for the specified repository, identified by its unique numeric id or short-name.""" user = parameters.context["users"] repository = jsonapi.deduce("v1/repositories", parameters) if repository: repository_filters = user.repository_filters.get( repository, []) else: repository_filters = itertools.chain( *user.repository_filters.values()) return jsonapi.sorted_by_id(repository_filters)
def json(value, parameters): """Filter { "id": integer, // the filter's id "type": string, // "reviewer", "watcher" or "ignored" "path": string, // the filtered path "repository": integer, // the filter's repository's id "delegates": integer[], // list of user ids }""" return parameters.filtered( "filters", { "id": value.id, "type": value.type, "path": value.path, "repository": value.repository, "delegates": jsonapi.sorted_by_id(value.delegates) })
def json(value, parameters): """{ "id": integer, // the object's unique id "review": integer, "changeset": integer, "file": integer, "deleted_lines": integer, "inserted_lines": integer, "is_reviewed": boolean, "reviewed_by": integer, "assigned_reviewers": integer[], "draft_changes": DraftChanges or null, } DraftChanges { "author": integer, // author of draft changes "new_is_reviewed": boolean, "new_reviewed_by": integer, }""" draft_changes = value.draft_changes if draft_changes: draft_changes_json = { "author": draft_changes.author, "new_is_reviewed": draft_changes.new_is_reviewed, "new_reviewed_by": draft_changes.new_reviewed_by, } else: draft_changes_json = None return parameters.filtered( "reviewablefilechanges", { "id": value.id, "review": value.review, "changeset": value.changeset, "file": value.file, "deleted_lines": value.deleted_lines, "inserted_lines": value.inserted_lines, "is_reviewed": value.is_reviewed, "reviewed_by": value.reviewed_by, "assigned_reviewers": jsonapi.sorted_by_id( value.assigned_reviewers), "draft_changes": draft_changes_json, })
def json(value, parameters): """{ "id": integer or null, "is_empty": boolean, "review": integer, "author": integer, "comment": integer or null, "timestamp": float or null, "created_comments": integer[], "written_replies": integer[], "resolved_issues": integer[], "reopened_issues": integer[], "morphed_comments": MorphedComment[], "reviewed_changes": integer[], "unreviewed_changes": integer[], } MorphedComment { "comment": integer, "new_type": "issue" or "note", }""" morphed_comments = sorted([ { "comment": comment, "new_type": new_type } for comment, new_type in value.morphed_comments.items() ], key=lambda morphed_comment: morphed_comment["comment"].id) timestamp = jsonapi.v1.timestamp(value.timestamp) return parameters.filtered( "batches", { "id": value.id, "is_empty": value.is_empty, "review": value.review, "author": value.author, "timestamp": timestamp, "comment": value.comment, "created_comments": jsonapi.sorted_by_id( value.created_comments), "written_replies": jsonapi.sorted_by_id( value.written_replies), "resolved_issues": jsonapi.sorted_by_id( value.resolved_issues), "reopened_issues": jsonapi.sorted_by_id( value.reopened_issues), "morphed_comments": morphed_comments, "reviewed_changes": jsonapi.sorted_by_id( value.reviewed_file_changes), "unreviewed_changes": jsonapi.sorted_by_id( value.unreviewed_file_changes) })
def delete(parameters, value, values): critic = parameters.critic if parameters.subresource_path: assert value and not values assert parameters.subresource_path[0] == "delegates" repository_filter = value delegates = jsonapi.sorted_by_id(repository_filter.delegates) if len(parameters.subresource_path) == 1: # Delete all delegates. delegates = [] else: del delegates[parameters.subresource_path[1] - 1] with api.transaction.Transaction(critic) as transaction: transaction \ .modifyUser(repository_filter.subject) \ .modifyFilter(repository_filter) \ .setDelegates(delegates) # Remove the last component from the sub-resource path, since we've # just deleted the specified sub-resource(s). del parameters.subresource_path[-1] return value, values if value: repository_filters = [value] else: repository_filters = values with api.transaction.Transaction(critic) as transaction: for repository_filter in repository_filters: transaction \ .modifyUser(repository_filter.subject) \ .modifyFilter(repository_filter) \ .delete()
def json(value, parameters): """Review { "id": integer, "state": string, "summary": string, "description": string or null, "repository": integer, "branch": integer, "owners": integer[], "active_reviewers": integer[], "assigned_reviewers": integer[], "watchers": integer[], "partitions": Partition[], "issues": integer[], "notes": integer[], "pending_rebase": integer or null, "progress": float, "progress_per_commit": CommitChangeCount[], } Partition { "commits": integer[], "rebase": integer or null, } CommitChangeCount { "commit_id": integer, "total_changes": integer, "reviewed_changes": integer, }""" def change_counts_as_dict(change_counts): return [{ "commit_id": change_count.commit_id, "total_changes": change_count.total_changes, "reviewed_changes": change_count.reviewed_changes, } for change_count in change_counts] partitions = [] def add_partition(partition): if partition.following: partition_rebase = partition.following.rebase else: partition_rebase = None partitions.append({ "commits": list(partition.commits.topo_ordered), "rebase": partition_rebase }) if partition.following: add_partition(partition.following.partition) add_partition(value.first_partition) return parameters.filtered( "reviews", { "id": value.id, "state": value.state, "summary": value.summary, "description": value.description, "repository": value.repository, "branch": value.branch, "owners": jsonapi.sorted_by_id(value.owners), "active_reviewers": jsonapi.sorted_by_id( value.active_reviewers), "assigned_reviewers": jsonapi.sorted_by_id( value.assigned_reviewers), "watchers": jsonapi.sorted_by_id(value.watchers), "partitions": partitions, "issues": jsonapi.sorted_by_id(value.issues), "notes": jsonapi.sorted_by_id(value.notes), "pending_rebase": value.pending_rebase, "progress": value.total_progress, "progress_per_commit": change_counts_as_dict(value.progress_per_commit)})
def json(value, parameters): """Review { "id": integer, "state": string, "summary": string, "description": string or null, "repository": integer, "branch": integer, "owners": integer[], "active_reviewers": integer[], "assigned_reviewers": integer[], "watchers": integer[], "partitions": Partition[], "issues": integer[], "notes": integer[], "pending_rebase": integer or null, "progress": float, "progress_per_commit": CommitChangeCount[], } Partition { "commits": integer[], "rebase": integer or null, } CommitChangeCount { "commit_id": integer, "total_changes": integer, "reviewed_changes": integer, }""" def change_counts_as_dict(change_counts): return [{ "commit_id": change_count.commit_id, "total_changes": change_count.total_changes, "reviewed_changes": change_count.reviewed_changes, } for change_count in change_counts] partitions = [] def add_partition(partition): if partition.following: partition_rebase = partition.following.rebase else: partition_rebase = None partitions.append({ "commits": list(partition.commits.topo_ordered), "rebase": partition_rebase }) if partition.following: add_partition(partition.following.partition) add_partition(value.first_partition) return parameters.filtered( "reviews", { "id": value.id, "state": value.state, "summary": value.summary, "description": value.description, "repository": value.repository, "branch": value.branch, "owners": jsonapi.sorted_by_id(value.owners), "active_reviewers": jsonapi.sorted_by_id(value.active_reviewers), "assigned_reviewers": jsonapi.sorted_by_id(value.assigned_reviewers), "watchers": jsonapi.sorted_by_id(value.watchers), "partitions": partitions, "issues": jsonapi.sorted_by_id(value.issues), "notes": jsonapi.sorted_by_id(value.notes), "pending_rebase": value.pending_rebase, "progress": value.total_progress, "progress_per_commit": change_counts_as_dict(value.progress_per_commit) })