source: app.py@ e6c1c76

Last change on this file since e6c1c76 was 19e7fbe, checked in by Valerija Andrijeska <valerija.andrijeska@…>, 3 days ago

BiblioPremium application

  • Property mode set to 100644
File size: 48.9 KB
RevLine 
[19e7fbe]1import os
2import psycopg2
3from psycopg2 import pool
4from sshtunnel import SSHTunnelForwarder
5from dotenv import load_dotenv
6from flask import Flask, render_template, request, redirect, url_for, session
7
8app = Flask(__name__)
9app.secret_key = "bibliopremium-secret-key"
10
11load_dotenv()
12
13DB_NAME = os.getenv("DB_NAME")
14DB_USER = os.getenv("DB_USER")
15DB_PASSWORD = os.getenv("DB_PASSWORD")
16
17SSH_HOST = os.getenv("SSH_HOST")
18SSH_USER = os.getenv("SSH_USER")
19SSH_PASSWORD = os.getenv("SSH_PASSWORD")
20
21
22# SSH поврзување
23tunnel = SSHTunnelForwarder(
24 (SSH_HOST, 22),
25 ssh_username=SSH_USER,
26 ssh_password=SSH_PASSWORD,
27 remote_bind_address=("localhost", 5432)
28)
29
30tunnel.start()
31
32
33# --------------------------------------------------
34# DATABASE CONNECTION POOL
35# --------------------------------------------------
36
37db_pool = pool.SimpleConnectionPool(
38 1, # минимален број конекции
39 10, # максимален број конекции
40 host="localhost",
41 port=tunnel.local_bind_port,
42 database=DB_NAME,
43 user=DB_USER,
44 password=DB_PASSWORD
45)
46
47if db_pool:
48 print("Успешно креиран connection pool за BiblioPremium базата!")
49
50# --------------------------------------------------
51# ЗЕМАЊЕ И ВРАЌАЊЕ КОНЕКЦИЈА ОД POOL
52# --------------------------------------------------
53
54def get_db_connection():
55 return db_pool.getconn()
56
57
58def release_db_connection(conn):
59 db_pool.putconn(conn)
60
61
62# --------------------------------------------------
63# ПОЧЕТНА СТРАНИЦА + ПРЕБАРУВАЊЕ
64# --------------------------------------------------
65
66@app.route("/")
67def home():
68 search = request.args.get("search", "")
69
70 conn = get_db_connection()
71 cursor = conn.cursor()
72
73 if search:
74 cursor.execute("""
75 SELECT kniga_id, naslov, cena, opis, godina_izdavanje
76 FROM project.knigi
77 WHERE naslov ILIKE %s
78 ORDER BY kniga_id;
79 """, (f"%{search}%",))
80 else:
81 cursor.execute("""
82 SELECT kniga_id, naslov, cena, opis, godina_izdavanje
83 FROM project.knigi
84 ORDER BY kniga_id;
85 """)
86
87 knigi = cursor.fetchall()
88 cursor.close()
89 release_db_connection(conn)
90
91 return render_template(
92 "index.html",
93 knigi=knigi,
94 search=search
95 )
96
97
98# --------------------------------------------------
99# ДЕТАЛИ ЗА КНИГА
100# --------------------------------------------------
101
102@app.route("/book/<int:kniga_id>")
103def book_details(kniga_id):
104 conn = get_db_connection()
105 cursor = conn.cursor()
106
107 cursor.execute("""
108 SELECT kniga_id, naslov, cena, opis, godina_izdavanje
109 FROM project.knigi
110 WHERE kniga_id = %s;
111 """, (kniga_id,))
112
113 kniga = cursor.fetchone()
114
115 is_favorite = False
116
117 if "korisnik_id" in session:
118 cursor.execute("""
119 SELECT 1
120 FROM project.omileni
121 WHERE korisnik_id = %s
122 AND kniga_id = %s;
123 """, (session["korisnik_id"], kniga_id))
124
125 is_favorite = cursor.fetchone() is not None
126
127 cursor.close()
128 release_db_connection(conn)
129
130 return render_template(
131 "book_details.html",
132 kniga=kniga,
133 is_favorite=is_favorite
134 )
135
136
137# --------------------------------------------------
138# ДОДАВАЊЕ КНИГА ВО ОМИЛЕНИ
139# --------------------------------------------------
140
141@app.route("/favorite/<int:kniga_id>", methods=["POST"])
142def add_favorite(kniga_id):
143
144 if "korisnik_id" not in session:
145 return redirect(url_for("login"))
146
147 conn = get_db_connection()
148 cursor = conn.cursor()
149
150 cursor.execute("""
151 INSERT INTO project.omileni
152 (korisnik_id, kniga_id, datum_dodavanje)
153 VALUES (%s, %s, CURRENT_DATE)
154 ON CONFLICT (korisnik_id, kniga_id) DO NOTHING;
155 """, (session["korisnik_id"], kniga_id))
156
157 conn.commit()
158 cursor.close()
159 release_db_connection(conn)
160
161 return redirect(
162 url_for("book_details", kniga_id=kniga_id)
163 )
164
165
166# --------------------------------------------------
167# ОМИЛЕНИ КНИГИ
168# --------------------------------------------------
169
170@app.route("/favorites")
171def favorites():
172
173 if "korisnik_id" not in session:
174 return redirect(url_for("login"))
175
176 conn = get_db_connection()
177 cursor = conn.cursor()
178
179 cursor.execute("""
180 SELECT
181 k.kniga_id,
182 k.naslov,
183 k.cena,
184 k.opis,
185 k.godina_izdavanje
186 FROM project.omileni o
187 JOIN project.knigi k
188 ON o.kniga_id = k.kniga_id
189 WHERE o.korisnik_id = %s
190 ORDER BY o.datum_dodavanje DESC;
191 """, (session["korisnik_id"],))
192
193 knigi = cursor.fetchall()
194 cursor.close()
195 release_db_connection(conn)
196
197 return render_template(
198 "favorites.html",
199 knigi=knigi
200 )
201
202
203# --------------------------------------------------
204# ОТСТРАНУВАЊЕ КНИГА ОД ОМИЛЕНИ
205# --------------------------------------------------
206
207@app.route("/favorite/remove/<int:kniga_id>", methods=["POST"])
208def remove_favorite(kniga_id):
209
210 if "korisnik_id" not in session:
211 return redirect(url_for("login"))
212
213 conn = get_db_connection()
214 cursor = conn.cursor()
215
216 cursor.execute("""
217 DELETE FROM project.omileni
218 WHERE korisnik_id = %s
219 AND kniga_id = %s;
220 """, (session["korisnik_id"], kniga_id))
221
222 conn.commit()
223 cursor.close()
224 release_db_connection(conn)
225
226 return redirect(
227 url_for("favorites")
228 )
229
230
231# --------------------------------------------------
232# ПЕРСОНАЛИЗИРАНИ ПРЕПОРАКИ
233# --------------------------------------------------
234
235@app.route("/recommendations")
236def recommendations():
237
238 mood_id = request.args.get("mood", type=int)
239
240 conn = get_db_connection()
241 cursor = conn.cursor()
242
243 # --------------------------------------------------
244 # ГИ ЗЕМАМЕ СИТЕ РАСПОЛОЖЕНИЈА
245 # --------------------------------------------------
246
247 cursor.execute("""
248 SELECT raspolozenie_id, naziv, opis
249 FROM project.raspolozenija
250 ORDER BY raspolozenie_id;
251 """)
252
253 raspolozenija = cursor.fetchall()
254
255 knigi = []
256 selected_mood = None
257 personalized_books = []
258
259
260 # --------------------------------------------------
261 # ПЕРСОНАЛИЗИРАНИ ПРЕПОРАКИ
262 # СПОРЕД ЖАНРОВИ И КАТЕГОРИИ
263 # --------------------------------------------------
264
265 if "korisnik_id" in session:
266
267 korisnik_id = session["korisnik_id"]
268
269 cursor.execute("""
270 SELECT DISTINCT
271 k.kniga_id,
272 k.naslov,
273 k.cena,
274 k.opis,
275 k.godina_izdavanje
276 FROM project.knigi k
277 WHERE
278
279 EXISTS (
280 SELECT 1
281 FROM project.ima_zhanr iz
282 JOIN project.preferira_zhanr pz
283 ON iz.zhanr_id = pz.zhanr_id
284 WHERE iz.kniga_id = k.kniga_id
285 AND pz.korisnik_id = %s
286 )
287
288 OR
289
290 EXISTS (
291 SELECT 1
292 FROM project.ima_kategorija ik
293 JOIN project.preferira_kategorija pk
294 ON ik.kategorija_id = pk.kategorija_id
295 WHERE ik.kniga_id = k.kniga_id
296 AND pk.korisnik_id = %s
297 )
298
299 ORDER BY k.kniga_id;
300 """, (korisnik_id, korisnik_id))
301
302 personalized_books = cursor.fetchall()
303
304
305 # --------------------------------------------------
306 # ПРЕПОРАКИ СПОРЕД РАСПОЛОЖЕНИЕ
307 # --------------------------------------------------
308
309 if mood_id:
310
311 cursor.execute("""
312 SELECT raspolozenie_id, naziv, opis
313 FROM project.raspolozenija
314 WHERE raspolozenie_id = %s;
315 """, (mood_id,))
316
317 selected_mood = cursor.fetchone()
318
319
320 cursor.execute("""
321 SELECT
322 k.kniga_id,
323 k.naslov,
324 k.cena,
325 k.opis,
326 k.godina_izdavanje
327 FROM project.knigi k
328 JOIN project.povrzana_so p
329 ON k.kniga_id = p.kniga_id
330 WHERE p.raspolozenie_id = %s
331 ORDER BY k.kniga_id;
332 """, (mood_id,))
333
334 knigi = cursor.fetchall()
335
336
337 cursor.close()
338 release_db_connection(conn)
339
340
341 return render_template(
342 "recommendations.html",
343 raspolozenija=raspolozenija,
344 knigi=knigi,
345 selected_mood=selected_mood,
346 personalized_books=personalized_books
347 )
348# --------------------------------------------------
349# КУПУВАЊЕ КНИГА
350# --------------------------------------------------
351
352@app.route("/buy/<int:kniga_id>", methods=["POST"])
353def buy_book(kniga_id):
354
355 if "korisnik_id" not in session:
356 return redirect(url_for("login"))
357
358 # Ја земаме количината што корисникот ја избрал
359 try:
360 kolicina = int(request.form.get("kolicina", 1))
361 except (TypeError, ValueError):
362 kolicina = 1
363
364 # Дозволуваме количина од 1 до 5
365 if kolicina < 1 or kolicina > 5:
366 return "Невалидна количина.", 400
367
368 conn = get_db_connection()
369 cursor = conn.cursor()
370
371 try:
372
373 # 1. Ја земаме цената и моменталната залиха
374 cursor.execute("""
375 SELECT cena, kolicina_na_zaliha
376 FROM project.knigi
377 WHERE kniga_id = %s;
378 """, (kniga_id,))
379
380 kniga = cursor.fetchone()
381
382 if kniga is None:
383 cursor.close()
384 release_db_connection(conn)
385 return "Книгата не постои.", 404
386
387 cena = kniga[0]
388 kolicina_na_zaliha = kniga[1]
389
390 # Проверуваме дали има доволно примероци
391 if kolicina_na_zaliha < kolicina:
392 cursor.close()
393 release_db_connection(conn)
394 return (
395 f"Нема доволно примероци на залиха. "
396 f"Моментално достапни: {kolicina_na_zaliha}.",
397 400
398 )
399
400 # Ја пресметуваме вкупната цена
401 vkupna_cena = cena * kolicina
402
403
404 # 2. Креираме нова нарачка
405 cursor.execute("""
406 INSERT INTO project.naracki
407 (datum, status, vkupna_cena, korisnik_id)
408 VALUES
409 (CURRENT_TIMESTAMP, %s, %s, %s)
410 RETURNING naracka_id;
411 """, (
412 "ZAVRSENA",
413 vkupna_cena,
414 session["korisnik_id"]
415 ))
416
417 naracka_id = cursor.fetchone()[0]
418
419
420 # 3. Ја додаваме книгата и избраната количина
421 cursor.execute("""
422 INSERT INTO project.sodrzi
423 (naracka_id, kniga_id, kolicina, edinechna_cena)
424 VALUES
425 (%s, %s, %s, %s);
426 """, (
427 naracka_id,
428 kniga_id,
429 kolicina,
430 cena
431 ))
432
433
434 # 4. Го евидентираме плаќањето
435 cursor.execute("""
436 INSERT INTO project.plakanja
437 (datum, iznos, nacin_na_plakjanje, status, naracka_id)
438 VALUES
439 (CURRENT_TIMESTAMP, %s, %s, %s, %s);
440 """, (
441 vkupna_cena,
442 "KARTICKA",
443 "USPESNO",
444 naracka_id
445 ))
446
447
448 # 5. Ја намалуваме залихата за избраната количина
449 cursor.execute("""
450 UPDATE project.knigi
451 SET kolicina_na_zaliha = kolicina_na_zaliha - %s
452 WHERE kniga_id = %s;
453 """, (
454 kolicina,
455 kniga_id
456 ))
457
458 conn.commit()
459
460 except Exception as e:
461
462 conn.rollback()
463 cursor.close()
464 release_db_connection(conn)
465
466 return f"Грешка при купувањето: {e}", 500
467
468
469 cursor.close()
470 release_db_connection(conn)
471
472 return redirect(
473 url_for(
474 "purchase_success",
475 naracka_id=naracka_id
476 )
477 )
478# --------------------------------------------------
479# УСПЕШНО КУПУВАЊЕ
480# --------------------------------------------------
481
482@app.route("/purchase-success/<int:naracka_id>")
483def purchase_success(naracka_id):
484
485 if "korisnik_id" not in session:
486 return redirect(url_for("login"))
487
488 conn = get_db_connection()
489 cursor = conn.cursor()
490
491 cursor.execute("""
492 SELECT
493 n.naracka_id,
494 n.datum,
495 n.vkupna_cena,
496 n.status,
497 k.naslov,
498 s.kolicina,
499 p.nacin_na_plakjanje,
500 p.status
501 FROM project.naracki n
502 JOIN project.sodrzi s
503 ON n.naracka_id = s.naracka_id
504 JOIN project.knigi k
505 ON s.kniga_id = k.kniga_id
506 JOIN project.plakanja p
507 ON n.naracka_id = p.naracka_id
508 WHERE n.naracka_id = %s
509 AND n.korisnik_id = %s;
510 """, (
511 naracka_id,
512 session["korisnik_id"]
513 ))
514
515 naracka = cursor.fetchone()
516
517 cursor.close()
518 release_db_connection(conn)
519
520 return render_template(
521 "purchase_success.html",
522 naracka=naracka
523 )
524
525
526# --------------------------------------------------
527# ПРЕГЛЕД НА ПРЕТХОДНИ КУПУВАЊА
528# --------------------------------------------------
529
530@app.route("/orders")
531def orders():
532
533 if "korisnik_id" not in session:
534 return redirect(url_for("login"))
535
536 conn = get_db_connection()
537 cursor = conn.cursor()
538
539 cursor.execute("""
540 SELECT
541 n.naracka_id,
542 n.datum,
543 n.status,
544 n.vkupna_cena,
545 k.naslov,
546 s.kolicina,
547 s.edinechna_cena
548 FROM project.naracki n
549 JOIN project.sodrzi s
550 ON n.naracka_id = s.naracka_id
551 JOIN project.knigi k
552 ON s.kniga_id = k.kniga_id
553 WHERE n.korisnik_id = %s
554 ORDER BY n.datum DESC;
555 """, (session["korisnik_id"],))
556
557 naracki = cursor.fetchall()
558 cursor.close()
559 release_db_connection(conn)
560
561 return render_template(
562 "orders.html",
563 naracki=naracki
564 )
565
566
567# --------------------------------------------------
568# РЕГИСТРАЦИЈА
569# --------------------------------------------------
570
571@app.route("/register", methods=["GET", "POST"])
572def register():
573
574 if request.method == "POST":
575 ime = request.form["ime"]
576 prezime = request.form["prezime"]
577 email = request.form["email"]
578 lozinka = request.form["lozinka"]
579
580 conn = get_db_connection()
581 cursor = conn.cursor()
582
583 cursor.execute("""
584 INSERT INTO project.korisnici
585 (ime, prezime, email, lozinka, datum_registracija, uloga)
586 VALUES
587 (%s, %s, %s, %s, CURRENT_DATE, %s)
588 RETURNING korisnik_id;
589 """, (
590 ime,
591 prezime,
592 email,
593 lozinka,
594 "KUPUVAC"
595 ))
596
597 korisnik_id = cursor.fetchone()[0]
598
599 conn.commit()
600 cursor.close()
601 release_db_connection(conn)
602
603 session["korisnik_id"] = korisnik_id
604 session["ime"] = ime
605 session["prezime"] = prezime
606 session["uloga"] = "KUPUVAC"
607
608 return redirect(url_for("home"))
609
610 return render_template("register.html")
611
612
613# --------------------------------------------------
614# НАЈАВА
615# --------------------------------------------------
616
617@app.route("/login", methods=["GET", "POST"])
618def login():
619
620 if request.method == "POST":
621 email = request.form["email"]
622 lozinka = request.form["lozinka"]
623
624 conn = get_db_connection()
625 cursor = conn.cursor()
626
627 cursor.execute("""
628 SELECT korisnik_id, ime, prezime, uloga
629 FROM project.korisnici
630 WHERE email = %s
631 AND lozinka = %s;
632 """, (email, lozinka))
633
634 korisnik = cursor.fetchone()
635 cursor.close()
636 release_db_connection(conn)
637
638 if korisnik:
639 session["korisnik_id"] = korisnik[0]
640 session["ime"] = korisnik[1]
641 session["prezime"] = korisnik[2]
642 session["uloga"] = korisnik[3]
643
644 return redirect(url_for("home"))
645
646 return render_template(
647 "login.html",
648 error="Погрешна е-пошта или лозинка."
649 )
650
651 return render_template("login.html")
652
653
654# --------------------------------------------------
655# ОДЈАВА
656# --------------------------------------------------
657
658@app.route("/logout")
659def logout():
660 session.clear()
661 return redirect(url_for("home"))
662
663# --------------------------------------------------
664# МОИ ПРЕФЕРЕНЦИИ
665# --------------------------------------------------
666
667@app.route("/preferences", methods=["GET", "POST"])
668def preferences():
669
670 if "korisnik_id" not in session:
671 return redirect(url_for("login"))
672
673 korisnik_id = session["korisnik_id"]
674 conn = get_db_connection()
675 cursor = conn.cursor()
676
677 # --------------------------------------------------
678 # ЗАЧУВУВАЊЕ НА ПРЕФЕРЕНЦИИТЕ
679 # --------------------------------------------------
680
681 if request.method == "POST":
682
683 selected_zhanrovi = request.form.getlist("zhanrovi")
684 selected_kategorii = request.form.getlist("kategorii")
685
686 try:
687
688 # ------------------------------------------
689 # ЖАНРОВИ
690 # ------------------------------------------
691
692 # Ги бришеме старите жанровски преференции
693 cursor.execute("""
694 DELETE FROM project.preferira_zhanr
695 WHERE korisnik_id = %s;
696 """, (korisnik_id,))
697
698 # Ги внесуваме новоизбраните жанрови
699 for zhanr_id in selected_zhanrovi:
700
701 cursor.execute("""
702 INSERT INTO project.preferira_zhanr
703 (korisnik_id, zhanr_id, datum_dodavanje)
704 VALUES
705 (%s, %s, CURRENT_DATE);
706 """, (korisnik_id, zhanr_id))
707
708
709 # ------------------------------------------
710 # КАТЕГОРИИ
711 # ------------------------------------------
712
713 # Ги бришеме старите преференции за категории
714 cursor.execute("""
715 DELETE FROM project.preferira_kategorija
716 WHERE korisnik_id = %s;
717 """, (korisnik_id,))
718
719 # Ги внесуваме новоизбраните категории
720 for kategorija_id in selected_kategorii:
721
722 cursor.execute("""
723 INSERT INTO project.preferira_kategorija
724 (korisnik_id, kategorija_id, datum_dodavanje)
725 VALUES
726 (%s, %s, CURRENT_DATE);
727 """, (korisnik_id, kategorija_id))
728
729
730 conn.commit()
731
732 except Exception as e:
733
734 conn.rollback()
735 cursor.close()
736 release_db_connection(conn)
737
738 return (
739 f"Грешка при зачувување на преференциите: {e}",
740 500
741 )
742
743 cursor.close()
744 release_db_connection(conn)
745
746 return redirect(url_for("recommendations"))
747
748
749 # --------------------------------------------------
750 # ГИ ЗЕМАМЕ СИТЕ ЖАНРОВИ
751 # --------------------------------------------------
752
753 cursor.execute("""
754 SELECT zhanr_id, naziv, opis
755 FROM project.zhanrovi
756 ORDER BY zhanr_id;
757 """)
758
759 zhanrovi = cursor.fetchall()
760
761
762 # --------------------------------------------------
763 # ГИ ЗЕМАМЕ ИЗБРАНИТЕ ЖАНРОВИ
764 # --------------------------------------------------
765
766 cursor.execute("""
767 SELECT zhanr_id
768 FROM project.preferira_zhanr
769 WHERE korisnik_id = %s;
770 """, (korisnik_id,))
771
772 selected_zhanrovi = [
773 row[0] for row in cursor.fetchall()
774 ]
775
776
777 # --------------------------------------------------
778 # ГИ ЗЕМАМЕ СИТЕ КАТЕГОРИИ
779 # --------------------------------------------------
780
781 cursor.execute("""
782 SELECT kategorija_id, naziv, opis
783 FROM project.kategorii
784 ORDER BY kategorija_id;
785 """)
786
787 kategorii = cursor.fetchall()
788
789
790 # --------------------------------------------------
791 # ГИ ЗЕМАМЕ ИЗБРАНИТЕ КАТЕГОРИИ
792 # --------------------------------------------------
793
794 cursor.execute("""
795 SELECT kategorija_id
796 FROM project.preferira_kategorija
797 WHERE korisnik_id = %s;
798 """, (korisnik_id,))
799
800 selected_kategorii = [
801 row[0] for row in cursor.fetchall()
802 ]
803
804
805 cursor.close()
806 release_db_connection(conn)
807
808
809 # --------------------------------------------------
810 # ЈА ПРИКАЖУВАМЕ СТРАНИЦАТА
811 # --------------------------------------------------
812
813 return render_template(
814 "preferences.html",
815 zhanrovi=zhanrovi,
816 selected_zhanrovi=selected_zhanrovi,
817 kategorii=kategorii,
818 selected_kategorii=selected_kategorii
819 )
820
821# --------------------------------------------------
822# ADMIN
823# --------------------------------------------------
824
825@app.route("/admin")
826def admin_dashboard():
827 if "korisnik_id" not in session:
828 return redirect(url_for("login"))
829
830 if session.get("uloga") != "ADMIN":
831 return redirect(url_for("home"))
832
833 return render_template("admin.html")
834# --------------------------------------------------
835# ADMIN - КНИГИ
836# --------------------------------------------------
837
838@app.route("/admin/books")
839def admin_books():
840 if "korisnik_id" not in session:
841 return redirect(url_for("login"))
842
843 if session.get("uloga") != "ADMIN":
844 return redirect(url_for("home"))
845
846 conn = get_db_connection()
847 cursor = conn.cursor()
848
849 cursor.execute("""
850 SELECT
851 kniga_id,
852 naslov,
853 isbn,
854 cena,
855 kolicina_na_zaliha
856 FROM project.knigi
857 ORDER BY kniga_id;
858 """)
859
860 knigi = cursor.fetchall()
861 cursor.close()
862 release_db_connection(conn)
863
864 return render_template(
865 "admin_books.html",
866 knigi=knigi
867 )
868# --------------------------------------------------
869# ADMIN - ДОДАВАЊЕ НОВА КНИГА
870# --------------------------------------------------
871
872@app.route("/admin/books/add", methods=["GET", "POST"])
873def admin_add_book():
874 if "korisnik_id" not in session:
875 return redirect(url_for("login"))
876
877 if session.get("uloga") != "ADMIN":
878 return redirect(url_for("home"))
879
880 if request.method == "POST":
881 naslov = request.form.get("naslov")
882 isbn = request.form.get("isbn")
883 opis = request.form.get("opis")
884 godina_izdavanje = request.form.get("godina_izdavanje")
885 kolicina_na_zaliha = request.form.get("kolicina_na_zaliha")
886 cena = request.form.get("cena")
887
888 conn = get_db_connection()
889 cursor = conn.cursor()
890
891 try:
892 cursor.execute("""
893 INSERT INTO project.knigi
894 (naslov, isbn, opis, godina_izdavanje,
895 kolicina_na_zaliha, cena)
896 VALUES (%s, %s, %s, %s, %s, %s);
897 """, (
898 naslov,
899 isbn,
900 opis,
901 godina_izdavanje,
902 kolicina_na_zaliha,
903 cena
904 ))
905
906 conn.commit()
907
908 except Exception as e:
909 conn.rollback()
910 cursor.close()
911 release_db_connection(conn)
912 return f"Грешка при додавање на книгата: {e}"
913
914 cursor.close()
915 release_db_connection(conn)
916
917 return redirect(url_for("admin_books"))
918
919 return render_template("admin_add_book.html")
920# --------------------------------------------------
921# ADMIN - ИЗМЕНА НА КНИГА
922# --------------------------------------------------
923
924@app.route("/admin/books/edit/<int:kniga_id>", methods=["GET", "POST"])
925def admin_edit_book(kniga_id):
926 if "korisnik_id" not in session:
927 return redirect(url_for("login"))
928
929 if session.get("uloga") != "ADMIN":
930 return redirect(url_for("home"))
931
932 conn = get_db_connection()
933 cursor = conn.cursor()
934
935 if request.method == "POST":
936 naslov = request.form.get("naslov")
937 isbn = request.form.get("isbn")
938 opis = request.form.get("opis")
939 godina_izdavanje = request.form.get("godina_izdavanje")
940 kolicina_na_zaliha = request.form.get("kolicina_na_zaliha")
941 cena = request.form.get("cena")
942
943 try:
944 cursor.execute("""
945 UPDATE project.knigi
946 SET naslov = %s,
947 isbn = %s,
948 opis = %s,
949 godina_izdavanje = %s,
950 kolicina_na_zaliha = %s,
951 cena = %s
952 WHERE kniga_id = %s;
953 """, (
954 naslov,
955 isbn,
956 opis,
957 godina_izdavanje,
958 kolicina_na_zaliha,
959 cena,
960 kniga_id
961 ))
962
963 conn.commit()
964
965 except Exception as e:
966 conn.rollback()
967 cursor.close()
968 release_db_connection(conn)
969 return f"Грешка при изменување на книгата: {e}"
970
971 cursor.close()
972 release_db_connection(conn)
973
974 return redirect(url_for("admin_books"))
975
976 cursor.execute("""
977 SELECT
978 kniga_id,
979 naslov,
980 isbn,
981 opis,
982 godina_izdavanje,
983 kolicina_na_zaliha,
984 cena
985 FROM project.knigi
986 WHERE kniga_id = %s;
987 """, (kniga_id,))
988
989 kniga = cursor.fetchone()
990 cursor.close()
991 release_db_connection(conn)
992
993 if not kniga:
994 return redirect(url_for("admin_books"))
995
996 return render_template(
997 "admin_edit_book.html",
998 kniga=kniga
999 )
1000
1001# --------------------------------------------------
1002# ADMIN - ЖАНРОВИ
1003# --------------------------------------------------
1004
1005@app.route("/admin/genres")
1006def admin_genres():
1007 if "korisnik_id" not in session:
1008 return redirect(url_for("login"))
1009
1010 if session.get("uloga") != "ADMIN":
1011 return redirect(url_for("home"))
1012
1013 conn = get_db_connection()
1014 cursor = conn.cursor()
1015
1016 cursor.execute("""
1017 SELECT
1018 zhanr_id,
1019 naziv,
1020 opis
1021 FROM project.zhanrovi
1022 ORDER BY zhanr_id;
1023 """)
1024
1025 zhanrovi = cursor.fetchall()
1026 cursor.close()
1027 release_db_connection(conn)
1028
1029 return render_template(
1030 "admin_genres.html",
1031 zhanrovi=zhanrovi
1032 )
1033
1034# --------------------------------------------------
1035# ADMIN - ДОДАВАЊЕ НОВ ЖАНР
1036# --------------------------------------------------
1037
1038@app.route("/admin/genres/add", methods=["GET", "POST"])
1039def admin_add_genre():
1040 if "korisnik_id" not in session:
1041 return redirect(url_for("login"))
1042
1043 if session.get("uloga") != "ADMIN":
1044 return redirect(url_for("home"))
1045
1046 if request.method == "POST":
1047 naziv = request.form.get("naziv")
1048 opis = request.form.get("opis")
1049
1050 conn = get_db_connection()
1051 cursor = conn.cursor()
1052
1053 try:
1054 cursor.execute("""
1055 INSERT INTO project.zhanrovi
1056 (naziv, opis)
1057 VALUES (%s, %s);
1058 """, (
1059 naziv,
1060 opis
1061 ))
1062
1063 conn.commit()
1064
1065 except Exception as e:
1066 conn.rollback()
1067 cursor.close()
1068 release_db_connection(conn)
1069 return f"Грешка при додавање на жанрот: {e}"
1070
1071 cursor.close()
1072 release_db_connection(conn)
1073
1074 return redirect(url_for("admin_genres"))
1075
1076 return render_template("admin_add_genre.html")
1077
1078# --------------------------------------------------
1079# ADMIN - ИЗМЕНА НА ЖАНР
1080# --------------------------------------------------
1081
1082@app.route("/admin/genres/edit/<int:zhanr_id>", methods=["GET", "POST"])
1083def admin_edit_genre(zhanr_id):
1084 if "korisnik_id" not in session:
1085 return redirect(url_for("login"))
1086
1087 if session.get("uloga") != "ADMIN":
1088 return redirect(url_for("home"))
1089
1090 conn = get_db_connection()
1091 cursor = conn.cursor()
1092
1093 if request.method == "POST":
1094 naziv = request.form.get("naziv")
1095 opis = request.form.get("opis")
1096
1097 try:
1098 cursor.execute("""
1099 UPDATE project.zhanrovi
1100 SET naziv = %s,
1101 opis = %s
1102 WHERE zhanr_id = %s;
1103 """, (
1104 naziv,
1105 opis,
1106 zhanr_id
1107 ))
1108
1109 conn.commit()
1110
1111 except Exception as e:
1112 conn.rollback()
1113 cursor.close()
1114 release_db_connection(conn)
1115 return f"Грешка при изменување на жанрот: {e}"
1116
1117 cursor.close()
1118 release_db_connection(conn)
1119
1120 return redirect(url_for("admin_genres"))
1121
1122 cursor.execute("""
1123 SELECT
1124 zhanr_id,
1125 naziv,
1126 opis
1127 FROM project.zhanrovi
1128 WHERE zhanr_id = %s;
1129 """, (zhanr_id,))
1130
1131 zhanr = cursor.fetchone()
1132 cursor.close()
1133 release_db_connection(conn)
1134
1135 if not zhanr:
1136 return redirect(url_for("admin_genres"))
1137
1138 return render_template(
1139 "admin_edit_genre.html",
1140 zhanr=zhanr
1141 )
1142# --------------------------------------------------
1143# ADMIN - БРИШЕЊЕ ЖАНР
1144# --------------------------------------------------
1145
1146@app.route("/admin/genres/delete/<int:zhanr_id>", methods=["POST"])
1147def admin_delete_genre(zhanr_id):
1148 if "korisnik_id" not in session:
1149 return redirect(url_for("login"))
1150
1151 if session.get("uloga") != "ADMIN":
1152 return redirect(url_for("home"))
1153
1154 conn = get_db_connection()
1155 cursor = conn.cursor()
1156
1157 try:
1158 # Проверка дали жанрот е поврзан со некоја книга
1159 cursor.execute("""
1160 SELECT COUNT(*)
1161 FROM project.ima_zhanr
1162 WHERE zhanr_id = %s;
1163 """, (zhanr_id,))
1164
1165 broj_knigi = cursor.fetchone()[0]
1166
1167 if broj_knigi > 0:
1168 cursor.close()
1169 release_db_connection(conn)
1170
1171 return """
1172 Жанрот не може да се избрише бидејќи е поврзан со една или повеќе книги.
1173 <br><br>
1174 <a href="/admin/genres">Назад кон жанровите</a>
1175 """
1176
1177 # Бришење на жанрот
1178 cursor.execute("""
1179 DELETE FROM project.zhanrovi
1180 WHERE zhanr_id = %s;
1181 """, (zhanr_id,))
1182
1183 conn.commit()
1184
1185 except Exception as e:
1186 conn.rollback()
1187 cursor.close()
1188 release_db_connection(conn)
1189
1190 return f"Грешка при бришење на жанрот: {e}"
1191
1192 cursor.close()
1193 release_db_connection(conn)
1194
1195 return redirect(url_for("admin_genres"))
1196# --------------------------------------------------
1197# ADMIN - КАТЕГОРИИ
1198# --------------------------------------------------
1199
1200@app.route("/admin/categories")
1201def admin_categories():
1202 if "korisnik_id" not in session:
1203 return redirect(url_for("login"))
1204
1205 if session.get("uloga") != "ADMIN":
1206 return redirect(url_for("home"))
1207
1208 conn = get_db_connection()
1209 cursor = conn.cursor()
1210
1211 cursor.execute("""
1212 SELECT
1213 kategorija_id,
1214 naziv,
1215 opis
1216 FROM project.kategorii
1217 ORDER BY kategorija_id;
1218 """)
1219
1220 kategorii = cursor.fetchall()
1221 cursor.close()
1222 release_db_connection(conn)
1223
1224 return render_template(
1225 "admin_categories.html",
1226 kategorii=kategorii
1227 )
1228
1229# --------------------------------------------------
1230# ADMIN - ДОДАВАЊЕ НОВА КАТЕГОРИЈА
1231# --------------------------------------------------
1232
1233@app.route("/admin/categories/add", methods=["GET", "POST"])
1234def admin_add_category():
1235 if "korisnik_id" not in session:
1236 return redirect(url_for("login"))
1237
1238 if session.get("uloga") != "ADMIN":
1239 return redirect(url_for("home"))
1240
1241 if request.method == "POST":
1242 naziv = request.form.get("naziv")
1243 opis = request.form.get("opis")
1244
1245 conn = get_db_connection()
1246 cursor = conn.cursor()
1247
1248 try:
1249 cursor.execute("""
1250 INSERT INTO project.kategorii
1251 (naziv, opis)
1252 VALUES (%s, %s);
1253 """, (
1254 naziv,
1255 opis
1256 ))
1257
1258 conn.commit()
1259
1260 except Exception as e:
1261 conn.rollback()
1262 cursor.close()
1263 release_db_connection(conn)
1264 return f"Грешка при додавање на категоријата: {e}"
1265
1266 cursor.close()
1267 release_db_connection(conn)
1268
1269 return redirect(url_for("admin_categories"))
1270
1271 return render_template("admin_add_category.html")
1272
1273# --------------------------------------------------
1274# ADMIN - ИЗМЕНА НА КАТЕГОРИЈА
1275# --------------------------------------------------
1276
1277@app.route("/admin/categories/edit/<int:kategorija_id>", methods=["GET", "POST"])
1278def admin_edit_category(kategorija_id):
1279 if "korisnik_id" not in session:
1280 return redirect(url_for("login"))
1281
1282 if session.get("uloga") != "ADMIN":
1283 return redirect(url_for("home"))
1284
1285 conn = get_db_connection()
1286 cursor = conn.cursor()
1287
1288 if request.method == "POST":
1289 naziv = request.form.get("naziv")
1290 opis = request.form.get("opis")
1291
1292 try:
1293 cursor.execute("""
1294 UPDATE project.kategorii
1295 SET naziv = %s,
1296 opis = %s
1297 WHERE kategorija_id = %s;
1298 """, (
1299 naziv,
1300 opis,
1301 kategorija_id
1302 ))
1303
1304 conn.commit()
1305
1306 except Exception as e:
1307 conn.rollback()
1308 cursor.close()
1309 release_db_connection(conn)
1310 return f"Грешка при изменување на категоријата: {e}"
1311
1312 cursor.close()
1313 release_db_connection(conn)
1314
1315 return redirect(url_for("admin_categories"))
1316
1317 cursor.execute("""
1318 SELECT
1319 kategorija_id,
1320 naziv,
1321 opis
1322 FROM project.kategorii
1323 WHERE kategorija_id = %s;
1324 """, (kategorija_id,))
1325
1326 kategorija = cursor.fetchone()
1327 cursor.close()
1328 release_db_connection(conn)
1329
1330 if not kategorija:
1331 return redirect(url_for("admin_categories"))
1332
1333 return render_template(
1334 "admin_edit_category.html",
1335 kategorija=kategorija
1336 )
1337
1338# --------------------------------------------------
1339# ADMIN - БРИШЕЊЕ КАТЕГОРИЈА
1340# --------------------------------------------------
1341
1342@app.route("/admin/categories/delete/<int:kategorija_id>", methods=["POST"])
1343def admin_delete_category(kategorija_id):
1344 if "korisnik_id" not in session:
1345 return redirect(url_for("login"))
1346
1347 if session.get("uloga") != "ADMIN":
1348 return redirect(url_for("home"))
1349
1350 conn = get_db_connection()
1351 cursor = conn.cursor()
1352
1353 try:
1354 # Проверка дали категоријата е поврзана со книги
1355 cursor.execute("""
1356 SELECT COUNT(*)
1357 FROM project.ima_kategorija
1358 WHERE kategorija_id = %s;
1359 """, (kategorija_id,))
1360
1361 broj_knigi = cursor.fetchone()[0]
1362
1363 # Проверка дали категоријата е поврзана со кориснички преференции
1364 cursor.execute("""
1365 SELECT COUNT(*)
1366 FROM project.preferira_kategorija
1367 WHERE kategorija_id = %s;
1368 """, (kategorija_id,))
1369
1370 broj_preferencii = cursor.fetchone()[0]
1371
1372 if broj_knigi > 0 or broj_preferencii > 0:
1373 cursor.close()
1374 release_db_connection(conn)
1375
1376 return """
1377 Категоријата не може да се избрише бидејќи е поврзана со книги или со кориснички преференции.
1378 <br><br>
1379 <a href="/admin/categories">Назад кон категориите</a>
1380 """
1381
1382 # Бришење на категоријата
1383 cursor.execute("""
1384 DELETE FROM project.kategorii
1385 WHERE kategorija_id = %s;
1386 """, (kategorija_id,))
1387
1388 conn.commit()
1389
1390 except Exception as e:
1391 conn.rollback()
1392 cursor.close()
1393 release_db_connection(conn)
1394
1395 return f"Грешка при бришење на категоријата: {e}"
1396
1397 cursor.close()
1398 release_db_connection(conn)
1399
1400 return redirect(url_for("admin_categories"))
1401
1402# --------------------------------------------------
1403# ADMIN - РАСПОЛОЖЕНИЈА
1404# --------------------------------------------------
1405
1406@app.route("/admin/moods")
1407def admin_moods():
1408 if "korisnik_id" not in session:
1409 return redirect(url_for("login"))
1410
1411 if session.get("uloga") != "ADMIN":
1412 return redirect(url_for("home"))
1413
1414 conn = get_db_connection()
1415 cursor = conn.cursor()
1416
1417 cursor.execute("""
1418 SELECT
1419 raspolozenie_id,
1420 naziv,
1421 opis
1422 FROM project.raspolozenija
1423 ORDER BY raspolozenie_id;
1424 """)
1425
1426 raspolozenija = cursor.fetchall()
1427 cursor.close()
1428 release_db_connection(conn)
1429
1430 return render_template(
1431 "admin_moods.html",
1432 raspolozenija=raspolozenija
1433 )
1434
1435# --------------------------------------------------
1436# ADMIN - ДОДАВАЊЕ НОВО РАСПОЛОЖЕНИЕ
1437# --------------------------------------------------
1438
1439@app.route("/admin/moods/add", methods=["GET", "POST"])
1440def admin_add_mood():
1441 if "korisnik_id" not in session:
1442 return redirect(url_for("login"))
1443
1444 if session.get("uloga") != "ADMIN":
1445 return redirect(url_for("home"))
1446
1447 if request.method == "POST":
1448 naziv = request.form.get("naziv")
1449 opis = request.form.get("opis")
1450
1451 conn = get_db_connection()
1452 cursor = conn.cursor()
1453
1454 try:
1455 cursor.execute("""
1456 INSERT INTO project.raspolozenija
1457 (naziv, opis)
1458 VALUES (%s, %s);
1459 """, (
1460 naziv,
1461 opis
1462 ))
1463
1464 conn.commit()
1465
1466 except Exception as e:
1467 conn.rollback()
1468 cursor.close()
1469 release_db_connection(conn)
1470 return f"Грешка при додавање на расположението: {e}"
1471
1472 cursor.close()
1473 release_db_connection(conn)
1474
1475 return redirect(url_for("admin_moods"))
1476
1477 return render_template("admin_add_mood.html")
1478
1479# --------------------------------------------------
1480# ADMIN - ИЗМЕНА НА РАСПОЛОЖЕНИЕ
1481# --------------------------------------------------
1482
1483@app.route("/admin/moods/edit/<int:raspolozenie_id>", methods=["GET", "POST"])
1484def admin_edit_mood(raspolozenie_id):
1485 if "korisnik_id" not in session:
1486 return redirect(url_for("login"))
1487
1488 if session.get("uloga") != "ADMIN":
1489 return redirect(url_for("home"))
1490
1491 conn = get_db_connection()
1492 cursor = conn.cursor()
1493
1494 if request.method == "POST":
1495 naziv = request.form.get("naziv")
1496 opis = request.form.get("opis")
1497
1498 try:
1499 cursor.execute("""
1500 UPDATE project.raspolozenija
1501 SET naziv = %s,
1502 opis = %s
1503 WHERE raspolozenie_id = %s;
1504 """, (
1505 naziv,
1506 opis,
1507 raspolozenie_id
1508 ))
1509
1510 conn.commit()
1511
1512 except Exception as e:
1513 conn.rollback()
1514 cursor.close()
1515 release_db_connection(conn)
1516 return f"Грешка при изменување на расположението: {e}"
1517
1518 cursor.close()
1519 release_db_connection(conn)
1520
1521 return redirect(url_for("admin_moods"))
1522
1523 cursor.execute("""
1524 SELECT
1525 raspolozenie_id,
1526 naziv,
1527 opis
1528 FROM project.raspolozenija
1529 WHERE raspolozenie_id = %s;
1530 """, (raspolozenie_id,))
1531
1532 raspolozenie = cursor.fetchone()
1533 cursor.close()
1534 release_db_connection(conn)
1535
1536 if not raspolozenie:
1537 return redirect(url_for("admin_moods"))
1538
1539 return render_template(
1540 "admin_edit_mood.html",
1541 raspolozenie=raspolozenie
1542 )
1543
1544 # --------------------------------------------------
1545# ADMIN - БРИШЕЊЕ РАСПОЛОЖЕНИЕ
1546# --------------------------------------------------
1547
1548@app.route("/admin/moods/delete/<int:raspolozenie_id>", methods=["POST"])
1549def admin_delete_mood(raspolozenie_id):
1550 if "korisnik_id" not in session:
1551 return redirect(url_for("login"))
1552
1553 if session.get("uloga") != "ADMIN":
1554 return redirect(url_for("home"))
1555
1556 conn = get_db_connection()
1557 cursor = conn.cursor()
1558
1559 try:
1560 # Проверка дали расположението е поврзано
1561 # со книга/податоци во izbira_raspolozenie
1562 cursor.execute("""
1563 SELECT COUNT(*)
1564 FROM project.izbira_raspolozenie
1565 WHERE raspolozenie_id = %s;
1566 """, (raspolozenie_id,))
1567
1568 broj_izbira = cursor.fetchone()[0]
1569
1570 # Проверка дали расположението е поврзано
1571 # во povrzana_so
1572 cursor.execute("""
1573 SELECT COUNT(*)
1574 FROM project.povrzana_so
1575 WHERE raspolozenie_id = %s;
1576 """, (raspolozenie_id,))
1577
1578 broj_povrzuvanja = cursor.fetchone()[0]
1579
1580 if broj_izbira > 0 or broj_povrzuvanja > 0:
1581 cursor.close()
1582 release_db_connection(conn)
1583
1584 return """
1585 Расположението не може да се избрише бидејќи е поврзано со други податоци.
1586 <br><br>
1587 <a href="/admin/moods">Назад кон расположенијата</a>
1588 """
1589
1590 # Бришење на расположението
1591 cursor.execute("""
1592 DELETE FROM project.raspolozenija
1593 WHERE raspolozenie_id = %s;
1594 """, (raspolozenie_id,))
1595
1596 conn.commit()
1597
1598 except Exception as e:
1599 conn.rollback()
1600 cursor.close()
1601 release_db_connection(conn)
1602
1603 return f"Грешка при бришење на расположението: {e}"
1604
1605 cursor.close()
1606 release_db_connection(conn)
1607
1608 return redirect(url_for("admin_moods"))
1609
1610# --------------------------------------------------
1611# ADMIN - ПРЕГЛЕД НА СИТЕ НАРАЧКИ
1612# --------------------------------------------------
1613
1614@app.route("/admin/orders")
1615def admin_orders():
1616 if "korisnik_id" not in session:
1617 return redirect(url_for("login"))
1618
1619 if session.get("uloga") != "ADMIN":
1620 return redirect(url_for("home"))
1621
1622 # Која страница ја гледаме
1623 page = request.args.get("page", 1, type=int)
1624
1625 # По 10 нарачки на една страница
1626 per_page = 10
1627
1628 # Од кој запис да почнеме
1629 offset = (page - 1) * per_page
1630
1631 conn = get_db_connection()
1632 cursor = conn.cursor()
1633
1634 # Вкупен број на нарачки
1635 cursor.execute("""
1636 SELECT COUNT(*)
1637 FROM project.naracki;
1638 """)
1639
1640 total_orders = cursor.fetchone()[0]
1641
1642 # Ги земаме само нарачките за тековната страница
1643 cursor.execute("""
1644 SELECT
1645 n.naracka_id,
1646 k.ime,
1647 k.prezime,
1648 k.email,
1649 n.datum,
1650 n.status,
1651 n.vkupna_cena
1652 FROM project.naracki n
1653 JOIN project.korisnici k
1654 ON n.korisnik_id = k.korisnik_id
1655 ORDER BY n.datum DESC, n.naracka_id DESC
1656 LIMIT %s OFFSET %s;
1657 """, (per_page, offset))
1658
1659 naracki = cursor.fetchall()
1660
1661 cursor.close()
1662 release_db_connection(conn)
1663
1664 # Колку страници вкупно имаме
1665 total_pages = (total_orders + per_page - 1) // per_page
1666
1667 return render_template(
1668 "admin_orders.html",
1669 naracki=naracki,
1670 page=page,
1671 total_pages=total_pages
1672 )
1673
1674# --------------------------------------------------
1675# ADMIN - ПРЕГЛЕД НА СИТЕ ПЛАЌАЊА
1676# --------------------------------------------------
1677
1678@app.route("/admin/payments")
1679def admin_payments():
1680 if "korisnik_id" not in session:
1681 return redirect(url_for("login"))
1682
1683 if session.get("uloga") != "ADMIN":
1684 return redirect(url_for("home"))
1685
1686 # Која страница ја гледаме
1687 page = request.args.get("page", 1, type=int)
1688
1689 # По 10 плаќања на една страница
1690 per_page = 10
1691
1692 # Од кој запис да почнеме
1693 offset = (page - 1) * per_page
1694
1695 conn = get_db_connection()
1696 cursor = conn.cursor()
1697
1698 # Вкупен број на плаќања
1699 cursor.execute("""
1700 SELECT COUNT(*)
1701 FROM project.plakanja;
1702 """)
1703
1704 total_payments = cursor.fetchone()[0]
1705
1706 # Ги земаме само плаќањата за тековната страница
1707 cursor.execute("""
1708 SELECT
1709 p.plakjanje_id,
1710 p.naracka_id,
1711 k.ime,
1712 k.prezime,
1713 k.email,
1714 p.datum,
1715 p.iznos,
1716 p.nacin_na_plakjanje,
1717 p.status
1718 FROM project.plakanja p
1719 JOIN project.naracki n
1720 ON p.naracka_id = n.naracka_id
1721 JOIN project.korisnici k
1722 ON n.korisnik_id = k.korisnik_id
1723 ORDER BY p.datum DESC, p.plakjanje_id DESC
1724 LIMIT %s OFFSET %s;
1725 """, (per_page, offset))
1726
1727 plakanja = cursor.fetchall()
1728
1729 cursor.close()
1730 release_db_connection(conn)
1731
1732 # Колку страници вкупно имаме
1733 total_pages = (total_payments + per_page - 1) // per_page
1734
1735 return render_template(
1736 "admin_payments.html",
1737 plakanja=plakanja,
1738 page=page,
1739 total_pages=total_pages
1740 )
1741# --------------------------------------------------
1742# ADMIN - БРИШЕЊЕ КНИГА
1743# --------------------------------------------------
1744
1745@app.route("/admin/books/delete/<int:kniga_id>", methods=["POST"])
1746def admin_delete_book(kniga_id):
1747 if "korisnik_id" not in session:
1748 return redirect(url_for("login"))
1749
1750 if session.get("uloga") != "ADMIN":
1751 return redirect(url_for("home"))
1752
1753 conn = get_db_connection()
1754 cursor = conn.cursor()
1755
1756 try:
1757 # Проверка дали книгата постои во некоја нарачка
1758 cursor.execute("""
1759 SELECT COUNT(*)
1760 FROM project.sodrzi
1761 WHERE kniga_id = %s;
1762 """, (kniga_id,))
1763
1764 broj_naracki = cursor.fetchone()[0]
1765
1766 if broj_naracki > 0:
1767 cursor.close()
1768 release_db_connection(conn)
1769 return """
1770 Книгата не може да се избрише бидејќи
1771 е дел од една или повеќе нарачки.
1772 <br><br>
1773 <a href="/admin/books">Назад кон книгите</a>
1774 """
1775
1776 # Бришење на врските со книгата
1777 cursor.execute("""
1778 DELETE FROM project.omileni
1779 WHERE kniga_id = %s;
1780 """, (kniga_id,))
1781
1782 cursor.execute("""
1783 DELETE FROM project.napisana_od
1784 WHERE kniga_id = %s;
1785 """, (kniga_id,))
1786
1787 cursor.execute("""
1788 DELETE FROM project.ima_zhanr
1789 WHERE kniga_id = %s;
1790 """, (kniga_id,))
1791
1792 cursor.execute("""
1793 DELETE FROM project.ima_kategorija
1794 WHERE kniga_id = %s;
1795 """, (kniga_id,))
1796
1797 cursor.execute("""
1798 DELETE FROM project.povrzana_so
1799 WHERE kniga_id = %s;
1800 """, (kniga_id,))
1801
1802 # Бришење на самата книга
1803 cursor.execute("""
1804 DELETE FROM project.knigi
1805 WHERE kniga_id = %s;
1806 """, (kniga_id,))
1807
1808 conn.commit()
1809
1810 except Exception as e:
1811 conn.rollback()
1812 cursor.close()
1813 release_db_connection(conn)
1814 return f"Грешка при бришење на книгата: {e}"
1815
1816 cursor.close()
1817 release_db_connection(conn)
1818
1819 return redirect(url_for("admin_books"))
1820
1821# --------------------------------------------------
1822# СТАРТУВАЊЕ НА FLASK
1823# --------------------------------------------------
1824
1825if __name__ == "__main__":
1826 app.run(debug=True, use_reloader=False)
Note: See TracBrowser for help on using the repository browser.