0
from flask import *
from redmine import Redmine
import sys

app = Flask(__name__)


REDMINE_KEY='sdfsdfsdfsdfsd'
REDMINE_URL='http://blabla/redmine'


redmine = Redmine(REDMINE_URL)
redmine = Redmine(REDMINE_URL, key=REDMINE_KEY)

neu = []
bearbeitung = []
erledigt = []

id_thema = ""
thema = ""
project = ""
zugewiesen = ""

def ticket_zugewiesen(diesTicket):
    alleticket = redmine.issue.get(diesTicket)
    try:
        alleticket.assigned_to
    except:
        return True


def ticket_infos(diesTicket):
    alleticket = redmine.issue.get(diesTicket)
    try:
        id_thema = alleticket.id
        thema = alleticket.subject
        project = alleticket.project.name
        zugewiesen = alleticket.assigned_to
    except:
        id_thema = alleticket.id
        thema = alleticket.subject
        project = alleticket.project.name

    return

neueIssues = redmine.issue.filter(status_id='1')
for i in neueIssues:
    neu.append(i.id)

neueIssues = redmine.issue.filter(status_id='2')
for i in neueIssues:
    bearbeitung.append(i.id)

neueIssues = redmine.issue.filter(status_id='5')
for i in neueIssues:
    erledigt.append(i.id)



@app.route('/_sendinfo')
def info():
    return jsonify(result=id_thema,thema=thema, project=project, zugewiesen=zugewiesen)

@app.route('/')
def home():
    while True:
        neu2 = []
        bearbeitung2 = []
        erledigt2 = []

        neueIssues = redmine.issue.filter(status_id='1')
        for neues in neueIssues:
            neu2.append(neues.id)

        neueIssues = redmine.issue.filter(status_id='2')
        for bearbeitetes in neueIssues:
            bearbeitung2.append(bearbeitetes.id)

        neueIssues = redmine.issue.filter(status_id='5')
        for erledigtes in neueIssues:
            erledigt2.append(erledigtes.id)

        for i in neu2:
            if i not in neu:
                janein = ticket_zugewiesen(i)
                if janein is True:
                    l = ticket_infos(i)
                else:
                    pass

        neu = neu2

        for ii in bearbeitung2:
            if ii not in bearbeitung:
                if ii in erledigt:
                    l = ticket_infos(ii)
                    erledigt = erledigt2
        bearbeitung = bearbeitung2

        for iii in erledigt2:
            if iii not in erledigt:
                l = ticket_infos(iii)
        erledigt = erledigt2
    return render_template("index.html")

if __name__ == '__main__':
    app.run()

How can I make this endless loop in home() work in flask? Now it does not work. Or is there a better way to get data from redmine?

I will check every round, that the endless loop make, if the three lists neu2, bearbeitung2, erledigt2 are equal to neu, bearbeitung, erledigt. And if there is a number more in "list2" i will display some information on the frontend (Browser) dynamically.

Samhamsam
  • 87
  • 9

2 Answers2

1

I do not know if this is a good idea, but I solved it.

from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(1) # number of executor
executor.submit(home) 
from concurrent.futures import ThreadPoolExecutor

from flask import *
from redmine import Redmine
import sys

app = Flask(__name__)


REDMINE_KEY='sdfsdfsdfsdfsd'
REDMINE_URL='http://blabla/redmine'


redmine = Redmine(REDMINE_URL)
redmine = Redmine(REDMINE_URL, key=REDMINE_KEY)

neu = []
bearbeitung = []
erledigt = []

id_thema = ""
thema = ""
project = ""
zugewiesen = ""

def ticket_zugewiesen(diesTicket):
    alleticket = redmine.issue.get(diesTicket)
    try:
        alleticket.assigned_to
    except:
        return True


def ticket_infos(diesTicket):
    alleticket = redmine.issue.get(diesTicket)
    try:
        id_thema = alleticket.id
        thema = alleticket.subject
        project = alleticket.project.name
        zugewiesen = alleticket.assigned_to
    except:
        id_thema = alleticket.id
        thema = alleticket.subject
        project = alleticket.project.name

    return

neueIssues = redmine.issue.filter(status_id='1')
for i in neueIssues:
    neu.append(i.id)

neueIssues = redmine.issue.filter(status_id='2')
for i in neueIssues:
    bearbeitung.append(i.id)

neueIssues = redmine.issue.filter(status_id='5')
for i in neueIssues:
    erledigt.append(i.id)



@app.route('/_sendinfo')
def info():
    return jsonify(result=id_thema,thema=thema, project=project, zugewiesen=zugewiesen)

executor = ThreadPoolExecutor(1) # number of executor

def home():
    while True:
        neu2 = []
        bearbeitung2 = []
        erledigt2 = []

        neueIssues = redmine.issue.filter(status_id='1')
        for neues in neueIssues:
            neu2.append(neues.id)

        neueIssues = redmine.issue.filter(status_id='2')
        for bearbeitetes in neueIssues:
            bearbeitung2.append(bearbeitetes.id)

        neueIssues = redmine.issue.filter(status_id='5')
        for erledigtes in neueIssues:
            erledigt2.append(erledigtes.id)

        for i in neu2:
            if i not in neu:
                janein = ticket_zugewiesen(i)
                if janein is True:
                    l = ticket_infos(i)
                else:
                    pass

        neu = neu2

        for ii in bearbeitung2:
            if ii not in bearbeitung:
                if ii in erledigt:
                    l = ticket_infos(ii)
                    erledigt = erledigt2
        bearbeitung = bearbeitung2

        for iii in erledigt2:
            if iii not in erledigt:
                l = ticket_infos(iii)
        erledigt = erledigt2
    return render_template("index.html")


if __name__ == '__main__':
    executor.submit(home) 
    app.run()
Cho
  • 163
  • 3
  • 13
0

If I understand you correctly, you want to keep pushing updates to the browser from a single Flask route. Sadly, that is not possible. You will need to look into using browser-side JavaScript and either polling with AJAX, or websockets to push real-time updates.

The choice between AJAX and WS depends on your specific use case. Try looking into both. AJAX is probably simpler to set up, but Flask has some WS support as far as I can tell: https://github.com/miguelgrinberg/Flask-SocketIO

EDIT: You can also try using Server-Sent Events, if you don't need to support old browsers (though there seem to be polyfills, which provide support in old browsers as well). They are well explained here: How to implement server push in Flask framework? and seem really easy to use, though I've never personally tried.

Community
  • 1
  • 1
ralh
  • 2,514
  • 1
  • 13
  • 19
  • Yea, thats correct! I will push updates to the Website. So, how can i poll with AJAX? I have no idea how i can make that. Can you give me a simple example? – Samhamsam Sep 23 '15 at 11:50
  • You would need to do that using JavaScript. I don't think explaining AJAX in a SO comment makes sense. Google around. I've also edited my answer for SSE. You can try them, the question I linked comes with a full example. – ralh Sep 23 '15 at 11:55
  • Ok, thank you. I will try the Server-Sent Events. It seems easy to me. Lets see. – Samhamsam Sep 23 '15 at 11:58