def get_plan_timetable(day, plan, orari, all_aule):
    if len(orari) == 0:
        return None
    timetable = Timetable()

    if plan.is_empty():
        return timetable

    start = datetime.datetime.strptime(
        day.strftime("%Y-%m-%d") + "T00:00:00", "%Y-%m-%dT%H:%M:%S")
    stop = datetime.datetime.strptime(
        day.strftime("%Y-%m-%d") + "T23:59:59", "%Y-%m-%dT%H:%M:%S")

    for t in plan.teachings:
        for o in orari[t.componente_id]:
            try:
                ##### DEBUG #####
                # if t.componente_id == '448380':
                #     print(t)
                #################
                inizio = datetime.datetime.strptime(o["inizio"],
                                                    "%Y-%m-%dT%H:%M:%S")

                if inizio > start and inizio < stop:
                    l = Lesson(
                        t.corso_codice, t.materia_codice,
                        t.materia_descrizione, t.docente_nome, t.componente_id,
                        t.url,
                        datetime.datetime.strptime(o["inizio"],
                                                   "%Y-%m-%dT%H:%M:%S"),
                        datetime.datetime.strptime(o["fine"],
                                                   "%Y-%m-%dT%H:%M:%S"),
                        t.anno, t.crediti, t.componente_padre,
                        t.componente_radice)
                    for code in o["aula_codici"].split():
                        try:
                            a = all_aule[code]
                            l.add_aula(a)
                        except:
                            l.add_aula(
                                Aula("-", "UNKNOWN AULA", "UNKNOWN ADDRESS",
                                     "", "NO LAT", "NO LON"))

                    timetable.add_lesson(l)
            except:
                traceback.print_exc()
                now = datetime.datetime.now()
                logging.info("TIMESTAMP = " +
                             now.strftime("%b %d %Y %H:%M:%S") +
                             " ### EXCEPTION = " + traceback.format_exc())

    timetable.lessons.sort(key=lambda x: x.inizio, reverse=False)
    return timetable
def get_lessons(chat_id, now, plan, orari, all_aule):

    timetable = Timetable()

    if plan.is_empty():
        return timetable

    u = um.get_user(chat_id)
    lesson_time = now + datetime.timedelta(minutes=u.notification_time)

    for t in plan.teachings:
        for o in orari[t.componente_id]:
            try:
                ##### DEBUG #####
                #                if t.componente_id == '448380':
                #                    print(t)
                #################
                inizio = datetime.datetime.strptime(o["inizio"],
                                                    "%Y-%m-%dT%H:%M:%S")

                if inizio == lesson_time:
                    l = Lesson(
                        t.corso_codice, t.materia_codice,
                        t.materia_descrizione, t.docente_nome, t.componente_id,
                        t.url,
                        datetime.datetime.strptime(o["inizio"],
                                                   "%Y-%m-%dT%H:%M:%S"),
                        datetime.datetime.strptime(o["fine"],
                                                   "%Y-%m-%dT%H:%M:%S"),
                        t.anno, t.crediti, t.componente_padre,
                        t.componente_radice)
                    for code in o["aula_codici"].split():
                        try:
                            a = all_aule[code]
                            l.add_aula(a)
                        except:
                            l.add_aula(
                                Aula("-", "UNKNOWN AULA", "UNKNOWN ADDRESS",
                                     "", "NO LAT", "NO LON"))

                    timetable.add_lesson(l)
            except:
                traceback.print_exc()
                now = datetime.datetime.now()
                logging.info("TIMESTAMP = " +
                             now.strftime("%b %d %Y %H:%M:%S") +
                             " ### EXCEPTION = " + traceback.format_exc())

    timetable.lessons.sort(key=lambda x: x.inizio, reverse=False)
    return timetable
def get_room_timetable(day, aula, orari_group_by_aula, all_teachings):
    if len(orari_group_by_aula) == 0:
        return None
    timetable = Timetable()

    start = datetime.datetime.strptime(
        day.strftime("%Y-%m-%d") + "T00:00:00", "%Y-%m-%dT%H:%M:%S")
    stop = datetime.datetime.strptime(
        day.strftime("%Y-%m-%d") + "T23:59:59", "%Y-%m-%dT%H:%M:%S")

    for o in orari_group_by_aula[aula.aula_codice]:
        try:
            inizio = datetime.datetime.strptime(o["inizio"],
                                                "%Y-%m-%dT%H:%M:%S")
            fine = datetime.datetime.strptime(o["fine"], "%Y-%m-%dT%H:%M:%S")

            if inizio > start and inizio < stop and aula.aula_codice in o[
                    "aula_codici"]:

                t = all_teachings[o["componente_id"]]

                l = Lesson(
                    t.corso_codice, t.materia_codice, t.materia_descrizione,
                    t.docente_nome, t.componente_id, t.url,
                    datetime.datetime.strptime(o["inizio"],
                                               "%Y-%m-%dT%H:%M:%S"),
                    datetime.datetime.strptime(o["fine"], "%Y-%m-%dT%H:%M:%S"),
                    t.anno, t.crediti, t.componente_padre, t.componente_radice)

                l.add_aula(aula)

                timetable.add_lesson(l)

        except:
            print(o)
            traceback.print_exc()
            now = datetime.datetime.now()
            logging.info("TIMESTAMP = " + now.strftime("%b %d %Y %H:%M:%S") +
                         " ### EXCEPTION = " + traceback.format_exc())

    timetable.lessons.sort(key=lambda x: x.inizio, reverse=False)
    return timetable
def get_plan_timetable_web_api(day, plan):
    timetable = Timetable()

    if plan.is_empty():
        return timetable

    orari_table = "orari_" + config.accademic_year
    aule_table = "aule_" + config.accademic_year
    url_o = "https://dati.unibo.it/api/action/datastore_search_sql"
    url_a = "https://dati.unibo.it/api/action/datastore_search?resource_id=" + \
        aule_table + "&q="

    sql_orari = "SELECT " + orari_table + ".inizio, " \
                + orari_table + ".fine, " \
                + orari_table + ".aula_codici, " \
                + orari_table + ".componente_id " \
                + " FROM " + orari_table \
                + " WHERE " + orari_table + ".inizio between \'" + day.strftime(
                    "%Y/%m/%d") + " 00:00:00\' and " + "\'" + day.strftime("%Y/%m/%d") + " 23:59:59\' AND ("

    for i in range(0, len(plan.teachings), 1):
        t = plan.teachings[i]
        if i == 0:
            sql_orari += orari_table + ".componente_id=" + t.componente_id
        else:
            sql_orari += " OR " + orari_table + ".componente_id=" + t.componente_id
    sql_orari += " )"

    headers = {
        'Content-type': 'application/json',
        'Accept': 'application/json'
    }
    json_orari = requests.post(url_o,
                               headers=headers,
                               data='{"sql":' + '"' + sql_orari + '"}').text

    try:
        ok = json.loads(json_orari)["success"]
    except:
        pass

    if ok:

        orari_dict = json.loads(json_orari)["result"]["records"]
        for o in orari_dict:
            try:
                componente_id = o["componente_id"]

                t = plan.find_teaching_by_componente_id(componente_id)
                if t != None:
                    ##### DEBUG #####
                    # if t.componente_id == '448380':
                    #     print(t)
                    #################
                    l = Lesson(
                        t.corso_codice, t.materia_codice,
                        t.materia_descrizione, t.docente_nome, t.componente_id,
                        t.url,
                        datetime.datetime.strptime(o["inizio"],
                                                   "%Y-%m-%dT%H:%M:%S"),
                        datetime.datetime.strptime(o["fine"],
                                                   "%Y-%m-%dT%H:%M:%S"),
                        t.anno, t.crediti, t.componente_padre,
                        t.componente_radice)
                    for code in o["aula_codici"].split():
                        try:
                            a = all_aule[code]
                            l.add_aula(a)
                        except:
                            l.add_aula(
                                Aula("-", "UNKNOWN AULA", "UNKNOWN ADDRESS",
                                     "", "NO LAT", "NO LON"))

                    timetable.add_lesson(l)
            except:
                traceback.print_exc()
                now = datetime.datetime.now()
                logging.info("TIMESTAMP = " +
                             now.strftime("%b %d %Y %H:%M:%S") +
                             " ### EXCEPTION = " + traceback.format_exc())
        timetable.lessons.sort(key=lambda x: x.inizio, reverse=False)
        return timetable
    else:
        return None