Generate slug in app
This commit is contained in:
parent
4a353ec17e
commit
01b5c72e7b
2 changed files with 8 additions and 18 deletions
|
@ -24,22 +24,7 @@ def upgrade():
|
||||||
))
|
))
|
||||||
op.create_unique_constraint('order_slug_unique', 'order', ['slug'])
|
op.create_unique_constraint('order_slug_unique', 'order', ['slug'])
|
||||||
|
|
||||||
# Trigger to handle duplicates: generate new slug if slug already exists
|
|
||||||
op.execute(text(
|
|
||||||
"""
|
|
||||||
CREATE TRIGGER order_before_insert
|
|
||||||
BEFORE UPDATE ON `order`
|
|
||||||
FOR EACH ROW
|
|
||||||
BEGIN
|
|
||||||
WHILE (NEW.slug IS NULL OR (SELECT id FROM `order` WHERE slug = NEW.slug) IS NOT NULL) DO
|
|
||||||
SET NEW.slug = SUBSTRING(MD5(RAND()) FROM 1 FOR 7);
|
|
||||||
END WHILE;
|
|
||||||
END
|
|
||||||
"""
|
|
||||||
))
|
|
||||||
|
|
||||||
|
|
||||||
def downgrade():
|
def downgrade():
|
||||||
op.execute(text("DROP TRIGGER order_before_insert"))
|
|
||||||
op.drop_constraint('order_slug_unique', 'order', type_='unique')
|
op.drop_constraint('order_slug_unique', 'order', type_='unique')
|
||||||
op.drop_column('order', 'slug')
|
op.drop_column('order', 'slug')
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
import typing
|
import typing
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
import secrets
|
||||||
import string
|
import string
|
||||||
|
|
||||||
from hlds.definitions import location_definitions
|
from hlds.definitions import location_definitions
|
||||||
|
@ -10,6 +11,12 @@ from utils import first
|
||||||
from .database import db
|
from .database import db
|
||||||
from .user import User
|
from .user import User
|
||||||
|
|
||||||
|
def generate_slug():
|
||||||
|
alphabet = string.ascii_letters + string.digits
|
||||||
|
secret = ''.join(secrets.choice(alphabet) for i in range(7))
|
||||||
|
while Order.query.filter(Order.slug == secret).first() is not None:
|
||||||
|
secret = ''.join(secrets.choice(alphabet) for i in range(7))
|
||||||
|
return secret
|
||||||
|
|
||||||
class Order(db.Model):
|
class Order(db.Model):
|
||||||
"""Class used for configuring the Order model in the database"""
|
"""Class used for configuring the Order model in the database"""
|
||||||
|
@ -20,9 +27,7 @@ class Order(db.Model):
|
||||||
starttime = db.Column(db.DateTime)
|
starttime = db.Column(db.DateTime)
|
||||||
stoptime = db.Column(db.DateTime)
|
stoptime = db.Column(db.DateTime)
|
||||||
public = db.Column(db.Boolean, default=True)
|
public = db.Column(db.Boolean, default=True)
|
||||||
# The default value for `slug`, a random 7-character alphanumerical string,
|
slug = db.Column(db.String(7), default=generate_slug, unique=True)
|
||||||
# is created on the database side. See migrations/versions/29ccbe077c57_add_slug.py
|
|
||||||
slug = db.Column(db.String(7), unique=True)
|
|
||||||
association = db.Column(db.String(120), nullable=False, server_default="")
|
association = db.Column(db.String(120), nullable=False, server_default="")
|
||||||
|
|
||||||
items = db.relationship("OrderItem", backref="order", lazy="dynamic")
|
items = db.relationship("OrderItem", backref="order", lazy="dynamic")
|
||||||
|
|
Loading…
Reference in a new issue