· 9 years ago · May 31, 2016, 10:45 AM
1admin.py
2# coding=utf-8
3from flask import request, url_for, redirect
4from flask_admin.contrib import sqla
5from flask_login import current_user
6
7from models import eatery
8
9
10class EateryAdmin(sqla.ModelView):
11 column_labels = dict(name=u'Ðазвание', open_time=u'Ð’Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ', close_time=u'Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ',
12 latitude=u'Широта', longitude=u'Долгота', address=u'ÐдреÑ')
13
14 def is_accessible(self):
15 return current_user.is_authenticated
16
17 def inaccessible_callback(self, name, **kwargs):
18 # redirect to login page if user doesn't have access
19 return redirect(url_for('user.login', next=request.url))
20
21 def __init__(self, session):
22 # Just call parent class with predefined model.
23 super(EateryAdmin, self).__init__(eatery.Eatery, session, name=u'ЗаведениÑ')
24
25
26class PhotoAdmin(sqla.ModelView):
27 column_labels = dict(photo=u'Путь к фотографии', eatery=u'СтоловаÑ')
28
29 def is_accessible(self):
30 return current_user.is_authenticated
31
32 def inaccessible_callback(self, name, **kwargs):
33 # redirect to login page if user doesn't have access
34 return redirect(url_for('user.login', next=request.url))
35
36 def __init__(self, session):
37 # Just call parent class with predefined model.
38 super(PhotoAdmin, self).__init__(eatery.EateryPhoto, session, name=u'Фотографии')
39
40
41class FeedBackAdmin(sqla.ModelView):
42 column_labels = dict(rating=u'Рейтинг', text=u'ТекÑÑ‚ отзыва', userId=u'ID пользователÑ', eatraryId=u'ID Ñтоловой')
43
44 def is_accessible(self):
45 return current_user.is_authenticated
46
47 def inaccessible_callback(self, name, **kwargs):
48 # redirect to login page if user doesn't have access
49 return redirect(url_for('user.login', next=request.url))
50
51 def __init__(self, session):
52 # Just call parent class with predefined model.
53 super(FeedBackAdmin, self).__init__(eatery.Feedback, session, name=u'Отзывы')
54
55
56
57app.py
58# coding=utf-8
59from appInit import *
60from flask import render_template, jsonify, request
61from admin import *
62from models import eatery,user
63
64
65@app.route('/')
66def hello_world():
67 return render_template('index.html')
68
69
70@app.route('/etrary', methods=['GET'])
71def getEtrary():
72 eateries = eatery.Eatery.query.all()
73 res = []
74 for i in eateries:
75 k = dict(
76 id=i.id,
77 address=i.address,
78 latitude=i.latitude,
79 longitude=i.longitude,
80 name=i.name,
81 open_time=str(i.open_time),
82 close_time=str(i.close_time),
83 photos=[]
84 )
85 for j in i.photos:
86 k['photos'].append(j.photo)
87 res.append(k)
88 return jsonify(dict(res=res, ok=True))
89
90
91@app.route('/feedback/<int:eatery_id>', methods=['GET'])
92def getFeedback(eatery_id):
93 res = []
94 feedBack = eatery.Feedback.query.filter_by(eatraryId=eatery_id).all()
95
96 for i in feedBack:
97 k = dict(
98 text=i.text,
99 userId=i.userId,
100 rating=i.rating,
101 email=User.query.get(i.userId).email
102 )
103 res.append(k)
104 return jsonify({'res': res, 'ok': True})
105
106
107@app.route('/feedback/<int:eatery_id>', methods=['POST'])
108def setFeedback(eatery_id):
109 data=request.get_json()
110 if data['key']:
111 key = data['key']
112 else:
113 return jsonify(dict(ok=False, message='Provide key'))
114
115 if data['rating']:
116 rating = data['rating']
117 else:
118 return jsonify(dict(ok=False, message='Provide Rating'))
119
120 if data['text']:
121 text = data['text']
122 else:
123 return jsonify(dict(ok=False, message='Provide Message'))
124
125 idd = user_manager.verify_token(key, float('inf'))[2]
126 if idd is None:
127 return jsonify(dict(
128 ok=False,
129 message='Invalid API Token'
130 ))
131
132 user = User.query.filter_by(id=idd).first()
133 if user is None:
134 return jsonify(dict(
135 ok=False,
136 message='Invalid API Token'
137 ))
138
139 try:
140 f = eatery.Feedback(text=text, userId=user.id, eatraryId=eatery_id, rating=rating)
141 db.session.add(f)
142 db.session.commit()
143 except Exception, e:
144 return jsonify(dict(ok=False, message='DB Error. ' + e.message))
145
146 return jsonify(dict(ok=True))
147
148
149@app.route('/auth', methods=['POST'])
150def auth():
151 if request.form['email']:
152 email = request.form['email']
153 else:
154 return jsonify(dict(ok=False, message='Provide email'))
155
156 if request.form['pass']:
157 password = request.form['pass']
158 else:
159 return jsonify(dict(ok=False, message='Provide password'))
160
161 user = user_manager.find_user_by_email(email)[0]
162 if not user:
163 return jsonify(dict(ok=False,
164 msg='user not found'))
165 if not user_manager.verify_password(password, user):
166 return jsonify(dict(ok=False,
167 msg='Invalid password'))
168 return jsonify(dict(ok=True,
169 key=user.get_auth_token()))
170
171
172adm.add_view(EateryAdmin(db.session))
173adm.add_view(PhotoAdmin(db.session))
174adm.add_view(FeedBackAdmin(db.session))
175
176if __name__ == '__main__':
177 with app.app_context():
178 # db.drop_all()
179 db.create_all()
180 pass
181 app.run(host='0.0.0.0', port=80)
182
183
184appInit.py
185# coding=utf-8
186from flask import Flask
187from flask.ext.user import SQLAlchemyAdapter, UserManager
188
189from models import db
190from config import Config
191import flask_admin as admin
192
193from models.user import User
194
195app = Flask(__name__)
196app.config.from_object(Config)
197db.init_app(app)
198adm = admin.Admin(app, name=u'Рекомендательный ÑервиÑ', template_mode='bootstrap3')
199
200db_adapter = SQLAlchemyAdapter(db, User)
201user_manager = UserManager(db_adapter, app)
202
203
204config.py
205# coding=utf-8
206class Config(object):
207 DEBUG = True
208 SECRET_KEY = 'adsgafbzcxfvbdfsbss'
209
210 SQLALCHEMY_DATABASE_URI = 'mysql+mysqldb://eatery:eatery@localhost/eatery'
211 SQLALCHEMY_TRACK_MODIFICATIONS = False
212 SQLALCHEMY_COMMIT_ON_TEARDOWN = True
213 SQLALCHEMY_MIGRATE_REPO = 'db_repository'
214
215 USER_SEND_PASSWORD_CHANGED_EMAIL = False
216 USER_SEND_USERNAME_CHANGED_EMAIL = False
217 USER_SEND_REGISTERED_EMAIL = True
218 USER_APP_NAME = u'Рекомендательный ÑервиÑ'
219 USER_ENABLE_USERNAMES = False
220 USER_ENABLE_CHANGE_USERNAME = False
221 USER_ENABLE_CONFIRM_EMAIL = False
222
223
224user.py
225# coding=utf-8
226from flask.ext.user import UserMixin
227from flask.ext.user.tokens import TokenManager
228import config
229from . import db
230
231tm = TokenManager()
232tm.setup(config.Config.SECRET_KEY)
233
234
235class User(db.Model, UserMixin):
236 id = db.Column(db.Integer, primary_key=True)
237
238 # User authentication information
239 username = db.Column(db.String(50), nullable=True, unique=True)
240 password = db.Column(db.String(255), nullable=False, server_default='')
241 reset_password_token = db.Column(db.String(100), nullable=False, server_default='')
242
243 # User email information
244 email = db.Column(db.String(255), nullable=False, unique=True)
245 confirmed_at = db.Column(db.DateTime())
246
247 # User information
248 active = db.Column('is_active', db.Boolean(), nullable=False, server_default='0')
249 first_name = db.Column(db.String(100), nullable=False, server_default='')
250 last_name = db.Column(db.String(100), nullable=False, server_default='')
251
252 # Relationships
253 roles = db.relationship('Role', secondary='user_roles',
254 backref=db.backref('users', lazy='dynamic'))
255
256 def get_auth_token(self):
257 return tm.generate_token(self.id)
258
259
260# Define the Role data model
261class Role(db.Model):
262 id = db.Column(db.Integer(), primary_key=True)
263 name = db.Column(db.String(50), unique=True)
264
265
266# Define the UserRoles data model
267class UserRoles(db.Model):
268 id = db.Column(db.Integer(), primary_key=True)
269 user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
270 role_id = db.Column(db.Integer(), db.ForeignKey('role.id', ondelete='CASCADE'))
271
272
273eatery.py
274from . import db
275from .user import User
276
277
278class Eatery(db.Model):
279 __tablename__ = 'eatery'
280 id = db.Column(db.Integer(), primary_key=True)
281 name = db.Column(db.String(100), nullable=False, server_default='')
282 open_time = db.Column(db.Time)
283 close_time = db.Column(db.Time)
284 latitude = db.Column(db.Float, server_default='42.966667')
285 longitude = db.Column(db.Float, server_default='47.483333')
286 address = db.Column(db.String(200), nullable=True)
287 photos = db.relationship('EateryPhoto', backref='eatery',
288 lazy='dynamic')
289
290 def __unicode__(self):
291 return self.name
292
293
294class EateryPhoto(db.Model):
295 __tablename__ = 'eatery_photo'
296 id = db.Column(db.Integer(), primary_key=True)
297 eateryId = db.Column(db.Integer(), db.ForeignKey('eatery.id'))
298 photo = db.Column(db.String(255), nullable=False)
299
300 def __unicode__(self):
301 return self.photo
302
303
304class Feedback(db.Model):
305 id = db.Column(db.Integer(), primary_key=True)
306 rating = db.Column(db.Integer(), default=5, nullable=False)
307 text = db.Column(db.String(2048), server_default='', nullable=False)
308 userId = db.Column(db.Integer(), nullable=False)
309 eatraryId = db.Column(db.Integer(), nullable=False)
310
311 def __unicode__(self):
312 return "%s - %s - %s" % (self.userId, self.eatraryId, self.rating)