diff --git a/CHANGELOG.md b/CHANGELOG.md index d937c10..ee1341b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ There is a generated client in `client`. It can be built with `clitools.py`. I'm starting to wire up the UI to use that. I took the NG submission-core and submission-ui and put them in the same project -and then refactored the pacakges. +and then refactored the packages. # 2024-09-24 Start of UI Brian Caruso @@ -73,8 +73,8 @@ without flask. This will need to be merged to arxiv-base master soon. ### Current state *WORKING* - creates a submission -- uplaod and unpacks tar.gz -- license, policy and author attestation +- upload and unpacks tar.gz +- submission agreement, and license acceptance - metadata: title abstract etc - docker file - tests diff --git a/submit_ce/implementations/compile/compile_at_gcp.py b/submit_ce/implementations/compile/compile_at_gcp.py index df5182f..d2c8bea 100644 --- a/submit_ce/implementations/compile/compile_at_gcp.py +++ b/submit_ce/implementations/compile/compile_at_gcp.py @@ -22,7 +22,7 @@ from typing import List, Optional from enum import Enum -from common import (GCP_LOG_NAME, GCP_RESULTS_NAME, GCP_PREFLIGHT_NAME, +from .common import (GCP_LOG_NAME, GCP_RESULTS_NAME, GCP_PREFLIGHT_NAME, DEFAULT_SUBMISSION_LOG_NAME, DEFAULT_SYSTEM_LOG_NAME, DEFAULT_COMPILATION_TIMEOUT, DEFAULT_MAX_APPEND_FILES, DEFAULT_MAX_TEX_FILES, MAX_RETRIES, RETRY_DELAY) @@ -478,7 +478,7 @@ def compile_submission( query_params['watermark_text'] = watermark_text if preflight: - query_params['preflight'] = args.preflight + query_params['preflight'] = preflight if not tex2pdf_url: raise FileNotFoundError("The tex2pdf_url is required. ") diff --git a/submit_ce/implementations/compile/compile_at_gcp_service.py b/submit_ce/implementations/compile/compile_at_gcp_service.py index 866a657..8fcd380 100644 --- a/submit_ce/implementations/compile/compile_at_gcp_service.py +++ b/submit_ce/implementations/compile/compile_at_gcp_service.py @@ -8,8 +8,7 @@ from submit_ce.api.CompileService import CompileService from submit_ce.api.domain.event.process import Result from submit_ce.api.domain.process import ProcessStatus -import sys -sys.path.append('submit_ce/implementations/compile') + from submit_ce.implementations.compile.compile_at_gcp import PreflightOption, DEFAULT_MAX_APPEND_FILES, DEFAULT_MAX_TEX_FILES, \ DEFAULT_COMPILATION_TIMEOUT, compile_submission @@ -81,4 +80,5 @@ def start_compile(self, submission: Submission, def check(self, process_id: str, user: User, client: Client) -> ProcessStatus: - pass \ No newline at end of file + pass + diff --git a/submit_ce/ui/controllers/__init__.py b/submit_ce/ui/controllers/__init__.py index df99673..1907139 100644 --- a/submit_ce/ui/controllers/__init__.py +++ b/submit_ce/ui/controllers/__init__.py @@ -10,7 +10,6 @@ from . import cross, delete, jref, util, withdraw from .manage_submissions import manage_submissions from .new import process, upload, review -from .new.authorship import authorship from .new.classification import classification from .new.create import create from .new.final import finalize diff --git a/submit_ce/ui/controllers/new/authorship.py b/submit_ce/ui/controllers/new/authorship.py deleted file mode 100644 index 8528365..0000000 --- a/submit_ce/ui/controllers/new/authorship.py +++ /dev/null @@ -1,122 +0,0 @@ -""" -Controller for authorship action. - -Creates an event of type `core.events.event.ConfirmAuthorship` -""" - -from http import HTTPStatus as status -from typing import Tuple, Dict, Any - -from arxiv.auth.auth import scopes -from arxiv.auth.domain import Session - -from arxiv.forms import csrf - -from flask import current_app -from werkzeug.datastructures import MultiDict -from wtforms import BooleanField, RadioField -from wtforms.validators import InputRequired, ValidationError, optional - -from submit_ce.api.domain.event import ConfirmAuthorship - -from submit_ce.ui.auth import user_and_client_from_session -from submit_ce.ui.controllers.util import validate_command -from submit_ce.ui.routes.flow_control import ready_for_next -from submit_ce.ui.backend import get_submission - -Response = Tuple[Dict[str, Any], int, Dict[str, Any]] # pylint: disable=C0103 - - -def authorship(method: str, params: MultiDict, session: Session, - submission_id: int, **kwargs) -> Response: - """Handle the authorship assertion view.""" - submitter, client = user_and_client_from_session(session) - submission, _ = get_submission(submission_id) - may_proxy = scopes.PROXY_SUBMISSION in submitter.scopes - - # The form should be prepopulated based on the current state of the submission. - if method == 'GET': - match submission.submitter_is_author, may_proxy: - case True, False: # already did form, is author - params['authorship'] = AuthorshipForm.YES - case True, True: # already did form - params['authorship'] = AuthorshipForm.YES - params['proxy'] = False - case False, True: # already did form and set False while being a proxy - params['authorship'] = AuthorshipForm.NO - params['proxy'] = True - case False, False: # bad state: not proxy and marked not author - params['authorship'] = False - case _, _: - pass # default values from form - - form = AuthorshipProxyForm(params) if may_proxy else AuthorshipForm(params) - - response_data = { - 'submission_id': submission_id, - 'form': form, - 'submission': submission, - 'submitter': submitter, - 'client': client, - 'may_proxy': may_proxy, - } - - if method == "GET": - return response_data, status.OK, {} - if method != "POST": - return response_data, status.METHOD_NOT_ALLOWED, {} - if not form.validate(): - return response_data, status.BAD_REQUEST, {} - - value = form.authorship.data == form.YES - not_yet_done = submission.submitter_is_author != value - command = ConfirmAuthorship(creator=submitter, client=client, - submitter_is_author=value) - if not_yet_done and validate_command(form, command, submission, 'authorship'): - submission, _ = current_app.api.save(command, submission_id=submission_id) - response_data['submission'] = submission - - return ready_for_next((response_data, status.OK, {})) - - - -class AuthorshipForm(csrf.CSRFForm): - """Generate form with radio button to confirm authorship information.""" - - YES = 'y' - NO = 'n' - - authorship = RadioField(choices=[(YES, 'I am submitting as an author of this article'), - (NO, 'I am not an author but have obtained pre-authorization' - 'from arXiv to submit as a third-party submitter')], - validators=[InputRequired('Please choose one')], - default=None) - - def validate_authorship(self, field: RadioField) -> None: - """Require proxy field if submitter is not author.""" - if field.data == self.NO: - # TODO could use better not author message - raise ValidationError('You must be the author of the paper you want to submit.') - - -class AuthorshipProxyForm(csrf.CSRFForm): - """Generate form with radio button to confirm authorship information.""" - - YES = 'y' - NO = 'n' - - authorship = RadioField(choices=[(YES, 'I am submitting as an author of this article'), - (NO, 'I am not an author but have obtained pre-authorization' - 'from arXiv to submit as a third-party submitter')], - validators=[InputRequired('Please choose one')], - default=YES) - proxy = BooleanField('By checking this box, I certify that I have ' - 'received authorization from arXiv to submit papers ' - 'on behalf of the author(s).', - validators=[optional()]) - - def validate_authorship(self, field: RadioField) -> None: - """Require proxy field if submitter is not author.""" - if field.data == self.NO and not self.data.get('proxy'): - raise ValidationError('You must get prior approval to submit ' - 'on behalf of authors') diff --git a/submit_ce/ui/controllers/new/tests/test_authorship.py b/submit_ce/ui/controllers/new/tests/test_authorship.py deleted file mode 100644 index 4f4094a..0000000 --- a/submit_ce/ui/controllers/new/tests/test_authorship.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Tests for :mod:`submit_ce.controllers.authorship`.""" - -from submit_ce.ui.tests.csrf_util import parse_csrf_token - -def get(appx, subx): - with appx.app_context(): - return appx.api.get(subx.submission_id) - -def test_authorship_form(app, authorized_client, sub_verified_user): - sub = sub_verified_user - assert sub and not sub.submitter_is_author - - url = f"/{sub.submission_id}/authorship" - resp = authorized_client.get(url) - assert resp.status_code == 200 and b"Confirm Authorship" in resp.data and b"