Explorar o código

Added flask migrations

Breandan Dezendorf %!s(int64=2) %!d(string=hai) anos
pai
achega
5acec87654

+ 2 - 0
dezendorf/applications/gopy/Makefile

@@ -0,0 +1,2 @@
+migrate:
+	FLASK_APP=gopy.py python3 -m  flask db upgrade

+ 33 - 13
dezendorf/applications/gopy/gopy.py

@@ -5,27 +5,32 @@ import flask
 from flask import make_response, request, redirect, jsonify, render_template, url_for
 from flask_sqlalchemy import SQLAlchemy
 from flask_marshmallow import Marshmallow
+from flask_migrate import Migrate
 
 db = SQLAlchemy()
 app = flask.Flask(__name__)
 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:m9Eb5OflQb@mysql.mysql.svc.cluster.local/gopy'
 db.init_app(app)
 
+migrate = Migrate(app, db)
+
 ma = Marshmallow(app)
 
 class Link(db.Model):
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(db.String(255), unique=True)
     target = db.Column(db.String(255))
+    hit_count = db.Column(db.Integer)
+    owner_name = db.Column(db.String(255))
 
     def __repr__(self):
         return '<Link id=(id) name=(name) target=(target)>'.format(
-            id=self.id, name=self.name, target=self.target
+            id=self.id, name=self.name, target=self.target, hit_count=self.hit_count, owner_name=self.owner_name
         )
 
 class LinkSchema(ma.Schema):
     class Meta:
-        fields = ('id', 'name', 'target')
+        fields = ('id', 'name', 'target', 'hit_count', 'owner_name')
 
 def get_links():
     links = Link.query.all()
@@ -33,6 +38,17 @@ def get_links():
     link_json = schema.dump(links)
     return links
 
+def link_exists(link_name):
+    try:
+        link = Link.query.filter_by(name=link_name).first()
+    except Exception as e:
+        print(e)
+        return e
+    if link is None:
+        return False
+    else:
+        return True
+
 
 @app.route('/<string:name>', strict_slashes=False, methods=['GET'])
 def redirect_to_link(name):
@@ -47,10 +63,14 @@ def redirect_to_link(name):
 
 @app.post('/<string:link_name>/add', strict_slashes=False)
 def add_link(link_name):
-    db.create_all()
-    link = Link(name=link_name, target=request.form['target'])
-    db.session.add(link)
-    db.session.commit()
+    if link_exists(link_name) is True:
+        print("Link exists")
+    else:
+        print("Creating link")
+        db.create_all()
+        link = Link(name=link_name, target=request.form['target'], hit_count=0, owner_name="unknown")
+        db.session.add(link)
+        db.session.commit()
     return redirect("/", code=302)
 
 
@@ -62,7 +82,7 @@ def add_link_form(link_name):
 def edit_link(link_name):
     db.create_all()
     link = Link(name=link_name, target=request.form['target'])
-    db.session.update(link)
+    db.session.merge(link)
     db.session.commit()
     return redirect("/", code=302)
 
@@ -73,17 +93,17 @@ def edit_link_form(link_name):
     return render_template('edit.html', link=link)
 
 
-@app.post('/<string:link_name>/delete', strict_slashes=False)
-def delete_link(link_name):
-    link = Link.query.filter_by(name=link_name).first()
+@app.post('/<int:link_id>/delete', strict_slashes=False)
+def delete_link(link_id):
+    link = Link.query.filter_by(id=link_id).first()
     db.session.delete(link)
     db.session.commit()
     return redirect(url_for('list_links'))
 
 
-@app.route('/<string:link_name>/delete', strict_slashes=False)
-def delete_link_form(link_name):
-    link = Link.query.filter_by(name=link_name).first()
+@app.route('/<int:link_id>/delete', strict_slashes=False)
+def delete_link_form(link_id):
+    link = Link.query.filter_by(id=link_id).first()
     return render_template('delete.html', link=link)
 
 

+ 36 - 0
dezendorf/applications/gopy/migrations/versions/cd0e9c173a7f_initial_migration.py

@@ -0,0 +1,36 @@
+"""initial migration
+
+Revision ID: cd0e9c173a7f
+Revises: 
+Create Date: 2023-07-18 15:53:06.213349
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = 'cd0e9c173a7f'
+down_revision = None
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('link', schema=None) as batch_op:
+        batch_op.add_column(sa.Column('hit_count', sa.Integer(), nullable=True))
+        batch_op.add_column(sa.Column('owner_name', sa.String(length=255), nullable=True))
+        batch_op.create_unique_constraint(None, ['name'])
+
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    with op.batch_alter_table('link', schema=None) as batch_op:
+        batch_op.drop_constraint(None, type_='unique')
+        batch_op.drop_column('owner_name')
+        batch_op.drop_column('hit_count')
+
+    # ### end Alembic commands ###

+ 2 - 1
dezendorf/applications/gopy/requirements.txt

@@ -1,6 +1,7 @@
-Flask
+
 Flask-SQLAlchemy
 flask-Marshmallow
+Flask-Migrate
 mysqlclient
 marshmallow-sqlalchemy
 watchdog

+ 1 - 1
dezendorf/applications/gopy/templates/base.html

@@ -33,7 +33,7 @@
 </head>
 <body>
     <nav>
-        <a href="{{ url_for('list_links') }}">FlaskApp</a>
+        <a href="{{ url_for('list_links') }}">Golinks</a>
         <a href="#">About</a>
     </nav>
     <hr>

+ 1 - 1
dezendorf/applications/gopy/templates/edit.html

@@ -1,7 +1,7 @@
 {% extends 'base.html' %}
 
 {% block content %}
-    <h1>{% block title %} Edit a New Link {% endblock %}</h1>
+    <h1>{% block title %} Edit an Existing Link {% endblock %}</h1>
     <form method="post">
         <label for="title">{{ link_name }}</label>
         <br>

+ 6 - 5
dezendorf/applications/gopy/templates/list.html

@@ -4,10 +4,11 @@
     <h1>{% block title %} Links {% endblock %}</h1>
     <div class='link'>
         <div>
-            <span class="name"></a></span>
-            <span class="target"></span>
-            <span class="add_button"><a href="add_link">Add</a></span>
-            <span class="add_button"><a href="add_link">Add</a></span>
+            <form method="post" action="/add">
+            <span class="name"><input type="text" name="name" placeholer="name"></input></span>
+            <span class="target"><input type="text" name="target" placeholder="http://example.com"></input></span>
+            <span class="add_button"><button type="submit">Add</button></span>
+            </form>
         </div>
     </div>
 
@@ -17,7 +18,7 @@
                 <span class="name"><a href="{{ link['target'] }}">{{ link['name'] }}</a></span>
                 <span class="target">{{ link['target'] }}</span>
                 <span class="edit_button"><a href="{{ url_for('edit_link_form', link_name=link['name']) }}">Edit</a></span>
-                <span class="delete_button"><a href="{{ url_for('delete_link_form', link_name=link['name']) }}">Delete</a></span>
+                <span class="delete_button"><a href="{{ url_for('delete_link_form', link_id=link['id']) }}">Delete</a></span>
             </div>
         </div>
     {% endfor %}