/
main.py
157 lines (115 loc) · 4.17 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/usr/bin/python
from flask import Flask, render_template, redirect, request, url_for, session, g
from flask.ext.sqlalchemy import SQLAlchemy
import forms
import helpers
import functools
import datetime
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
class Term(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
description = db.Column(db.String(255))
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
def __init__(self, name, description):
self.name = name
self.description = description
class Clip(db.Model):
id = db.Column(db.Integer, primary_key=True)
url = db.Column(db.String(255))
created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)
term_id = db.Column(db.Integer, db.ForeignKey('term.id'))
term = db.relationship('Term', backref=db.backref('clips', lazy='dynamic'))
def __init__(self, url, term):
self.url = url
self.term = term
@app.before_request
def before_request():
g.username = session.get('username', None)
def login_required(f):
@functools.wraps(f)
def decorated_function(*args, **kwargs):
if g.username == None:
return redirect(url_for('login'))
return f(*args, **kwargs)
return decorated_function
@app.route('/')
def index():
return render_template('index.html')
@app.route('/terms/all')
def terms_all():
terms = Term.query.all()
return render_template('terms/all.html', terms=terms)
@app.route('/terms/search')
def terms_search():
query = request.args.get('q', '')
if len(query) < 3: return ''
terms = Term.query.filter(Term.name.ilike(r'%{0}%'.format(query)))
return render_template('terms/search.html', terms=terms, query=query)
@app.route('/terms/<int:id>')
def terms_view(id):
term = Term.query.get(id)
return render_template('terms/view.html', term=term)
@app.route('/admin/')
@login_required
def admin_index():
terms = Term.query.all()
return render_template('admin/index.html', terms=terms)
@app.route('/admin/terms/create', methods=['GET', 'POST'])
@login_required
def admin_terms_create():
form = forms.TermForm()
if form.validate_on_submit():
new_term = Term(form.name.data, form.description.data)
if form.create_clip_with_file.data.filename != '':
destination_url = helpers.save_termform_clip(form)
new_clip = Clip(destination_url, new_term)
db.session.add(new_clip)
db.session.add(new_term)
db.session.commit()
return redirect(url_for('admin_index'))
return render_template('admin/terms/create.html', form=form)
@app.route('/admin/terms/<int:id>/edit', methods=['GET', 'POST'])
@login_required
def admin_terms_edit(id):
term = Term.query.get(id)
form = forms.TermForm(obj=term)
if form.validate_on_submit():
form.populate_obj(term)
if form.create_clip_with_file.data.filename != '':
destination_url = helpers.save_termform_clip(form)
new_clip = Clip(destination_url, term)
db.session.add(new_clip)
db.session.commit()
return redirect(url_for('admin_index'))
return render_template('admin/terms/edit.html', form=form, term=term)
@app.route('/admin/terms/<int:id>/delete', methods=['POST'])
@login_required
def admin_terms_delete(id):
term = Term.query.get(id)
db.session.delete(term)
db.session.commit()
return 'success'
@app.route('/admin/clips/<int:id>/delete', methods=['POST'])
@login_required
def admin_clips_delete(id):
clip = Clip.query.get(id)
db.session.delete(clip)
db.session.commit()
return 'success'
@app.route('/login', methods=['GET', 'POST'])
def login():
form = forms.LoginForm()
if form.validate_on_submit():
if (form.username.data, form.password.data) in app.config['ADMIN_USERS']:
session['username'] = form.username.data
return redirect(url_for('admin_index'))
return render_template('login.html', form=form)
@app.route('/logout')
def logout():
session['username'] = None
return redirect('/')
if __name__ == '__main__':
app.run(debug=True)