Hadeeratef91 commited on
Commit
71ef75a
·
verified ·
1 Parent(s): 71b017d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +203 -141
app.py CHANGED
@@ -4,190 +4,252 @@ from datetime import datetime
4
  from passlib.hash import bcrypt
5
  import os
6
 
 
7
  st.set_page_config(page_title="نظام إدارة الشكاوى", layout="centered")
8
 
9
- # الاتصال بقاعدة البيانات
10
- conn = sqlite3.connect("complaints_system.db", check_same_thread=False)
11
- c = conn.cursor()
12
-
13
- # إنشاء الجداول
14
- c.execute('''CREATE TABLE IF NOT EXISTS users (
15
- id INTEGER PRIMARY KEY AUTOINCREMENT,
16
- username TEXT UNIQUE,
17
- password TEXT,
18
- role TEXT
19
- )''')
20
-
21
- c.execute('''CREATE TABLE IF NOT EXISTS complaints (
22
- id INTEGER PRIMARY KEY AUTOINCREMENT,
23
- complaint_id TEXT UNIQUE,
24
- username TEXT,
25
- complaint_text TEXT,
26
- status TEXT,
27
- response TEXT,
28
- timestamp TEXT,
29
- user_comment TEXT
30
- )''')
31
-
32
- conn.commit()
33
-
34
- # تهيئة الجلسة
35
- if "is_logged_in" not in st.session_state:
36
- st.session_state.is_logged_in = False
37
- if "user_type" not in st.session_state:
38
- st.session_state.user_type = None
39
- if "username" not in st.session_state:
40
- st.session_state.username = ""
41
- if "complaint_input" not in st.session_state:
42
- st.session_state.complaint_input = ""
43
-
44
- # تسجيل الدخول
45
- if not st.session_state.is_logged_in:
 
 
 
 
 
 
 
46
  st.title("🔐 تسجيل الدخول")
47
  username = st.text_input("اسم المستخدم")
48
  password = st.text_input("كلمة المرور", type="password")
49
 
50
  if st.button("تسجيل الدخول"):
51
- c.execute("SELECT * FROM users WHERE username=?", (username,))
52
- user = c.fetchone()
53
- if user:
54
- if bcrypt.verify(password, user[2]):
55
- st.session_state.is_logged_in = True
56
- st.session_state.username = username
57
- st.session_state.user_type = "sender" if user[3] == "sender" else "receiver"
58
- st.rerun()
59
- else:
60
- st.error("❌ كلمة المرور غير صحيحة.")
 
 
 
61
  else:
62
- st.warning("❌ اسم المستخدم غير موجود.")
63
 
64
- # مقدم الشكوى
65
- elif st.session_state.user_type == "sender":
66
  st.title("📨 إرسال شكوى جديدة")
 
67
 
68
- def clear_complaint():
69
- st.session_state.complaint_input = ""
70
-
71
- complaint_text = st.text_area("📝 وصف الشكوى", key="complaint_input")
72
-
73
- if st.button("📤 إرسال الشكوى", on_click=clear_complaint):
74
- if not complaint_text or not complaint_text.strip():
75
- st.warning("⚠️ الرجاء إدخال نص الشكوى.")
76
  else:
77
- c.execute("SELECT * FROM complaints WHERE username=?", (st.session_state.username,))
78
- user_complaints = c.fetchall()
79
- prefix = st.session_state.username[:4].lower()
80
- next_id = len(user_complaints) + 1
81
- complaint_id = f"{prefix}_{next_id:07}"
82
-
83
- c.execute("SELECT * FROM complaints WHERE complaint_id=?", (complaint_id,))
84
- if c.fetchone():
85
- st.warning("⚠️ تم إرسال هذه الشكوى مسبقًا بناءً على المعرف!")
86
- else:
87
- timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
88
- c.execute("""INSERT INTO complaints
89
- (complaint_id, username, complaint_text, status, response, timestamp, user_comment)
90
- VALUES (?, ?, ?, ?, ?, ?, ?)""",
91
- (complaint_id, st.session_state.username, complaint_text.strip(),
92
- "Pending", "", timestamp, ""))
 
93
  conn.commit()
94
  st.success("✅ تم تقديم الشكوى بنجاح")
 
95
  st.rerun()
 
 
 
 
96
 
 
97
  st.subheader("📋 الشكاوى السابقة")
98
- c.execute("SELECT * FROM complaints WHERE username=? ORDER BY id DESC", (st.session_state.username,))
99
- complaints = c.fetchall()
100
-
101
- for row in complaints:
102
- comp_id, username, text, status, response, timestamp, user_comment = row[1:]
103
- with st.expander(f"📨 {comp_id} | الحالة: {status}"):
104
- st.write(f"📅 تم الإرسال في: {timestamp}")
105
- st.write(f"📄 الشكوى: {text}")
106
-
107
- if status.lower() == "pending":
108
- new_text = st.text_area("📝 تعديل الشكوى", value=text, key=f"edit_{comp_id}")
109
- if st.button("💾 حفظ التعديل", key=f"save_{comp_id}"):
 
 
 
 
 
 
 
110
  if new_text.strip():
111
- c.execute("UPDATE complaints SET complaint_text=? WHERE complaint_id=?",
112
- (new_text.strip(), comp_id))
 
 
 
113
  conn.commit()
 
114
  st.success("✅ تم تعديل الشكوى")
115
  st.rerun()
116
  else:
117
  st.warning("⚠️ لا يمكن حفظ شكوى فارغة")
118
  else:
119
- if response:
120
- st.success(f"💬 الرد: {response}")
121
- if not user_comment:
122
- comment = st.text_area("✏️ تعليقك على الرد", key=f"comment_{comp_id}")
123
- if st.button("📩 إرسال التعليق", key=f"send_comment_{comp_id}"):
 
 
 
 
124
  if comment.strip():
125
- c.execute("UPDATE complaints SET user_comment=? WHERE complaint_id=?",
126
- (comment.strip(), comp_id))
 
 
 
127
  conn.commit()
 
128
  st.success("✅ تم إرسال التعليق بنجاح")
129
  st.rerun()
130
  else:
131
  st.warning("⚠️ لا يمكن إرسال تعليق فارغ")
132
  else:
133
- st.info(f"🗣️ تعليقك السابق: {user_comment}")
134
 
135
- # مستقبل الشكوى (الـ admin أو الموظف)
136
- elif st.session_state.user_type == "receiver":
137
  st.title("📬 إدارة الشكاوى")
138
-
139
- c.execute("SELECT COUNT(*) FROM complaints WHERE status = 'Pending'")
140
- pending_count = c.fetchone()[0]
 
 
 
141
  if pending_count > 0:
142
  st.warning(f"🚨 يوجد {pending_count} شكوى جديدة لم يتم التعامل معها!")
143
-
144
- c.execute("SELECT * FROM complaints ORDER BY id DESC")
145
- complaints = c.fetchall()
 
 
146
 
147
  if not complaints:
148
  st.info("لا توجد شكاوى حالياً.")
149
  else:
150
  st.subheader("📋 جميع الشكاوى")
151
- options = {f"{row[1]} - {row[2]}": row for row in complaints}
152
- selected = st.selectbox("اختر شكوى للتعامل معها", list(options.keys()))
153
- selected_row = options[selected]
154
-
155
- st.subheader(f"📨 معرف الشكوى: {selected_row[1]}")
156
- st.write(f"👤 مقدم الشكوى: {selected_row[2]}")
157
- st.write(f"📝 الشكوى: {selected_row[3]}")
158
- st.write(f"📅 الوقت: {selected_row[6]}")
159
- if selected_row[7]:
160
- st.info(f"🗣️ تعليق المستخدم على الرد: {selected_row[7]}")
161
-
162
- new_status = st.selectbox("🔄 تحديث الحالة",
163
- ["Pending", "In Progress", "Resolved"],
164
- index=["Pending", "In Progress", "Resolved"].index(selected_row[4]))
165
- new_response = st.text_area("💬 الرد على الشكوى", value=selected_row[5] or "")
 
 
 
 
 
 
 
 
 
166
 
167
  if st.button("💾 حفظ التعديلات"):
168
- c.execute("UPDATE complaints SET status=?, response=? WHERE complaint_id=?",
169
- (new_status, new_response.strip(), selected_row[1]))
 
 
 
170
  conn.commit()
 
171
  st.success("✅ تم حفظ التعديلات")
172
  st.rerun()
173
 
174
- # زر تسجيل الخروج دائم
175
- if st.session_state.get("is_logged_in"):
176
- st.markdown("---")
177
- if st.button("🚪 تسجيل ا��خروج"):
178
- st.session_state.is_logged_in = False
179
- st.session_state.user_type = None
180
- st.session_state.username = ""
181
- st.rerun()
182
-
183
- # زر لتحميل قاعدة البيانات
184
- if os.path.exists("complaints_system.db"):
185
- with open("complaints_system.db", "rb") as db_file:
186
- st.download_button(
187
- label="📥 تحميل قاعدة البيانات",
188
- data=db_file,
189
- file_name="complaints_system.db",
190
- mime="application/octet-stream"
191
- )
192
- else:
193
- st.warning("⚠️ ملف قاعدة البيانات غير موجود.")
 
 
 
 
 
 
 
 
 
 
 
 
4
  from passlib.hash import bcrypt
5
  import os
6
 
7
+ # تهيئة الصفحة
8
  st.set_page_config(page_title="نظام إدارة الشكاوى", layout="centered")
9
 
10
+ # إدارة اتصال قاعدة البيانات
11
+ def get_db_connection():
12
+ conn = sqlite3.connect("complaints_system.db", check_same_thread=False)
13
+ conn.row_factory = sqlite3.Row
14
+ return conn
15
+
16
+ # إنشاء الجداول إذا لم تكن موجودة
17
+ def init_db():
18
+ conn = get_db_connection()
19
+ conn.execute('''CREATE TABLE IF NOT EXISTS users (
20
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
21
+ username TEXT UNIQUE,
22
+ password TEXT,
23
+ role TEXT
24
+ )''')
25
+
26
+ conn.execute('''CREATE TABLE IF NOT EXISTS complaints (
27
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
28
+ complaint_id TEXT UNIQUE,
29
+ username TEXT,
30
+ complaint_text TEXT,
31
+ status TEXT,
32
+ response TEXT,
33
+ timestamp TEXT,
34
+ user_comment TEXT
35
+ )''')
36
+ conn.commit()
37
+ conn.close()
38
+
39
+ init_db()
40
+
41
+ # إدارة حالة الجلسة
42
+ def init_session():
43
+ if "auth" not in st.session_state:
44
+ st.session_state.auth = {
45
+ "is_logged_in": False,
46
+ "username": "",
47
+ "role": ""
48
+ }
49
+
50
+ init_session()
51
+
52
+ # واجهة تسجيل الدخول
53
+ def login_page():
54
  st.title("🔐 تسجيل الدخول")
55
  username = st.text_input("اسم المستخدم")
56
  password = st.text_input("كلمة المرور", type="password")
57
 
58
  if st.button("تسجيل الدخول"):
59
+ conn = get_db_connection()
60
+ user = conn.execute("SELECT * FROM users WHERE username = ?", (username,)).fetchone()
61
+ conn.close()
62
+
63
+ if user and bcrypt.verify(password, user["password"]):
64
+ st.session_state.auth = {
65
+ "is_logged_in": True,
66
+ "username": user["username"],
67
+ "role": user["role"]
68
+ }
69
+ st.rerun()
70
+ elif user:
71
+ st.error("❌ كلمة المرور غير صحيحة")
72
  else:
73
+ st.warning("❌ اسم المستخدم غير موجود")
74
 
75
+ # صفحة مقدم الشكوى
76
+ def sender_page():
77
  st.title("📨 إرسال شكوى جديدة")
78
+ complaint_text = st.text_area("📝 وصف الشكوى", key="complaint_text")
79
 
80
+ if st.button("📤 إرسال الشكوى"):
81
+ if not complaint_text.strip():
82
+ st.warning("⚠️ الرجاء إدخال نص الشكوى")
 
 
 
 
 
83
  else:
84
+ conn = get_db_connection()
85
+ try:
86
+ # إنشاء معرف فريد للشكوى
87
+ user_complaints = conn.execute(
88
+ "SELECT COUNT(*) FROM complaints WHERE username = ?",
89
+ (st.session_state.auth["username"],)
90
+ ).fetchone()[0]
91
+
92
+ complaint_id = f"{st.session_state.auth['username'][:4]}_{user_complaints + 1:07d}"
93
+
94
+ conn.execute(
95
+ """INSERT INTO complaints
96
+ (complaint_id, username, complaint_text, status, response, timestamp, user_comment)
97
+ VALUES (?, ?, ?, ?, ?, ?, ?)""",
98
+ (complaint_id, st.session_state.auth["username"], complaint_text.strip(),
99
+ "Pending", "", datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "")
100
+ )
101
  conn.commit()
102
  st.success("✅ تم تقديم الشكوى بنجاح")
103
+ st.session_state.complaint_text = "" # مسح حقل الإدخال
104
  st.rerun()
105
+ except sqlite3.IntegrityError:
106
+ st.error("❌ حدث خطأ أثناء حفظ الشكوى")
107
+ finally:
108
+ conn.close()
109
 
110
+ # عرض الشكاوى السابقة
111
  st.subheader("📋 الشكاوى السابقة")
112
+ conn = get_db_connection()
113
+ complaints = conn.execute(
114
+ "SELECT * FROM complaints WHERE username = ? ORDER BY id DESC",
115
+ (st.session_state.auth["username"],)
116
+ ).fetchall()
117
+ conn.close()
118
+
119
+ for complaint in complaints:
120
+ with st.expander(f"📨 {complaint['complaint_id']} | الحالة: {complaint['status']}"):
121
+ st.write(f"📅 تم الإرسال في: {complaint['timestamp']}")
122
+ st.write(f"📄 الشكوى: {complaint['complaint_text']}")
123
+
124
+ if complaint["status"].lower() == "pending":
125
+ new_text = st.text_area(
126
+ "📝 تعديل الشكوى",
127
+ value=complaint["complaint_text"],
128
+ key=f"edit_{complaint['complaint_id']}"
129
+ )
130
+ if st.button("💾 حفظ التعديل", key=f"save_{complaint['complaint_id']}"):
131
  if new_text.strip():
132
+ conn = get_db_connection()
133
+ conn.execute(
134
+ "UPDATE complaints SET complaint_text = ? WHERE complaint_id = ?",
135
+ (new_text.strip(), complaint["complaint_id"])
136
+ )
137
  conn.commit()
138
+ conn.close()
139
  st.success("✅ تم تعديل الشكوى")
140
  st.rerun()
141
  else:
142
  st.warning("⚠️ لا يمكن حفظ شكوى فارغة")
143
  else:
144
+ if complaint["response"]:
145
+ st.success(f"💬 الرد: {complaint['response']}")
146
+
147
+ if not complaint["user_comment"]:
148
+ comment = st.text_area(
149
+ "✏️ تعليقك على الرد",
150
+ key=f"comment_{complaint['complaint_id']}"
151
+ )
152
+ if st.button("📩 إرسال التعليق", key=f"send_comment_{complaint['complaint_id']}"):
153
  if comment.strip():
154
+ conn = get_db_connection()
155
+ conn.execute(
156
+ "UPDATE complaints SET user_comment = ? WHERE complaint_id = ?",
157
+ (comment.strip(), complaint["complaint_id"])
158
+ )
159
  conn.commit()
160
+ conn.close()
161
  st.success("✅ تم إرسال التعليق بنجاح")
162
  st.rerun()
163
  else:
164
  st.warning("⚠️ لا يمكن إرسال تعليق فارغ")
165
  else:
166
+ st.info(f"🗣️ تعليقك السابق: {complaint['user_comment']}")
167
 
168
+ # صفحة مستقبل الشكاوى
169
+ def receiver_page():
170
  st.title("📬 إدارة الشكاوى")
171
+
172
+ conn = get_db_connection()
173
+ pending_count = conn.execute(
174
+ "SELECT COUNT(*) FROM complaints WHERE status = 'Pending'"
175
+ ).fetchone()[0]
176
+
177
  if pending_count > 0:
178
  st.warning(f"🚨 يوجد {pending_count} شكوى جديدة لم يتم التعامل معها!")
179
+
180
+ complaints = conn.execute(
181
+ "SELECT * FROM complaints ORDER BY id DESC"
182
+ ).fetchall()
183
+ conn.close()
184
 
185
  if not complaints:
186
  st.info("لا توجد شكاوى حالياً.")
187
  else:
188
  st.subheader("📋 جميع الشكاوى")
189
+ selected_complaint = st.selectbox(
190
+ "اختر شكوى للتعامل معها",
191
+ complaints,
192
+ format_func=lambda x: f"{x['complaint_id']} - {x['username']}"
193
+ )
194
+
195
+ st.subheader(f"📨 معرف الشكوى: {selected_complaint['complaint_id']}")
196
+ st.write(f"👤 مقدم الشكوى: {selected_complaint['username']}")
197
+ st.write(f"📝 الشكوى: {selected_complaint['complaint_text']}")
198
+ st.write(f"📅 الوقت: {selected_complaint['timestamp']}")
199
+
200
+ if selected_complaint["user_comment"]:
201
+ st.info(f"🗣️ تعليق المستخدم على الرد: {selected_complaint['user_comment']}")
202
+
203
+ new_status = st.selectbox(
204
+ "🔄 تحديث الحالة",
205
+ ["Pending", "In Progress", "Resolved"],
206
+ index=["Pending", "In Progress", "Resolved"].index(selected_complaint["status"])
207
+ )
208
+
209
+ new_response = st.text_area(
210
+ "💬 الرد على الشكوى",
211
+ value=selected_complaint["response"] or ""
212
+ )
213
 
214
  if st.button("💾 حفظ التعديلات"):
215
+ conn = get_db_connection()
216
+ conn.execute(
217
+ "UPDATE complaints SET status = ?, response = ? WHERE complaint_id = ?",
218
+ (new_status, new_response.strip(), selected_complaint["complaint_id"])
219
+ )
220
  conn.commit()
221
+ conn.close()
222
  st.success("✅ تم حفظ التعديلات")
223
  st.rerun()
224
 
225
+ # الواجهة الرئيسية
226
+ def main():
227
+ if not st.session_state.auth["is_logged_in"]:
228
+ login_page()
229
+ else:
230
+ if st.session_state.auth["role"] == "sender":
231
+ sender_page()
232
+ else:
233
+ receiver_page()
234
+
235
+ st.markdown("---")
236
+ if st.button("🚪 تسجيل الخروج"):
237
+ st.session_state.auth = {
238
+ "is_logged_in": False,
239
+ "username": "",
240
+ "role": ""
241
+ }
242
+ st.rerun()
243
+
244
+ # زر تحميل قاعدة البيانات
245
+ if os.path.exists("complaints_system.db"):
246
+ with open("complaints_system.db", "rb") as db_file:
247
+ st.download_button(
248
+ label="📥 تحميل قاعدة البيانات",
249
+ data=db_file,
250
+ file_name="complaints_system.db",
251
+ mime="application/octet-stream"
252
+ )
253
+
254
+ if __name__ == "__main__":
255
+ main()