arshtech commited on
Commit
1a3f0c9
·
verified ·
1 Parent(s): ee64209

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +242 -5
app.py CHANGED
@@ -2,8 +2,8 @@ from flask import Flask, render_template, request, redirect, url_for, session, f
2
  from pymongo import MongoClient
3
  import bcrypt
4
  import smtplib
5
- from email.mime.text import MimeText
6
- from email.mime.multipart import MimeMultipart
7
  from datetime import datetime
8
  import os
9
 
@@ -28,9 +28,10 @@ SMTP_PASSWORD = "wpiy tuxp pgpf wljz"
28
  ADMIN_EMAIL = "singharshbir76@gmail.com"
29
  ADMIN_PASSWORD = "arshbir"
30
 
31
- # Routes (same as before, but using direct MongoClient)
32
  @app.route('/')
33
  def index():
 
34
  car_list = list(cars.find({"status": "approved"}))
35
  return render_template('index.html', cars=car_list)
36
 
@@ -43,13 +44,16 @@ def login():
43
  user = users.find_one({"email": email})
44
 
45
  if user:
 
46
  if email == ADMIN_EMAIL and password == ADMIN_PASSWORD:
47
  session['user_id'] = str(user['_id'])
48
  session['role'] = 'admin'
49
  session['email'] = email
50
  return redirect(url_for('admin_dashboard'))
51
 
 
52
  if bcrypt.checkpw(password.encode('utf-8'), user['password']):
 
53
  if user['role'] == 'seller' and not user.get('approved', False):
54
  flash('Your seller account is pending approval by admin.')
55
  return redirect(url_for('login'))
@@ -69,7 +73,240 @@ def login():
69
 
70
  return render_template('login.html')
71
 
72
- # ... (rest of the routes remain the same as previous app.py)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
 
74
  if __name__ == '__main__':
75
- app.run(host='0.0.0.0', port=7860, debug=True)
 
2
  from pymongo import MongoClient
3
  import bcrypt
4
  import smtplib
5
+ from email.mime.text import MIMEText
6
+ from email.mime.multipart import MIMEMultipart
7
  from datetime import datetime
8
  import os
9
 
 
28
  ADMIN_EMAIL = "singharshbir76@gmail.com"
29
  ADMIN_PASSWORD = "arshbir"
30
 
31
+ # Routes
32
  @app.route('/')
33
  def index():
34
+ # Get all approved cars
35
  car_list = list(cars.find({"status": "approved"}))
36
  return render_template('index.html', cars=car_list)
37
 
 
44
  user = users.find_one({"email": email})
45
 
46
  if user:
47
+ # Check if user is admin
48
  if email == ADMIN_EMAIL and password == ADMIN_PASSWORD:
49
  session['user_id'] = str(user['_id'])
50
  session['role'] = 'admin'
51
  session['email'] = email
52
  return redirect(url_for('admin_dashboard'))
53
 
54
+ # Check password for regular users
55
  if bcrypt.checkpw(password.encode('utf-8'), user['password']):
56
+ # Check if seller is approved
57
  if user['role'] == 'seller' and not user.get('approved', False):
58
  flash('Your seller account is pending approval by admin.')
59
  return redirect(url_for('login'))
 
73
 
74
  return render_template('login.html')
75
 
76
+ @app.route('/register', methods=['GET', 'POST'])
77
+ def register():
78
+ if request.method == 'POST':
79
+ name = request.form.get('name')
80
+ email = request.form.get('email')
81
+ password = request.form.get('password')
82
+ role = request.form.get('role')
83
+ address = request.form.get('address')
84
+ phone = request.form.get('phone')
85
+
86
+ # Check if user already exists
87
+ if users.find_one({"email": email}):
88
+ flash('Email already registered')
89
+ return redirect(url_for('register'))
90
+
91
+ # Hash password
92
+ hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
93
+
94
+ # Create user document
95
+ user_data = {
96
+ "name": name,
97
+ "email": email,
98
+ "password": hashed_password,
99
+ "role": role,
100
+ "address": address,
101
+ "phone": phone,
102
+ "approved": True if role == 'buyer' else False,
103
+ "created_at": datetime.now()
104
+ }
105
+
106
+ users.insert_one(user_data)
107
+
108
+ if role == 'buyer':
109
+ flash('Registration successful! Please login.')
110
+ return redirect(url_for('login'))
111
+ else:
112
+ flash('Registration submitted. Waiting for admin approval.')
113
+ return redirect(url_for('login'))
114
+
115
+ return render_template('register.html')
116
+
117
+ @app.route('/logout')
118
+ def logout():
119
+ session.clear()
120
+ return redirect(url_for('index'))
121
+
122
+ @app.route('/admin')
123
+ def admin_dashboard():
124
+ if 'user_id' not in session or session.get('role') != 'admin':
125
+ return redirect(url_for('login'))
126
+
127
+ # Get pending seller approvals
128
+ pending_sellers = list(users.find({"role": "seller", "approved": False}))
129
+
130
+ # Get all cars for approval
131
+ pending_cars = list(cars.find({"status": "pending"}))
132
+
133
+ return render_template('admin.html',
134
+ pending_sellers=pending_sellers,
135
+ pending_cars=pending_cars)
136
+
137
+ @app.route('/approve_seller/<user_id>')
138
+ def approve_seller(user_id):
139
+ if 'user_id' not in session or session.get('role') != 'admin':
140
+ return redirect(url_for('login'))
141
+
142
+ users.update_one({"_id": user_id}, {"$set": {"approved": True}})
143
+ flash('Seller approved successfully')
144
+ return redirect(url_for('admin_dashboard'))
145
+
146
+ @app.route('/seller')
147
+ def seller_dashboard():
148
+ if 'user_id' not in session or session.get('role') != 'seller':
149
+ return redirect(url_for('login'))
150
+
151
+ # Check if seller is approved
152
+ user = users.find_one({"_id": session['user_id']})
153
+ if not user.get('approved', False):
154
+ flash('Your seller account is pending approval.')
155
+ return redirect(url_for('login'))
156
+
157
+ # Get seller's cars
158
+ seller_cars = list(cars.find({"seller_id": session['user_id']}))
159
+ return render_template('seller_dashboard.html', cars=seller_cars)
160
+
161
+ @app.route('/add_car', methods=['POST'])
162
+ def add_car():
163
+ if 'user_id' not in session or session.get('role') != 'seller':
164
+ return redirect(url_for('login'))
165
+
166
+ name = request.form.get('name')
167
+ year = request.form.get('year')
168
+ price = request.form.get('price')
169
+ description = request.form.get('description')
170
+
171
+ car_data = {
172
+ "name": name,
173
+ "year": year,
174
+ "price": price,
175
+ "description": description,
176
+ "seller_id": session['user_id'],
177
+ "seller_email": session['email'],
178
+ "status": "pending",
179
+ "created_at": datetime.now()
180
+ }
181
+
182
+ cars.insert_one(car_data)
183
+ flash('Car added successfully. Waiting for admin approval.')
184
+ return redirect(url_for('seller_dashboard'))
185
+
186
+ @app.route('/approve_car/<car_id>')
187
+ def approve_car(car_id):
188
+ if 'user_id' not in session or session.get('role') != 'admin':
189
+ return redirect(url_for('login'))
190
+
191
+ cars.update_one({"_id": car_id}, {"$set": {"status": "approved"}})
192
+ flash('Car approved successfully')
193
+ return redirect(url_for('admin_dashboard'))
194
+
195
+ @app.route('/book_appointment/<car_id>', methods=['GET', 'POST'])
196
+ def book_appointment(car_id):
197
+ if 'user_id' not in session or session.get('role') != 'buyer':
198
+ return redirect(url_for('login'))
199
+
200
+ car = cars.find_one({"_id": car_id})
201
+
202
+ if request.method == 'POST':
203
+ name = request.form.get('name')
204
+ email = request.form.get('email')
205
+ address = request.form.get('address')
206
+ phone = request.form.get('phone')
207
+ preferred_date = request.form.get('preferred_date')
208
+ preferred_time = request.form.get('preferred_time')
209
+
210
+ appointment_data = {
211
+ "car_id": car_id,
212
+ "car_name": car['name'],
213
+ "buyer_id": session['user_id'],
214
+ "buyer_name": name,
215
+ "buyer_email": email,
216
+ "buyer_address": address,
217
+ "buyer_phone": phone,
218
+ "preferred_date": preferred_date,
219
+ "preferred_time": preferred_time,
220
+ "status": "pending",
221
+ "created_at": datetime.now()
222
+ }
223
+
224
+ appointments.insert_one(appointment_data)
225
+ flash('Appointment booked successfully. Seller will contact you soon.')
226
+ return redirect(url_for('index'))
227
+
228
+ return render_template('appointment.html', car=car)
229
+
230
+ @app.route('/seller_appointments/<car_id>')
231
+ def seller_appointments(car_id):
232
+ if 'user_id' not in session or session.get('role') != 'seller':
233
+ return redirect(url_for('login'))
234
+
235
+ car_appointments = list(appointments.find({"car_id": car_id}))
236
+ car = cars.find_one({"_id": car_id})
237
+ return render_template('seller.html', appointments=car_appointments, car=car)
238
+
239
+ @app.route('/approve_appointment/<appointment_id>', methods=['POST'])
240
+ def approve_appointment(appointment_id):
241
+ if 'user_id' not in session or session.get('role') != 'seller':
242
+ return redirect(url_for('login'))
243
+
244
+ meeting_date = request.form.get('meeting_date')
245
+ meeting_time = request.form.get('meeting_time')
246
+ meeting_place = request.form.get('meeting_place')
247
+
248
+ appointment = appointments.find_one({"_id": appointment_id})
249
+
250
+ # Update appointment status
251
+ appointments.update_one(
252
+ {"_id": appointment_id},
253
+ {"$set": {
254
+ "status": "approved",
255
+ "meeting_date": meeting_date,
256
+ "meeting_time": meeting_time,
257
+ "meeting_place": meeting_place
258
+ }}
259
+ )
260
+
261
+ # Send email to buyer
262
+ send_meeting_email(
263
+ appointment['buyer_email'],
264
+ appointment['car_name'],
265
+ meeting_date,
266
+ meeting_time,
267
+ meeting_place
268
+ )
269
+
270
+ flash('Appointment approved and email sent to buyer')
271
+ return redirect(url_for('seller_appointments', car_id=appointment['car_id']))
272
+
273
+ def send_meeting_email(buyer_email, car_name, date, time, place):
274
+ try:
275
+ subject = f"Appointment Confirmation for {car_name}"
276
+ body = f"""
277
+ Dear Buyer,
278
+
279
+ Your appointment for {car_name} has been approved.
280
+
281
+ Meeting Details:
282
+ Date: {date}
283
+ Time: {time}
284
+ Place: {place}
285
+
286
+ Please arrive on time for the test drive.
287
+
288
+ Best regards,
289
+ Carwala Team
290
+ """
291
+
292
+ msg = MIMEMultipart()
293
+ msg['From'] = SMTP_EMAIL
294
+ msg['To'] = buyer_email
295
+ msg['Subject'] = subject
296
+
297
+ msg.attach(MIMEText(body, 'plain'))
298
+
299
+ server = smtplib.SMTP('smtp.gmail.com', 587)
300
+ server.starttls()
301
+ server.login(SMTP_EMAIL, SMTP_PASSWORD)
302
+ text = msg.as_string()
303
+ server.sendmail(SMTP_EMAIL, buyer_email, text)
304
+ server.quit()
305
+
306
+ return True
307
+ except Exception as e:
308
+ print(f"Email error: {e}")
309
+ return False
310
 
311
  if __name__ == '__main__':
312
+ app.run(host='0.0.0.0', port=7860, debug=False)