• Sonuç bulunamadı

itucsdb1713 Proje Raporu

N/A
N/A
Protected

Academic year: 2022

Share "itucsdb1713 Proje Raporu"

Copied!
46
0
0

Yükleniyor.... (view fulltext now)

Tam metin

(1)

Release 1.0

itucsdb1713

Dec 21, 2017

(2)
(3)

1 Kurulum Kılavuzu 3

1.1 Gerekli Programlar . . . 3

2 Kullanıcı Kılavuzu 5 2.1 Mehmet Taha Çorbacıo˘glu Tarafından Yapılan Kısımlar . . . 5

2.1.1 Kullanıcı Giri¸si . . . 5

2.1.2 Ana Sayfa . . . 5

2.1.3 Hata Sayfası. . . 7

2.1.4 Kullanıcı Kaydı . . . 7

2.1.5 Profil Sayfası . . . 8

2.1.6 Kullanıcı Bilgilerinin Güncellenmesi. . . 8

2.1.7 Kullanıcının Silinmesi . . . 8

2.1.8 Futbolcular için Sakatlık Bilgisi . . . 9

2.1.9 Kontrat Bilgileri. . . 11

2.1.10 ˙Istatistik Bilgileri . . . 13

2.2 Ufuk ¸Sahar Tarafından Yapılan Kısımlar . . . 14

2.2.1 Antrenman Bilgisi Sayfası . . . 14

2.2.2 Maç Bilgisi Sayfası . . . 14

2.2.3 Gözlenen Futbolcular Sayfası. . . 15

2.2.4 Prim Bilgisi Sayfası. . . 16

2.2.5 Parametre Bilgisi Sayfası . . . 17

3 Geli¸stirici Kılavuzu 23 3.1 Veri Tabanı Tasarımı . . . 23

3.2 Kod . . . 23

3.2.1 Mehmet Taha Çorbacıo˘glu Tarafından Yapılan Kısımlar. . . 23

3.2.2 Ufuk ¸Sahar Tarafından Yapılan Kısımlar . . . 33

(4)
(5)

Takım itucsdb1713 - beeINfootball Üyeler

• Ufuk ¸Sahar

• Mehmet Taha Çorbacıo˘glu

beeINfootball Futbol Kulübü Yönetim-Bilgi Sistemi

Futbol kulüpleri için tasarladı˘gımız yönetim-bilgi sistemi, kulüp mensuplarının bilgilerini içeren ve kulüp ile ilgili gerekli bilgileri kullanıcılara sunan bir platformdur. Bu projenin amacı, futbol kulübü içerisindeki bilgi akı¸sının sa˘glanmasıdır. Sistemde yöneticiler tüm bilgilere eri¸sip onlar üzerinde i¸slem yapabilir. Sınırlı yetkisi olan sa˘glıkçılar, gözlemciler ve antrenörler kendi alanları ile ilgili bilgiler üzerinde i¸slem yapabilir. Sıradan kullanıcı olan futbolcular ise sadece kendileri ile ilgili bilgilere eri¸sim sa˘glayabilmektedir.

˙Içindekiler:

(6)
(7)

Kurulum Kılavuzu

1.1 Gerekli Programlar

Yüklenecekler

1- Python 3.6.x sürümü bu linkten yüklenebilir:https://www.python.org/downloads/

2- PostgreSQL bu linkten yüklenebilir:https://www.postgresql.org/download/

3- Git versiyon kontrol aracı bu linkten yüklenebilir:https://git-scm.com/downloads 4- Pgadmin bu linkten yüklenebilir:https://www.pgadmin.org/download/

5- Flask bu linkten yüklenebilir:http://pypi.python.org/packages/source/F/Flask/Flask-0.10.1.tar.gz Veya pip kullanılarak ‘cmd’ üzerinden a¸sa˘gıdaki gibi yüklenebilir:

pip install Flask

6- Flask-Login pip kullanılarak ‘cmd’ üzerinden a¸sa˘gıdaki gibi yüklenebilir:

pip install Flask-Login

7- passlib pip kullanılarak ‘cmd’ üzerinden a¸sa˘gıdaki gibi yüklenebilir:

pip install passlib

8- Psycopg2 pip kullanılarak ‘cmd’ üzerinden a¸sa˘gıdaki gibi yüklenebilir:

pip install psycopg2 Projeyi Çalı¸stırma

Komut satırında projenin klasörüne gidilerek “git” ile projenin kaynak kodları Github üzerinden çekilir.

• Komut satırında git versiyon kontrol sistemi ile a¸sa˘gıdaki adımlar izlenerek proje çekilebilir.

git init

git remote add origin https://github.com/itucsdb1713/itucsdb1713 git pull origin master

(8)

• pgAdmin üzerinde yeni sunucu ve veritabanı olu¸sturularak projenin veritabanı gözlenebilir ve SQL sorguları yapılabilir.

username: postgres password: 12345 port: 5432

• Komut satırında projenin klasörüne gidilerek proje a¸sa˘gıdaki komutla çalı¸stırılabilir.

python server.py

(9)

Kullanıcı Kılavuzu

Bu bölümde kullanıcıların siteyi nasıl kullanabilecekleri detaylı bir ¸sekilde anlatılmı¸stır.

2.1 Mehmet Taha Çorbacıo ˘ glu Tarafından Yapılan Kısımlar

2.1.1 Kullanıcı Giri ¸si

Bu sayfada kullanıcıların sisteme giri¸sleri ve giri¸s kontrolleri yapılmaktadır. Sistem ilk açıldı˘gında sadece yönetici hesabı önceden tanımlı bir ¸sekilde bulunmaktadır. Siteye sadece kulüp üyelerinin katılması istendi˘gi için, siteye giri¸s yapmak isteyen ki¸siler yöneticiler tarafından önceden sisteme kayıt edilmesi gerekmektedir. Giri¸s yapmadan adres satırından sitenin ba¸ska sayfalarına girmeye çalı¸sanlar da bu sayfaya yönlendirilmektedir.

Fig. 2.1: Giri¸s Sayfası

2.1.2 Ana Sayfa

Giri¸s yapan kullanıcılar bu sayfaya yönlendirilmektedir. Gezinti çubu˘gu(navbar) aracılı˘gı ile kullanıcılar yekileri olan sayfalara gidebilmektedir.

Yöneticiler ˙Için

Yöneticiler her sayfaya eri¸simleri oldukları için gezinti çubu˘gu aracılı˘gı ile di˘ger tüm sayfalara eri¸sim sa˘glaya- bilmektedir.

(10)

Fig. 2.2: Ana Sayfa

Antrenörler ˙Için

Antrenörler sadece profil ve training sayfalarına eri¸sim sa˘glayabilmektedir.

Fig. 2.3: Antrenörler için gezinti çubu˘gu

Sa ˘glıkçılar ˙Için

Sa˘glıkçkılar sadece profil ve injury sayfalarına eri¸sim sa˘glayabilmektedir.

Fig. 2.4: Sa˘glıkçılar için gezinti çubu˘gu

Gözlemciler ˙Için

Gözlemciler sadece profil ve scouting sayfalarına eri¸sim sa˘glayabilmektedir.

Fig. 2.5: Gözlemciler için gezinti çubu˘gu

(11)

Futbolcular ˙Için

Futbolcular sadece kendi profillerini görüntüleyebilecektir.

Fig. 2.6: Futbolcular için gezinti çubu˘gu

2.1.3 Hata Sayfası

E˘ger kullanıcılar eri¸sim izni olmadıkları bir sayfaya girmeye çalı¸sırlarsa izin hatası alacaktırlar.

Fig. 2.7: ˙Izin hatası

2.1.4 Kullanıcı Kaydı

Sistem kulüp bazlı çalı¸stı˘gı için dı¸sarıdan kayıt engellenmi¸stir. Kayıt olmak için yönetici ile ileti¸sime geçmek ve ardından yöneticinin kayıt sayfası aracılı˘gı ile yeni kullanıcı olu¸sturması gerekmektedir. Yeni kullanıcı olu¸stu- rurken, yöneticinin girmesinin zorunlu oldu˘gu kısımlar, kullanıcı adı ve ¸sifresi bölümüdür. Kullancı olu¸sturulduk- tan sonra ister kullanıcı, isterse yönetici kullanıcı bilgilerini güncelleyebilir.

Fig. 2.8: Kullanıcı Kaydı

(12)

2.1.5 Profil Sayfası

Kullanıcılar bu sayfa aracılı˘gı ile bilgilerine ula¸sabilir, güncelleyebilir ve isterlerse hesaplarını silebilirler.

Yöneticiler ˙Için

Yöneticiler di˘ger kullanıcıların haricinde, sayfanın üst kısmında bulunan liste aracılı˘gı ile di˘ger kullacıları seçip onların hesap bilgilerini güncelleyebilir veya hesaplarını silebilir.

Fig. 2.9: Yönetici Profili

Futbolcular ˙Için

Futbolcular kendi profillerinde, di˘ger kullanıcı tiplerinin futbolculara girmi¸s oldukları bilgileri görebilmektedir.

Bunlar: kontrat bilgileri, istatistikler, sakatlık bilgisi, antreman ve prim bilgileridir. Aynı zamanda di˘ger kul- lanıcılar gibi kendi profillerini güncelleyebilir veya silebilir.

Di ˘ger Kullacı Tipleri ˙Için

Di˘ger kullıcı tipleri, bu sayfada sadece kendi bilgilerini güncelleyebilir veya hesaplarını silebilir.

2.1.6 Kullanıcı Bilgilerinin Güncellenmesi

Kullanıcılar profil sayfasındaki update butonu aracılı˘gı ile kendi bilgilerini güncelleyebilir. Yöneticiler buna ek olarak ba¸ska hesapları da güncelleyebilir.

2.1.7 Kullanıcının Silinmesi

Kullanıcılar profillerinde bulunan delete butonu ile hesaplarını silebilir.

(13)

Fig. 2.10: Futbolcu Profili

Fig. 2.11: Di˘ger Profil Görünümleri

Yönetici Tarafından Kullancının Silinmesi

Kullanıcı profil sayfasından istedi˘gi kullanıcı˘gı seçtikten sonra update butonu ile güncelleme sayfasına giderler.

Burada update butonunun altında yer alan delete butonu ile seçtikleri hesabı silebilirler.

2.1.8 Futbolcular için Sakatlık Bilgisi

Yöneticiler ve sa˘glıkçılar bu sayfa aracılı˘gı ile takımın mevcut sa˘glık durumunu inceleyebilirler.

(14)

Fig. 2.12: Profil Güncellenmesi

Fig. 2.13: Hesap Silinmesi

Sakatlık Bilgisinin Eklenmesi

Yönetici veya sa˘glıkçı sakatlık sayfasında yer alan add butonu ile oyunculara sakatlık bilgisi girebilir. Bunun için sistemde en bir futbolcunun kayıtlı olması gerekmektedir. Buraya tahmini iyile¸sme süresinin, sakatlık ne oldu˘gu ve sakatlık bölgesini girebilirler.

(15)

Fig. 2.14: Sakatlık Sayfası

Fig. 2.15: Sakatlık Eklenmesi

Sakatlık Bilgisinin Güncellenmesi

Yönetici veya sa˘glıkçı, sakatlık sayfasında her sakatlı˘gın yanında bulunan update butonu ile önceden girilen bir sakatlı˘gı güncelleyebilirler. Yanlı¸s girilmi¸s bir sakatlık de˘gi¸stirebilecekleri gibi tahmini süreyi de de˘gi¸stirebilirler.

Fig. 2.16: Sakatlık Güncellenmesi

Sakatlık Bilgisinin Silinmesi

Yönetici veya sa˘glıkçılar, sakatlık sayfasında yer alan delete butonu ile her sakatlı˘gın solunda yer alan i¸saratçiler ile seçtikleri sakatlıkları silebilirler.

2.1.9 Kontrat Bilgileri

Yöneticiler bu sayfa aracılı˘gı ile sistemdeki futbolcular ile imzaladıkları sözle¸smelerin detaylarını sisteme ekleye- bilirler, tüm sözle¸smeleri görüntüleyebilir, güncelleyebilir veya silebilirler.

Kontrat Bilgilerinin Eklenmesi

Yöneticiler kontrat sayfasında yer alan add butonu ile futbolcular ile imzaladıkları sözle¸smelerin bilgisini girebilir.

Bunun için sistemde en bir futbolcunun kayıtlı olması gerekmektedir. Buraya maa¸s bilgisini, imza primini, maç,

(16)

Fig. 2.17: Kontrat Sayfası

gol ve assist primlerini girerler. Sözle¸smenin imzalanma tarihini ve biti¸s süresini de yine buradan eklerler.

Fig. 2.18: Kontrat Eklenmesi

Kontrat Bilgilerinin Güncellenmesi

Yöneticiler, kontrat sayfasında her sözle¸smenin yanında bulunan update butonu ile önceden girilen bir sözle¸smeyi güncelleyebilirler. Yanlı¸s girilmi¸s bir sözle¸smeyi de˘gi¸stirebilirler.

Fig. 2.19: Kontrat Güncellenmesi

(17)

Kontrat Bilgilerinin Silinmesi

Yöneticiler, kontrat sayfasında yer alan delete butonu ile her sözle¸smenin solunda yer alan i¸saratçiler ile seçtikleri sözle¸smeleri silebilirler.

2.1.10 ˙Istatistik Bilgileri

Yöneticiler bu sayfa aracılı˘gı ile sistemdeki futbolcular için istatistik ekleyebilir, tüm futbolcuların istatistik bilgi- lerine ula¸sabilirler, güncelleyebilir veya silebilirler.

Fig. 2.20: ˙Istatistik Sayfası

˙Istatistik Bilgilerinin Eklenmesi

Yöneticiler istatistik sayfasında yer alan add butonu ile futbolcular için istatistik bilgisi ekleyebilirler. Bunun için sistemde en bir futbolcunun kayıtlı olması gerekmektedir. Buraya maç, gol ve assist bilgilerini girerler.

Fig. 2.21: ˙Istatistik Eklenmesi

˙Istatistik Bilgilerinin Güncellenmesi

Yöneticiler, istatistik sayfasında her istatisti˘gin yanında bulunan update butonu ile önceden girilen bir istatisti˘gi güncelleyebilirler. Yanlı¸s girilmi¸s bir istatisti˘gi de˘gi¸stirebilirler.

˙Istatistik Bilgilerinin Silinmesi

Yöneticiler, istatistik sayfasında yer alan delete butonu ile her istatisti˘gin solunda yer alan i¸saratçiler ile seçtikleri istatistikleri silebilirler.

(18)

Fig. 2.22: ˙Istatistik Güncellenmesi

2.2 Ufuk ¸ Sahar Tarafından Yapılan Kısımlar

2.2.1 Antrenman Bilgisi Sayfası

Bu sayfada kulübün antrenman bilgileri yöneticiler(admin) veya antrenörler tarafından eklenebilir, güncellenebilir ve silinebilir. Bu sayfaya yöneticiler ve sadece antrenörler eri¸sim sa˘glayabilir.

• Antrenman bilgileri

Fig. 2.23: Antrenman sayfası görünümü

Eklenen antrenman bilgileri antrenman tarihlerine göre tabloda listelenir.

• Antrenman bilgisi ekleme

Antrenman bilgileri antrenör tipi veya yönetici tipi kullanıcılar tarafından eklenir.

• Antrenman bilgisi güncelleme

Antrenman bilgileri antrenör tipi veya yönetici tipi kullanıcılar tarafından güncellenir.

2.2.2 Maç Bilgisi Sayfası

Bu sayfada kulübün oynayaca˘gı veya oynadı˘gı maç bilgileri yalnızca yöneticiler(admin) tarafından eklenebilir,

(19)

Fig. 2.24: Antrenman ekleme sayfası görünümü

Fig. 2.25: Antrenman güncelleme sayfası görünümü

• Maç bilgileri

• Maç bilgisi ekleme

• Maç bilgisi güncelleme

2.2.3 Gözlenen Futbolcular Sayfası

Bu sayfada gözlenen futbolcuların bilgileri yöneticiler(admin) veya gözlemciler tarafından eklenebilir, güncel- lenebilir ve silinebilir. Bu sayfaya yöneticiler ve sadece gözlemciler eri¸sim sa˘glayabilir. Bir kar¸sıla¸smadaki fut- bolcunun gözlenen futbolculara eklenebilmesi için öncelikle maç bilgisinin eklenmesi gerekir. Daha sonra o maçta

(20)

Fig. 2.26: Maç bilgisi sayfası görünümü

Fig. 2.27: Maç bilgisi ekleme sayfası görünümü

görev alan futbolcu gözlenen futbolculara eklenerek gözlemci tarafından puanlaması yapılır.

• Gözlenen futbolcu bilgileri

• Gözlenen futbolcu bilgisinin ekleme

• Gözlenen futbolcu bilgisinin güncellenmesi

2.2.4 Prim Bilgisi Sayfası

Bu sayfada futbolcuların prim bilgileri yöneticiler(admin) güncellenebilir ve silinebilir. Bu sayfaya yalnızca yö-

(21)

Fig. 2.28: Maç bilgisi güncelleme sayfası görünümü

Fig. 2.29: Gözlenen futbolcular sayfası görünümü

hesaplanır. Yöneticiler yalnızca güncelle butonunu kullanarak primlerin otomatik olarak hesaplanması i¸slemini gerçekle¸stirirler.

• Futbolcuların prim bilgileri

2.2.5 Parametre Bilgisi Sayfası

Bu sayfada sitede kullanılan bazı parametre bilgileri mevcuttur. Bunlar; kullanıcı tipi parametreleri (admin, Dok- tor, Gözlemci, Antrenör, Futbolcu vs.), ¸sehir parametreleri (do˘gum yeri bilgisi ve maç ¸sehri bilgisi), futbolcular için pozisyon/mevki parametreleri, antrenman tipi parametreleri ve prim tipi parametreleri olmak üzere di˘ger say- falarda kullanılmaktadır. Yalnızca yöneticiler bu sayfaya eri¸sim sa˘glayıp parametreleri ekleme, güncelleme ve

(22)

Fig. 2.30: Gözlenen futbolcuları ekleme sayfası görünümü

Fig. 2.31: Gözlenen futbolcuları güncelleme sayfası görünümü

silme i¸slemlerini gerçekle¸stirebilirler.

• Parametre Bilgileri

• Kullanıcı Tipi Parametre Bilgileri

• Pozisyon/Mevki Parametre Bilgileri

• ¸Sehir Parametre Bilgileri

• Antrenman Tipi Parametre Bilgileri

• Prim Tipi Parametre Bilgileri

(23)

Fig. 2.32: Prim sayfası görünümü

Fig. 2.33: Parametre sayfası görünümü

(24)

Fig. 2.34: Parametre sayfası görünümü

Fig. 2.35: Parametre sayfası görünümü

(25)

Fig. 2.36: Parametre sayfası görünümü

Fig. 2.37: Parametre sayfası görünümü

(26)

Fig. 2.38: Parametre sayfası görünümü

(27)

Geli¸stirici Kılavuzu

3.1 Veri Tabanı Tasarımı

Bu projenin varlık-ili¸ski diyagramı a¸sa˘gıdaki gibi olup veritabanında 11 tablo bulunmaktadır. Bu tabloların her birinin di˘ger tablolarla ili¸skisi olup dı¸s anahtar (FK) ile ba¸svuru yapılmaktadır. Birincil anahtarlar da “PK” olarak tasarımda görülmektedir.

3.2 Kod

3.2.1 Mehmet Taha Çorbacıo ˘ glu Tarafından Yapılan Kısımlar

Bütün tablolar create_tables fonksiyonu içerisinde olu¸sturulmaktadır.

Kullanıcı Giri ¸s Bilgileri

Kullanıcının sisteme giri¸s yapması için gerekli olan bilgiler “LogInfo” tablosunda tutulmu¸stur. Bu tabloda kul- lanıcının UserID birincil anahtar olarak kullanılmı¸stır. Aynı zamanda UserID, “UserInfo” tablosunu dı¸s anahtar ile ba˘glamı¸stır. UserInfo tablosunda UserID serial oldu˘gu ve bu tablodaki UserID ile aynı oldu˘gu için, bu tablodaki UserID integer olarak tutulmu¸stur. Bu tablo aynı zamanda kullanıcı adı ve ¸sifresini tutmaktadır. Kayıt sırasında

¸sifre hashlenerek saklanmaktadır.

query = """DROP TABLE IF EXISTS LogInfo CASCADE"""

cursor.execute(query)

query = """CREATE TABLE LogInfo (

UserID INT PRIMARY KEY,

Username varchar(50) UNIQUE NOT NULL, Password varchar(500) NOT NULL, LastLoginDate TIMESTAMP,

FOREIGN KEY(UserID) REFERENCES

˓→UserInfo(UserID) ON DELETE CASCADE )"""

cursor.execute(query)

User sınıfı sisteme o anda giri¸s yapan kullanıcının bazı bilgilerini tutmaktadır. A¸sa˘gıdaki kod parçasında da görüldü˘gü gibi, bu bilgiler: userID, kullanıcı ismi, ¸sifresi, son giri¸s zamanı ve kullanıcının tipidir.

(28)

Fig. 3.1: Varlık-˙Ili¸ski Diyagramı

class User(UserMixin):

def __init__(self, id, username, password, lastLoginDate, userType):

self.id = id

self.username = username self.password = password

self.lastLoginDate = lastLoginDate self.userType = userType

Ziyaretçi login sayfasına geldi˘ginde formları doldurarak giri¸s yapmayı dener. UserDatabase sınıfı içerisinde yer alan select_user fonksiyonu ile forma girilen kullanıcı adı ile veritabanında e¸sle¸sen kullanıcıyı çeker. E˘ger bu isme sahip bir kullanıcı varsa, forma girilen ¸sifre ile hashlenen ¸sifreyi kontrol eder. Do˘gru olması ko¸sulunda son giri¸s zamanını günceller ve Flask-Login kütüphanesinin login_user fonksiyonu ile kullanıcı giri¸sini gerçekle¸stirir.

@site.route('/login', methods=['GET', 'POST']) def login_page():

if request.method == 'GET':

return render_template('login.html') else:

user = UserDatabase.select_user(request.form['username']) if user and user != -1:

if pwd_context.verify(request.form['password'], user.password):

UserDatabase.setLastLoginDate(user) login_user(user)

return redirect(url_for('site.home_page'))

(29)

Profil Bilgileri

Kullanıcıların ki¸sisel bilgileri “UserInfo” tablosunda tutulmaktadır. UserID birincil anahtar olarak kullanılmı¸stır.

UserTypeID, parameters tablosundan kullanıcıyı çekmek için dı¸s anahtar olarak kullanılmı¸stır. PositionID, pa- rameters tablosundan futbolcunun mevkisini çekmek için dı¸s anahtar olarak kullanılmı¸stır. CityID, parameters tablosundan kullanıcının do˘gum yerini çekmek için dı¸s anahtar olarak kullanılmı¸stır. CreateUserID, kendi tablo- suna kullanıcıyı olu¸sturan ki¸siyi bulmak için dı¸s anahtar olarak kullanılmı¸stır.

query = """DROP TABLE IF EXISTS UserInfo CASCADE"""

cursor.execute(query)

query = """CREATE TABLE UserInfo (

UserID SERIAL PRIMARY KEY, UserTypeID INTEGER NOT NULL, PositionID INTEGER,

CityID INTEGER,

CreateUserID INTEGER NOT NULL, No INTEGER,

Birthday DATE,

CreateDate TIMESTAMP NOT NULL, Name VARCHAR(50),

Surname VARCHAR (50),

FOREIGN KEY (UserTypeID) REFERENCES

˓→Parameters(ID),

FOREIGN KEY (PositionID) REFERENCES

˓→Parameters(ID),

FOREIGN KEY (CityID) REFERENCES Parameters(ID), FOREIGN KEY (CreateUserID) REFERENCES

˓→UserInfo(UserID)

)"""

cursor.execute(query)

Kullanıcı ˙I¸slemleri

Kullanıcılar yöneticiler tarafından eklenebilirler. Yöneticiler veya kullanıcılar bilgilerini güncelleyebilir ya da hesaplarını silebilir.

˙Ilk Yöneticinin Olu¸sturulması

Initdb sayfasına gidildi˘ginde create_tables fonksiyonu ça˘grıldıktan sonra adminInit ça˘grılır ve sistemin ilk yö- neticisi veritabanına eklenir. Bunun için ilk önce parametre tablosuna admin kullanıcı tipi eklenir. Ardından bo¸s bir profil yönetici için olu¸sturulur. Olu¸sturulan bu profil ile LogInfo tablosuna yöneticinin giri¸s bilgileri girilir.

Burada ¸sifre hash’i alınarak veritabanına kaydedilir.

def adminInit(self):

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

cursor = connection.cursor()

query = """INSERT INTO Parameters(Name,TypeID) VALUES ('admin',1)"""

cursor.execute(query)

query= """SELECT ID FROM PARAMETERS WHERE NAME='%s'""" %('admin') cursor.execute(query)

userType = cursor.fetchone()

query = """INSERT INTO UserInfo(UserTypeID, CreateUserID, CreateDate)

˓→VALUES (%s, 1, %s)"""

cursor.execute(query,(userType,datetime.datetime.now(),)) query = """SELECT MAX(UserID) FROM UserInfo """

cursor.execute(query)

(30)

userID = cursor.fetchone()

hashp = pwd_context.encrypt('12345')

query = """INSERT INTO LogInfo(UserID, Username, Password) VALUES (%s,

˓→'admin', %s)"""

cursor.execute(query, (userID[0],hashp,)) connection.commit()

cursor.close()

Kullanıcı Eklenmesi

Kayıt sayfasında yönetici kontrolü yapılır ardından UserDatabase sınıfından girilen formlara göre yeni bir kullanıcı olu¸sturmak için add_user fonksiyonu çalı¸stırılır.

@site.route('/register', methods=['GET', 'POST'])

@login_required def register_page():

if current_user.userType == 'admin':

if request.method == 'GET':

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

query = """ SELECT * FROM PARAMETERS WHERE TYPEID=1""" # typeid 1

˓→for user type

cursor.execute(query)

userTypeData = cursor.fetchall()

query = """ SELECT * FROM PARAMETERS WHERE TYPEID=2""" # typeid 2

˓→for position type

cursor.execute(query)

positionTypeData = cursor.fetchall()

query = """ SELECT * FROM PARAMETERS WHERE TYPEID=3""" # typeid 3

˓→for city type

cursor.execute(query)

cityTypeData = cursor.fetchall()

return render_template('register.html', userTypeData=userTypeData,

˓→positionTypeData=positionTypeData, cityTypeData=cityTypeData) else:

UserDatabase.add_user(request.form['TypeID'], request.form['PositionID

˓→'], request.form['BirthCityID'], request.form['No'], request.form['Birthday'],

˓→request.form['Name'], request.form['Surname'], request.form['username'], request.

˓→form['password'])

return redirect(url_for('site.home_page')) else:

return render_template('error.html')

Formdan gelen bilgiler ile ilk önce UserInfo tablosuna yeni bir satır eklenir. Ardından giri¸s bilgileri için LogInfo tablasuna eklenme yapılır. E˘ger futbolcu kaydı yapılıyorsa istatistik tablosuna da ekleme yapılır.

class UserDatabase:

@classmethod

def add_user(cls, TypeID, PositionID, BirthCityID, No, Birthday, Name, Surname,

˓→ username, password):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

query = """INSERT INTO UserInfo (UserTypeID, PositionID, CityID,

˓→CreateUserID, No, Birthday,

CreateDate, Name,

˓→Surname) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)"""

try:

cursor.execute(query, (str(TypeID), str(PositionID),

(31)

except dbapi2.Error:

connection.rollback() else:

connection.commit()

query = """SELECT MAX(UserID) FROM UserInfo """

try:

cursor.execute(query) except dbapi2.Error:

connection.rollback() else:

userID = cursor.fetchone() connection.commit()

hashp = pwd_context.encrypt(password)

query = """INSERT INTO LogInfo (userID, Username, Password) VALUES ('%d

˓→','%s','%s')"""%(userID[0], username, hashp)

try:

cursor.execute(query) except dbapi2.Error:

connection.rollback() else:

connection.commit()

query = """SELECT name FROM Parameters WHERE ID = '%s' """%(TypeID) try:

cursor.execute(query) except dbapi2.Error:

connection.rollback() else:

parameterName = cursor.fetchone() connection.commit()

if parameterName[0] == 'Footballer':

query = """INSERT INTO StatisticsInfo (ID) VALUES ('%s')"""

˓→%(str(userID[0])) try:

cursor.execute(query) except dbapi2.Error:

connection.rollback() else:

connection.commit() cursor.close()

Kullanıcı Bilgilerinin Güncellenmesi

Profil güncellemek için istek geldi˘ginde kullanıcı numarası üzerinden kullanıcın bilgileri güncellenir.

@classmethod

def updateUser(cls, currentId, newName, newSurname, newType, newNo, newBirthday,

˓→newPosition, newCity):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor() try:

if(newName != ''):

query = "UPDATE USERINFO SET name='%s' WHERE userid = '%d'" %

˓→(newName, int(currentId))

cursor.execute(query) if(newSurname != ''):

query = "UPDATE USERINFO SET surname='%s' WHERE userid = '%d'" %

˓→(newSurname, int(currentId))

(32)

cursor.execute(query) if(newType != ''):

query = "UPDATE USERINFO SET usertypeid='%d' WHERE userid = '%d'"

˓→% (int(newType), int(currentId)) cursor.execute(query) if(newNo != ''):

query = "UPDATE USERINFO SET no='%d' WHERE userid = '%d'" %

˓→(int(newNo), int(currentId))

cursor.execute(query) if(newBirthday != ''):

query = "UPDATE USERINFO SET birthday='%s' WHERE userid = '%d'" %

˓→(newBirthday, int(currentId)) cursor.execute(query) if(newPosition != ''):

query = "UPDATE USERINFO SET positionid='%d' WHERE userid = '%d'"

˓→% (int(newPosition), int(currentId)) cursor.execute(query) if(newCity !=''):

query = "UPDATE USERINFO SET cityid='%d' WHERE userid = '%d'" %

˓→(int(newCity), int(currentId)) cursor.execute(query) except dbapi2.Error:

connection.rollback() else:

connection.commit() cursor.close()

Kullanıcının Silinmesi

Silme iste˘gi geldi˘ginde kullanıcı numarası üzerinden UserInfo tablosunda silme gerçekle¸stirilir. Bu tablodan bir kullanıcının silinmesi LogInfo ve di˘ger ba˘glantılı tablolardaki verilerin de silinmesini sa˘glar.

@classmethod

def deleteUser(cls, ID):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor() try:

query = "DELETE FROM USERINFO WHERE USERID = '%d' " % int(ID) cursor.execute(query)

except dbapi2.Error:

connection.rollback() else:

connection.commit() cursor.close()

Futbolcular için Sakatlık Bilgisi

Sakatlık tablosunda ID birincil anahtar olarak kullanılmaktadır. UserID, UserInfo tablosuna dı¸s anahtar olarak ba˘glanmı¸stır ve buradan hangi futbolcuya ait sakatlı˘gın girildi˘gi belirtilmektedir. CreateUserID ise yine UserInfo tablosuna dı¸s anahtardır ve sakatlı˘gın kim tarafından girildi˘gini göstermektedir.

query = """DROP TABLE IF EXISTS InjuryInfo CASCADE"""

cursor.execute(query)

query = """CREATE TABLE InjuryInfo (

ID SERIAL PRIMARY KEY, UserID INTEGER NOT NULL,

(33)

CreateUserID INTEGER NOT NULL, CreateDate TIMESTAMP NOT NULL, Injury VARCHAR(500) NOT NULL, InjuryArea VARCHAR(50) NOT NULL, FOREIGN KEY (UserID) REFERENCES

˓→UserInfo(UserID),

FOREIGN KEY (CreateUserID) REFERENCES

˓→UserInfo(UserID)

)"""

cursor.execute(query)

Sakatlık Bilgisinin Eklenmesi

Sakatlık bilgisi eklenirken formdan gelen bilgiler add_injury fonksiyonuna gönderilir ve veritabanına burada ek- leme yapılır.

@classmethod

def add_injury(cls,UserID, RecoveryTime, Injury, InjuryArea):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

CreateDate = datetime.datetime.now() CreateUserID = current_user.id

query = """INSERT INTO InjuryInfo (UserID, RecoveryTime, CreateUserID,

˓→CreateDate, Injury, InjuryArea) VALUES (%s, %s, %s, %s, %s, %s)"""

cursor.execute(query, (UserID, RecoveryTime, CreateUserID, CreateDate,

˓→Injury, InjuryArea,)) cursor.close()

Sakatlık Bilgisinin Güncellenmesi

Sakatlık bilgisi güncellenirken id’si üzerinden veritabanından bulunan sakatlık bilgisi formdan gelen bilgiler ile güncellenir.

@classmethod

def update_injury(cls, ID, RecoveryTime, Injury, InjuryArea):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

query = """SELECT * FROM InjuryInfo WHERE ID = %d""" % (ID) cursor.execute(query)

injuryInfo = cursor.fetchone() injury = list(injuryInfo) if RecoveryTime != "":

injury[2] = RecoveryTime if Injury != "":

injury[5] = Injury if InjuryArea != "":

injury[6] = InjuryArea query = """UPDATE InjuryInfo

SET RecoveryTime = '%s', Injury= '%s', InjuryArea= '%s' WHERE ID = %d """ % (injury[2], injury[5], injury[6], ID) cursor.execute(query)

cursor.close()

Sakatlık Bilgisinin Silinmesi

Id’si ile veritabanında buldu˘gumuz sakatlık bilgisi silinir.

(34)

@classmethod

def DeleteInjury(cls,ID):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

query = """DELETE FROM InjuryInfo WHERE ID = %s"""%(ID) try:

cursor.execute(query) except dbapi2.Error:

connection.rollback() else:

connection.commit() cursor.close()

Kontrat Bilgileri

Kontrat tablosunda ID birincil anahtar olarak kullanılmaktadır. UserID, UserInfo tablosuna dı¸s anahtar olarak ba˘glanmı¸stır ve buradan hangi futbolcuya ait kontratın girildi˘gi belirtilmektedir. CreateUserID ise yine UserInfo tablosuna dı¸s anahtardır ve kontratı kimin imzaladı˘gı tutulmaktadır.

query = """DROP TABLE IF EXISTS ContractInfo CASCADE"""

cursor.execute(query)

query = """CREATE TABLE ContractInfo (

ID SERIAL PRIMARY KEY, UserID INTEGER NOT NULL, CreateUserID INTEGER NOT NULL, Salary DECIMAL DEFAULT 0, SignPremium DECIMAL DEFAULT 0, MatchPremium DECIMAL DEFAULT 0, GoalPremium DECIMAL DEFAULT 0, AssistPremium DECIMAL DEFAULT 0, SignDate TIMESTAMP NOT NULL, EndDate TIMESTAMP NOT NULL, CreateDate TIMESTAMP NOT NULL, FOREIGN KEY (UserID) REFERENCES

˓→UserInfo(UserID),

FOREIGN KEY (CreateUserID)

˓→REFERENCES UserInfo(UserID)

)"""

cursor.execute(query)

Kontrat Bilgilerinin Eklenmesi

Kontrat bilgisi eklenirken formdan gelen bilgiler add_contract fonksiyonuna gönderilir ve veritabanına burada ekleme yapılır.

@classmethod

def add_contract(cls, ID, Salary, SignPremium, MatchPremium, GoalPremium,

˓→AssistPremium, SignDate, EndDate):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

CreateDate = datetime.datetime.now() CreateUserID = current_user.id

query = """INSERT INTO ContractInfo (UserID, CreateUserID, Salary,

˓→SignPremium, MatchPremium, GoalPremium, AssistPremium,

SignDate, EndDate,

(35)

cursor.execute(query, (ID, CreateUserID, Salary, SignPremium, MatchPremium,

˓→ GoalPremium, AssistPremium,

SignDate, EndDate,

˓→CreateDate,))

cursor.close()

Kontrat Bilgilerinin Güncellenmesi

Kontrat bilgisi güncellenirken id’si üzerinden veritabanından bulunan sakatlık bilgisi formdan gelen bilgiler ile güncellenir.

@classmethod

def update_contract(cls, ID, Salary, SignPremium, MatchPremium, GoalPremium,

˓→AssistPremium, SignDate, EndDate):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

query = """SELECT * FROM ContractInfo WHERE ID = %d"""%(ID) cursor.execute(query)

contractInfo = cursor.fetchone() contract = list(contractInfo) if Salary != "":

contract[3] = Salary if SignPremium != "":

contract[4] = SignPremium if MatchPremium != "":

contract[5] = MatchPremium if GoalPremium != "":

contract[6] = GoalPremium if AssistPremium != "":

contract[7] = AssistPremium if SignDate != "":

contract[8] = SignDate if EndDate != "":

contract[9] = EndDate query = """UPDATE ContractInfo

SET Salary = '%s', SignPremium= '%s', MatchPremium= '%s',

˓→GoalPremium= '%s', AssistPremium= '%s', SignDate= '%s', EndDate= '%s'

WHERE ID = %d """ %(contract[3], contract[4], contract[5],

˓→contract[6], contract[7], contract[8], contract[9], ID) cursor.execute(query)

cursor.close()

Kontrat Bilgilerinin Silinmesi

Id’si ile veritabanında buldu˘gumuz kontrat bilgisi silinir.

@classmethod

def DeleteContract(cls, ID):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

query = """DELETE FROM ContractInfo WHERE ID = %s"""%(ID) try:

cursor.execute(query) except dbapi2.Error:

connection.rollback() else:

connection.commit() cursor.close()

(36)

˙Istatistik Bilgileri

˙Istatistik tablosunda ID birincil anahtar olarak kullanılmaktadır. UserID, UserInfo tablosuna dı¸s anahtar olarak ba˘glanmı¸stır ve buradan hangi futbolcuya ait istatisti˘gin girildi˘gi belirtilmektedir.

query = """DROP TABLE IF EXISTS StatisticsInfo CASCADE"""

cursor.execute(query)

query = """CREATE TABLE StatisticsInfo (

ID INT PRIMARY KEY, Goal INTEGER

˓→DEFAULT 0,

Assist INTEGER

˓→DEFAULT 0,

Match INTEGER

˓→DEFAULT 0,

FOREIGN KEY(ID)

˓→REFERENCES UserInfo(UserID) ON DELETE CASCADE

)"""

cursor.execute(query)

˙Istatistik Bilgilerinin Eklenmesi

˙Istatistik bilgisi eklenirken formdan gelen bilgiler add_statistics fonksiyonuna gönderilir ve veritabanına burada ekleme yapılır.

@classmethod

def add_statistics(cls, ID, Goal, Asist, Match):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

query = """SELECT * FROM StatisticsInfo WHERE ID = %s""" % (ID) cursor.execute(query)

statisticsInfo = cursor.fetchone() statistics = list(statisticsInfo) if Goal != "":

statistics[1] = int(Goal) + int(statistics[1]) if Asist != "":

statistics[2] = int(Asist) + int(statistics[2]) if Match != "":

statistics[3] = int(Match) + int(statistics[3]) query = """UPDATE StatisticsInfo

SET Goal = '%s', Assist= '%s', Match= '%s' WHERE ID = '%s' """ % (str(statistics[1]),

˓→str(statistics[2]), str(statistics[3]), str(ID)) cursor.execute(query)

cursor.close()

˙Istatistik Bilgilerinin Güncellenmesi

˙Istatistik bilgisi güncellenirken id’si üzerinden veritabanından bulunan istatistik bilgisi formdan gelen bilgiler ile güncellenir.

@classmethod

def update_statistics(cls, ID, Goal, Assist, Match):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

query = """SELECT * FROM StatisticsInfo WHERE ID = %d""" % (ID)

(37)

statisticsInfo = cursor.fetchone() statistics = list(statisticsInfo) if Goal != "":

statistics[1] = Goal if Assist != "":

statistics[2] = Assist if Match != "":

statistics[3] = Match

query = """UPDATE StatisticsInfo

SET Goal = '%s', Assist= '%s', Match= '%s'

WHERE ID = %d """ % (statistics[1], statistics[2],

˓→statistics[3], ID)

cursor.execute(query) cursor.close()

˙Istatistik Bilgilerinin Silinmesi

Id’si ile veritabanında buldu˘gumuz istatistik bilgisi silinir.

@classmethod

def DeleteStatistic(cls, ID):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor() query = """UPDATE StatisticsInfo

SET Goal = %d, Assist= %d, Match= %d WHERE ID = '%s' """ % (0, 0, 0, ID) cursor.execute(query)

cursor.close()

3.2.2 Ufuk ¸ Sahar Tarafından Yapılan Kısımlar

Antrenman Bilgisi

• Antrenman bilgisi tablosu Bu tabloda antrenman ile ilgili bilgiler yer almakta ve antrenman tipi(TypeID) dı¸s anahtarı ile parametreler tablosuna ba¸svuru yapıp parametre tablosunda var olan antrenman tip- lerini kullanabiliriz. Ayrıca, antrenmanı ekleyen kullanıcı(CreateUserID) dı¸s anahtarı ile kullanıcı bilgisi tablosuna ba¸svuru yapıp antrenmanı kimin ekledi˘gi bilgisine ula¸sabiliriz.

• Antrenman bilgisi ekleme def training_add():

if current_user.userType == 'admin' or current_user.userType == 'Trainer':

with dbapi2.connect(database.config) as connection:

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

query = """ SELECT * FROM PARAMETERS WHERE TYPEID=4""" #typeid 4

˓→for training

cursor.execute(query)

training_data = cursor.fetchall()

return render_template('training_add.html',training_data=training_

˓→data)

else:

trainingType = request.form['trainingType']

trainingName = request.form['trainingName']

trainingLoc = request.form['trainingLoc']

trainingDate = request.form['trainingDate']

(38)

query = "INSERT INTO TrainingInfo(TYPEID,TrainingName,Location,

˓→TrainingDate,CreateUserId,CreateDate) VALUES('%d', '%s', '%s', '%s','%d','%s')"

˓→% (int(trainingType), trainingName, trainingLoc, trainingDate,current_user.id,

˓→datetime.datetime.now())

cursor.execute(query) connection.commit()

return redirect(url_for('site.training_page')) else:

return render_template('error.html')

• Antrenman bilgisi güncelleme

def training_update(trainingID):

if current_user.userType == 'admin' or current_user.userType == 'Trainer':

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor() if new_trainingType != '':

query = """UPDATE TrainingInfo SET TypeID = '%s' WHERE ID = %d"

˓→"" % (new_trainingType, int(trainingID)) cursor.execute(query) if new_trainingName != '':

query = """UPDATE TrainingInfo SET TrainingName = '%s' WHERE

˓→ID = %d""" % (new_trainingName, int(trainingID)) cursor.execute(query)

if new_trainingLoc != '':

query = """UPDATE TrainingInfo SET Location = '%s' WHERE ID =

˓→%d""" % (new_trainingLoc, int(trainingID)) cursor.execute(query) if new_trainingDate != '':

query = """UPDATE TrainingInfo SET TrainingDate = '%s' WHERE

˓→ID = %d""" % (new_trainingDate, int(trainingID)) cursor.execute(query)

connection.commit()

return redirect(url_for('site.training_page')) else:

return render_template('error.html')

• Antrenman bilgisi silme

def training_page():

if current_user.userType == 'admin' or current_user.userType == 'Trainer':

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

deletes = request.form.getlist('training_to_delete') for delete in deletes:

query = "DELETE FROM TrainingInfo WHERE ID='%d'" % int(delete) cursor.execute(query)

return redirect(url_for('site.training_page')) else:

return render_template('error.html')

(39)

Maç Bilgisi

• Maç bilgisi tablosu Bu tabloda gerekli maç bilgileri yer almakta ve ¸sehir(cityID) dı¸s anahtarı ile parametre tablosuna ba¸svuru yapıp parametre tablosunda var olan ¸sehir bilgilerini kullanabiliriz.

• Maç bilgisi ekleme

def fixture_add():

if current_user.userType == 'admin':

with dbapi2.connect(database.config) as connection:

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

query = """ SELECT * FROM PARAMETERS WHERE TYPEID=3""" # typeid 3

˓→for city

cursor.execute(query)

city_data = cursor.fetchall()

return render_template('fixture_add.html', city_data=city_data) else:

fixtureHomeName = request.form['fixtureHomeName']

fixtureAwayName = request.form['fixtureAwayName']

fixtureArena = request.form['fixtureArena']

fixtureCity = request.form['fixtureCity']

matchDate = request.form['matchDate']

query = "INSERT INTO FixtureInfo(CityID,HomeTeamName,AwayTeamName,

˓→ArenaName,matchDate) VALUES('%d', '%s', '%s', '%s','%s')" % (

int(fixtureCity), fixtureHomeName, fixtureAwayName, fixtureArena,

˓→matchDate)

cursor.execute(query) connection.commit()

return redirect(url_for('site.fixture_page')) else:

return render_template('error.html')

• Maç bilgisi güncelleme

def fixture_update(matchID):

if current_user.userType == 'admin':

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

new_Home = request.form['fixtureHomeName']

new_Away = request.form['fixtureAwayName']

new_Arena = request.form['fixtureArena']

new_HomeScore = request.form['fixtureHomeScore']

new_AwayScore = request.form['fixtureAwayScore']

new_City = request.form['fixtureCity']

new_Date = request.form['matchDate']

query = """SELECT * FROM FixtureInfo WHERE ID = %d""" % (matchID) cursor.execute(query)

fixtureInfo = cursor.fetchone() fixture = list(fixtureInfo) if new_Home != "":

fixture[5] = new_Home if new_Away != "":

fixture[6] = new_Away if new_Arena != "":

fixture[7] = new_Arena if new_HomeScore != "":

(40)

fixture[2] = new_HomeScore if new_AwayScore != "":

fixture[3] = new_AwayScore if new_City != "":

fixture[1] = new_City if new_Date != "":

fixture[4] = new_Date

query = """UPDATE FixtureInfo SET HomeTeamName = '%s', AwayTeamName= '

˓→%s', ArenaName= '%s', CityID= '%d', HomeTeamScore= '%s', AwayTeamScore= '%s',

˓→MatchDate= '%s'

WHERE ID = %d """ % (

fixture[5], fixture[6], fixture[7], int(fixture[1]), fixture[2],

˓→fixture[3], fixture[4], matchID) cursor.execute(query) cursor.close()

connection.commit()

return redirect(url_for('site.fixture_page'))

• Maç bilgisi silme def fixture_page():

if current_user.userType == 'admin':

with dbapi2.connect(database.config) as connection:

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

query = """ SELECT x.ID, x.HomeTeamName, x.AwayTeamName, x.

˓→ArenaName, y.Name, x.HomeTeamScore, x.AwayTeamScore, x.Matchdate FROM

˓→FixtureInfo As x JOIN Parameters as y ON x.CityId = y.Id ORDER BY x.MatchDate

˓→DESC"""

cursor.execute(query) fixture = cursor.fetchall() connection.commit()

return render_template('fixture.html', fixture=fixture) else:

deletes = request.form.getlist('fixture_to_delete') for delete in deletes:

query = "DELETE FROM FixtureInfo WHERE ID='%d'" % int(delete) cursor.execute(query)

return redirect(url_for('site.fixture_page')) else:

return render_template('error.html')

Gözlenen Futbolcular

• Gözlenen oyuncu bilgisi tablosu Bu tabloda gözlenen futbolcular ile ilgili bilgiler yer almakta ve gö- zlemci(ScoutID) dı¸s anahtarı ile kullanıcılar tablosuna ba¸svuru yapıp gözlemci bilgisine eri¸sebiliriz.

Ayrıca, maç bilgisi(MatchID) dı¸s anahtarı ile maç bilgisi tablosuna ba¸svuru yapıp gözlenen oyuncunun hangi maçta izlendi˘gi bilgisine eri¸sebiliriz.

• Gözlenen futbolcuları ekleme def scouting_add():

if current_user.userType == 'admin' or current_user.userType == "Scout":

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

(41)

query = """ SELECT * FROM FixtureInfo"""

cursor.execute(query)

match_data = cursor.fetchall()

return render_template('scouting_add.html', match_data=match_data) else:

matchType = request.form['matchType']

observedName = request.form['observedName']

observedSurname = request.form['observedSurname']

observedPoint = request.form['observedPoint']

if observedPoint == '':

observedPoint = 0

query = "INSERT INTO ObservedPlayerInfo(MatchID, ScoutID, Name,

˓→Surname, Point,CreateDate) VALUES('%d', '%d', '%s', '%s','%d','%s')" %

˓→(int(matchType), current_user.id, observedName, observedSurname,

˓→int(observedPoint), datetime.datetime.now()) cursor.execute(query)

connection.commit()

return redirect(url_for('site.scouting_page')) else:

return render_template('error.html')

• Gözlenen futbolcuları güncelleme

def scouting_update(observedID):

if current_user.userType == 'admin' or current_user.userType == "Scout":

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

new_Match = request.form['matchType']

new_Name = request.form['observedName']

new_Surname = request.form['observedSurname']

new_Point = request.form['observedPoint']

new_Date = datetime.datetime.now()

query = """SELECT * FROM ObservedPlayerInfo WHERE ID = %d""" %

˓→(observedID)

cursor.execute(query)

observedPlayerInfo = cursor.fetchone() observedPlayer = list(observedPlayerInfo) if new_Name != "":

observedPlayer[5] = new_Name if new_Surname != "":

observedPlayer[6] = new_Surname if new_Point != "":

observedPlayer[3] = new_Point

query = """UPDATE ObservedPlayerInfo

SET Name = '%s', Surname= '%s', Point= '%s', MatchID= '%d',

˓→CreateDate= '%s'

WHERE ID = %d """ % (

observedPlayer[5], observedPlayer[6], observedPlayer[3], int(new_

˓→Match),new_Date, observedID) cursor.execute(query) cursor.close()

connection.commit()

return redirect(url_for('site.scouting_page')) else:

return render_template('error.html')

• Gözlenen futbolcuları silme

(42)

def scouting_page():

if current_user.userType == 'admin' or current_user.userType == "Scout":

with dbapi2.connect(database.config) as connection:

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

query = """ SELECT x.ID, x.Name, x.Surname, x.Point, x.CreateDate,

˓→y.HomeTeamName, y.AwayTeamName, y.ArenaName, y.MatchDate FROM

˓→ObservedPlayerInfo as x JOIN FixtureInfo as y ON x.MatchId = y.Id ORDER BY x.

˓→CreateDate DESC"""

cursor.execute(query)

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

return render_template('scouting.html',

˓→observedPlayers=observedPlayers) else:

deletes = request.form.getlist('scouting_to_delete') for delete in deletes:

query = "DELETE FROM ObservedPlayerInfo WHERE ID='%d'" %

˓→int(delete)

cursor.execute(query)

return redirect(url_for('site.scouting_page')) else:

return render_template('error.html')

Prim Bilgisi

• Prim bilgisi tablosu Bu tabloda futbolcuların primleri ile ilgili bilgiler yer almakta ve prim tipi(TypeID) dı¸s anahtarı ile parametreler tablosuna ba¸svuru yapıp parametre tablosunda var olan prim tiplerini kullanabiliriz. Ayrıca, prim bilgisinin sahibini (UserID) dı¸s anahtarı ile kullanıcı bilgisi tablosuna ba¸svuru yapıp prim bilgisinin hangi futbolcuya ait oldu˘gu bilgisine ula¸sabiliriz.

Prim bilgisi daha önce olmayan futbolculara prim bilgisi eklenirken mevcut prim bilgisi olan fut- bolcuların prim bilgisi güncellenir. Prim bilgisi futbolcunun kontratında yer alan prim de˘gerleri ve futbolcunun istatistik verilerine göre hesaplanır.

• Prim bilgisi ekleme/güncelleme def add_premium(cls):

with dbapi2.connect(database.config) as connection:

cursor = connection.cursor()

CreateDate = datetime.datetime.now() CreateUserID = current_user.id

query = """SELECT ID, Goal, Assist, Match FROM StatisticsInfo"""

try:

cursor.execute(query)

statisticsInfo = cursor.fetchall() except dbapi2.Error:

connection.rollback() else:

connection.commit()

statistics = list(statisticsInfo)

query = """SELECT UserID, GoalPremium, AssistPremium, MatchPremium,

˓→SignPremium, Salary FROM ContractInfo"""

try:

cursor.execute(query)

contractInfo = cursor.fetchall()

(43)

except dbapi2.Error:

connection.rollback() else:

connection.commit()

query = """SELECT * FROM PremiumInfo"""

try:

cursor.execute(query)

premiumInfo = cursor.fetchall() except dbapi2.Error:

connection.rollback() else:

connection.commit()

query = """SELECT ID, Name FROM Parameters WHERE TypeID = 5"""

try:

cursor.execute(query)

parameterInfo = cursor.fetchall() except dbapi2.Error:

connection.rollback() else:

connection.commit()

contracts = list(contractInfo) statistics = list(statisticsInfo) parameters = list(parameterInfo) premiums = list(premiumInfo) for i in statistics:

for j in contracts:

ctrl = False if i[0] == j[0]:

for m in premiums:

if m[1] == i[0]: # ctrl = True break

for k in range(1, 6):

if k < 4:

userID = i[0]

amount = j[k] * i[k]

if k == 1:

for l in parameters:

if l[1] == 'Goal Premium':

type = l[0]

if k == 2:

for l in parameters:

if l[1] == 'Assist Premium':

type = l[0]

if k == 3:

for l in parameters:

if l[1] == 'Match Premium':

type = l[0]

else:

if k == 4:

for l in parameters:

if l[1] == 'Sign Premium':

type = l[0]

amount = j[k]

if k == 5:

for l in parameters:

if l[1] == 'Salary':

type = l[0]

amount = j[k]

(44)

if ctrl == True:

query = """UPDATE PremiumInfo SET Amount = %d WHERE

˓→UserID = %s and PremiumTypeID = %s """ % (

amount, userID, type) else:

query = """INSERT INTO PremiumInfo (UserID,

˓→PremiumTypeID, Amount, CreateUserID, CreateDate)

VALUES ('%s', '%s', '%s', '%s', '%s')""" % ( str(userID), str(type), str(amount),

˓→str(CreateUserID), datetime.datetime.now()) try:

cursor.execute(query) except dbapi2.Error:

connection.rollback() else:

connection.commit() cursor.close()

• Prim bilgisi silme

def premiums_page():

if current_user.userType == 'admin':

if request.method == 'GET':

premiums = PremiumDatabase.getPremiums()

return render_template('premiums.html', premiums = premiums) else:

deletes = request.form.getlist('premium_to_delete') for delete in deletes:

print("delete",delete)

PremiumDatabase.DeletePremium(delete) return redirect(url_for('site.premiums_page')) else:

return render_template('error.html')

Parametre Bilgisi

• Parametre bilgisi tablosu Bu tabloda di˘ger tabloların kullanması gereken parametreler yer almaktadır. Bu parametreler kullanıcı tipi, pozisyon/mevki, ¸sehir, antrenman tipi ve prim tipi parametreleri olmak üzere 5’e ayrılır. Parametre tablosuna birçok tablodan dı¸s anahtarla ba¸svuru yapılır. Parametreleri ekleme, silme, ve güncelleme yetkisi sadece yetkili yöneticiler de olup ba¸slangıçta veritabanında yer alan parametrelerin silinmemesi gerekir. Ayrıca, sistemde kullanılan parametreler silinemez.

• Parametre bilgisi ekleme def parameter_add(TYPE):

if current_user.userType == 'admin':

with dbapi2.connect(database.config) as connection:

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

query = """ SELECT ID,NAME FROM PARAMETERTYPE WHERE ID='%d'"""% TYPE cursor.execute(query)

typeName = cursor.fetchone()

return render_template('parameter_add.html', parameterType=typeName)

(45)

parameterName = request.form['parameterType']

query = "INSERT INTO PARAMETERS(TYPEID,NAME) VALUES('%d', '%s')" %

˓→(TYPE,parameterName)

cursor.execute(query) connection.commit()

return redirect(url_for('site.parameters_page')) else:

return render_template('error.html')

• Parametre bilgisi güncelleme

def parameter_update(parameterID):

if current_user.userType == 'admin':

with dbapi2.connect(database.config) as connection:

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

query = """ SELECT * FROM PARAMETERS WHERE ID='%d'""" %

˓→(parameterID)

cursor.execute(query)

parameter = cursor.fetchone()

query = """ SELECT NAME FROM PARAMETERTYPE WHERE ID='%d'""" %

˓→parameter[1]

cursor.execute(query)

parameterType = cursor.fetchone() connection.commit()

return render_template('parameter_update.html',

˓→parameter=parameter,parameterType=parameterType) else:

new_parameterName = request.form['update_parameter']

query = """UPDATE Parameters SET Name = '%s' WHERE ID = %d""" %

˓→(new_parameterName,parameterID) cursor.execute(query) connection.commit()

return redirect(url_for('site.parameters_page')) else:

return render_template('error.html')

• Parametre bilgisi silme def parameters_page():

if current_user.userType == 'admin':

with dbapi2.connect(database.config) as connection:

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

#query = """ SELECT P1.NAME FROM PARAMETERS AS P1 JOIN PARAMETERTYPE

˓→AS P2 ON(P1.TYPEID=P2.ID) WHERE P2.NAME='City' """

query = """ SELECT * FROM PARAMETERS"""

cursor.execute(query)

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

return render_template('parameters.html', all_parameters=all_

˓→parameters)

(46)

else:

deletes = request.form.getlist('parameter_to_delete') print(deletes)

#### check parameter to be deleted ###

deletes = ParamaterCheckDelete.search(deletes) for delete in deletes:

query = "DELETE FROM PARAMETERS WHERE ID='%d'" % int(delete) cursor.execute(query)

query = """ SELECT * FROM PARAMETERS"""

cursor.execute(query)

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

return render_template('parameters.html', all_parameters=all_

˓→parameters) else:

return render_template('error.html')

Referanslar

Benzer Belgeler

• Çift serili korelasyon katsayısı, sürekli bir değişken ile gerçekte sürekli ancak yapay olarak süreksiz hale getirilen iki kategorili bir değişken arasındaki

• Değişkenler arası ilişki doğrusalsa: doğrusal regresyon • Tek bağımsız değişken varsa: basit regresyon. Basit doğrusal regresyondaki basit kelimesi iki

• Fark puanlarına dayalı standart hata tan sayılı küçük gruplar için kolay olmakla beraber büyük gruplar için korelasyona dayalı şu

• Null hipotezi test etmede kullanılacak istatistiksel testi tanımlayan test istatistiği • Gerçekte doğru olan hipotezin reddedilmesi durumunda yapılacak hatayı

• İlişkili iki örneklemden elde edilen iki ortalama arasındaki farkın manidar olup olmadığını test etmek için kullanılan parametrik bir tekniktir.. • EŞLEŞTİRİLMİŞ

• Formül, bağımsız örneklemler için t-testi formülü; tek fark ortak varyans yerine ANOVA’da

• Araştırma teknikleri dersi: Tüm öğrenciler bu dersi alır dolayısı ile tüm öğrenciler için sabittir, değişken değildir ....