def METHOD_NAME(journal_id):
    auth_svc = DOAJ.authorisationService()
    journal_svc = DOAJ.journalService()
    journal, _ = journal_svc.journal(journal_id)
    if journal is None:
        abort(404)
    try:
        auth_svc.can_edit_journal(current_user._get_current_object(), journal)
    except exceptions.AuthoriseException:
        abort(401)
    # # now check whether the user is the editor of the editor group
    role = "associate_editor"
    eg = models.EditorGroup.pull_by_key("name", journal.editor_group)
    if eg is not None and eg.editor == current_user.id:
        role = "editor"
    # attempt to get a lock on the object
    try:
        lockinfo = lock.lock(constants.LOCK_JOURNAL, journal_id, current_user.id)
    except lock.Locked as l:
        return render_template("editor/journal_locked.html", journal=journal, lock=l.lock, lcc_tree=lcc_jstree)
    fc = JournalFormFactory.context(role, extra_param=exparam_editing_user())
    if request.method == "GET":
        fc.processor(source=journal)
        return fc.render_template(lock=lockinfo, obj=journal, lcc_tree=lcc_jstree)
    elif request.method == "POST":
        processor = fc.processor(formdata=request.form, source=journal)
        if processor.validate():
            try:
                processor.finalise()
                flash('Journal updated.', 'success')
                for a in processor.alert:
                    flash_with_url(a, "success")
                return redirect(url_for("editor.journal_page", journal_id=journal.id, _anchor='done'))
            except Exception as e:
                flash(str(e))
                return redirect(url_for("editor.journal_page", journal_id=journal.id, _anchor='cannot_edit'))
        else:
            return fc.render_template(lock=lockinfo, obj=journal, lcc_tree=lcc_jstree)