scheduler DAL object has no attribute

33 views
Skip to first unread message

Yebach

unread,
Aug 22, 2018, 6:15:47 AM8/22/18
to web2py-users
Hello

I have a scheduler running some emailing tasks. After email is sent it should write into table mail_logger. When insert should happen I get an error DAL object has no attribute mail_logger. 

On my test environment everything is working fine. 

any suggestions?

Thank you

Anthony

unread,
Aug 22, 2018, 7:56:08 AM8/22/18
to web2py-users
Hard to say without seeing code. Obviously the mail_logger table is not defined in the context of the task being executed. Is it possible the db object is redefined somewhere in the code?

Yebach

unread,
Aug 22, 2018, 8:34:08 AM8/22/18
to web2py-users
Attaching code


#scheduler koda za pošiljanje mailov za stanje števcev
def send_mail_stevci(first_reminder = False):
    dons = datetime.datetime.now()
    #a = True
    try:
        if dons.day in [22,25,28]:
        #if a:
            counters_data_oddani = db((db.counters.c_date.year() == dons.year) &
                               (db.counters.c_date.month() == dons.month)).select(db.counters.c_user_inserted,
                                                                                  db.counters.c_machine_id,
                                                                                  db.machines.m_code,
                                                                                  join= db.machines.on(db.machines.id == db.counters.c_machine_id)).as_list()
            users_machines = db(db.user_machines.um_status == 1).select(db.user_machines.um_user,
                                        db.machines.m_code,
                                        db.machines.id,
                                        db.auth_user.email,
                                        join = [db.machines.on(db.user_machines.um_machine == db.machines.id),
                                        db.auth_user.on(db.user_machines.um_user == db.auth_user.id)]).as_list()




            from itertools import groupby
            from operator import itemgetter

            nw_users_machines = []
            #pogledamo kaj vse mašine ki jih user ima in za katere ni še oddal ta mesec
            #glede na to mu bomo pol pošiljal maile
            for rec in users_machines:
                if not any(d['counters']['c_machine_id'] == rec["machines"]["id"] for d in counters_data_oddani):
                    nw_users_machines.append({"user": rec["user_machines"]["um_user"], "m_code" : rec["machines"]["m_code"], "email": rec["auth_user"]["email"],
                                          "machine_id": rec["machines"]["id"]})



            #print nw_masine_neoodanih

            masine_uporabnikov_unique = [dict(t) for t in set([tuple(d.items()) for d in nw_users_machines])]

            #sortiramo po worker_nick
            sortWorkers = sorted(masine_uporabnikov_unique , key=itemgetter('user'))
            #print sortWorkers
            grouper = lambda x: (x["user"])
            result = []
            #print masine_neoddanih_unique
            masine_uporabnikov_grupirane= []
            for key, grp in groupby(sorted(sortWorkers, key = grouper), grouper):
                group = list(grp)
                all_machines =  [item['m_code'] for item in group]
                all_machines_codes = [(item['machine_id']) for item in group]
                # print group
                # print group[0]["user"], all_machines
                masine_uporabnikov_grupirane.append({"user": group[0]["user"], "mail" :group[0]["email"], "machines": all_machines, "machines_codes": all_machines_codes})

            for neoddan in masine_uporabnikov_grupirane:
                #if neoddan["machines"]:
                if neoddan["mail"] == 'vid....@gmail.com':
                    mail_send = False
                    dan = dons.day
                    #dan = 28
                    msg = "Email ni bil poslan. Ali še ni pravi datum ali pa nekaj ne dela"
                    if dan == 22:

                        msg = """<html>Pozdravljeni,<br />
                        <br />
                        bliža se konec meseca in ponovno je čas, da pristopite k vašim napravam, jim ukažete, da vam pokažejo,
                        koliko ste jih v tem mesecu mučili s tiskanjem ter nam to sporočite preko našega portala.<br />
                        <br />
                        Oddati morate stanja števcev za naprave s kodami <b>%s </b>.<br />
                        <br />
                        Sledite povezavi:<br />
                        kjer se prijavite z vašim uporabniškim imenom in geslom, katerega že poznate, ter oddate stanja za vsako napravo,
                        ki jo uporabljate.<br />
                        <br />
                        Punce v našem podjetju vam bodo zelo hvaležne, saj jim boste olajšali delo. Prav tako vas ne bodo motile pri vašem delu
                        s prošnjami glede stanja števcev, saj imate zagotovo dovolj dela, ker se bliža konec meseca. <br />
                        <br />
                        Za vsa vprašanja smo vam na voljo na ste...@bilban-resitve.si <br />
                        <br />
                        Lep pozdrav<br />
                        <br />
                        Ekipa Bilban<br />
                        </html>""" % (', '.join(x for x in neoddan["machines"]))
                        #print msg
                        mail_send = mail_reminder(neoddan, msg)

                    elif dan == 25:
                        msg = """<html>Pozdravljeni,<br />
                        <br />
                        radi bi vam sporočili, da smo že <b>25.</b> v mesecu, sistem pa nam sporoča, da nam še niste sporočili
                        stanja števcev vaših naprav. Res bi bili veseli in hvaležni, če lahko to uredite v čimkrajšem času.<br />
                        <br />
                        Za naprave s kodami <b> %s </b> še niste oddali stanja števcev. <br />
                        <br />
                        Prosimo sledite povezavi:<br />
                        kjer se prijavite z vašim uporabniškim imenom in geslom, katerega že poznate, ter oddate stanja za vsako napravo,
                        ki jo uporabljate.<br />
                        <br />
                        Hvala še enkret in lep pozdrav.<br />
                        <br />
                        Ekipa Bilban
                        </html>""" % (', '.join(x for x in neoddan["machines"]))
                        #print msg
                        mail_send = mail_reminder(neoddan, msg)

                    elif dan == 28:
                        msg = """<html>Pozdravljeni,<br />
                        <br />
                        spet mi iz Bilbana. Torej ja, ammmmm.... konec meseca je tu in stanja števcev vaših naprav še vedno ni v sistemu.<br />
                        <br />
                        Res, res, res bi vas prosili če si vzamete 10 minut časa, sledite povezavi
                        in nam sporočite stanja števcev za sledeče naprave <b>%s</b>. <br />
                        <br />
                        Naše punce so že pretežno nervozne, saj morajo po končanem zbiranju podatkov narediti še obračun in druga administrativna dela,
                        kar jim vzame precej časa. Prav tako bo kmalu nov mesec, kar pomeni kup težav, če nimamo podatkov in tudi vi boste jezni, če
                        računi in izračuni ne bodo prispeli v doglednem času. Skratka, ni prijetno. <br />
                        Tudi jaz vam bom hvaležen, sicer je v ŽIVČNEM krču tudi IT služba. In še jaz sem kriv za to da števci niso popisani,
                        čeprav sem samo informatik tukaj.<br />
                        <br />
                        Hvala vam, ker vemo da boste oddali stanje števcev vaših naprav.<br />
                        <br />
                        Lep pozdrav<br />
                        <br />
                        Ekipa Bilban
                        </html>""" % (', '.join(x for x in neoddan["machines"]))
                        #print msg
                        mail_send = mail_reminder(neoddan, msg)

                    if mail_send:
                        db.mail_logger.insert(ml_touser = neoddan["user"],
                                              ml_text = msg,
                                              ml_status =1 ) #status = 1 pomen da je blo poslano
                    else:
                        db.mail_logger.insert(ml_touser = neoddan["user"],
                                              ml_text = msg,
                                              ml_status = 2 ) #status = 2 pomen da ni blo poslano
                else:
                    db.mail_logger.insert(ml_touser = neoddan["user"],
                                  ml_text = "User nima naprav",
                                  ml_status = 2 ) #status = 2 pomen da ni blo poslano
                db.commit()
        # else:
        #     db.mail_logger.insert(ml_touser = 2,
        #                           ml_text = "Ni še datum za poslat maile",
        #                           ml_status = 2 ) #status = 2 pomen da ni blo poslano
    #    db.commit()
    except Exception as e:
        import sys
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        errmsg = ["error pri pošiljanju e-mailov", exc_type, fname, exc_tb.tb_lineno,e.__doc__ , e.message]

        #Writte error to log file
        mailErrorLogger(errmsg)


# instantiate Scheduler class
from gluon.scheduler import Scheduler
scheduler = Scheduler(db)

Anthony

unread,
Aug 22, 2018, 1:06:51 PM8/22/18
to web2py-users
Where and how is db.mail_logger defined? Is it possible either the code that defines it is not being run, or that the db object is being redefined after it has run?

Yebach

unread,
Aug 23, 2018, 6:13:27 AM8/23/18
to web2py-users
mail_logger is defined in db.py 

What is interesting is that I am using the same code on two environments and on one it works ok the other causes problems

The one that works is run from PyCharm (versuib 2.8.2) whereas scheduler is run from cmd as is also the function that starts the procedure 
On the other one (production version) everything is run from cmd, version is 2.16.1
Reply all
Reply to author
Forward
0 new messages