Release 1.0
itucsdb1713
Dec 21, 2017
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
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:
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
• 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
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.
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
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ı
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.
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.
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.
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ç,
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
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.
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,
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
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ö-
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
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
Fig. 2.32: Prim sayfası görünümü
Fig. 2.33: Parametre sayfası görünümü
Fig. 2.34: Parametre sayfası görünümü
Fig. 2.35: Parametre sayfası görünümü
Fig. 2.36: Parametre sayfası görünümü
Fig. 2.37: Parametre sayfası görünümü
Fig. 2.38: Parametre sayfası görünümü
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.
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'))
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)
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),
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))
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,
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.
@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,
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()
˙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)
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']
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')
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 != "":
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()
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
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()
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]
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)
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)
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')