diff options
Diffstat (limited to 'module')
| -rw-r--r-- | module/FileDatabase.py | 43 | ||||
| -rw-r--r-- | module/web/ajax/urls.py | 2 | ||||
| -rw-r--r-- | module/web/ajax/views.py | 9 | ||||
| -rw-r--r-- | module/web/media/default/css/default.css | 9 | ||||
| -rw-r--r-- | module/web/templates/default/base.html | 6 | ||||
| -rw-r--r-- | module/web/templates/default/collector.html | 7 | ||||
| -rw-r--r-- | module/web/templates/default/package_ui.js | 156 | ||||
| -rw-r--r-- | module/web/templates/default/queue.html | 6 | 
8 files changed, 173 insertions, 65 deletions
| diff --git a/module/FileDatabase.py b/module/FileDatabase.py index 818c6ed07..631269030 100644 --- a/module/FileDatabase.py +++ b/module/FileDatabase.py @@ -165,6 +165,7 @@ class FileHandler:          p = self.getPackage(id)          if not p: +            if self.packageCache.has_key(id): del self.packageCache[id]              return          e = RemoveEvent("pack", id, "collector" if not p.queue else "queue") @@ -208,7 +209,7 @@ class FileHandler:          self.core.pullManager.addEvent(e)          p = self.getPackage(pid) -        if len(p.getChildren()) == 0: +        if not len(p.getChildren()):              p.delete()      #---------------------------------------------------------------------- @@ -507,6 +508,34 @@ class FileHandler:          self.core.threadManager.createInfoThread(urls, pid) +    @lock +    @change +    def deleteFinishedLinks(self): +        """ deletes finished links and packages, return deleted packages """ + +        old_packs = self.getInfoData(0) +        old_packs.update(self.getInfoData(1)) + +        self.db.deleteFinished() +         +        new_packs = self.db.getAllPackages(0) +        new_packs.update(self.db.getAllPackages(1)) +        #get new packages only from db + +        deleted = [] +        for id in old_packs.iterkeys(): +            if not new_packs.has_key(str(id)): +                deleted.append(id) +                self.deletePackage(int(id)) + +        return deleted + +    @lock +    @change +    def restartFailed(self): +        """ restart all failed links """ +        self.db.restartFailed() +  #########################################################################  class FileDatabaseBackend(Thread):      """underlying backend for the filehandler to save the data""" @@ -879,7 +908,7 @@ class FileDatabaseBackend(Thread):          cmd = "("          for i, item in enumerate(occ): -            if i != 0: cmd += ", " +            if i: cmd += ", "              cmd += "'%s'" % item          cmd += ")" @@ -906,6 +935,16 @@ class FileDatabaseBackend(Thread):          self.c.execute("SELECT id FROM links WHERE package=? AND status NOT IN (0, 13) LIMIT 3", (str(pid),))          return [r[0] for r in self.c] +    @queue +    def deleteFinished(self): +        self.c.execute("DELETE FROM links WHERE status=0") +        self.c.execute("DELETE FROM packages WHERE NOT EXISTS(SELECT 1 FROM links WHERE packages.id=links.package)") + + +    @queue +    def restartFailed(self): +        self.c.execute("UPDATE links SET status=3,error='' WHERE status IN (8, 9)") +  if __name__ == "__main__":      pypath = "." diff --git a/module/web/ajax/urls.py b/module/web/ajax/urls.py index f661b2b6a..ebbf401af 100644 --- a/module/web/ajax/urls.py +++ b/module/web/ajax/urls.py @@ -31,4 +31,6 @@ urlpatterns = patterns('ajax',                          (r'^package_order/([0-9|]+)$', 'views.package_order'),                          (r'^link_order/([0-9|]+)$', 'views.link_order'),                          (r'edit_package$', 'views.edit_package'), +                        (r'restart_failed$', 'views.restart_failed'), +                        (r'delete_finished$', 'views.delete_finished'),                         )
\ No newline at end of file diff --git a/module/web/ajax/views.py b/module/web/ajax/views.py index f90052b62..acceac585 100644 --- a/module/web/ajax/views.py +++ b/module/web/ajax/views.py @@ -310,3 +310,12 @@ def set_captcha(request):          return JsonResponse({'captcha': True, 'src': src, 'id': id})      else:          return JsonResponse({'captcha': False}) + + +@permission('pyload.can_delete') +def delete_finished(request): +    return JsonResponse({"del":settings.PYLOAD.delete_finished()}) + +@permission('pyload.can_delete') +def restart_failed(request): +    return JsonResponse(settings.PYLOAD.restart_failed())
\ No newline at end of file diff --git a/module/web/media/default/css/default.css b/module/web/media/default/css/default.css index 8ca554e9b..b73ec2278 100644 --- a/module/web/media/default/css/default.css +++ b/module/web/media/default/css/default.css @@ -165,7 +165,7 @@ h5 {  h6 {
  	font-size:80%;
  }
 -ul#page-actions {
 +ul#page-actions, ul#page-actions-more {
  	float:right;
  	margin:10px 10px 0 10px;
  	padding:6px;
 @@ -186,10 +186,10 @@ ul#user-actions {  	-moz-border-radius:3px;
  	border-radius:3px;
  }
 -ul#page-actions li, ul#user-actions li {
 +ul#page-actions li, ul#user-actions li, ul#page-actions-more li {
  	display:inline;
  }
 -ul#page-actions a, ul#user-actions a {
 +ul#page-actions a, ul#user-actions a, ul#page-actions-more a {
  	text-decoration:none;
  	color:black;
  	display:inline;
 @@ -230,7 +230,8 @@ ul#page-actions2 a, ul#user-actions2 a {  	margin:0 3px;
  	padding:2px 0px 2px 18px;
  }
 -ul#page-actions2 a:hover, ul#page-actions2 a:focus, ul#user-actions2 a:hover, ul#user-actions2 a:focus {
 +ul#page-actions2 a:hover, ul#page-actions2 a:focus, ul#user-actions2 a:hover, ul#user-actions2 a:focus,
 +ul#page-actions-more a:hover, ul#page-actions-more a:focus{
  	color: #4e7bb4;
  }
  /****************************/
 diff --git a/module/web/templates/default/base.html b/module/web/templates/default/base.html index 9b9622a12..94fcd4291 100644 --- a/module/web/templates/default/base.html +++ b/module/web/templates/default/base.html @@ -273,9 +273,13 @@ function AddBox()      <li><a class="action backlink">{% trans "Speed:" %} <b id="speed">{{ status.speed }}</b> kb/s</a></li>
      <li><a class="action cog">{% trans "Active:" %} <b id="aktiv">{{ status.activ }}</b> / <b id="aktiv_from">{{ status.queue }}</b></a></li>
      <li><a href=""  class="action revisions" accesskey="o" rel="nofollow">{% trans "Reload page" %}</a></li>
 -</ul><br />
 +</ul>
  {% endif %}
 +{% block pageactions %}
 +{% endblock %}
 +<br/>
 +
  <div id="body-wrapper" class="dokuwiki">
  <div id="content" lang="en" dir="ltr">
 diff --git a/module/web/templates/default/collector.html b/module/web/templates/default/collector.html index 1a7a4aa0c..c0ac78202 100644 --- a/module/web/templates/default/collector.html +++ b/module/web/templates/default/collector.html @@ -36,6 +36,13 @@ document.addEvent("domready", function(){      <a href="/settings/"  class="action index" accesskey="x" rel="nofollow"><img src="{{ MEDIA_URL }}img/head-menu-config.png" alt="" />{% trans "Config" %}</a>
  </li>{% endblock %}
 +{% block pageactions %}
 +<ul id="page-actions-more">
 +    <li id="del-finished"><a style="padding: 0; font-weight: bold;" href="#">{% trans "Delete Finished" %}</a></li>
 +    <li id="restart-failed"><a style="padding: 0; font-weight: bold;" href="#">{% trans "Restart Failed" %}</a></li>
 +</ul>
 +{% endblock %}
 +
  {% block content %}
  <div id="load-success" style="opacity: 0; float: right; color: white; background-color: #90ee90; padding: 4px; -moz-border-radius: 5px; border-radius: 5px; font-weight: bold; margin-left: -100%; margin-top: -10px;">{% trans "success" %}</div>
  <div id="load-failure" style="opacity: 0; float: right; color: white; background-color: #f08080; padding: 4px; -moz-border-radius: 5px; border-radius: 5px; font-weight: bold; margin-left: -100%; margin-top: -10px;">{% trans "failure" %}</div>
 diff --git a/module/web/templates/default/package_ui.js b/module/web/templates/default/package_ui.js index 75e6ef234..eec645184 100644 --- a/module/web/templates/default/package_ui.js +++ b/module/web/templates/default/package_ui.js @@ -1,17 +1,17 @@  //{% load i18n %}  var load, success, fail, pack_box; -document.addEvent("domready", function(){ +document.addEvent("domready", function() {      load = new Fx.Tween($("load-indicator"), {link: "cancel"});      success = new Fx.Tween($("load-success"), {link: "chain"});      fail = new Fx.Tween($("load-failure"), {link: "chain"}); -    [load,success,fail].each(function(fx){ +    [load,success,fail].each(function(fx) {          fx.set("opacity", 0)      });      pack_box = new Fx.Tween($('pack_box')); -    $('pack_reset').addEvent('click', function(){ +    $('pack_reset').addEvent('click', function() {          hide_pack()      });  }); @@ -25,34 +25,34 @@ function indicateFinish() {      load.start("opacity", 0)  } -function indicateSuccess(){ +function indicateSuccess() {      indicateFinish(); -    success.start("opacity", 1).chain(function(){ -        (function(){ +    success.start("opacity", 1).chain(function() { +        (function() {              success.start("opacity", 0);          }).delay(250);      });  } -function indicateFail(){ +function indicateFail() {      indicateFinish(); -    fail.start("opacity", 1).chain(function(){ -        (function(){ +    fail.start("opacity", 1).chain(function() { +        (function() {              fail.start("opacity", 0);          }).delay(250);      });  } -function show_pack(){ +function show_pack() {      bg_show();      $("pack_box").setStyle('display', 'block'); -    pack_box.start('opacity',1) +    pack_box.start('opacity', 1)  } -function hide_pack(){ +function hide_pack() {      bg_hide(); -    pack_box.start('opacity',0).chain(function(){ +    pack_box.start('opacity', 0).chain(function() {          $('pack_box').setStyle('display', 'none');      });  } @@ -73,6 +73,10 @@ var PackageUI = new Class({              //onStart: this.startSort,              onComplete: this.saveSort.bind(this)          }); + +        $("del_finished").addEvent("click", this.deleteFinished.bind(this)); +        $("restart_failed").addEvent("click", this.restartFailed.bind(this)); +      },      parsePackages: function() { @@ -83,7 +87,40 @@ var PackageUI = new Class({      },      loadPackages: function() { +    }, +    deleteFinished: function() { +        indicateLoad(); +        new Request.JSON({ +            method: 'get', +            url: '/json/delete_finished', +            onSuccess: function(data) { +                if (data.del.length > 0) { +                    window.location.reload() +                } else { +                    this.packages.each(function(pack) { +                        pack.close(); +                    }); +                    indicateSuccess(); +                } +            }.bind(this), +            onFailure: indicateFail +        }).send(); +    }, + +    restartFailed: function() { +        indicateLoad(); +        new Request.JSON({ +            method: 'get', +            url: '/json/restart_failed', +            onSuccess: function(data) { +                this.packages.each(function(pack) { +                    pack.close(); +                }); +                indicateSuccess(); +            }.bind(this), +            onFailure: indicateFail +        }).send();      },      startSort: function(ele, copy) { @@ -91,13 +128,13 @@ var PackageUI = new Class({      saveSort: function(ele, copy) {          var order = []; -        this.sorts.serialize(function(li,pos){ -            if (li == ele && ele.retrieve("order") != pos){ -                order.push(ele.retrieve("pid")+"|"+pos) +        this.sorts.serialize(function(li, pos) { +            if (li == ele && ele.retrieve("order") != pos) { +                order.push(ele.retrieve("pid") + "|" + pos)              }              li.store("order", pos)          }); -        if (order.length > 0){ +        if (order.length > 0) {              indicateLoad();              new Request.JSON({                  method: 'get', @@ -126,15 +163,15 @@ var Package = new Class({              this.parseElement();          } -        var pname = this.ele.getElements(".packagename")[0];  +        var pname = this.ele.getElements(".packagename")[0];          this.buttons = new Fx.Tween(this.ele.getElements(".buttons")[0], {link: "cancel"});          this.buttons.set("opacity", 0); -        pname.addEvent("mouseenter", function(e){ +        pname.addEvent("mouseenter", function(e) {              this.buttons.start("opacity", 1)          }.bind(this)); -        pname.addEvent("mouseleave", function(e){ +        pname.addEvent("mouseleave", function(e) {              this.buttons.start("opacity", 0)          }.bind(this)); @@ -178,8 +215,8 @@ var Package = new Class({      createLinks: function(data) {          var ul = $("sort_children_{id}".substitute({"id": this.id}));          ul.erase("html"); -        data.links.each(function(link){ -            var li = new Element("li",{ +        data.links.each(function(link) { +            var li = new Element("li", {                  "style": {                      "margin-left": 0                  } @@ -193,8 +230,8 @@ var Package = new Class({              html += "<img title='{% trans "Delete Link" %}' style='cursor: pointer;' width='10px' height='10px' src='{{ MEDIA_URL }}img/delete.png' />  ";              html += "<img title='{% trans "Restart Link" %}' style='cursor: pointer;margin-left: -4px' width='10px' height='10px' src='{{ MEDIA_URL }}img/arrow_refresh.png' /></div>"; -            var div = new Element("div",{ -                "id": "file_"+link.id, +            var div = new Element("div", { +                "id": "file_" + link.id,                  "class": "child",                  "html": html              }); @@ -220,26 +257,26 @@ var Package = new Class({      },      registerLinkEvents: function() { -        this.ele.getElements('.child').each(function(child){ +        this.ele.getElements('.child').each(function(child) {              var lid = child.get('id').match(/[0-9]+/);              var imgs = child.getElements('.child_secrow img'); -            imgs[0].addEvent('click', function(e){ +            imgs[0].addEvent('click', function(e) {                  new Request({                      method: 'get', -                    url: '/json/remove_link/'+this, -                    onSuccess: function(){ -                        $('file_'+this).nix() +                    url: '/json/remove_link/' + this, +                    onSuccess: function() { +                        $('file_' + this).nix()                      }.bind(this),                      onFailure: indicateFail                  }).send();              }.bind(lid)); -            imgs[1].addEvent('click', function(e){ +            imgs[1].addEvent('click', function(e) {                  new Request({                      method: 'get', -                    url: '/json/restart_link/'+this, -                    onSuccess: function(){ -                        var ele = $('file_'+this); +                    url: '/json/restart_link/' + this, +                    onSuccess: function() { +                        var ele = $('file_' + this);                          var imgs = ele.getElements("img");                          imgs[0].set("src", "/media/default/img/status_queue.png");                          var spans = ele.getElements(".child_status"); @@ -269,8 +306,8 @@ var Package = new Class({          indicateLoad();          new Request({              method: 'get', -            url: '/json/remove_package/'+this.id, -            onSuccess: function(){ +            url: '/json/remove_package/' + this.id, +            onSuccess: function() {                  this.ele.nix();                  indicateFinish();              }.bind(this), @@ -283,16 +320,9 @@ var Package = new Class({          indicateLoad();          new Request({              method: 'get', -            url: '/json/restart_package/'+this.id, -            onSuccess: function(){ -                var child = this.ele.getElement('.children'); -                if (child.getStyle('display') == "block") { -                    child.dissolve(); -                } -                var ul = $("sort_children_{id}".substitute({"id": this.id})); -                ul.erase("html"); -                this.linksLoaded = false; -                     +            url: '/json/restart_package/' + this.id, +            onSuccess: function() { +                this.close();                  indicateSuccess();              }.bind(this),              onFailure: indicateFail @@ -300,12 +330,22 @@ var Package = new Class({          event.stop();      }, -    movePackage: function(event){ +    close: function() { +        var child = this.ele.getElement('.children'); +        if (child.getStyle('display') == "block") { +            child.dissolve(); +        } +        var ul = $("sort_children_{id}".substitute({"id": this.id})); +        ul.erase("html"); +        this.linksLoaded = false; +    }, + +    movePackage: function(event) {          indicateLoad();          new Request({              method: 'get', -            url: '/json/move_package/'+((this.ui.type +1) % 2) +"/"+ this.id, -            onSuccess: function(){ +            url: '/json/move_package/' + ((this.ui.type + 1) % 2) + "/" + this.id, +            onSuccess: function() {                  this.ele.nix();                  indicateFinish();              }.bind(this), @@ -314,7 +354,7 @@ var Package = new Class({          event.stop();      }, -    editPackage: function(event){ +    editPackage: function(event) {          $("pack_form").removeEvents("submit");          $("pack_form").addEvent("submit", this.savePackage.bind(this)); @@ -324,10 +364,10 @@ var Package = new Class({          $("pack_pws").set("value", this.password.get("text"));          var prio = 3; -        $("pack_prio").getChildren("option").each(function(item, index){ -           item.erase("selected"); -            if (prio.toString() == this.prio.get("text")){ -                item.set("selected","selected"); +        $("pack_prio").getChildren("option").each(function(item, index) { +            item.erase("selected"); +            if (prio.toString() == this.prio.get("text")) { +                item.set("selected", "selected");              }              prio--;          }.bind(this)); @@ -337,7 +377,7 @@ var Package = new Class({          event.stop();      }, -    savePackage: function(event){ +    savePackage: function(event) {          $("pack_form").send();          this.name.set("text", $("pack_name").get("value"));          this.folder.set("text", $("pack_folder").get("value")); @@ -349,13 +389,13 @@ var Package = new Class({      saveSort: function(ele, copy) {          var order = []; -        this.sorts.serialize(function(li,pos){ -            if (li == ele && ele.retrieve("order") != pos){ -                order.push(ele.retrieve("lid")+"|"+pos) +        this.sorts.serialize(function(li, pos) { +            if (li == ele && ele.retrieve("order") != pos) { +                order.push(ele.retrieve("lid") + "|" + pos)              }              li.store("order", pos)          }); -        if (order.length > 0){ +        if (order.length > 0) {              indicateLoad();              new Request.JSON({                  method: 'get', diff --git a/module/web/templates/default/queue.html b/module/web/templates/default/queue.html index cd16cf1c4..ec11bc365 100644 --- a/module/web/templates/default/queue.html +++ b/module/web/templates/default/queue.html @@ -37,6 +37,12 @@ document.addEvent("domready", function(){  </li>
  {% endblock %}
 +{% block pageactions %}
 +<ul id="page-actions-more">
 +    <li id="del_finished"><a style="padding: 0; font-weight: bold;" href="#">{% trans "Delete Finished" %}</a></li>
 +    <li id="restart_failed"><a style="padding: 0; font-weight: bold;" href="#">{% trans "Restart Failed" %}</a></li>
 +</ul>
 +{% endblock %}
  {% block content %}
  <div id="load-success" style="opacity: 0; float: right; color: white; background-color: #90ee90; padding: 4px; -moz-border-radius: 5px; border-radius: 5px; font-weight: bold; margin-left: -100%; margin-top: -10px;">{% trans "success" %}</div>
 | 
