• Sonuç bulunamadı

2.2.1 ¸ Sevket Cerit Tarafından Yapılan Kısımlar

Kullanıcılar Tablosu

Kullanıcıları temsil etmek icin “users” tablosu olu¸sturuldu.Users tablosu “userId” birincil anahtar ve serial olarak tanımlandı. “Firstname” kullanıcının ismi ,”Lastname” kullanıcının soyismi ,”Email_adress” kullanıcının mail adresi ,”password” kullanıcının siteye giri¸s yapmak için kullanaca˘gı ¸sifresi ve universities tablosuna dı¸s anahtar olan “uni” niteliklerine sahiptir.

def users(self):

with dbapi2.connect(self.cp) as connection:

cursor = connection.cursor()

query = "DROP TABLE IF EXISTS users CASCADE"

cursor.execute(query)

query = """CREATE TABLE users (

uni VARCHAR (100) NOT NULL REFERENCES universities(title) ON DELETE CASCADE

ON UPDATE CASCADE,

UserId SERIAL PRIMARY KEY, Firstname VARCHAR (80) NOT NULL, Lastname VARCHAR (80) NOT NULL ,

Email_adress VARCHAR (100) NOT NULL UNIQUE, password VARCHAR(10) NOT NULL

)"""

cursor.execute(query)

query = """INSERT INTO users(Firstname, Lastname, Email_adress,uni,password) VALUES ('Sevket','Cerit','cerits@itu.er','Ankara Üniversitesi','sevko'),

('Mert','Yıldız','yildiz@itu.edr','˙Istanbul Üniversitesi','mert'),

('Halit','Ugurgelen','ugurgelen@itu.edu.tr','Bo˘gaziçi Üniversitesi','halit'), ('Hasan','Caglar','caglarh@itu.edu','˙Istanbul Teknik Üniversitesi','hhc'), ('Donald','Hearn','Hearn@ise.ufl.edu','Bo˘gaziçi Üniversitesi','hearn'),

('Ulug','Bayazit','ulugbayazit@itu.edu.tr','˙Istanbul Teknik Üniversitesi','ulug'), ('Fatih','Guler','gulerfa','˙Istanbul Teknik Üniversitesi','feg');

"""

cursor.execute(query) connection.commit()

Kullanıcı Giri ¸si

Kullanıcıların sayfaya giri¸si için mail adresleri ve ¸sifreleri veritabanında kontrol edildi.E¸sle¸sme sa˘glanırsa sitenin anasayfasına yönlendirildi.

@app.route('/home', methods = ['POST', 'GET']) def page_login():

with dbapi2.connect(app.config['dsn']) as connection:

cursor = connection.cursor() if request.method == 'POST':

mailentered = request.form['mail']

passentered = request.form['password']

query = """SELECT Firstname,Lastname,Email_adress FROM users WHERE Email_adress='%s' AND password='%s' """ % (mailentered, passentered) cursor.execute(query)

global allusers

allusers = cursor.fetchall()

return render_template('signup.html') elif request.method == 'GET':

return render_template('signup.html')

Kullanıcı Kayıt

Siteye kayıt olmak isteyen kullanıcılar email,ad,soyad,üniversite ve ¸sifre formlarını doldurarak kayıt olur.Girilen bilgiler veritabanına kaydedilir.Kayıt i¸sleminden sonra giri¸s sayfasına yönlendirilir.

@app.route('/user_add', methods=['GET', 'POST']) def user_add():

user = users(app.config['dsn']) if request.method == 'GET':

now = datetime.datetime.now()

return render_template('signup.html', current_time=now.ctime()) if request.method == 'POST':

user.set_mail(request.form['email'])

now = datetime.datetime.now()

return redirect(url_for('page_login'))

Kullanıcı Profil

Kullanıcı profil sayfasında bilgilerini güncelleyebilir.Formda yer alan mail bilgisi veritabanında kontrol edilir ve e¸slesen kullanıcının yeni girilen bilgileri veritabanına kaydedilir.

@app.route('/user_update', methods=['GET', 'POST']) def user_update():

user = users(app.config['dsn']) if request.method == 'GET':

now = datetime.datetime.now()

return render_template('signup.html', current_time=now.ctime()) if request.method == 'POST':

name = request.form['firstname']

mail = request.form['email']

uni = request.form['uni']

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement = """UPDATE users

SET Firstname='%s',uni='%s'

WHERE Email_adress='%s'""" % (name, uni, mail) cursor.execute(statement)

connection.commit()

now = datetime.datetime.now()

return redirect(url_for('page_profile'))

2.2. Kod 37

2.2.2 Mert YILDIZ Tarafından Yapılan Kısımlar

Psycopg2 Metodunun Açıklaması

con(): PostgreSQL veri tabanına ba˘glantı sa˘glanmasını halleder.

cursor(): PostgreSQL komutlarının python kodunda çalı¸stırılmasını sa˘glar.

execute(): Veri tabanı i¸sleminin çalı¸stırılmasını sa˘glar.(Sorgu yada komutların) commit(): bekleyen de˘gi¸siklik yada i¸slemleri veri tabanına i¸sler.

fetchall(): Sorgu sonucunu alır ve satırlar halinde döner.

Üniversiteler

Üniversiteleri temsil etmek için sistemde iki adet tablo gerçeklendi. Bunlardan ilki olan “universities” tablosu “id”

ve “title” niteliklerinden olu¸san basit bir tablodur. “id” niteli˘gi birincil anahtar olup “Serial” olarak tanımlanmı¸stır.

Di˘ger nitelik olan “title” da ise üniversitelerin isimleri yer almaktadır. Bu tablo site açıldı˘gında a¸sa˘gıdaki kod ile olu¸sturulup, ilk de˘gerleri atanmaktadır.

def universities(self):

with dbapi2.connect(self.cp) as connection:

cursor = connection.cursor()

query = "DROP TABLE IF EXISTS universities CASCADE"

cursor.execute(query)

query = """CREATE TABLE universities ( id SERIAL PRIMARY KEY,

title VARCHAR(40) UNIQUE NOT NULL )"""

cursor.execute(query)

cursor.execute("""INSERT INTO universities (title) VALUES ('Ankara Üniversitesi'),

('Gazi Üniversitesi'), ('Bilkent Üniversitesi'), ('Hacettepe Üniversitesi'),

('Orta Do˘gu Teknik Üniversitesi'), ('Ege Üniversitesi '),

('Dokuz Eylül Üniversitesi'), ('Kocaeli Üniversitesi'), ('Sakarya Üniversitesi'), ('Bo˘gaziçi Üniversitesi'), ('Yıldız Teknik Üniversitesi'), ('˙Istanbul Üniversitesi'), ('Bahçe¸sehir Üniversitesi'), ('Galatasaray Üniversitesi'), ('˙Istanbul Teknik Üniversitesi'), ('Özye˘gin Üniversitesi'),

('Sabancı Üniversitesi'), ('Koç Üniversitesi'), ('Munzur Üniversitesi'), ('Gebze Teknik Üniversitesi'), ('Karadeniz Teknik Üniversitesi'), ('I¸sık Üniversitesi'),

('Kadir Has Üniversitesi'), ('Bursa Teknik Üniversitesi'), ('Fırat Üniversitesi'),

('Osmangazi Üniversitesi'), ('Kırıkkale Üniversitesi'), ('Sinop Üniversitesi'),

('¸Sehir Üniversitesi'), ('Atatürk Üniversitesi'), ('Yeditepe Üniversitesi'), ('Marmara Üniversitesi'), ('Uluda˘g Üniversitesi'), ('Düzce Üniversitesi'), ('Trakya Üniversitesi'), ('Bilgi Üniversitesi');

""")

connection.commit()

Üniversiteler hakkında daha detaylı bilgilerin bulundu˘gu di˘ger bir tablo ise “universities_info” tablosudur. Bu tabloda “uni_id”,”local”,”population” ve “type” olmak üzere dört nitelik vardır. Bunlardan uni_id universities tablosundaki id ile ili¸skili dı¸s anahtar, local ise locations tablosundaki loc_id ile ili¸skili bir dı¸s anahtardır. Bu tabloda üniversitelere ait yeri, ö˘grenci sayısı ve türü(özel yada devlet) gibi bilgiler tutulmaktadır. Tablonun olu¸s-turulması ve ilk de˘gerlerin atanması a¸sa˘gıdaki kod ile site açıldı˘gında yapılmaktadır.

def universities_info(self):

with dbapi2.connect(self.cp) as connection:

cursor = connection.cursor()

query = "DROP TABLE IF EXISTS universities_info CASCADE"

cursor.execute(query)

query = """CREATE TABLE universities_info (

uni_id INTEGER NOT NULL REFERENCES universities(id) ON DELETE CASCADE

ON UPDATE CASCADE,

local INTEGER NOT NULL REFERENCES locations(loc_id) ON DELETE CASCADE

ON UPDATE CASCADE, population NUMERIC(10), type VARCHAR(10), UNIQUE (uni_id) )"""

cursor.execute(query)

query = """INSERT INTO universities_info VALUES (1, 6, 15020,'Devlet'),

(2, 6, 25010,'Devlet'), (3, 6, 21008,'Özel'), (4, 6, 12504,'Devlet'), (5, 6, 27500,'Devlet'), (6, 35, 25412,'Devlet'), (7, 35, 10997,'Devlet'), (8, 41, 17627,'Devlet'), (9, 54, 6570,'Devlet'), (10, 34, 8879, 'Devlet'), (11, 34, 8690, 'Devlet'), (12, 34, 11994, 'Devlet'), (13, 34, 33424, 'Özel'), (14, 34, 11586, 'Devlet'), (15, 34, 17215, 'Devlet'), (16, 34, 15990,'Özel'), (17, 34, 3944,'Özel'), (18, 34, 3338, 'Özel'), (19, 62, 1330,'Devlet'), (20, 41, 1219, 'Devlet'), (21, 61, 8879, 'Devlet'), (22, 34, 8600, 'Özel'),

2.2. Kod 39

(23, 34, 11994,'Özel'), (24, 16, 3384, 'Devlet'), (25, 23, 11586,'Devlet'), (26, 26, 17615,'Devlet'), (27, 71, 5110, 'Devlet'), (28, 57, 3774,'Devlet'), (29, 6, 3338,'Özel'), (30, 24, 2030, 'Devlet'), (31, 65, 1439,'Devlet'), (32, 26, 38424,'Devlet'), (33, 7, 11586,'Devlet'), (34, 6, 17215, 'Özel'), (35, 34, 24190,'Özel'), (36, 25, 7944, 'Devlet'), (37, 34, 3338,'Özel'), (38, 34, 9030,'Devlet'), (39, 16, 4139,'Devlet'), (40, 81, 2558, 'Devlet'), (41, 22, 9030,'Devlet'), (42, 34, 4239, 'Özel');

"""

cursor.execute(query) connection.commit()

Üniversite Sınıfının Yapısı ve Kurucu Fonksiyonu

Üniversiteleri temsil etmek için olu¸sturulan sınıfın yapısı elemanları ve kurucu fonksiyonu a¸sa˘gıdaki gibidir.

class University:

def __init__(self, title, local, population, type):

self.Title = title self.Local = local

self.Population = population self.Type = type

Üniversiteler ˙Için Yazılan Fonksiyonlar

Bu varlı˘gın tablolarına ekleme, silme, güncelleme ve seçme i¸slemlerinin yapılabilmesi için gerekli olan kodlar projede “universities.py ” dosyasının altındadır.

Üniversite Ekleme

Sitenin arayüzünden girilen bilgileri kullanarak öncelikle “universities” tablosuna yeni üniversitenin adını, “uni-versities_info” tablosuna da girilen di˘ger ilgili bilgileri ekler. Bu ¸sekilde yeni bir üniversite eklenmi¸s olur. Bu i¸slem yazılan kod a¸sa˘gıdaki gibidir.

def add_university(self, title, local, population, type):

with dbapi2.connect(self.cp) as connection:

cursor = connection.cursor()

query = "INSERT INTO universities (title) VALUES ('%s')" % (title) cursor.execute(query)

query = "SELECT * FROM universities WHERE title = '%s' " % (title) cursor.execute(query)

row = cursor.fetchone() uni_id = row[0]

query = "SELECT loc_id FROM locations WHERE city = '%s' " % (local) cursor.execute(query)

row = cursor.fetchone()

Bu ekleme fonksiyonu server.py’daki üniversiteler ile ilgili olan kısımda ekleme i¸slemi yapılaca˘gı zaman kullanılır.

Üniversite Silme

Arayüzdeki kontrol kutuları i¸saretlenen üniversitelerin id de˘gerlerini alarak bu üniversiteleri tablodan kaldırır.

Silme i¸slemi için kullanılan kod a¸sa˘gıdaki gibidir. Bu kod server.py’da yazılmı¸s olup, e˘ger arayüzde herhangi bir kontrol kutusu i¸saretlenmi¸sse çalı¸sır. Öncelikle “universities” ardından ba˘glantılı oldu˘gu di˘ger tablo olan

“universities_info” tablosundan kaldırılır.

elif 'unis_to_delete' in request.form:

ids = request.form.getlist('unis_to_delete') for id in ids:

id = id.split('/', maxsplit=1) id = id[0]

unis.delete_university(id)

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement = """SELECT * FROM universities"""

cursor.execute(statement) ulist = cursor.fetchall()

statement = """SELECT uni_id, locations.city, locations.country, population, type FROM universities_info JOIN locations ON universities_info.local = locations.loc_id"""

cursor.execute(statement) ilist = cursor.fetchall() connection.commit()

now = datetime.datetime.now()

return render_template('universities.html', UniversityList = ulist, InfoList=ilist, current_time = now.ctime())

Üniversite Güncelle

Üniversite güncellemek için önce arayüzde istenen üniversitenin yanındaki “Güncelle” linkine tıklanması ardından açılan yeni sayfada yeni bilgilerin girilerek “Güncelle” butonuna basılması gerekmektedir. ˙I¸ste Html kodunda, is-tenen üniversitenin yanındaki linke tıklandı˘gında bu üniversitenin id de˘gerinin gönderilmesiyle “/universiteler/id”

uzantılı yeni bir sayfa açılır. Daha sonra bu id de˘gerine sahip üniversite için yeni girilen bilgiler kullanılarak güncelleme i¸slemi yapılır. Html kısmındaki yeni sayfaya yönlendiren ve id de˘gerini gönderen kod ¸su ¸sekildedir.

<br>

<h3>Üniversiteler</h3>

<br>

<form method="POST">

<table class="table table-hover">

<thead>

<tr>

<th>Adı</th>

<th>¸Sehir</th>

<th>Ülke</th>

<th>Ö˘grenci Sayısı</th>

<th>Türü</th>

{% for i in range(0,UniversityList|count) %}

<td><a href="{{request.path}}/{{InfoList[i][0]}}" class="text-info" name="unis_to_update">Güncelle</a></td>

<td><input type="checkbox" name="unis_to_delete" value= {{UniversityList[i][0]}}/></td>

</tr>

{% endfor %}

</tbody>

</table>

Buradan gelen id ile yeni açılan sayfaya ait server.py daki kod ise a¸sa˘gıdaki gibidir. Bu koda göre öncelikle say-fanın metodu “GET” ise güncellenecek olan üniversitenin bilgileri yeni açılan sayfadaki metin kutularına doldu-rulur. E˘ger “POST” ise yani “Güncelle” butonuna basılırsa, seçili üniversitenin id de˘gerine göre seçim yapılarak yeni veriler ile güncelleme i¸slemi yapılır ve ardından üniversiteler sayfasına geri dönülür.

@app.route('/universiteler/<int:id>', methods=['GET','POST']) def uni_update_page(id):

unis = Universities(app.config['dsn']) fn = Func(app.config['dsn'])

if request.method == 'GET':

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement = """SELECT * FROM universities WHERE id={}""".format(id) cursor.execute(statement)

univ = cursor.fetchall()

statement = """SELECT uni_id, locations.city, locations.country, population, type FROM universities_info JOIN locations ON universities_info.local = locations.loc_id WHERE uni_id={}""".format(id) cursor.execute(statement)

infos = cursor.fetchall() connection.close()

now = datetime.datetime.now()

return render_template('a_university.html',ID=id, UniversityList = univ, InfoList=infos, current_time=now.ctime())

#elif 'universities_to_update' in request.form:

if request.method == 'POST':

#unis.update_a_university(id,request.form['uni'],request.form['city'],request.form['cont'],request.form ['number'],request.form['type']) connection = dbapi2.connect(app.config['dsn'])

cursor = connection.cursor()

statement = """UPDATE universities SET title ='{}' WHERE id={};""".format(request.form['uni'],id) cursor.execute(statement)

statement ="""SELECT loc_id FROM locations WHERE city='{}';""".format(request.form['city']) cursor.execute(statement)

row = cursor.fetchone() if row is None:

return None loca_id = row[0]

statement = """UPDATE universities_info

SET local='{}', population='{}', type='{}' WHERE uni_id = {};""".format(loca_id,request.form ['number'],request.form['type'],id) cursor.execute(statement)

statement = """SELECT * FROM universities"""

cursor.execute(statement) ulist = cursor.fetchall()

statement = """SELECT uni_id, locations.city, locations.country, population, type FROM universities_info JOIN locations ON universities_info.local = locations.loc_id"""

cursor.execute(statement) ilist = cursor.fetchall() connection.commit()

now = datetime.datetime.now()

listelenir. Bu i¸slemler için server.py’da yazılan kod ¸su ¸sekildedir:

elif 'universities_to_select' in request.form:

vals = request.form.getlist('unis_to_select') City=request.form['city']

length=len(vals) if length==2:

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement = """SELECT loc_id FROM locations WHERE city='{}';""".format(City) cursor.execute(statement)

row = cursor.fetchone() if row is None:

now = datetime.datetime.now()

return render_template('404.html', current_time = now.ctime()) loca_id = row[0]

statement = """SELECT universities.title, universities_info.population, universities_info.type FROM universities JOIN universities_info ON universities_info.uni_id = universities.id WHERE local ={}""".format(loca_id) cursor.execute(statement)

ilist = cursor.fetchall() connection.commit()

now = datetime.datetime.now() if ilist is None:

return render_template('404.html', current_time = now.ctime())

return render_template('b_university.html', UniversityList = ilist, current_time = now.ctime()) elif length==1:

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement = """SELECT loc_id FROM locations WHERE city='{}';""".format(City) cursor.execute(statement)

row = cursor.fetchone() if row is None:

now = datetime.datetime.now()

return render_template('404.html', current_time = now.ctime()) loca_id = row[0]

statement = """SELECT universities.title, universities_info.population, universities_info.type FROM universities JOIN universities_info ON universities_info.uni_id = universities.id WHERE universities_info.local ={} AND universities_info.type='{}'""".format(loca_id,vals[0]) cursor.execute(statement)

ilist = cursor.fetchall() connection.commit()

now = datetime.datetime.now() if ilist is None:

return render_template('404.html', current_time = now.ctime())

return render_template('b_university.html', UniversityList = ilist, current_time = now.ctime()) Görüldü˘gü üzere öncelikle “Seç” butonuna basılması beklenir, bu butona basılırsa, “Özel” ve “Devlet” de˘gerlerini

ta¸sıyan kontrol kutularının de˘gerleri ve girilen ¸sehir bilgisi alınır. Önce kontrol kutularının ikisininde mi yoksa birinin mi seçildi˘gine bakılır. ˙Ikiside seçildiyse girilen ¸sehre göre seçme i¸slemi yapılır. E˘ger yanlızca “Özel” veya

“Devlet” seçildiyse o zaman bu kriterde seçimde göz önüne alınır.

E˘ger yanlı¸s de˘ger girilirse hata sayfasına yönlendirilir.(404.html)

¸

Sirketler

¸Sirketleri temsil etmek için sistemde “companies” tablosu gerçeklendi. Tablo “id”, “title”, “local2” ve “popula-tion” olmak üzere dört nitelikten olu¸smaktadır. Bunlarda sırasıyla ¸sirketin sıra numarası(birincil anahtar olarak kullanıldı.), ¸sirketin ismi, yer bilgisi(“locations” tablosuna dı¸sa anahtar olarak) ve çalı¸san sayısı bilgileri tutulmak-tadır. Bu tablo site açıldı˘gında a¸sa˘gıdaki kod ile olu¸sturulup, ilk de˘gerleri atanmaktutulmak-tadır.

2.2. Kod 43

def companies(self):

with dbapi2.connect(self.cp) as connection:

cursor = connection.cursor()

query = "DROP TABLE IF EXISTS companies CASCADE"

cursor.execute(query)

query = """CREATE TABLE companies ( id SERIAL PRIMARY KEY,

title VARCHAR(40) UNIQUE NOT NULL,

local2 INTEGER NOT NULL REFERENCES locations(loc_id) ON DELETE CASCADE

ON UPDATE CASCADE, population NUMERIC(10) )"""

cursor.execute(query)

cursor.execute("""INSERT INTO companies(title,local2,population) VALUES ('Apple', 34, 1200),

('Turkcell', 34, 4500), ('Vodafone', 34, 2100), ('Airties', 34, 800), ('Microsoft', 34, 6800), ('Google', 34, 1700), ('Avea', 34, 1700), ('Akbank', 41, 2700), ('Tüpra¸s', 41, 5800), ('Arkas', 35, 900), ('Logosoft', 6, 1700), ('NVIDIA', 34, 360);

""")

connection.commit()

¸

Sirket Sınıfının Yapısı ve Kurucu Fonksiyonu

¸Sirketleri temsil etmek için olu¸sturulan sınıfın yapısı elemanları ve kurucu fonksiyonu a¸sa˘gıdaki gibidir.

class Company:

def __init__(self, title, local, population):

self.Title = title self.Local = local

self.Population = population

Üniversiteler ˙Için Yazılan Fonksiyonlar

Bu varlı˘gın tablolarına ekleme, silme, güncelleme ve seçme i¸slemlerinin yapılabilmesi için gerekli olan kodlar projede “companies.py” dosyasının altındadır.

¸

Sirket Ekleme

Sitenin arayüzünden girilen bilgileri kullanarak “companies” tablosuna yeni ¸sirketin adını, çalı¸san sayısını, ¸sehrini gibi ilgili bilgileri ekler. Bu ¸sekilde yeni bir ¸sirket eklenmi¸s olur. Bu i¸slem yazılan kod a¸sa˘gıdaki gibidir.

def add_company(self, title, local, population):

with dbapi2.connect(self.cp) as connection:

cursor = connection.cursor()

query = "SELECT loc_id FROM locations WHERE city = '%s' " % (local) cursor.execute(query)

row = cursor.fetchone()

Bu ekleme fonksiyonu server.py’daki ¸sirketler ile ilgili olan kısımda ekleme i¸slemi yapılaca˘gı zaman kullanılır.

¸

Sirket Silme

Arayüzdeki kontrol kutuları i¸saretlenen ¸sirketlerin id de˘gerlerini alarak bu ¸sirketleri tablodan kaldırır. Silme i¸slemi için kullanılan kod a¸sa˘gıdaki gibidir. Bu kod server.py’da yazılmı¸s olup, e˘ger arayüzde herhangi bir kontrol kutusu i¸saretlenmi¸sse çalı¸sır.

elif 'comps_to_delete' in request.form:

ids = request.form.getlist('comps_to_delete') for id in ids:

id = id.split('/', maxsplit=1) id = id[0]

comps.delete_company(id)

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement = """SELECT id, title, locations.city, locations.country, population FROM companies JOIN locations ON companies.local2 = locations.loc_id"""

cursor.execute(statement) clist = cursor.fetchall() connection.commit()

now = datetime.datetime.now()

return render_template('companies.html', CompanyList = clist, current_time = now.ctime())

¸

Sirket Güncelle

¸Sirket güncellemek için önce arayüzde istenen ¸sirketin yanındaki “Güncelle” linkine tıklanması ardından açılan yeni sayfada yeni bilgilerin girilerek “Güncelle” butonuna basılması gerekmektedir. ˙I¸ste Html kodunda, istenen

¸sirketin yanındaki linke tıklandı˘gında bu ¸sirketin id de˘gerinin gönderilmesiyle “/sirketler/id” uzantılı yeni bir sayfa açılır. Daha sonra bu id de˘gerine sahip ¸sirket için yeni girilen bilgiler kullanılarak güncelleme i¸slemi yapılır. Html kısmındaki yeni sayfaya yönlendiren ve id de˘gerini gönderen kod ¸su ¸sekildedir.

<form method="POST">

<table class="table table-hover">

<thead>

<tr>

<th>Adı</th>

<th>¸Sehir</th>

<th>Ülke</th>

<th>Çalı¸san Sayısı</th>

<th>Güncellensin Mi?</th>

<th>Silinsin Mi?</th>

</tr>

</thead>

<tbody>

{% for i in range(0,CompanyList|count) %}

<tr>

{% for k in range(1,5) %}

<td>{{CompanyList[i][k]}}</td>

{% endfor %}

<td><a href="{{request.path}}/{{CompanyList[i][0]}}" class="text-info" name="comps_to_update">Güncelle</a></td>

<td><input type="checkbox" name="comps_to_delete" value= {{CompanyList[i][0]}}/></td>

</tr>

2.2. Kod 45

{% endfor %}

</tbody>

</table>

Buradan gelen id ile yeni açılan sayfaya ait server.py daki kod ise a¸sa˘gıdaki gibidir. Bu koda göre öncelikle sayfanın metodu “GET” ise güncellenecek olan ¸sirketin bilgileri yeni açılan sayfadaki metin kutularına doldurulur.

E˘ger “POST” ise yani “Güncelle” butonuna basılırsa, seçili ¸sirketin id de˘gerine göre seçim yapılarak yeni veriler ile güncelleme i¸slemi yapılır ve ardından ¸sirketler sayfasına geri dönülür.

@app.route('/sirketler/<int:id>', methods=['GET','POST']) def comp_update_page(id):

comps = Companies(app.config['dsn']) fn = Func(app.config['dsn'])

if request.method == 'GET':

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement = """SELECT id, title, locations.city, locations.country, population FROM companies JOIN locations ON companies.local2 = locations.loc_id WHERE id={}""".format(id) cursor.execute(statement)

clist = cursor.fetchall() connection.close()

now = datetime.datetime.now()

return render_template('a_company.html',ID=id, CompanyList = clist, current_time=now.ctime()) if request.method == 'POST':

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement ="""SELECT loc_id FROM locations WHERE city='{}';""".format(request.form['city']) cursor.execute(statement)

row = cursor.fetchone() if row is None:

return None loca_id = row[0]

statement = """UPDATE companies

SET title='{}', local2='{}', population='{}' WHERE id = {};""".format(request.form['comp'],loca_id,request.form['number'],id)

cursor.execute(statement)

statement = """SELECT id, title, locations.city, locations.country, population FROM companies JOIN locations ON companies.local2= locations.loc_id"""

cursor.execute(statement) clist = cursor.fetchall() connection.commit()

now = datetime.datetime.now()

return redirect(url_for('company_page'))

¸

Sirket Seçme

Arayüzde girilen belirli kriterlere göre ¸sirket bilgilerini seçme i¸slemi yapmak için kullanılan kısımdır. Seçme i¸slemi için ¸sehir yada ¸sirket ismi kriter olarak kullanılabilir. Yapılan bu seçimlere göre tablolardan istenen kriter-lere uyan ¸sirketler çekikriter-lerek yeni bir sayfada listelenir. Bu i¸slemler için server.py’da yazılan kod ¸su ¸sekildedir:

elif 'companies_to_select' in request.form:

City=request.form['city']

#l_id=fn.get_id("locations",City)

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement = """SELECT loc_id FROM locations WHERE city='{}';""".format(City) cursor.execute(statement)

row = cursor.fetchone() if row is None:

now = datetime.datetime.now()

return render_template('404.html', current_time = now.ctime()) loca_id = row[0]

if clist is None:

return render_template('404.html', current_time = now.ctime())

return render_template('b_company.html', CompanyList = clist, current_time = now.ctime()) elif 'companies_to_select2' in request.form:

Title=request.form['title']

#l_id=fn.get_id("locations",City)

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement = """SELECT id, title, locations.city, locations.country, population FROM companies JOIN locations ON companies.local2= locations.loc_id WHERE title ='{}'""".format(Title) cursor.execute(statement)

clist = cursor.fetchall() connection.commit()

now = datetime.datetime.now() if clist is None:

return render_template('404.html', current_time = now.ctime())

return render_template('b_company.html', CompanyList = clist, current_time = now.ctime()) Görüldü˘gü üzere öncelikle “Seç” butonuna basılması beklenir, iki farklı “Seç” butonu vardır. ˙Ilki olan

“compa-nies_to_select” butonuna basılırsa seçme için ¸sehir kriterine bakılaca˘gı anlamına gelir. Bu nedenle girilen ¸sehir de˘geri kullanılarak buna uygun olan ¸sirketler tablodan çekilerek, yeni bir sayfada listelenir. E˘ger ikinci buton olan

“companies_to_select2” kullanılırsa bu isme göre seçme yapılaca˘gını gösterir ve girilen isim de˘geri kullanılarak i¸slem yapılır. Bulunan sonuçlar yeni bir ekranda listelenir.

E˘ger yanlı¸s de˘ger girilirse hata sayfasına yönlendirilir.(404.html)

Hata Sayfası

E˘ger kullanıcı seçme gibi i¸slemlerde yanlı¸s yada sistemde olmayan veriler girerse “internal server error” hatası yerine bu hazırlanan sayfanın görünmesi sa˘glandı. Bunun için bu ko¸sula uygun durumlar belirlenerek server.py dosyasında gerekli yerlerde yönlendirmeler yapıldı. Örnek kullanım yerleri a¸sa˘gıda gösterilmi¸stir.

¸Sirketler için:

elif 'companies_to_select2' in request.form:

Title=request.form['title']

#l_id=fn.get_id("locations",City)

connection = dbapi2.connect(app.config['dsn']) cursor = connection.cursor()

statement = """SELECT id, title, locations.city, locations.country, population FROM companies JOIN locations ON companies.local2= locations.loc_id WHERE title ='{}'""".format(Title) cursor.execute(statement)

clist = cursor.fetchall() connection.commit()

now = datetime.datetime.now() if clist is None:

return render_template('404.html', current_time = now.ctime())

return render_template('b_company.html', CompanyList = clist, current_time = now.ctime())

Yerler

Yerler temsil etmek için sistemde “locations” tablosu gerçeklendi. Tablo “id”, “city” ve “country” olmak üzere üç nitelikten olu¸smaktadır. Bunlarda sırasıyla yerin numarası(birincil anahtar olarak kullanıldı.), ¸sehir ve ülke bilgi-leri tutulmaktadır. Bu tablo site açıldı˘gında a¸sa˘gıdaki kod ile olu¸sturulup, ilk de˘gerbilgi-leri atanmaktadır. Ba¸slangıç için Türkiye’deki 81 ilin hepsi plaka kodlarına göre eklenmi¸stir.

2.2. Kod 47

def locations(self):

with dbapi2.connect(self.cp) as connection:

cursor = connection.cursor()

query = "DROP TABLE IF EXISTS locations CASCADE"

cursor.execute(query)

query = """CREATE TABLE locations ( loc_id INTEGER PRIMARY KEY, city VARCHAR(40) NOT NULL, country VARCHAR(40), UNIQUE (loc_id), UNIQUE (city) )"""

cursor.execute(query)

query = """INSERT INTO locations VALUES (1, 'Adana','Türkiye'),

(2, 'Adıyaman', 'Türkiye'), (3, 'Afyon', 'Türkiye'), (4, 'A˘grı', 'Türkiye'), (5, 'Amasya', 'Türkiye'), (6, 'Ankara', 'Türkiye'), (7, 'Antalya', 'Türkiye'), (8, 'Artvin', 'Türkiye'), (9, 'Aydın', 'Türkiye'), (10, 'Balıkesir','Türkiye'), (11, 'Bilecik', 'Türkiye'), (12, 'Bingöl', 'Türkiye'), (13, 'Bitlis', 'Türkiye'), (14, 'Bolu', 'Türkiye'), (15, 'Burdur', 'Türkiye'), (16, 'Bursa', 'Türkiye'), (17, 'Çanakkale', 'Türkiye'), (18, 'Çankırı', 'Türkiye'), (19, 'Çorum', 'Türkiye'), (20, 'Denizli', 'Türkiye'), (21, 'Diyarbakır','Türkiye'), (22, 'Edirne', 'Türkiye'), (23, 'Elazı˘g', 'Türkiye'), (24, 'Erzincan', 'Türkiye'), (25, 'Erzurum', 'Türkiye'), (26, 'Eski¸sehir', 'Türkiye'), (27, 'Gaziantep', 'Türkiye'), (28, 'Giresun', 'Türkiye'), (29, 'Gümü¸shane', 'Türkiye'), (30, 'Hakkari', 'Türkiye'), (31, 'Hatay', 'Türkiye'), (32, 'Isparta', 'Türkiye'), (33, 'Mersin', 'Türkiye'), (34, '˙Istanbul', 'Türkiye'), (35, '˙Izmir', 'Türkiye'), (36, 'Kars', 'Türkiye'), (37, 'Kastamonu', 'Türkiye'), (38, 'Kayseri', 'Türkiye'), (39, 'Kırklareli','Türkiye'), (40, 'Kır¸sehir', 'Türkiye'), (41, 'Kocaeli', 'Türkiye'), (42, 'Konya', 'Türkiye'), (43, 'Kütahya', 'Türkiye'), (44, 'Malatya', 'Türkiye'), (45, 'Manisa', 'Türkiye'),

(46, 'Kahramanmara¸s', 'Türkiye'), (47, 'Mardin', 'Türkiye'),

(54, 'Sakarya', 'Türkiye'), (55, 'Samsun', 'Türkiye'), (56, 'Siirt', 'Türkiye'), (57, 'Sinop','Türkiye'), (58, 'Sivas', 'Türkiye'), (59, 'Tekirda˘g', 'Türkiye'), (60, 'Tokat', 'Türkiye'), (61, 'Trabzon', 'Türkiye'), (62, 'Tunceli', 'Türkiye'), (63, '¸Sanlıurfa', 'Türkiye'), (64, 'U¸sak', 'Türkiye'), (65, 'Van', 'Türkiye'), (66, 'Yozgat', 'Türkiye'), (67, 'Zonguldak', 'Türkiye'), (68, 'Aksaray', 'Türkiye'), (69, 'Bayburt', 'Türkiye'), (70, 'Karaman', 'Türkiye'), (71, 'Kırıkkale', 'Türkiye'), (72, 'Batman', 'Türkiye'), (73, '¸Sırnak', 'Türkiye'), (74, 'Bartın', 'Türkiye'), (75, 'Ardahan', 'Türkiye'), (76, 'I˘gdır', 'Türkiye'), (77, 'Yalova','Türkiye'), (78, 'Karabük', 'Türkiye'), (79, 'Kilis', 'Türkiye'), (80, 'Osmaniye', 'Türkiye'), (81, 'Düzce', 'Türkiye');

"""

cursor.execute(query) connection.commit()

Yerler Sınıfının Yapısı ve Kurucu Fonksiyonu

Yerleri temsil etmek için olu¸sturulan sınıfın yapısı elemanları ve kurucu fonksiyonu a¸sa˘gıdaki gibidir.

class Location:

def __init__(self, loc_id, city, country):

self.Loc_id = loc_id self.City = city self.Country = country

Yerler ˙Için Yazılan Fonksiyonlar

Bu varlı˘gın tablolarına ekleme, silme, güncelleme ve seçme i¸slemlerinin yapılabilmesi için gerekli olan kodlar projede “locations.py” dosyasının altındadır.

Yer Ekleme

Sitenin arayüzünden girilen bilgileri kullanarak “locations” tablosuna yeni yerin numara, ¸sehir ve ülke gibi ilgili bilgileri ekler. Bu ¸sekilde yeni bir yer eklenmi¸s olur. Bu i¸slem yazılan kod a¸sa˘gıdaki gibidir.

Sitenin arayüzünden girilen bilgileri kullanarak “locations” tablosuna yeni yerin numara, ¸sehir ve ülke gibi ilgili bilgileri ekler. Bu ¸sekilde yeni bir yer eklenmi¸s olur. Bu i¸slem yazılan kod a¸sa˘gıdaki gibidir.

Benzer Belgeler