示例#1
0
文件: users.py 项目: jensl/critic
    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
示例#2
0
    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
示例#3
0
    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
示例#4
0
    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
示例#5
0
文件: replies.py 项目: jensl/critic
    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
示例#7
0
    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)
示例#8
0
    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
示例#10
0
    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)
示例#11
0
    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
示例#12
0
文件: replies.py 项目: jensl/critic
    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
示例#13
0
文件: rebases.py 项目: jensl/critic
    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
示例#14
0
    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)
示例#15
0
    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
示例#16
0
    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
示例#17
0
    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)
示例#18
0
文件: users.py 项目: jensl/critic
    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)
示例#19
0
文件: sessions.py 项目: jensl/critic
    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
示例#20
0
    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
示例#21
0
文件: comments.py 项目: jensl/critic
    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
示例#22
0
    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
示例#23
0
    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
示例#24
0
    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
示例#25
0
    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"])
示例#26
0
    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
示例#27
0
    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"])
示例#28
0
文件: comments.py 项目: jensl/critic
    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
示例#29
0
    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
示例#30
0
文件: users.py 项目: jensl/critic
    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
示例#31
0
    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