From: Jan-Pascal van Best Date: Mon, 22 Feb 2016 19:28:28 +0000 (+0100) Subject: Fix stream export UI X-Git-Tag: v1.2~1 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=8bb4e03835100a22ea7832dc23e77792cc0c4eec;p=tweet-django-debian Fix stream export UI --- diff --git a/.gitignore b/.gitignore index 8cf8bb1..d8d701f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ __pycache__ *.pyc *.log +.*.swp diff --git a/tweet/streamrunner.py b/tweet/streamrunner.py index da03107..c1b230a 100644 --- a/tweet/streamrunner.py +++ b/tweet/streamrunner.py @@ -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) diff --git a/tweet/templates/tweet/export_stream.html b/tweet/templates/tweet/export_stream.html index b78fb70..fa53074 100644 --- a/tweet/templates/tweet/export_stream.html +++ b/tweet/templates/tweet/export_stream.html @@ -9,9 +9,10 @@

Voortgang

Het Excel-bestand wordt nu voor je gemaakt, even geduld aub...

+

0 van de ? tweets ge-exporteerd

-
- 2% +
+ 0%
Download Excel @@ -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); {% endblock %} diff --git a/tweet/templates/tweet/index.html b/tweet/templates/tweet/index.html index 41e55d1..014510d 100644 --- a/tweet/templates/tweet/index.html +++ b/tweet/templates/tweet/index.html @@ -17,6 +17,6 @@ Overzicht resultaten

- Download resultaten + Download resultaten {% endblock %} diff --git a/tweet/templates/tweet/list_stream.html b/tweet/templates/tweet/list_stream.html index 19e9fc4..0b2c938 100644 --- a/tweet/templates/tweet/list_stream.html +++ b/tweet/templates/tweet/list_stream.html @@ -17,7 +17,7 @@

diff --git a/tweet/views.py b/tweet/views.py index 52e8fe6..1467d3b 100644 --- a/tweet/views.py +++ b/tweet/views.py @@ -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