gopy.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #!/usr/bin/env python3
  2. import flask
  3. from flask import make_response, request, redirect, jsonify, render_template, url_for
  4. from flask_sqlalchemy import SQLAlchemy
  5. from flask_marshmallow import Marshmallow
  6. from flask_migrate import Migrate
  7. import argparse
  8. db = SQLAlchemy()
  9. app = flask.Flask(__name__)
  10. app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:m9Eb5OflQb@mysql.mysql.svc.cluster.local/gopy'
  11. db.init_app(app)
  12. list_fqdn = "https://go.dezendorf.net/list"
  13. migrate = Migrate(app, db)
  14. ma = Marshmallow(app)
  15. class Link(db.Model):
  16. id = db.Column(db.Integer, primary_key=True)
  17. name = db.Column(db.String(255), unique=True)
  18. target = db.Column(db.String(255))
  19. hit_count = db.Column(db.Integer)
  20. owner_name = db.Column(db.String(255))
  21. def __repr__(self):
  22. return '<Link id=(id) name=(name) target=(target)>'.format(
  23. id=self.id, name=self.name, target=self.target, hit_count=self.hit_count, owner_name=self.owner_name
  24. )
  25. class LinkSchema(ma.Schema):
  26. class Meta:
  27. fields = ('id', 'name', 'target', 'hit_count', 'owner_name')
  28. def get_links():
  29. links = Link.query.order_by(Link.name).all()
  30. schema = LinkSchema(many=True)
  31. link_json = schema.dump(links)
  32. return links
  33. def link_exists(link_name):
  34. try:
  35. link = Link.query.filter_by(name=link_name).first()
  36. except Exception as e:
  37. print(e)
  38. return e
  39. if link is None:
  40. return False
  41. else:
  42. return True
  43. @app.route('/<string:name>', strict_slashes=False, methods=['GET'])
  44. def redirect_to_link(name):
  45. try:
  46. link = Link.query.filter_by(name=name).first()
  47. except e:
  48. return redirect(list_fqdn)
  49. if link is None:
  50. return redirect(list_fqdn)
  51. try:
  52. link.hit_count += 1
  53. except TypeError:
  54. link.hit_count = 1
  55. db.session.commit()
  56. print("updating link hit count")
  57. return redirect(link.target, code=302)
  58. @app.post('/add', strict_slashes=False)
  59. def add_link():
  60. if link_exists(request.form['link_name']) is True:
  61. print("Link exists")
  62. else:
  63. print("Creating link")
  64. db.create_all()
  65. link = Link(name=request.form['link_name'], target=request.form['target'], hit_count=0, owner_name="unknown")
  66. db.session.add(link)
  67. db.session.commit()
  68. return redirect(list_fqdn)
  69. @app.route('/<string:link_name>/add', strict_slashes=False)
  70. def add_link_form(link_name):
  71. return render_template('add.html', link_name=link_name)
  72. @app.post('/<string:link_name>/edit', strict_slashes=False)
  73. def edit_link(link_name):
  74. db.create_all()
  75. link = Link.query.filter_by(name=link_name).first()
  76. print("Setting link target to {}".format(request.form['target']))
  77. link.target = request.form['target']
  78. db.session.commit()
  79. return redirect(list_fqdn)
  80. @app.route('/<string:link_name>/edit', strict_slashes=False)
  81. def edit_link_form(link_name):
  82. link = Link.query.filter_by(name=link_name).first()
  83. return render_template('edit.html', link=link)
  84. @app.post('/<int:link_id>/delete', strict_slashes=False)
  85. def delete_link(link_id):
  86. link = Link.query.filter_by(id=link_id).first()
  87. db.session.delete(link)
  88. db.session.commit()
  89. return redirect(list_fqdn)
  90. @app.route('/<int:link_id>/delete', strict_slashes=False)
  91. def delete_link_form(link_id):
  92. link = Link.query.filter_by(id=link_id).first()
  93. return render_template('delete.html', link=link)
  94. @app.route('/list')
  95. def list_links():
  96. links = get_links()
  97. return render_template('list.html', links=links)
  98. @app.route('/')
  99. def landing_page():
  100. return redirect(list_fqdn)
  101. if __name__ == "__main__":
  102. app.run(host='0.0.0.0')