diff --git a/app/blueprints/packages/releases.py b/app/blueprints/packages/releases.py index cc209aa..1d11477 100644 --- a/app/blueprints/packages/releases.py +++ b/app/blueprints/packages/releases.py @@ -22,7 +22,7 @@ from . import bp from app.rediscache import has_key, set_key, make_download_key from app.models import * -from app.tasks.importtasks import makeVCSRelease, checkZipRelease +from app.tasks.importtasks import makeVCSRelease, checkZipRelease, updateMetaFromRelease from app.utils import * from celery import uuid @@ -111,6 +111,7 @@ def create_release(package): db.session.commit() checkZipRelease.apply_async((rel.id, uploadedPath), task_id=rel.task_id) + updateMetaFromRelease.delay(rel.id, uploadedPath) msg = "Release {} created".format(rel.title) addNotification(package.maintainers, current_user, msg, rel.getEditURL(), package) @@ -120,6 +121,7 @@ def create_release(package): return render_template("packages/release_new.html", package=package, form=form) + @bp.route("/packages///releases//download/") @is_package_page def download_release(package, id): @@ -149,6 +151,7 @@ def download_release(package, id): return redirect(release.url, code=300) + @bp.route("/packages///releases//", methods=["GET", "POST"]) @login_required @is_package_page diff --git a/app/blueprints/todo/__init__.py b/app/blueprints/todo/__init__.py index 12b0622..89e24b8 100644 --- a/app/blueprints/todo/__init__.py +++ b/app/blueprints/todo/__init__.py @@ -100,3 +100,12 @@ def topics(): topic_count=topic_count, query=qb.search, show_discarded=qb.show_discarded, \ next_url=next_url, prev_url=prev_url, page=page, page_max=query.pages, \ n=num, sort_by=qb.order_by) + + +@bp.route("/todo/tags/") +@login_required +def tags(): + packages = Package.query.filter_by(approved=True, soft_deleted=False).all() + tags = Tag.query.order_by(db.asc(Tag.title)).all() + + return render_template("todo/tags.html", packages=packages, tags=tags) diff --git a/app/public/static/tagselector.js b/app/public/static/tagselector.js index 9bbb764..f099415 100644 --- a/app/public/static/tagselector.js +++ b/app/public/static/tagselector.js @@ -19,80 +19,80 @@ $.fn.selectSelector = function(source, select) { return this.each(function() { - var selector = $(this), - input = $('input[type=text]', this); + var selector = $(this), + input = $('input[type=text]', this); - selector.click(function() { input.focus(); }) - .delegate('.badge a', 'click', function() { - var id = $(this).parent().data("id"); - select.find("option[value=" + id + "]").attr("selected", false) - recreate(); - }); + selector.click(function() { input.focus(); }) + .delegate('.badge a', 'click', function() { + var id = $(this).parent().data("id"); + select.find("option[value=" + id + "]").attr("selected", false) + recreate(); + }); - function addTag(id, text) { - $('') - .text(text + ' ') - .data("id", id) - .append('x') - .insertBefore(input); - input.attr("placeholder", null); - select.find("option[value='" + id + "']").attr("selected", "selected") - hide_error(input); - } + function addTag(id, text) { + $('') + .text(text + ' ') + .data("id", id) + .append('x') + .insertBefore(input); + input.attr("placeholder", null); + select.find("option[value='" + id + "']").attr("selected", "selected") + hide_error(input); + } - function recreate() { - selector.find("span").remove(); - select.find("option").each(function() { - if (this.hasAttribute("selected")) { - addTag(this.getAttribute("value"), this.innerText); - } - }); - } - recreate(); - - input.focusout(function(e) { - var value = input.val().trim() - if (value != "") { - show_error(input, "Please select an existing tag, it;s not possible to add custom ones."); + function recreate() { + selector.find("span").remove(); + select.find("option").each(function() { + if (this.hasAttribute("selected")) { + addTag(this.getAttribute("value"), this.innerText); } + }); + } + recreate(); + + input.focusout(function(e) { + var value = input.val().trim() + if (value != "") { + show_error(input, "Please select an existing tag, it;s not possible to add custom ones."); + } + }) + + input.keydown(function(e) { + if (e.keyCode === $.ui.keyCode.TAB && $(this).data('ui-autocomplete').menu.active) + e.preventDefault(); }) + .autocomplete({ + minLength: 0, + source: source, + select: function(event, ui) { + addTag(ui.item.id, ui.item.toString()); + input.val(""); + return false; + } + }).focus(function() { + // The following works only once. + // $(this).trigger('keydown.autocomplete'); + // As suggested by digitalPBK, works multiple times + // $(this).data("autocomplete").search($(this).val()); + // As noted by Jonny in his answer, with newer versions use uiAutocomplete + $(this).data("ui-autocomplete").search($(this).val()); + }); - input.keydown(function(e) { - if (e.keyCode === $.ui.keyCode.TAB && $(this).data('ui-autocomplete').menu.active) - e.preventDefault(); - }) - .autocomplete({ - minLength: 0, - source: source, - select: function(event, ui) { - addTag(ui.item.id, ui.item.toString()); - input.val(""); - return false; - } - }).focus(function() { - // The following works only once. - // $(this).trigger('keydown.autocomplete'); - // As suggested by digitalPBK, works multiple times - // $(this).data("autocomplete").search($(this).val()); - // As noted by Jonny in his answer, with newer versions use uiAutocomplete - $(this).data("ui-autocomplete").search($(this).val()); - }); + input.data('ui-autocomplete')._renderItem = function(ul, item) { + return $('
  • ') + .data('item.autocomplete', item) + .append($('').text(item.toString())) + .appendTo(ul); + }; - input.data('ui-autocomplete')._renderItem = function(ul, item) { - return $('
  • ') - .data('item.autocomplete', item) - .append($('').text(item.toString())) - .appendTo(ul); - }; - - input.data('ui-autocomplete')._resizeMenu = function(ul, item) { - var ul = this.menu.element; - ul.outerWidth(Math.max( - ul.width('').outerWidth(), - selector.outerWidth() - )); - }; - }); + input.data('ui-autocomplete')._resizeMenu = function(ul, item) { + var ul = this.menu.element; + ul.outerWidth(Math.max( + ul.width('').outerWidth(), + selector.outerWidth() + )); + }; + }); } $.fn.csvSelector = function(source, name, result, allowSlash) { diff --git a/app/scss/components.scss b/app/scss/components.scss index 3f10ed4..a9ce978 100644 --- a/app/scss/components.scss +++ b/app/scss/components.scss @@ -1,7 +1,7 @@ .ui-autocomplete, ui-front { position:absolute; cursor:default; - z-index:1001 !important + z-index:1100 !important } .ui-autocomplete { diff --git a/app/tasks/importtasks.py b/app/tasks/importtasks.py index e0b2308..ff085cd 100644 --- a/app/tasks/importtasks.py +++ b/app/tasks/importtasks.py @@ -299,6 +299,8 @@ def makeVCSRelease(id, branch): release.approve(release.package.author) db.session.commit() + updateMetaFromRelease.delay(release.id, destPath) + return release.url finally: shutil.rmtree(gitDir) diff --git a/app/templates/base.html b/app/templates/base.html index 534538b..a6b7b69 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -7,7 +7,7 @@ {% block title %}title{% endblock %} - {{ config.USER_APP_NAME }} - + diff --git a/app/templates/todo/tags.html b/app/templates/todo/tags.html new file mode 100644 index 0000000..e7675f8 --- /dev/null +++ b/app/templates/todo/tags.html @@ -0,0 +1,113 @@ +{% extends "base.html" %} + +{% block title %} + Tags +{% endblock %} + +{% block content %} + + + + + + + + + {% for package in packages %} + + + + + {% endfor %} +
    PackageTags
    + + {{ package.title }} + + + by {{ package.author.display_name }} + + {% for tag in package.tags %} + {{ tag.title }} + {% endfor %} + + + +
    + + +{% endblock %} + +{% from "macros/forms.html" import form_scripts %} + +{% block scriptextra %} +{{ form_scripts() }} + + +{% endblock %}