]> www.vanbest.org Git - tweet-django-debian/commitdiff
Fix stream export UI
authorJan-Pascal van Best <janpascal@vanbest.org>
Mon, 22 Feb 2016 19:28:28 +0000 (20:28 +0100)
committerJan-Pascal van Best <janpascal@vanbest.org>
Mon, 22 Feb 2016 19:28:28 +0000 (20:28 +0100)
.gitignore
tweet/streamrunner.py
tweet/templates/tweet/export_stream.html
tweet/templates/tweet/index.html
tweet/templates/tweet/list_stream.html
tweet/views.py

index 8cf8bb1cec417b7dcd5e07f18358eb091301cd9a..d8d701f9c2f509e08d36ad09531d64343d5c9a0d 100644 (file)
@@ -5,3 +5,4 @@
 __pycache__
 *.pyc
 *.log
+.*.swp
index da0310777b8b41587e31f0f9912b8cebdaf8608c..c1b230a02c6000d812be500599ac431cca0058a1 100644 (file)
@@ -90,15 +90,6 @@ def run_stream():
             time.sleep(5)
             start_stream(terms)
 
-def export_tweets(filename):
-    exporter = ExcelExporter(filename)
-    tweets = Tweet.objects.filter(conforms_to_terms=True).order_by('-pk')
-    for tweet in tweets:
-        tweet.fill_address()
-        tweet.save(update_fields=['address'])
-        exporter.add_tweet(tweet)
-    exporter.close()
-
 def check_match(status):
     result = False
     if _match_pattern.search(status["text"]) is not None:
@@ -190,3 +181,36 @@ def check_match(status):
 #    logger.debug(json.dumps(status))
 
     return False
+
+class Exporter:
+    def __init__(self, filename):
+        self.filename = filename
+        self.thread = None
+        self.total = 100
+        self.done = 0
+        self.finished = False
+
+    def export_tweets(self):
+        exporter = ExcelExporter(self.filename)
+        tweets = Tweet.objects.filter(conforms_to_terms=True).order_by('-pk')
+        self.total = tweets.count()
+        self.done = 0
+        self.finished = False
+        for tweet in tweets:
+            tweet.fill_address()
+            tweet.save(update_fields=['address'])
+            exporter.add_tweet(tweet)
+            self.done += 1
+        exporter.close()
+        self.finished = True
+
+    def start(self):
+        self.thread = threading.Thread(target=self.export_tweets, name="Stream exporter thread")
+        self.thread.start()
+
+    def percentage(self):
+        if self.finished:
+            return 100
+        if self.total == 0:
+            return 0
+        return int(100.0 * self.done / self.total)
index b78fb7019d617571980be4a165a3f33182caeac4..fa53074aceb84b8e320ebf8b1c95c15b0dbc7d90 100644 (file)
@@ -9,9 +9,10 @@
 
     <h2>Voortgang</h2>
     <p>Het Excel-bestand wordt nu voor je gemaakt, even geduld aub...</p>
+    <p><span id="done">0</span> van de <span id="total">?</span> tweets ge-exporteerd</p>
     <div class="progress">
-      <div class="progress-bar" role="progressbar" aria-valuenow="2" aria-valuemin="0" aria-valuemax="100" style="min-width: 2em; width: 2%;">
-        2%
+      <div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="min-width: 2em; width: 0%;">
+        0%
       </div>
     </div>
     <a class="btn btn-success" disabled="disabled" href="{% url 'tweet:download_stream' %}">Download Excel</a>
@@ -29,8 +30,11 @@ var updateProgress=function() {
           bar.html(data.progress+"%");
           bar.css('width', data.progress+'%');
           bar.attr("aria-valuenow", data.progress);
+          $("#done").html(data.done);
+          $("#total").html(data.total);
           if(data.finished) {
             $(".btn").removeAttr("disabled");
+            clearInterval(ticker);
           }
         },
         error: function() {
@@ -40,6 +44,6 @@ var updateProgress=function() {
   });
 }
 
-setInterval(function(){updateProgress()},1000);
+var ticker = setInterval(function(){updateProgress()},1000);
 </script>
 {% endblock %}   
index 41e55d16c2aacfc3865815057bf5e32acaa0d34a..014510dce8fd38848f1cee2037aed678287d1662 100644 (file)
@@ -17,6 +17,6 @@
    <a class="btn btn-success" href="{% url 'tweet:list_stream' %}">Overzicht resultaten</a>
 <br>
 <br>
-   <a class="btn btn-success" href="{% url 'tweet:download_stream' %}">Download resultaten</a>
+   <a class="btn btn-success" href="{% url 'tweet:export_stream' %}">Download resultaten</a>
 
 {% endblock %}   
index 19e9fc43ea5ac8c7dd2a08eb5e0dd9fb68fbaee2..0b2c938cc42f629a48e6b679ec51d3df0503fb5d 100644 (file)
@@ -17,7 +17,7 @@
     </p>
     <div class="controls">
      <a class="btn btn-primary" href="{% url 'tweet:edit_stream_terms' %}">Pas zoektermen aan</a>
-     <a class="btn btn-success" href="{% url 'tweet:download_stream' %}">Download resultaten</a>
+     <a class="btn btn-success" href="{% url 'tweet:export_stream' %}">Download resultaten</a>
      <a class="btn btn-primary" href="{% url 'tweet:list_stream' %}?page={{ tweets.number }}">Ververs</a>
    </div>
 
index 52e8fe69d732d5fd66a1e7c0dabe9e0b959098e6..1467d3b09882b2d65aae606e7747462ab19ee3db 100644 (file)
@@ -13,7 +13,7 @@ from django.contrib import messages
 from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
 from django.core.urlresolvers import reverse
 from django.http import HttpResponse, JsonResponse, FileResponse
-from django.http import HttpResponseRedirect, Http404
+from django.http import HttpResponseRedirect, Http404, HttpResponseServerError
 from django.shortcuts import get_object_or_404, render
 from django.utils import timezone
  
@@ -154,28 +154,41 @@ def edit_stream_terms(request):
     terms = Settings.get().stream_terms
     return render(request, "tweet/edit_stream_terms.html", {'terms': terms})
 
-def download_stream(request):
-    logger.info("Exporting stream tweets to excel...")
-    base_path = settings.TWEET_BASEPATH
-    filename = os.path.join(base_path, "tmp.xlsx")
-    #streamrunner.export_tweets(filename)
-    response = FileResponse(open(filename, 'rb'), content_type='application/vnd.ms-excel')
-    response['Content-Disposition'] = 'attachment; filename="stream.xlsx"'
-    return response
+_exporter = None
 
 def export_stream(request):
+    global _exporter
     logger.info("Exporting stream tweets to excel...")
     base_path = settings.TWEET_BASEPATH
-    filename = os.path.join(base_path, "tmp.xlsx")
-    #streamrunner.export_tweets(filename)
-    thread = threading.Thread(target=streamrunner.export_tweets, name="Stream exporter thread",
-            kwargs={'filename':filename}) 
-    thread.start()
+    filename = os.path.join(base_path, "tweets-{}.xlsx".format(datetime.datetime.now().isoformat()))
+    _exporter = streamrunner.Exporter(filename)
+    _exporter.start()
     return render(request, "tweet/export_stream.html")
 
 def export_stream_progress(request):
-    result = {
-        "progress": 33,
-        "finished": True
-    }
+    global _exporter
+    if _exporter is None:
+        result = {
+            "progress": 0,
+            "done": 0,
+            "total": 0,
+            "finished": False
+        }
+    else:
+        result = {
+            "progress": _exporter.percentage(),
+            "finished": _exporter.finished,
+            "total": _exporter.total,
+            "done": _exporter.done,
+        }
     return JsonResponse(result)
+
+def download_stream(request):
+    global _exporter
+    logger.info("Exporting stream tweets to excel...")
+    if _exporter is None:
+        return HttpResponseServerError("No stream to download...")
+    response = FileResponse(open(_exporter.filename, 'rb'), content_type='application/vnd.ms-excel')
+    filename = os.path.basename(_exporter.filename)
+    response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
+    return response