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:
- AppointmentEntry – vraća se pomoću add_appointment() metode
- EventEntry – vraća se pomoću add_event() metode
- AnniversaryEntry – vraća se pomoću add_anniversary() metode
- ReminderEntry – vraća se pomoću add_reminder() metode
- ToDoEntry - vraća se pomoću add_todo() metode
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.