Kategori Sistemi

Python ile bir iki gün önce başlamıştım yapımına ancak silme kısmında bir kaç düzenleme kalmıştı. O düzenlemelerle birlikte bazı düzenlemeler daha yapıp son şeklini verdim az önce. KategoriSistemi sınıfı ile ürün sistemi ya da ona benzer kategorilendirilecek içerikleri kontrol edebiliyorsunuz. Alt alta istediğiniz kadar kategori eklemek mümkün.

Sınıfı kendi hayal gücünüze göre şekillendirebilirsiniz. Belki vakit olursa veritabanı ile etkileşim özelliği eklenebilir. Kodlar ve kodların çalışması sonucu oluşan sonuç:

 
#-*- coding: utf-8 *-*
 
from types import *
 
class KategoriSistemi:
    def __init__(self):
        # Kategorileri tutan değişken hazırlanıyor.
        # Sözlükteki no anahtarı, kategori numaralarını tutuyor.
        # Bu numaralar benzersiz numaralardır. bilgi anahtarı ise
        # kategori bilgilerini tutuyor.
        self.kategoriler = {"no" : {},"bilgi" : {}}
 
        # Silinecek kategorileri tutan değişken
        self.silinecekler = []
 
        # Konum değerinin altında bulunan kategori numaralarını tutar.
        self.mevcut_kategoriler = []
 
    def ekle(self,*degiskenler):
        # Konum ve kategori bilgileri alınıyor.
        # İlk olarak degiskenler içeriğine bakılıyor.
        # Eğer sadece tek değişken varsa bunu kategori olarak
        # algılıyor. İki değişken varsa ilkini konum
        # ikincisini kategori olarak algılıyor.
        if len(locals()["degiskenler"])==1:
            konum = 0
            kategori = locals()["degiskenler"][0]
        else:
            konum = locals()["degiskenler"][0]
            kategori = locals()["degiskenler"][1]
 
        # İşlem durumu
        durum = False
        # Kategori için bir numara tanımlanıyor.
        numara = self.kategoriler["bilgi"].__len__() + 1
 
        if type(konum) is IntType:
            # Konum kontrol ediliyor.
            # Var ise içeriği alınıyor
            if self.kategoriler["no"].has_key(konum)==True:
                # Konuma ait kategori numaraları alınıyor.
                aktar = self.kategoriler["no"][konum]
                # Oluşturulan kategori numarası aktarıcıya ekleniyor.
                aktar.append(numara)
                # Aktarıcı içeriği konumdaki içeriğe aktarılıyor
                self.kategoriler["no"][konum] = aktar
                # Bilgi eklemesi için durum hazırlanıyor.
                durum = True
            else:
                # Konum yok ise ekleme yapılıyor
                self.kategoriler["no"][konum] = [numara]
                # Bilgi eklemesi için durum hazırlanıyor.
                durum = True
 
        if type(konum) is StringType:
            # Kategori bilgileri içerisinde konum var mı kontrol ediliyor.
            try:
                self.kategoriler["bilgi"].values().index(konum)
 
                # Yukarıdaki komut hatalı ise işlem sonlanacaktır.
                # Yani konum değeri bilgi taşıyıcısında yoksa.
                numara = self.kategoriler["bilgi"].keys()[self.kategoriler["bilgi"].values().index(konum)]
                # Numara ile ekleme için işlem tekrar başlatılıyor.
                self.ekle(numara,kategori)
            except:
                pass
 
        if durum==True:
            # Eklenecek bilgi kümesi oluşturuluyor.
            bilgi = { numara : kategori }
            # Bilgi kümesi ekleniyor.
            self.kategoriler["bilgi"].update(bilgi)
 
    def duzenle(self,ilk_deger,son_deger):
            # Kategori bilgileri içerisinde konum var mı kontrol ediliyor.
            try:
                self.kategoriler["bilgi"].values().index(ilk_deger)
 
                # Yukarıdaki komut hatalı ise işlem sonlanacaktır.
                # Yani konum değeri bilgi taşıyıcısında yoksa.
                numara = self.kategoriler["bilgi"].keys()[self.kategoriler["bilgi"].values().index(ilk_deger)]
                # Numara ile düzenleme işlemi yapılıyor.
                self.kategoriler["bilgi"][numara] = son_deger
            except:
                pass
 
    def sil(self,konum):
        # Konum değeri sayısal değer ise yapılacak olan işlemler.
        if type(konum) is IntType:
            self.kategori_al(konum)
            for i in self.mevcut_kategoriler:
                if self.kategoriler["bilgi"].has_key(i)==True:
                    self.kategoriler["bilgi"].pop(i)
                if self.kategoriler["no"].has_key(i)==True:
                    self.kategoriler["no"].pop(i)
            if self.kategoriler["bilgi"].has_key(konum)==True:
                self.kategoriler["bilgi"].pop(konum)
            if self.kategoriler["no"].has_key(konum)==True:
                self.kategoriler["no"].pop(konum)
 
            for i in self.kategoriler["no"]:
                try:
                    self.kategoriler["no"][i].remove(konum)
                except:
                    pass
 
        # Konum değeri karakter dizisi ise yapılacak olan işlemler.
        if type(konum) is StringType:
            # Kategori bilgileri içerisinde konum var mı kontrol ediliyor.
            try:
                self.kategoriler["bilgi"].values().index(konum)
 
                # Yukarıdaki komut hatalı ise işlem sonlanacaktır.
                # Yani konum değeri bilgi taşıyıcısında yoksa.
                numara = self.kategoriler["bilgi"].keys()[self.kategoriler["bilgi"].values().index(konum)]
                # Numara ile silme için işlem tekrar başlatılıyor.
                self.sil(numara)
            except:
                pass
 
    def kategori_al(self,konum=0):
        # Konum kontrol ediliyor.
        if self.kategoriler["no"].has_key(konum)==True:
            # Konum varsa döngü ile konumlar alınıyor.
            for x in self.kategoriler["no"][konum]:
                # Konum içerisindeki kategori numaraları
                # için alt kategori kontrolü yapılıyor.
                self.mevcut_kategoriler.append(x)
                self.kategori_al(x)
 
    def kategori_goster(self,konum=0,basamak=0,tasiyici=0):
        # Konum kontrol ediliyor.
        if self.kategoriler["no"].has_key(konum)==True:
            # Konum varsa döngü ile konumlar alınıyor.
            for x in self.kategoriler["no"][konum]:
                if tasiyici == konum:
                    basamak = 0
                if konum>0:
                    basamak+=1
                    bosluk = "-"*basamak*2
                    tasiyici = konum
                else:
                    basamak = 0
                    bosluk = ""
                if self.kategoriler["bilgi"].has_key(x)==True:
                    print "%s%s" %(bosluk,self.kategoriler["bilgi"][x])
                    # Konum içerisindeki kategori numaraları
                    # için alt kategori kontrolü yapılıyor.
                    self.kategori_goster(x,basamak,tasiyici)
 
# Sınıf kullanılmak için tanımlanıyor.
islem = KategoriSistemi()
 
# Ekleme yapılıyor.
islem.ekle("a")
islem.ekle("b")
islem.ekle("c")
islem.ekle("a","a-1")
islem.ekle("a","a-2")
islem.ekle("c","c-1")
islem.ekle("a-1","a-1-1")
islem.ekle("a-1-1","a-1-1-1")
islem.ekle("a-2","a-2-1")
islem.ekle("b","b-1")
islem.ekle("b-1","b-1-1")
islem.ekle("b","b-2")
islem.ekle("b-2","b-2-1")
islem.kategori_goster()
 
print
print
 
# Silme yapılıyor.
islem.sil("c")
islem.kategori_goster()
 
print
print
 
# Düzenleme yapılıyor.
islem.duzenle("a","A")
islem.kategori_goster()
 
 
omer@omer-laptop:~/gelistirme/hatirlat$ python2.5 test.py
a
--a-1
----a-1-1
------a-1-1-1
--a-2
----a-2-1
b
--b-1
----b-1-1
--b-2
----b-2-1
c
--c-1
 
a
--a-1
----a-1-1
------a-1-1-1
--a-2
----a-2-1
b
--b-1
----b-1-1
--b-2
----b-2-1
 
A
--a-1
----a-1-1
------a-1-1-1
--a-2
----a-2-1
b
--b-1
----b-1-1
--b-2
----b-2-1
 

Tags:

Leave a Reply