1
+ from flask import Flask ,jsonify ,request
2
+ from flask_sqlalchemy import SQLAlchemy
3
+ from sqlalchemy import Column ,Integer ,Float ,String
4
+ import os
5
+ from flask_marshmallow import Marshmallow
6
+ from flask_jwt_extended import JWTManager ,jwt_required ,create_access_token
7
+ from flask_mail import Mail ,Message
8
+
9
+ app = Flask (__name__ )
10
+ basedir = os .path .abspath (os .path .dirname (__file__ ))
11
+
12
+ app .config ['SQLALCHEMY_DATABASE_URI' ] = 'sqlite:///' + os .path .join (basedir ,"planets.db" )
13
+ app .config ['JWT_SECRET_KEY' ]= 'super secret' # chenge this in real life
14
+
15
+ app .config ['MAIL_SERVER' ]= 'smtp.mailtrap.io'
16
+ app .config ['MAIL_PORT' ] = 2525
17
+ app .config ['MAIL_USERNAME' ] = ''
18
+ # app.config['MAIL_USERNAME'] = os.environ['MAIL_USERNAME']
19
+ app .config ['MAIL_PASSWORD' ] = ''
20
+ # app.config['MAIL_PASSWORD'] = os.environ['MAIL_PASSWORD']
21
+ app .config ['MAIL_USE_TLS' ] = True
22
+ app .config ['MAIL_USE_SSL' ] = False
23
+
24
+ db = SQLAlchemy (app )
25
+ ma = Marshmallow (app )
26
+ jwt = JWTManager (app )
27
+ mail = Mail (app )
28
+
29
+ # Start
30
+ @app .cli .command ("db_create" )
31
+ def db_create ():
32
+ db .create_all ()
33
+ print ("databse created" )
34
+
35
+ @app .cli .command ("db_drop" )
36
+ def db_drop ():
37
+ db .drop_all ()
38
+ print ("databse droped" )
39
+
40
+ '''
41
+ seeding databse
42
+ '''
43
+ @app .cli .command ("db_seed" )
44
+ def db_seed ():
45
+ mercury = Planet (
46
+ planet_name = 'Mercury' ,
47
+ planet_type = 'Class D' ,
48
+ home_star = 'Sol' ,
49
+ mass = 2.258e23 ,
50
+ radius = 1516 ,
51
+ distance = 35.98e6 )
52
+ venus = Planet (
53
+ planet_name = 'Venus' ,
54
+ planet_type = 'Class K' ,
55
+ home_star = 'Sol' ,
56
+ mass = 4.867e24 ,
57
+ radius = 3760 ,
58
+ distance = 67.24e6 )
59
+ earth = Planet (
60
+ planet_name = 'Earth' ,
61
+ planet_type = 'Class M' ,
62
+ home_star = 'Sol' ,
63
+ mass = 5.972e24 ,
64
+ radius = 3959 ,
65
+ distance = 92.96e6 )
66
+ db .session .add (mercury )
67
+ db .session .add (venus )
68
+ db .session .add (earth )
69
+
70
+ test_user = User (first_name = 'William' ,
71
+ last_name = 'Herschel' ,
72
+
73
+ password = 'P@ssw0rd' )
74
+ db .session .add (test_user )
75
+ db .session .commit ()
76
+ print ("databse seeded!" )
77
+
78
+ # End
79
+
80
+
81
+
82
+ @app .route ("/" ,methods = ["GET" ])
83
+ def hello_world ():
84
+ return jsonify ( message = "hi this is looking awesome" ),200
85
+
86
+ @app .route ("/<int:id>" ,methods = ["GET" ])
87
+ def hello (id ):
88
+ return jsonify (message = f"hi you entered the number is { id } " ),400
89
+
90
+
91
+ @app .route ("/parameters" )
92
+ def parameters ():
93
+ name = request .args .get ("name" )
94
+ age = int (request .args .get ("age" ))
95
+ if age < 18 :
96
+ return jsonify (message = "hi " + name + ', you are not old,hence you are not able to accesss this page' ),401
97
+ # by default status code is 200 or ok
98
+ return jsonify (message = "hello " + name + " you are old." )
99
+
100
+
101
+ @app .route ("/url_parameter/<string:name>/<int:age>" )
102
+ # def url_parameter(name,age): same work as below
103
+ def url_parameter (name :str ,age :int ):
104
+ if age < 18 :
105
+ return jsonify (message = "hi " + name + ', you are not old,hence you are not able to accesss this page' ),401
106
+ # by default status code is 200 or ok
107
+ return jsonify (message = "hello " + name + " you are old." )
108
+
109
+
110
+
111
+ ##
112
+ @app .route ("/planets" ,methods = ["GET" ])
113
+ def planets ():
114
+ planet_list = Planet .query .all ()
115
+ result = planets_schema .dump (planet_list )
116
+ return jsonify (result )
117
+ # return jsonify(data=planet_list)
118
+
119
+ @app .route ("/register" ,methods = ["POST" ])
120
+ def register ():
121
+ email = request .form ['email' ]
122
+ test = User .query .filter_by (email = email ).first ()
123
+ if test :
124
+ return jsonify (message = "email is already exist!" ),409
125
+
126
+ first_name = request .form ['first_name' ]
127
+ last_name = request .form ['last_name' ]
128
+ password = request .form ['password' ]
129
+ db .session .add (User (first_name = first_name ,last_name = last_name ,email = email ,password = password ))
130
+ db .session .commit ()
131
+ return jsonify (message = "user Created Successfully!" ),201
132
+
133
+
134
+ @app .route ("/login" ,methods = ["POST" ])
135
+ def login ():
136
+ # api==json, or form
137
+ if request .is_json :
138
+ # if user is trying to login via api
139
+ email = request .json ['email' ]
140
+ password = request .json ['password' ]
141
+ else :
142
+ # if user is logging via form
143
+ email = request .form ['email' ]
144
+ password = request .form ['password' ]
145
+ test = User .query .filter_by (email = email ,password = password ).first ()
146
+ if test :
147
+ # create token
148
+ access_token = create_access_token (identity = email )
149
+ return jsonify (message = "login Successfully!" ,access_token = access_token )
150
+ else :
151
+ return jsonify (message = "bad password or email" ),401
152
+
153
+
154
+ @app .route ("/retrieve_password/<string:email>" ,methods = ["GET" ])
155
+ def retrieve_password (email :str ):
156
+ user = User .query .filter_by (email = email ).first ()
157
+ if user :
158
+ msg = Message (
159
+ "Your planetry api password is " + user .password ,
160
+
161
+ recipients = [email ])
162
+ mail .send (msg )
163
+ return jsonify (message = "password sent to " + email )
164
+ else :
165
+ return jsonify (message = email + " email doesn't exist!" ),401
166
+
167
+
168
+ @app .route ("/planet_details/<int:planet_id>" ,methods = ["GET" ])
169
+ def planet_details (planet_id :int ):
170
+ planet = Planet .query .filter_by (planet_id = planet_id ).first ()
171
+ if planet :
172
+ result = planet_schema .dump (planet )
173
+ return jsonify (result )
174
+ else :
175
+ return jsonify (message = "that planet does not exist!" ),404
176
+
177
+
178
+ @app .route ("/add_planet" ,methods = ["POST" ])
179
+ @jwt_required ()
180
+ def add_planet ():
181
+ planet_name = request .form ['planet_name' ]
182
+ planet = Planet .query .filter_by (planet_name = planet_name ).first ()
183
+ if planet :
184
+ return jsonify (message = "the planet is exists already!" ),409
185
+ else :
186
+ planet_type = request .form ['planet_type' ]
187
+ home_star = request .form ['home_star' ]
188
+ mass = request .form ['mass' ]
189
+ radius = request .form ["radius" ]
190
+ distance = request .form ["distance" ]
191
+ db .session .add (Planet (planet_name = planet_name ,planet_type = planet_type ,home_star = home_star ,mass = mass ,radius = radius ,distance = distance ))
192
+ db .session .commit ()
193
+ return jsonify (message = "You added a planet Successfully!" ),201
194
+
195
+
196
+ @app .route ("/update_planet" ,methods = ["PUT" ])
197
+ @jwt_required ()
198
+ def update_planet ():
199
+ planet_id = request .form ['planet_id' ]
200
+ planet = Planet .query .filter_by (planet_id = planet_id ).first ()
201
+ if planet :
202
+ planet .planet_name = request .form ['planet_name' ]
203
+ planet .planet_type = request .form ['planet_type' ]
204
+ planet .home_star = request .form ['home_star' ]
205
+ planet .mass = request .form ['mass' ]
206
+ planet .radius = request .form ["radius" ]
207
+ planet .distance = request .form ["distance" ]
208
+ db .session .commit ()
209
+ return jsonify (message = "You updated a planet Successfully!" ),202
210
+ else :
211
+ return jsonify (message = "the planet does not exists!" ),404
212
+
213
+
214
+
215
+ @app .route ("/remove_planet/<int:planet_id>" ,methods = ["DELETE" ])
216
+ @jwt_required ()
217
+ def remove_planet (planet_id :int ):
218
+ planet = Planet .query .filter_by (planet_id = planet_id ).first ()
219
+ if planet :
220
+ db .session .delete (planet )
221
+ db .session .commit ()
222
+ return jsonify (message = "You deleted a planet Successfully!" ),202
223
+ else :
224
+ return jsonify (message = "the planet does not exists!" ),404
225
+
226
+ # Databse Models
227
+ class User (db .Model ):
228
+ __tablename__ = "User"
229
+ id = Column (Integer ,primary_key = True )
230
+ first_name = Column (String )
231
+ last_name = Column (String )
232
+ email = Column (String ,unique = True )
233
+ password = Column (String )
234
+
235
+ class Planet (db .Model ):
236
+ planet_id = Column (Integer ,primary_key = True )
237
+ planet_type = Column (String )
238
+ planet_name = Column (String )
239
+ home_star = Column (String )
240
+ mass = Column (Float )
241
+ radius = Column (Float )
242
+ distance = Column (Float )
243
+
244
+ class UserSchema (ma .Schema ):
245
+ class Meta :
246
+ fields = ("id" ,"first_name" ,"last_name" ,"email" ,"password" )
247
+
248
+ class PlanetSchema (ma .Schema ):
249
+ class Meta :
250
+ fields = ("planet_id" ,"planet_type" ,"planet_name" ,"home_star" ,"mass" ,"radius" ,"distance" )
251
+
252
+ user_schema = UserSchema ()
253
+ users_schema = UserSchema (many = True )
254
+
255
+ planet_schema = PlanetSchema ()
256
+ planets_schema = PlanetSchema (many = True )
257
+
258
+
259
+
260
+
261
+
262
+ if __name__ == "__main__" :
263
+ app .run (debug = True )
0 commit comments