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:
# 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)
<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>
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() {
});
}
-setInterval(function(){updateProgress()},1000);
+var ticker = setInterval(function(){updateProgress()},1000);
</script>
{% endblock %}
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
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