{"record":{"id":"0c6a5fca92501f06","repo":"theonedev/onedev","slug":"project-level-issue-state-transition-rule-definiti","errorCode":null,"errorMessage":"Project level issue state transition rule definition","messagePattern":"Project level issue state transition rule definition","errorType":"exception","errorClass":"NoSubscriptionException","httpStatus":null,"severity":"warning","filePath":"server-core/src/main/java/io/onedev/server/web/page/project/setting/issuesetting/ProjectStateTransitionListPage.java","lineNumber":27,"sourceCode":"import org.apache.wicket.markup.html.basic.Label;\nimport org.apache.wicket.request.mapper.parameter.PageParameters;\n\nimport io.onedev.server.OneDev;\nimport io.onedev.server.data.migration.VersionedXmlDoc;\nimport io.onedev.server.exception.NoSubscriptionException;\nimport io.onedev.server.model.support.issue.transitionspec.TransitionSpec;\nimport io.onedev.server.service.ProjectService;\nimport io.onedev.server.util.CollectionUtils;\nimport io.onedev.server.web.component.issue.transitionspec.StateTransitionListPanel;\nimport io.onedev.server.web.util.WicketUtils;\n\npublic class ProjectStateTransitionListPage extends ProjectIssueSettingPage {\n\n\tpublic ProjectStateTransitionListPage(PageParameters params) {\n\t\tsuper(params);\n\n\t\tif (!WicketUtils.isSubscriptionActive()) {\n\t\t\tthrow new NoSubscriptionException(\"Project level issue state transition rule definition\");\n\t\t}\n\t}\n\n\t@Override\n\tprotected void onInitialize() {\n\t\tsuper.onInitialize();\n\t\t\n\t\tadd(new StateTransitionListPanel(\"transitions\") {\n\t\t\t\n\t\t\t@Override\n\t\t\tprotected List<TransitionSpec> getTransitions() {\n\t\t\t\treturn getProject().getIssueSetting().getTransitionSpecs();\n\t\t\t}\n\t\t\t\n\t\t\t@Override\n\t\t\tprotected void onSave(AjaxRequestTarget target, int transitionIndex, TransitionSpec transition) {\n\t\t\t\tString oldAuditContent = null;\n\t\t\t\tList<TransitionSpec> transitions = getProject().getIssueSetting().getTransitionSpecs();","sourceCodeStart":9,"sourceCodeEnd":45,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/web/page/project/setting/issuesetting/ProjectStateTransitionListPage.java#L9-L45","documentation":"The project-level issue state transition rules setting page is a premium feature; the constructor checks WicketUtils.isSubscriptionActive() and throws NoSubscriptionException when no active OneDev subscription exists. The feature is gated behind a paid plan.","triggerScenarios":"Opening Project -> Issue Settings -> State Transitions while running community edition or with an expired/absent subscription key.","commonSituations":"Using OneDev community build after evaluating premium features; subscription expired; license key not applied on the instance; sharing settings documentation that assumes enterprise edition.","solutions":["Purchase or renew a OneDev subscription and apply the license key on the server (Site Settings / subscription).","Use the free alternative: define state transitions via project issue setting that is available in community (e.g. rules at the global level if offered) or manage states manually.","If a subscription was recently applied, restart/refresh so the license check picks it up."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if (!WicketUtils.isSubscriptionActive()) {\n    // hide the state transitions menu entry / redirect to subscription page\n    throw new NoSubscriptionException(\"State transition rules require an active subscription\");\n}","typeGuard":"boolean canManageStateTransitions() { return WicketUtils.isSubscriptionActive(); }","tryCatchPattern":"try { openStateTransitionsPage(project); } catch (NoSubscriptionException e) { promptSubscriptionUpgrade(); }","preventionTips":["Hide premium menu items when no subscription is active.","Monitor subscription expiry and renew proactively.","Apply the license key on all instances (including replicas) after purchase."],"tags":["licensing","subscription","issues","settings"],"backgroundTag":"feature-not-enabled","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}