Skip to content
Snippets Groups Projects
Select Git revision
  • 0250d10c7950a4cf5a536d47ffb5537f58cadc2a
  • devel default
  • master
  • fo
  • jirka/typing
  • fo-base
  • mj/submit-images
  • jk/issue-96
  • jk/issue-196
  • honza/add-contestant
  • honza/mr7
  • honza/mrf
  • honza/mrd
  • honza/mra
  • honza/mr6
  • honza/submit-images
  • honza/kolo-vs-soutez
  • jh-stress-test-wip
  • shorten-schools
19 results

fix-submits

Blame
  • fix-submits 1.59 KiB
    #!/usr/bin/env python3
    
    import argparse
    import datetime
    import os
    from sqlalchemy.orm import joinedload
    import subprocess
    import tempfile
    
    import mo.db as db
    import mo.submit
    import mo.util
    
    parser = argparse.ArgumentParser(description='Pokusí se opravit rozbitá PDF')
    parser.add_argument(dest='id', type=int, nargs='?', help='ID papíru k opravení')
    args = parser.parse_args()
    
    mo.util.init_standalone()
    sess = db.get_session()
    
    fixed = 0
    errors = 0
    
    
    def fix_paper(id: int):
        global fixed, errors
    
        paper = (sess.query(db.Paper)
                 .options(joinedload(db.Paper.for_user_obj))
                 .get(id))
        assert paper is not None
        assert paper.orig_file_name is not None
        print(f"=== Paper #{id} ({paper.orig_file_name}){' [RETRY]' if paper.fixed_at else ''}")
    
        tmp_file = tempfile.NamedTemporaryFile(dir=mo.util.data_dir('tmp'), prefix='fix-')
        res = subprocess.run(['qpdf', os.path.join(mo.util.data_dir('submits'), paper.orig_file_name), tmp_file.name])
        if res.returncode in [0, 3]:
            sub = mo.submit.Submitter()
            try:
                sub.submit_fix(paper, tmp_file.name)
                fixed += 1
            except mo.submit.SubmitException:
                errors += 1
        else:
            print(f'--> ERROR: qpdf failed with exit code {res.returncode}')
            errors += 1
    
        paper.fixed_at = datetime.datetime.now()
        sess.commit()
    
    
    if args.id is not None:
        fix_paper(args.id)
    else:
        papers = sess.query(db.Paper).filter_by(file_name=None).all()
        sess.rollback()
        for p in papers:
            fix_paper(p.paper_id)
    
    print(f'Opraveno {fixed} PDF, stále rozbito {errors}')