Add admin function to import foreign release URLs

This commit is contained in:
rubenwardy 2020-07-14 00:28:56 +01:00
parent 3fbc5f7751
commit aa6892da82
3 changed files with 42 additions and 2 deletions

View File

@ -21,7 +21,7 @@ import flask_menu as menu
from . import bp from . import bp
from app.models import * from app.models import *
from celery import uuid, group from celery import uuid, group
from app.tasks.importtasks import importRepoScreenshot, makeVCSRelease, checkZipRelease, updateMetaFromRelease from app.tasks.importtasks import importRepoScreenshot, makeVCSRelease, checkZipRelease, updateMetaFromRelease, importForeignDownloads
from app.tasks.forumtasks import importTopicList, checkAllForumAccounts from app.tasks.forumtasks import importTopicList, checkAllForumAccounts
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import * from wtforms import *
@ -71,6 +71,21 @@ def admin_page():
return redirect(url_for("todo.view")) return redirect(url_for("todo.view"))
elif action == "importforeign":
releases = PackageRelease.query.filter(PackageRelease.url.like("http%")).all()
tasks = []
for release in releases:
tasks.append(importForeignDownloads.s(release.id))
result = group(tasks).apply_async()
while not result.ready():
import time
time.sleep(0.1)
return redirect(url_for("todo.view"))
elif action == "importmodlist": elif action == "importmodlist":
task = importTopicList.delay() task = importTopicList.delay()
return redirect(url_for("tasks.check", id=task.id, r=url_for("todo.topics"))) return redirect(url_for("tasks.check", id=task.id, r=url_for("todo.topics")))

View File

@ -27,7 +27,7 @@ from zipfile import ZipFile
from app import app from app import app
from app.models import * from app.models import *
from app.tasks import celery, TaskError from app.tasks import celery, TaskError
from app.utils import randomString from app.utils import randomString, getExtension
from .minetestcheck import build_tree, MinetestCheckError, ContentType from .minetestcheck import build_tree, MinetestCheckError, ContentType
from .minetestcheck.config import parse_conf from .minetestcheck.config import parse_conf
@ -341,3 +341,27 @@ def importRepoScreenshot(id):
print("screenshot.png does not exist") print("screenshot.png does not exist")
return None return None
@celery.task(bind=True)
def importForeignDownloads(self, id):
release = PackageRelease.query.get(id)
if release is None:
raise TaskError("No such release!")
elif release.package is None:
raise TaskError("No package attached to release")
elif not release.url.startswith("http"):
return
try:
ext = getExtension(release.url)
filename = randomString(10) + "." + ext
filepath = os.path.join(app.config["UPLOAD_DIR"], filename)
urllib.request.urlretrieve(release.url, filepath)
release.url = "/uploads/" + filename
db.session.commit()
except urllib.error.URLError:
release.task_id = self.request.id
release.approved = False
db.session.commit()

View File

@ -28,6 +28,7 @@
<option value="checkreleases">Validate all Zip releases</option> <option value="checkreleases">Validate all Zip releases</option>
<option value="reimportpackages">Reimport meta</option> <option value="reimportpackages">Reimport meta</option>
<option value="importmodlist">Import forum topics</option> <option value="importmodlist">Import forum topics</option>
<option value="importforeign">Import foreign release downloads</option>
<option value="recalcscores">Recalculate package scores</option> <option value="recalcscores">Recalculate package scores</option>
<option value="checkusers">Check forum users</option> <option value="checkusers">Check forum users</option>
<option value="importscreenshots">Import screenshots from VCS</option> <option value="importscreenshots">Import screenshots from VCS</option>