6. KALENDAR

6.1. Uvod

Podacima kalendara se pristupa na vrlo sličan način kao i podacima kontakata. Kalendar je predstavljen pomoću objekta CalendarDb koji sadrži Entry objekte. Svi novi unosi ili izmene sačuvane u postojeće unose (entries) u Python aplikaciji pojavljuju se na native Calendar aplikaciji uređaja, i obrnuto.


Dostupni tipovi unosa (entries) su klase izvedene iz glavne Entry klase:

 

6.2. Dodavanje unosa

Kreiranje unosa u kalendaru je jednostavno: otvorimo bazu podataka, pozovemo jedan od njenih metoda (u zavisnosti od tipa zapisa koji želimo), opciono zadamo vrednost atributima zapisa i sačuvamo promene.

 

Naredni deo koda demonstrira kako dodati neki zakazani događaj (appointment) koji ističe u određeno vreme. Atribut content klase Entry se koristi da se odreti tema događaja – kratak opis koji će biti prikazan u aplikaciji uređaja – Kalendar. Atribut location se koristi da se naznači lokacija događaja. Funkcija set_time() se koristi da se odredi vremenski okvir tokom koje će zapis događaj važiti.


Nakon kreiranja zapisa, važno je da ga sačuvamo koristeći commit() metod.

 

import e32calendar, appuifw
 
#Otvori bazu podataka
db = e32calendar.open()
 
#Kreiraj zapis događaja
appointment = db.add_appointment()
 
#dodaj informacije
appointment.content = appuifw.query(u"Enter subject", "text")
appointment.location = appuifw.query(u"Enter location", "text")
 
#Pitaj korisnika za vreme početka i završetka
t1 = appuifw.query(u"Enter start hour", "time")
d1 = appuifw.query(u"Enter start date", "date")
t2 = appuifw.query(u"Enter end hour", "time")
d2 = appuifw.query(u"Enter end date", "date")
 
start_time = t1 + d1
end_time = t2 + d2
 
#Podesi vreme početka i završetka
appointment.set_time(start_time, end_time)
 
#Sačuvaj unos
appointment.commit()

 

Sledeći kod kreira jednostavni to do zapis i nakon nekoliko sekundi, pita korisnika da li je to urađeno, označavajući ga kao završenog ako je tako.

import e32calendar, appuifw, e32, time
 
app_lock = e32.Ao_lock()
def quit():
    t.cancel()
    app_lock.signal()
appuifw.app.exit_key_handler = quit
 
# Otvori bazu podataka
db = e32calendar.open()
 
#Kreiraj 'to do' unos
todo = db.add_todo()
 
#Dodaj informacije o temi
todo.content = appuifw.query(u"Enter subject", "text")
 
# Pitaj korisnika za vreme početka i završetka
t1 = appuifw.query(u"Enter start hour", "time")
d1 = appuifw.query(u"Enter start date", "date")
t2 = appuifw.query(u"Enter end hour", "time")
d2 = appuifw.query(u"Enter end date", "date")
 
start_time = t1 + d1
end_time = t2 + d2
 
# Podesi vreme početka i završetka
todo.set_time(start_time, end_time)
 
appuifw.note(u"Entry created!")
 
#Kreiraj funkciju koja pita korisnika da li je izvršio 'to do' zadatak
def todo_handler():
    answer = appuifw.query(u"Have you finished the to do?", "query")
    if answer == True:
        #Korisnik više ne treba da mu ovaj unos bude aktivan u kalendaru s obzirom da je to obavio
        todo.cross_out = True
    #Da bismo proverili kada je unos 'precrtan', koristimo crossed_out_time atribut
    appuifw.note(u"Entry crossed out at " + time.ctime(todo.cross_out_time))
 
#Inicijalizuj tajmer i upotrebi ga da pozoveš funkciju nakon 10 sekundi
t = e32.Ao_timer()
t.after(10, todo_handler)
 
#Sačuvaj unos
todo.commit()

 

Unosi u kalendaru često su povezani sa alarmom da bi privukli pažnju korisnika. Alarm se podešava koristeći alarm atribut unosa. Alarm se može omogućiti samo za zapise tipa AppointmentEntry i AnniversaryEntry; za druge tipove zapisa ne postoji mogućnost alarma. Ukoliko podesimo alarm na None, ukidamo ga.

 

Naredni deo koda prikazuje zapis u kalendaru koji treba da podseti korisnika da podigne poklon za godišnjicu:

 

import e32calendar, time
 
#Otvori bazu podataka
db = e32calendar.open()
 
#Kreiraj 'anniversary' unos
anniversary = db.add_anniversary()
 
#Podesi alarm na ovo vreme za sutra i daj unosu najviši prioritet
anniversary.set_time(time.time() + 86400)
anniversary.content = u"Pick up gift for Shelley"
anniversary.priority = 1
anniversary.alarm = time.time() + 86400
 
anniversary.commit()

 

Zapisi mogu biti i ponovljeni, što znači da postaju aktivni u regularnim intervalima zasnovanim na povezanim pravilima ponavljanja. Na primer, osoba može imati zapis u kalendaru da ga podseća na rođendan druge osobe. Ovaj zapis treba da se ponavlja istog dana svake godine.

 

import e32calendar, time
 
# Otvori bazu podataka
db = e32calendar.open()
 
#Dodaj 'anniversary' unos
anniversary = db.add_anniversary()
 
anniversary.content = u"Hannah's birthday!"
anniversary.set_time(time.time() + 86400)
 
#Definiši pravilo ponavljanja
repeat = {"type":"yearly_by_date",
          "start":time.time() + 86400,
          "end":None,
          "interval":1}
 
anniversary.set_repeat(repeat)
 
anniversary.commit()

 

 

6.3. Prikazivanje i brisanje unosa

Metod find_instances(start_date, end_date, search_str=u""[ , appointments=0, events=0, anniversaries=0, todos=0, reminders=0]) , pozvan nad bazu podataka, može se koristiti da bi se pronašli svi zapisi u kalendaru unutar vremenskog okvira koji se poklapa sa kriterijumima pretrage.


find_instances() vraća listu dictionary-ja koji imaju ID-je unosa i koristeći subscript notaciju, objekat Entry se može pribaviti i njegove informacije mogu biti prikazane.

 

import e32calendar, appuifw, time
 
db = e32calendar.open()
 
#Nađi sve unose između dva datuma koje je zadao korisnik koji sadrža reč "birthday"
start = appuifw.query(u"Enter start date", "date")
end = appuifw.query(u"Enter end date", "date")
entries = db.find_instances(start, end, u"birthday")
 
#Prikaži njihove nazive i datume
for i in entries:
  print "Description: " + db[i["id"]].content
  print "Date: " + time.strftime("%H:%M %m/%d/%Y", time.localtime(db[i["id"]].start_time))

 

Brisanje zapisa je slično brisanju kontakta: kada se pribavi ID, pozivom del() operatora nad objekat briše se zapis.

 

 

 

PyS60