Ver Fonte

Add scheduler for setting job running async

JoostSijm há 6 anos atrás
pai
commit
5256a22812
5 ficheiros alterados com 110 adições e 37 exclusões
  1. 1 0
      Pipfile
  2. 42 1
      Pipfile.lock
  3. 5 1
      app/__init__.py
  4. 4 35
      app/flaskr.py
  5. 58 0
      app/util/job.py

+ 1 - 0
Pipfile

@@ -8,6 +8,7 @@ verify_ssl = true
 [packages]
 flask = "*"
 python-dotenv = "*"
+flask-apscheduler = "*"
 
 [requires]
 python_version = "3.7"

+ 42 - 1
Pipfile.lock

@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "e730cb0544e578be1605f4302c6bdcdf2f841cf66635c736c630dc6e63056301"
+            "sha256": "84aaa9b90fb468db4f504e1b7fa2584e9e1b90e03d8b6f2d6853f0da698df991"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -16,6 +16,13 @@
         ]
     },
     "default": {
+        "apscheduler": {
+            "hashes": [
+                "sha256:6599bc78901ee7e9be85cbd073d9cc155c42d2bc867c5cde4d4d1cc339ebfbeb",
+                "sha256:a8fe0c82d1c21bcf4a1b0e00aa35709f1f63fdd36446e406fa56cc0d51d3acc6"
+            ],
+            "version": "==3.5.3"
+        },
         "click": {
             "hashes": [
                 "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
@@ -31,6 +38,13 @@
             "index": "pypi",
             "version": "==1.0.2"
         },
+        "flask-apscheduler": {
+            "hashes": [
+                "sha256:7911d66e449f412d92a1a6c524217f44f4c40a5c92148c60d5189c6c402f87d0"
+            ],
+            "index": "pypi",
+            "version": "==1.11.0"
+        },
         "itsdangerous": {
             "hashes": [
                 "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19",
@@ -78,6 +92,13 @@
             ],
             "version": "==1.1.0"
         },
+        "python-dateutil": {
+            "hashes": [
+                "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb",
+                "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"
+            ],
+            "version": "==2.8.0"
+        },
         "python-dotenv": {
             "hashes": [
                 "sha256:a84569d0e00d178bc5b957f7ff208bf49287cbf61857c31c258c4a91f571527b",
@@ -86,6 +107,26 @@
             "index": "pypi",
             "version": "==0.10.1"
         },
+        "pytz": {
+            "hashes": [
+                "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9",
+                "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c"
+            ],
+            "version": "==2018.9"
+        },
+        "six": {
+            "hashes": [
+                "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
+                "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
+            ],
+            "version": "==1.12.0"
+        },
+        "tzlocal": {
+            "hashes": [
+                "sha256:4ebeb848845ac898da6519b9b31879cf13b6626f7184c496037b818e238f2c4e"
+            ],
+            "version": "==1.5.1"
+        },
         "werkzeug": {
             "hashes": [
                 "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c",

+ 5 - 1
app/__init__.py

@@ -7,6 +7,7 @@ import os
 
 from flask import Flask
 from dotenv import load_dotenv
+from flask_apscheduler import APScheduler
 
 
 load_dotenv()
@@ -16,8 +17,11 @@ class Config():
     SECRET_KEY = os.environ["SECRET_KEY"]
     SEND_FILE_MAX_AGE_DEFAULT = 1296000
 
-
 app = Flask(__name__)
 app.config.from_object(Config())
 app.jinja_env.lstrip_blocks = True
 app.jinja_env.trim_blocks = True
+
+scheduler = APScheduler()
+scheduler.init_app(app)
+scheduler.start()

+ 4 - 35
app/flaskr.py

@@ -7,10 +7,10 @@ import os
 import hashlib
 import hmac
 import subprocess
-import shutil
 
 from flask import jsonify, abort, request, send_from_directory
 from app import app
+from app.util import job
 
 
 @app.route('/')
@@ -46,39 +46,8 @@ def tutorial_dist_png():
 
 @app.route('/typeset', methods=['GET', 'POST'])
 def typeset():
-    """Show index page"""
-    working_dir = os.getcwd()
-    if os.path.basename(working_dir) == 'rr':
-        os.chdir('rr_tutorial')
-
-    book_toc_size = os.path.getsize('master_book.toc') \
-        if os.path.isfile('master_book.toc') else 0
-    article_toc_size = os.path.getsize('master_article.toc') \
-        if os.path.isfile('master_article.toc') else 0
-    dist_toc_size = os.path.getsize('master_dist.toc') \
-        if os.path.isfile('master_dist.toc') else 0
-
-    subprocess.check_output(['xelatex', '-halt-on-error', 'master_book.tex'])
-    subprocess.check_output(['xelatex', '-halt-on-error', 'master_article.tex'])
-    subprocess.check_output(['./set.sh'])
-
-    if book_toc_size != os.path.getsize('master_book.toc'):
-        subprocess.check_output(['xelatex', '-halt-on-error', 'master_book.tex'])
-
-    if article_toc_size != os.path.getsize('master_article.toc'):
-        subprocess.check_output(['xelatex', '-halt-on-error', 'master_article.tex'])
-
-    if dist_toc_size != os.path.getsize('master_dist.toc'):
-        subprocess.check_output(['./set.sh'])
-
-    shutil.copyfile('master_book.pdf', '../app/static/tutorial/book.pdf')
-    shutil.copyfile('master_article.pdf', '../app/static/tutorial/article.pdf')
-    shutil.copyfile('master_dist.pdf', '../app/static/tutorial/dist.pdf')
-
-    subprocess.check_output(['./convert.sh'])
-    shutil.copyfile('master_dist.png', '../app/static/tutorial/dist.png')
-
-    os.chdir(working_dir)
+    """Add job to schedeuler"""
+    job.add()
     return jsonify(True)
 
 
@@ -91,7 +60,7 @@ def deploy():
     if len(signature) < 2 or not hmac.compare_digest(signature, digest):
         abort(400, 'Invalid signature')
 
-    subprocess.call(['pipenv', 'sync'])
     subprocess.call(['git', 'pull'])
+    subprocess.call(['pipenv', 'sync'])
     subprocess.call(['touch', 'flask.wsgi'])
     return jsonify(True)

+ 58 - 0
app/util/job.py

@@ -0,0 +1,58 @@
+"""Scheduler class"""
+
+import os
+import subprocess
+import shutil
+from datetime import datetime
+
+from app import scheduler
+
+
+def add():
+    """Schedule job"""
+    job = scheduler.get_job("set")
+    if job is None:
+        job = scheduler.add_job(
+            id="set",
+            func=run,
+            trigger="date",
+        )
+
+
+def run():
+    """Run the job"""
+    print("Running")
+    working_dir = os.getcwd()
+    if os.path.basename(working_dir) != 'rr_tutorial':
+        os.chdir('rr_tutorial')
+
+    book_toc_size = os.path.getsize('master_book.toc') \
+        if os.path.isfile('master_book.toc') else 0
+    article_toc_size = os.path.getsize('master_article.toc') \
+        if os.path.isfile('master_article.toc') else 0
+    dist_toc_size = os.path.getsize('master_dist.toc') \
+        if os.path.isfile('master_dist.toc') else 0
+
+    subprocess.check_output(['xelatex', '-halt-on-error', 'master_book.tex'])
+    subprocess.check_output(['xelatex', '-halt-on-error', 'master_article.tex'])
+    subprocess.check_output(['./set.sh'])
+
+    if book_toc_size != os.path.getsize('master_book.toc'):
+        subprocess.check_output(['xelatex', '-halt-on-error', 'master_book.tex'])
+
+    if article_toc_size != os.path.getsize('master_article.toc'):
+        subprocess.check_output(['xelatex', '-halt-on-error', 'master_article.tex'])
+
+    if dist_toc_size != os.path.getsize('master_dist.toc'):
+        subprocess.check_output(['./set.sh'])
+
+    shutil.copyfile('master_book.pdf', '../app/static/tutorial/book.pdf')
+    shutil.copyfile('master_article.pdf', '../app/static/tutorial/article.pdf')
+    shutil.copyfile('master_dist.pdf', '../app/static/tutorial/dist.pdf')
+
+    subprocess.check_output(['./convert.sh'])
+    shutil.copyfile('master_dist.png', '../app/static/tutorial/dist.png')
+
+
+if __name__ == "__main__":
+    run.__module__ = "scheduler"