jO-Osko
5/4/2018 - 4:16 PM

Task.py

# Ni nujno, da se class imenuje enako kot datoteka, je pa to smiselna navada, ce imamo zgolj en class


class Task(object):

    def __init__(self, title, done=False):
        self.title = title
        self.done = done

    def output_nice(self):
        if self.done:
            return self.title + ": Done"
        return self.title + ": Not done"
import pickle

from Task import Task

# Pripravimo malo boljsi program, ki omogoci, da si na koncu shranimo opravila
# Ideja dela:
# Uporabimo pickle, v tem primeru je datoteka sicer vecja, v primeru vecjih objektov pa je vecinoma manjsa, predvsem pa je serializacija lazja


# !!!! POZOR !!!! pri uporabi pickla je potrebno biti previden, ce datoteka prihaja iz drugih virov,
# saj lahko izvede poljubno python kodo, kar zna prinesti tezave...


# Pripravimo si pomozne spremenljivke
SAVED_FILE_NAME = "task_list_simple_pickle.txt"  # koncnica .txt je popolnoma poljubna (lahko bi izbrali karkoli, a take koncnice prepozna in odpira vecina programov)


# Raje si naredmio pomozno funkcijo, saj je koda tako bolj berljiva
def load_saved():
    # Manjsa tezavica, kaj naredimo, ce datoteka iz katere beremo se ne obstaja?
    # Tole sicer presega snov, a ideja je sledeca:
    # Poskusamo jo vseeno odpreti (try), in jo prebrati
    # Ce pa gre kaj narobe, napako ulovimo (catch) in nadaljujemo z znanjem, da je slo nekaj narobe -> v nasem primeru ni datoteke
    try:
        # Preberemo datoteko za branje (crka "r"ead)
        f = open(SAVED_FILE_NAME, "r")
        # Uporabimo pickle, ki bo uspesno prebral, kaj je prej zapisal
        tasks = pickle.load(f)
        return tasks
    except IOError:
        print("NI NOBENE SHRANJENE DATOTEKE, ZACEL BOM S PRAZNO")

        return []

def save_tasks(tasks_to_save):
    # Odpremo z crko "w"rite (za pisanje)
    # Tu ni tezav pri neobstojeci datoteki, saj jo bo sistem ustvaril sam, ce ne obstaja (prazno)
    # !!POZOR, klic te funkcije zbrise vse kar je dosedaj bilo v tej datoteki POZOR!!
    f = open(SAVED_FILE_NAME, "w")
    # Preprosto zapisemo vse stvari v datoteko (pozor, tu so v ozadju podrobnosti, kako tocno zadeva funkcionira, kako je z import objektov...)
    # Ampak celotna zadeva deluje preprosto
    pickle.dump(tasks_to_save, f)
    # D.N. preglej vsebimo pcikle datoteke, vecinoma je ni mogoce razumeti
    # Datoteko zapremo, s tem zagotovimo, da se stvari res zapisejo vanjo in jo damo na voljo ostalim programom.
    f.close()


load_old = raw_input("Ali zelis naloziti sharanjena opravila?")

if load_old == "da":  # Preberemo stare
    task_list = load_saved()
else:  # Uporabimo prazen seznam
    task_list = []

while 1:
    title = raw_input("Vpisi naslednje opravilo")
    print("Opraviti moras se: " + title)
    done = raw_input("ali je opravilo opravljeno")
    if done == "da":
        # Opravljeno
        task = Task(title, True)
    else:
        task = Task(title, False)
    # V seznam dodamo trenut o opravilo
    task_list.append(task)
    end = raw_input("Zelis koncati (da/ne)?")
    if end.lower() == "da":
        break

print("POROCILO O OPRAVILIH")
print("Opravljena")
for sample_task in task_list:
    if sample_task.done == True:  # To bi lahko nadomestili kar z:  if sample_task.done:
        print(sample_task.title)

print("Neopravljena")
for sample_task in task_list:
    if sample_task.done == False:  # To bi lahko nadomestili kar z:  if !sample_task.done: (Torej ce je res negacija sample_task.done)
        print(sample_task.title)

print("Vsa opravila")
# Izpisemo vsa opravila (ne glede na njihovo opravljenost) s pomocjo definirane funkcije
for sample_task in task_list:
    print(sample_task.output_nice())

# DN: vprasaj uporabnika, ali res zeli shraniti nova opravila (in upostevaj njegovo zeljo)
print("SHRANUJEM")
save_tasks(task_list)
print("SHRANJEVANJE KONCANO")

from Task import Task

# Pripravimo malo boljsi program, ki omogoci, da si na koncu shranimo opravila
# Ideja dela:
# Preden zacnemo, uporabnika vprasamo, ali zeli naloziti ze prej shranjena opravila
# Na koncu prepisemo stara opravila

# DN: Razmisli, kako bi dodal v stara opravila (namig: poglej dokumentacijo funkcije open)


# Pripravimo si pomozne spremenljivke
# Po dogovoru konstante (spremenljivke, ki jih nocemo spreminjati) pisemo Z_VELIKIMI_CRKAMI (tako dodatno povemo, da gre za konstanto)
SAVED_FILE_NAME = "task_list_simple.txt"  # koncnica .txt je popolnoma poljubna (lahko bi izbrali karkoli, a take koncnice prepozna in odpira vecina programov)


# Raje si naredmio pomozno funkcijo, saj je koda tako bolj berljiva
def load_saved():
    # Manjsa tezavica, kaj naredimo, ce datoteka iz katere beremo se ne obstaja?
    # Tole sicer presega snov, a ideja je sledeca:
    # Poskusamo jo vseeno odpreti (try), in jo prebrati
    # Ce pa gre kaj narobe, napako ulovimo (catch) in nadaljujemo z znanjem, da je slo nekaj narobe -> v nasem primeru ni datoteke
    try:
        # Preberemo datoteko za branje (crka "r"ead)
        f = open(SAVED_FILE_NAME, "r")
        # To ja zgolj zacasna spremenljivka, ki jo bomo vrnili
        tasks = []
        # Gremo po vseh vrsticah
        for line in f:
            # Vemo, da so vrstice oblike: title,dokoncanost
            # Zato jih locimo po vejici, in vsako zapisemo v svoj del
            title, done = line.split(",")
            if done == "True":
                task = Task(title, True)
            else:
                task = Task(title, False)
            tasks.append(task)
        return tasks
    except IOError:
        print("NI NOBENE SHRANJENE DATOTEKE, ZACEL BOM S PRAZNO")

        return []

def save_tasks(tasks_to_save):
    # Odpremo z crko "w"rite (za pisanje)
    # Tu ni tezav pri neobstojeci datoteki, saj jo bo sistem ustvaril sam, ce ne obstaja (prazno)
    # !!POZOR, klic te funkcije zbrise vse kar je dosedaj bilo v tej datoteki POZOR!!
    f = open(SAVED_FILE_NAME, "w")
    for task in tasks_to_save:
        # Posamezeno opravilo zapisemo v datoteko, loceno z vejico, na koncu opravila pa novo vrstico
        f.write(task.title + "," + str(task.done) + "\n")
    # Datoteko zapremo, s tem zagotovimo, da se stvari res zapisejo vanjo in jo damo na voljo ostalim programom.
    f.close()


load_old = raw_input("Ali zelis naloziti sharanjena opravila?")

if load_old == "da":  # Preberemo stare
    task_list = load_saved()
else:  # Uporabimo prazen seznam
    task_list = []

while 1:
    title = raw_input("Vpisi naslednje opravilo")
    print("Opraviti moras se: " + title)
    done = raw_input("ali je opravilo opravljeno")
    if done == "da":
        # Opravljeno
        task = Task(title, True)
    else:
        task = Task(title, False)
    # V seznam dodamo trenut o opravilo
    task_list.append(task)
    end = raw_input("Zelis koncati (da/ne)?")
    if end.lower() == "da":
        break

print("POROCILO O OPRAVILIH")
print("Opravljena")
for sample_task in task_list:
    if sample_task.done == True:  # To bi lahko nadomestili kar z:  if sample_task.done:
        print(sample_task.title)

print("Neopravljena")
for sample_task in task_list:
    if sample_task.done == False:  # To bi lahko nadomestili kar z:  if !sample_task.done: (Torej ce je res negacija sample_task.done)
        print(sample_task.title)

print("Vsa opravila")
# Izpisemo vsa opravila (ne glede na njihovo opravljenost) s pomocjo definirane funkcije
for sample_task in task_list:
    print(sample_task.output_nice())

# DN: vprasaj uporabnika, ali res zeli shraniti nova opravila (in upostevaj njegovo zeljo)
print("SHRANUJEM")
save_tasks(task_list)
print("SHRANJEVANJE KONCANO")

# Tezava takega nacina je v tem, da moramo vedno natancno vedeti, kako opravila shranjujemo
# Ena se malo dfugacna tezava je v primeru, ko naslov opravila vsebuje vejico ","
# Razmisli, kako bi lahko postopal v tem primeru
from Task import Task

# Pripravimo prazen seznam
task_list = []

while 1:
    title = raw_input("Vpisi naslednje opravilo")
    print("Opraviti moras se: " + title)
    done = raw_input("ali je opravilo opravljeno")
    if done == "da":
        # Opravljeno
        task = Task(title, True)
    else:
        task = Task(title, False)
    # V seznam dodamo trenut o opravilo
    end = raw_input("Zelis koncati (da/ne)?")
    if end.lower() == "da":
        break

print("POROCILO O OPRAVILIH")
print("Opravljena")
for sample_task in task_list:
    if sample_task.done == True:  # To bi lahko nadomestili kar z:  if sample_task.done:
        print(sample_task.title)

print("Neopravljena")
for sample_task in task_list:
    if sample_task.done == False:  # To bi lahko nadomestili kar z:  if !sample_task.done: (Torej ce je res negacija sample_task.done)
        print(sample_task.title)

print("Vsa opravila")
# Izpisemo vsa opravila (ne glede na njihovo opravljenost) s pomocjo definirane funkcije
for sample_task in task_list:
    print(sample_task.output_nice())