def update(parameters, value, values, data): critic = parameters.critic if parameters.subresource_path: assert parameters.subresource_path[0] == "delegates" if len(parameters.subresource_path) == 2: raise jsonapi.UsageError("can't update specific delegate") delegates = jsonapi.convert( parameters, [api.user.User], data) else: converted = jsonapi.convert( parameters, { "delegates?": [api.user.User] }, data) delegates = converted.get("delegates") if value: repository_filters = [value] else: repository_filters = values with api.transaction.Transaction(critic) as transaction: for repository_filter in repository_filters: if delegates is not None: transaction \ .modifyUser(repository_filter.subject) \ .modifyFilter(repository_filter) \ .setDelegates(delegates) return value, values
def update(parameters, value, values, data): critic = parameters.critic if parameters.subresource_path: assert parameters.subresource_path[0] == "delegates" if len(parameters.subresource_path) == 2: raise jsonapi.UsageError("can't update specific delegate") delegates = jsonapi.convert(parameters, [api.user.User], data) else: converted = jsonapi.convert(parameters, {"delegates?": [api.user.User]}, data) delegates = converted.get("delegates") if value: repository_filters = [value] else: repository_filters = values with api.transaction.Transaction(critic) as transaction: for repository_filter in repository_filters: if delegates is not None: transaction \ .modifyUser(repository_filter.subject) \ .modifyFilter(repository_filter) \ .setDelegates(delegates) return value, values
def create(parameters, value, values, data): critic = parameters.critic user = parameters.context.get("users", critic.actual_user) profiles = [value] if value else values path = parameters.subresource_path if 0 < len(path) < 2: raise jsonapi.UsageError("Invalid POST request") if len(path) == 2 \ and path[0] in CATEGORIES \ and path[1] == "exceptions": # Create an rule exception. if path[0] == "http": exception_type = HTTP_EXCEPTION elif path[0] == "repositories": exception_type = REPOSITORIES_EXCEPTION else: exception_type = EXTENSION_EXCEPTION converted = jsonapi.convert( parameters, exception_type, data) with api.transaction.Transaction(critic) as transaction: for profile in profiles: modifier = transaction.modifyAccessControlProfile(profile) \ .modifyExceptions(path[0]) \ .add(**converted) return value, values # Create an access control profile. assert not profiles converted = jsonapi.convert(parameters, PROFILE_WITH_TITLE, data) result = [] def collectAccessControlProfile(profile): assert isinstance( profile, api.accesscontrolprofile.AccessControlProfile) result.append(profile) with api.transaction.Transaction(critic) as transaction: modifier = transaction.createAccessControlProfile( callback=collectAccessControlProfile) updateProfile(modifier, converted) assert len(result) == 1 return result[0], None
def create(parameters, value, values, data): critic = parameters.critic user = parameters.context.get("users", critic.actual_user) profiles = [value] if value else values path = parameters.subresource_path if 0 < len(path) < 2: raise jsonapi.UsageError("Invalid POST request") if len(path) == 2 \ and path[0] in CATEGORIES \ and path[1] == "exceptions": # Create an rule exception. if path[0] == "http": exception_type = HTTP_EXCEPTION elif path[0] == "repositories": exception_type = REPOSITORIES_EXCEPTION else: exception_type = EXTENSION_EXCEPTION converted = jsonapi.convert(parameters, exception_type, data) with api.transaction.Transaction(critic) as transaction: for profile in profiles: modifier = transaction.modifyAccessControlProfile(profile) \ .modifyExceptions(path[0]) \ .add(**converted) return value, values # Create an access control profile. assert not profiles converted = jsonapi.convert(parameters, PROFILE_WITH_TITLE, data) result = [] def collectAccessControlProfile(profile): assert isinstance(profile, api.accesscontrolprofile.AccessControlProfile) result.append(profile) with api.transaction.Transaction(critic) as transaction: modifier = transaction.createAccessControlProfile( callback=collectAccessControlProfile) updateProfile(modifier, converted) assert len(result) == 1 return result[0], None
def update(parameters, value, values, data): critic = parameters.critic path = parameters.subresource_path if value: replies = [value] else: replies = values if path: raise jsonapi.UsageError("Invalid PUT request") converted = jsonapi.convert( parameters, { "text": str }, data) with api.transaction.Transaction(critic) as transaction: for reply in replies: transaction \ .modifyReview(reply.comment.review) \ .modifyComment(reply.comment) \ .modifyReply(reply) \ .setText(converted["text"]) return value, values
def create(parameters, value, values, data): critic = parameters.critic user = parameters.context.get("users", critic.actual_user) if parameters.subresource_path: raise jsonapi.UsageError("Invalid POST request") # Create a labeled access control profile selector. assert not (value or values) converted = jsonapi.convert(parameters, { "labels": [str], "profile": api.accesscontrolprofile.AccessControlProfile }, data) result = [] def collectLabeledAccessControlProfile(labeled_profile): assert isinstance( labeled_profile, api.labeledaccesscontrolprofile.LabeledAccessControlProfile) result.append(labeled_profile) with api.transaction.Transaction(critic) as transaction: transaction.createLabeledAccessControlProfile( converted["labels"], converted["profile"], callback=collectLabeledAccessControlProfile) assert len(result) == 1 return result[0], None
def update(parameters, value, values, data): critic = parameters.critic filechanges = [value] if value else values reviews = set(filechange.review for filechange in filechanges) if len(reviews) > 1: raise jsonapi.UsageError("Multiple reviews updated") review = reviews.pop() converted = jsonapi.convert(parameters, { "draft_changes": { "new_is_reviewed": bool, }, }, data) is_reviewed = converted["draft_changes"]["new_is_reviewed"] with api.transaction.Transaction(critic) as transaction: modifier = transaction \ .modifyReview(review) if is_reviewed: for filechange in filechanges: modifier.markChangeAsReviewed(filechange) else: for filechange in filechanges: modifier.markChangeAsPending(filechange)
def update(parameters, value, values, data): critic = parameters.critic filechanges = [value] if value else values reviews = set(filechange.review for filechange in filechanges) if len(reviews) > 1: raise jsonapi.UsageError("Multiple reviews updated") review = reviews.pop() converted = jsonapi.convert( parameters, { "draft_changes": { "new_is_reviewed": bool, }, }, data) is_reviewed = converted["draft_changes"]["new_is_reviewed"] with api.transaction.Transaction(critic) as transaction: modifier = transaction \ .modifyReview(review) if is_reviewed: for filechange in filechanges: modifier.markChangeAsReviewed(filechange) else: for filechange in filechanges: modifier.markChangeAsPending(filechange)
def create(parameters, value, values, data): critic = parameters.critic user = parameters.context.get("users", critic.actual_user) if parameters.subresource_path: raise jsonapi.UsageError("Invalid POST request") # Create a labeled access control profile selector. assert not (value or values) converted = jsonapi.convert( parameters, { "labels": [str], "profile": api.accesscontrolprofile.AccessControlProfile }, data) result = [] def collectLabeledAccessControlProfile(labeled_profile): assert isinstance( labeled_profile, api.labeledaccesscontrolprofile.LabeledAccessControlProfile) result.append(labeled_profile) with api.transaction.Transaction(critic) as transaction: transaction.createLabeledAccessControlProfile( converted["labels"], converted["profile"], callback=collectLabeledAccessControlProfile) assert len(result) == 1 return result[0], None
def update(parameters, value, values, data): critic = parameters.critic if value: profiles = [value] else: profiles = values path = parameters.subresource_path if len(path) == 1 and path[0] in CATEGORIES: if path[0] == "http": exception_type = HTTP_EXCEPTION elif path[0] == "repositories": exception_type = REPOSITORIES_EXCEPTION else: exception_type = EXTENSION_EXCEPTION converted = jsonapi.convert( parameters, { "rule?": RULE, "exceptions?": [exception_type] }, data) with api.transaction.Transaction(critic) as transaction: for profile in profiles: modifier = transaction.modifyAccessControlProfile(profile) updateProfile(modifier, { path[0]: converted }) return converted = jsonapi.convert(parameters, PROFILE_WITH_TITLE, data) with api.transaction.Transaction(critic) as transaction: for profile in profiles: modifier = transaction.modifyAccessControlProfile(profile) updateProfile(modifier, converted)
def create(parameters, value, values, data): critic = parameters.critic user = parameters.context.get("users", critic.actual_user) if value or values: raise jsonapi.UsageError("Invalid POST request") converted = jsonapi.convert( parameters, { "review?": api.review.Review, "comment?": str, }, data) review = jsonapi.deduce("v1/reviews", parameters) if not review: if "review" not in converted: raise jsonapi.UsageError("No review specified") review = converted["review"] elif "review" in converted and review != converted["review"]: raise jsonapi.UsageError("Conflicting reviews specified") if "comment" in converted: comment_text = converted["comment"].strip() if not comment_text: raise jsonapi.UsageError("Empty comment specified") else: comment_text = None result = [] def collectBatch(batch): assert isinstance(batch, api.batch.Batch) result.append(batch) with api.transaction.Transaction(critic) as transaction: modifier = transaction.modifyReview(review) if comment_text: note = modifier.createComment(comment_type="note", author=critic.actual_user, text=comment_text) else: note = None modifier.submitChanges(note, callback=collectBatch) assert len(result) == 1 return result[0], None
def create(parameters, value, values, data): critic = parameters.critic user = parameters.context.get("users", critic.actual_user) if value or values: raise jsonapi.UsageError("Invalid POST request") converted = jsonapi.convert( parameters, { "comment?": api.comment.Comment, "author?": api.user.User, "text": str }, data) comment = jsonapi.deduce("v1/comments", parameters) if not comment: if "comment" not in converted: raise jsonapi.UsageError("No comment specified") comment = converted["comment"] elif "comment" in converted and comment != converted["comment"]: raise jsonapi.UsageError("Conflicting comments specified") if "author" in converted: author = converted["author"] else: author = critic.actual_user if not converted["text"].strip(): raise jsonapi.UsageError("Empty reply") result = [] def collectReply(reply): assert isinstance(reply, api.reply.Reply) result.append(reply) with api.transaction.Transaction(critic) as transaction: transaction \ .modifyReview(comment.review) \ .modifyComment(comment) \ .addReply( author=author, text=converted["text"], callback=collectReply) assert len(result) == 1 return result[0], None
def create(parameters, value, values, data): critic = parameters.critic user = critic.actual_user converted = jsonapi.convert( parameters, { "new_upstream?": str, "history_rewrite?": bool }, data) new_upstream = converted.get("new_upstream") history_rewrite = converted.get("history_rewrite") if (new_upstream is None) == (history_rewrite is None): raise jsonapi.UsageError( "Exactly one of the arguments new_upstream and history_rewrite " "must be specified.") if history_rewrite == False: raise jsonapi.UsageError( "history_rewrite must be true, or omitted.") review = jsonapi.deduce("v1/reviews", parameters) if review is None: raise jsonapi.UsageError( "review must be specified when preparing a rebase") if history_rewrite is not None: expected_type = api.log.rebase.HistoryRewrite else: expected_type = api.log.rebase.MoveRebase result = [] def collectRebase(rebase): assert isinstance(rebase, expected_type), repr(rebase) result.append(rebase) with api.transaction.Transaction(critic) as transaction: transaction \ .modifyReview(review) \ .prepareRebase( user, new_upstream, history_rewrite, callback=collectRebase) assert len(result) == 1, repr(result) return result[0], None
def update(parameters, value, values, data): critic = parameters.critic if value: profiles = [value] else: profiles = values path = parameters.subresource_path if len(path) == 1 and path[0] in CATEGORIES: if path[0] == "http": exception_type = HTTP_EXCEPTION elif path[0] == "repositories": exception_type = REPOSITORIES_EXCEPTION else: exception_type = EXTENSION_EXCEPTION converted = jsonapi.convert(parameters, { "rule?": RULE, "exceptions?": [exception_type] }, data) with api.transaction.Transaction(critic) as transaction: for profile in profiles: modifier = transaction.modifyAccessControlProfile(profile) updateProfile(modifier, {path[0]: converted}) return converted = jsonapi.convert(parameters, PROFILE_WITH_TITLE, data) with api.transaction.Transaction(critic) as transaction: for profile in profiles: modifier = transaction.modifyAccessControlProfile(profile) updateProfile(modifier, converted)
def create(parameters, value, values, data): critic = parameters.critic user = parameters.context.get("users", critic.actual_user) if value or values: raise jsonapi.UsageError("Invalid POST request") converted = jsonapi.convert(parameters, { "comment?": api.comment.Comment, "author?": api.user.User, "text": str }, data) comment = jsonapi.deduce("v1/comments", parameters) if not comment: if "comment" not in converted: raise jsonapi.UsageError("No comment specified") comment = converted["comment"] elif "comment" in converted and comment != converted["comment"]: raise jsonapi.UsageError("Conflicting comments specified") if "author" in converted: author = converted["author"] else: author = critic.actual_user if not converted["text"].strip(): raise jsonapi.UsageError("Empty reply") result = [] def collectReply(reply): assert isinstance(reply, api.reply.Reply) result.append(reply) with api.transaction.Transaction(critic) as transaction: transaction \ .modifyReview(comment.review) \ .modifyComment(comment) \ .addReply( author=author, text=converted["text"], callback=collectReply) assert len(result) == 1 return result[0], None
def create(parameters, value, values, data): critic = parameters.critic user = critic.actual_user converted = jsonapi.convert(parameters, { "new_upstream?": str, "history_rewrite?": bool }, data) new_upstream = converted.get("new_upstream") history_rewrite = converted.get("history_rewrite") if (new_upstream is None) == (history_rewrite is None): raise jsonapi.UsageError( "Exactly one of the arguments new_upstream and history_rewrite " "must be specified.") if history_rewrite == False: raise jsonapi.UsageError( "history_rewrite must be true, or omitted.") review = jsonapi.deduce("v1/reviews", parameters) if review is None: raise jsonapi.UsageError( "review must be specified when preparing a rebase") if history_rewrite is not None: expected_type = api.log.rebase.HistoryRewrite else: expected_type = api.log.rebase.MoveRebase result = [] def collectRebase(rebase): assert isinstance(rebase, expected_type), repr(rebase) result.append(rebase) with api.transaction.Transaction(critic) as transaction: transaction \ .modifyReview(review) \ .prepareRebase( user, new_upstream, history_rewrite, callback=collectRebase) assert len(result) == 1, repr(result) return result[0], None
def update(parameters, value, values, data): if values and len(values) != 1: raise UsageError("Updating multiple users not supported") critic = parameters.critic if values: value = values[0] converted = jsonapi.convert(parameters, {"fullname?": str}, data) with api.transaction.Transaction(critic) as transaction: if "fullname" in converted: new_fullname = converted["fullname"].strip() if not new_fullname: raise jsonapi.InputError("Empty new fullname") transaction.modifyUser(value).setFullname(new_fullname)
def update(parameters, value, values, data): if values and len(values) != 1: raise UsageError("Updating multiple users not supported") critic = parameters.critic if values: value = values[0] converted = jsonapi.convert(parameters, { "fullname?": str }, data) with api.transaction.Transaction(critic) as transaction: if "fullname" in converted: new_fullname = converted["fullname"].strip() if not new_fullname: raise jsonapi.InputError("Empty new fullname") transaction.modifyUser(value).setFullname(new_fullname)
def create(parameters, value, values, data): fields = auth.DATABASE.getFields() converted = jsonapi.convert(parameters, { fieldname: str for hidden, fieldname, label in fields }, data) critic = parameters.critic try: auth.DATABASE.authenticate(critic.database, converted) except auth.AuthenticationFailed as error: raise SessionError(error.message) except auth.WrongPassword: raise SessionError("Wrong password") auth.createSessionId( critic.database, parameters.req, critic.database.user) return Session(critic.actual_user, "normal"), None
def create(parameters, value, values, data): fields = auth.DATABASE.getFields() converted = jsonapi.convert( parameters, {fieldname: str for hidden, fieldname, label in fields}, data) critic = parameters.critic try: auth.DATABASE.authenticate(critic.database, converted) except auth.AuthenticationFailed as error: raise SessionError(error.message) except auth.WrongPassword: raise SessionError("Wrong password") auth.createSessionId(critic.database, parameters.req, critic.database.user) return Session(critic.actual_user, "normal"), None
def update(parameters, value, values, data): critic = parameters.critic path = parameters.subresource_path if value: comments = [value] else: comments = values if path: raise jsonapi.UsageError("Invalid PUT request") converted = jsonapi.convert( parameters, { "text?": str, "draft_changes?": { "new_state?": frozenset(["open", "resolved"]), }, }, data) with api.transaction.Transaction(critic) as transaction: for comment in comments: modifier = transaction \ .modifyReview(comment.review) \ .modifyComment(comment) if "text" in converted: modifier.setText(converted["text"]) draft_changes = converted.get("draft_changes") if draft_changes: if draft_changes.get("new_state") == "resolved": modifier.resolveIssue() elif draft_changes.get("new_state") == "open": modifier.reopenIssue() return value, values
def update(parameters, value, values, data): critic = parameters.critic path = parameters.subresource_path if value: replies = [value] else: replies = values if path: raise jsonapi.UsageError("Invalid PUT request") converted = jsonapi.convert(parameters, {"text": str}, data) with api.transaction.Transaction(critic) as transaction: for reply in replies: transaction \ .modifyReview(reply.comment.review) \ .modifyComment(reply.comment) \ .modifyReply(reply) \ .setText(converted["text"]) return value, values
def create(parameters, value, values, data): critic = parameters.critic user = parameters.context.get("users", critic.actual_user) path = parameters.subresource_path if value and path == ["replies"]: assert isinstance(value, api.comment.Comment) Comments.setAsContext(parameters, value) raise jsonapi.InternalRedirect("v1/replies") if value or values or path: raise jsonapi.UsageError("Invalid POST request") converted = jsonapi.convert( parameters, { "type": api.comment.Comment.TYPE_VALUES, "review!?": api.review.Review, "author?": api.user.User, "location?": { # Note: "general" not included here; |location| should be # omitted instead. "type": frozenset(["commit-message", "file-version"]), "first_line": int, "last_line": int, "commit?": api.commit.Commit, "file?": api.file.File, "changeset?": api.changeset.Changeset, "side?": frozenset(["old", "new"]), }, "text": str }, data) review = jsonapi.deduce("v1/reviews", parameters) if not review: if "review" not in converted: raise jsonapi.UsageError("No review specified") review = converted["review"] elif "review" in converted and review != converted["review"]: raise jsonapi.UsageError("Conflicting reviews specified") if "author" in converted: author = converted["author"] else: author = critic.actual_user if converted["type"] == "issue": expected_class = api.comment.Issue else: expected_class = api.comment.Note converted_location = converted.get("location") if converted_location: location_type = converted_location.pop("type") if location_type == "commit-message": required_fields = set(("first_line", "last_line", "commit")) optional_fields = set() else: required_fields = set(("first_line", "last_line", "file")) optional_fields = set(("commit", "changeset", "side")) accepted_fields = required_fields | optional_fields for required_field in required_fields: if required_field not in converted_location: raise jsonapi.InputError( "data.location.%s: missing attribute" % required_field) for actual_field in converted_location.keys(): if actual_field not in accepted_fields: raise jsonapi.InputError( "data.location.%s: unexpected attribute" % actual_field) if location_type == "commit-message": max_line = len( converted_location["commit"].message.splitlines()) else: if "commit" in converted_location: if "changeset" in converted_location: raise jsonapi.InputError( "data.location: only one of commit and changeset " "can be specified") changeset = None side = None commit = converted_location["commit"] elif "changeset" not in converted_location: raise jsonapi.InputError( "data.location: one of commit and changeset must be " "specified") elif "side" not in converted_location: raise jsonapi.InputError( "data.location.side: missing attribute (required when " "changeset is specified)") else: changeset = converted_location["changeset"] side = converted_location["side"] commit = None first_line = converted_location["first_line"] last_line = converted_location["last_line"] if location_type == "commit-message": location = api.comment.CommitMessageLocation.make( critic, first_line, last_line, converted_location["commit"]) else: location = api.comment.FileVersionLocation.make( critic, first_line, last_line, converted_location["file"], changeset, side, commit) else: location = None result = [] def collectComment(comment): assert isinstance(comment, expected_class), repr(comment) result.append(comment) with api.transaction.Transaction(critic) as transaction: transaction \ .modifyReview(review) \ .createComment( comment_type=converted["type"], author=author, text=converted["text"], location=location, callback=collectComment) assert len(result) == 1, repr(result) return result[0], None
def update(parameters, value, values, data): critic = parameters.critic if value: access_tokens = [value] else: access_tokens = values path = parameters.subresource_path if path == ["profile"]: converted = jsonapi.convert(parameters, PROFILE, data) with api.transaction.Transaction(critic) as transaction: for access_token in access_tokens: modifier = modifyAccessToken(transaction, access_token) \ .modifyProfile() updateProfile(modifier, converted) return if len(path) == 2 \ and path[0] == "profile" \ and path[1] in CATEGORIES: if path[1] == "http": exception_type = HTTP_EXCEPTION elif path[1] == "repositories": exception_type = REPOSITORIES_EXCEPTION else: exception_type = EXTENSION_EXCEPTION converted = jsonapi.convert(parameters, { "rule?": RULE, "exceptions?": [exception_type] }, data) with api.transaction.Transaction(critic) as transaction: for access_token in access_tokens: modifier = modifyAccessToken(transaction, access_token) \ .modifyProfile() updateProfile(modifier, {path[1]: converted}) return converted = jsonapi.check.convert(parameters, { "title?": str, "profile?": PROFILE, }, data) with api.transaction.Transaction(critic) as transaction: for access_token in access_tokens: modifier = modifyAccessToken(transaction, access_token) if "title" in converted: modifier.setTitle(converted["title"]) if "profile" in converted: updateProfile(modifier.modifyProfile(), converted["profile"])
def create(parameters, value, values, data): critic = parameters.critic user = parameters.context.get("users", critic.actual_user) access_tokens = [value] if value else values path = parameters.subresource_path if 0 < len(path) < 3: raise jsonapi.UsageError("Invalid POST request") if len(path) == 3 \ and path[0] == "profile" \ and path[1] in CATEGORIES \ and path[2] == "exceptions": # Create an rule exception. if path[1] == "http": exception_type = HTTP_EXCEPTION elif path[1] == "repositories": exception_type = REPOSITORIES_EXCEPTION else: exception_type = EXTENSION_EXCEPTION converted = jsonapi.convert(parameters, exception_type, data) with api.transaction.Transaction(critic) as transaction: for access_token in access_tokens: modifier = modifyAccessToken(transaction, access_token) \ .modifyProfile() \ .modifyExceptions(path[1]) \ .add(**converted) return value, values # Create an access token. assert not access_tokens converted = jsonapi.convert(parameters, { "access_type?": ACCESS_TYPE, "title?": str, "profile?": PROFILE }, data) result = [] def collectAccessToken(token): assert isinstance(token, api.accesstoken.AccessToken) result.append(token) with api.transaction.Transaction(critic) as transaction: modifier = transaction \ .modifyUser(user) access_type = converted.get("access_type", "user") access_token = modifier.createAccessToken( access_type=access_type, title=converted.get("title"), callback=collectAccessToken) if "profile" in converted: modifier = transaction if access_type == "user": modifier = modifier.modifyUser(user) modifier = modifier \ .modifyAccessToken(access_token) \ .modifyProfile() updateProfile(modifier, converted["profile"]) assert len(result) == 1 return result[0], None
def update(parameters, value, values, data): critic = parameters.critic if value: access_tokens = [value] else: access_tokens = values path = parameters.subresource_path if path == ["profile"]: converted = jsonapi.convert(parameters, PROFILE, data) with api.transaction.Transaction(critic) as transaction: for access_token in access_tokens: modifier = modifyAccessToken(transaction, access_token) \ .modifyProfile() updateProfile(modifier, converted) return if len(path) == 2 \ and path[0] == "profile" \ and path[1] in CATEGORIES: if path[1] == "http": exception_type = HTTP_EXCEPTION elif path[1] == "repositories": exception_type = REPOSITORIES_EXCEPTION else: exception_type = EXTENSION_EXCEPTION converted = jsonapi.convert( parameters, { "rule?": RULE, "exceptions?": [exception_type] }, data) with api.transaction.Transaction(critic) as transaction: for access_token in access_tokens: modifier = modifyAccessToken(transaction, access_token) \ .modifyProfile() updateProfile(modifier, { path[1]: converted }) return converted = jsonapi.check.convert( parameters, { "title?": str, "profile?": PROFILE, }, data) with api.transaction.Transaction(critic) as transaction: for access_token in access_tokens: modifier = modifyAccessToken(transaction, access_token) if "title" in converted: modifier.setTitle(converted["title"]) if "profile" in converted: updateProfile(modifier.modifyProfile(), converted["profile"])
def create(parameters, value, values, data): critic = parameters.critic user = parameters.context.get("users", critic.actual_user) access_tokens = [value] if value else values path = parameters.subresource_path if 0 < len(path) < 3: raise jsonapi.UsageError("Invalid POST request") if len(path) == 3 \ and path[0] == "profile" \ and path[1] in CATEGORIES \ and path[2] == "exceptions": # Create an rule exception. if path[1] == "http": exception_type = HTTP_EXCEPTION elif path[1] == "repositories": exception_type = REPOSITORIES_EXCEPTION else: exception_type = EXTENSION_EXCEPTION converted = jsonapi.convert( parameters, exception_type, data) with api.transaction.Transaction(critic) as transaction: for access_token in access_tokens: modifier = modifyAccessToken(transaction, access_token) \ .modifyProfile() \ .modifyExceptions(path[1]) \ .add(**converted) return value, values # Create an access token. assert not access_tokens converted = jsonapi.convert( parameters, { "access_type?": ACCESS_TYPE, "title?": str, "profile?": PROFILE }, data) result = [] def collectAccessToken(token): assert isinstance(token, api.accesstoken.AccessToken) result.append(token) with api.transaction.Transaction(critic) as transaction: modifier = transaction \ .modifyUser(user) access_type = converted.get("access_type", "user") access_token = modifier.createAccessToken( access_type=access_type, title=converted.get("title"), callback=collectAccessToken) if "profile" in converted: modifier = transaction if access_type == "user": modifier = modifier.modifyUser(user) modifier = modifier \ .modifyAccessToken(access_token) \ .modifyProfile() updateProfile(modifier, converted["profile"]) assert len(result) == 1 return result[0], None
def create(parameters, value, values, data): import reviewing.filters class FilterPath(jsonapi.check.StringChecker): def check(self, context, value): path = reviewing.filters.sanitizePath(value) try: reviewing.filters.validatePattern(path) except reviewing.filters.PatternError as error: return error.message def convert(self, context, value): return reviewing.filters.sanitizePath(value) critic = parameters.critic subject = parameters.context["users"] if parameters.subresource_path: if value: repository_filters = [value] else: repository_filters = values assert parameters.subresource_path[0] == "delegates" assert len(parameters.subresource_path) == 1 converted = jsonapi.convert(parameters, api.user.User, data) with api.transaction.Transaction(critic) as transaction: for repository_filter in repository_filters: delegates = set(repository_filter.delegates) if converted not in delegates: delegates.add(converted) transaction \ .modifyUser(subject) \ .modifyFilter(repository_filter) \ .setDelegates(delegates) return value, values converted = jsonapi.convert( parameters, { "type": set(("reviewer", "watcher", "ignore")), "path": FilterPath, "repository": api.repository.Repository, "delegates?": [api.user.User] }, data) result = [] def collectFilter(repository_filter): assert isinstance(repository_filter, api.filters.RepositoryFilter) result.append(repository_filter) with api.transaction.Transaction(critic, result) as transaction: transaction \ .modifyUser(subject) \ .createFilter( filter_type=converted["type"], repository=converted["repository"], path=converted["path"], delegates=converted.get("delegates", []), callback=collectFilter) assert len(result) == 1 return result[0], None