aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models.py12
-rw-r--r--app/querybuilder.py2
-rw-r--r--migrations/versions/6dca6eceb04d_.py30
3 files changed, 38 insertions, 6 deletions
diff --git a/app/models.py b/app/models.py
index 34b689c..cd7a88a 100644
--- a/app/models.py
+++ b/app/models.py
@@ -24,8 +24,7 @@ from flask import Flask, url_for
from flask_sqlalchemy import SQLAlchemy, BaseQuery
from flask_migrate import Migrate
from flask_user import login_required, UserManager, UserMixin, SQLAlchemyAdapter
-from sqlalchemy import func
-from sqlalchemy.orm import validates
+from sqlalchemy import func, CheckConstraint
from sqlalchemy_searchable import SearchQueryMixin
from sqlalchemy_utils.types import TSVectorType
from sqlalchemy_searchable import make_searchable
@@ -310,7 +309,7 @@ class Dependency(db.Model):
package = db.relationship("Package", foreign_keys=[package_id])
meta_package_id = db.Column(db.Integer, db.ForeignKey("meta_package.id"), nullable=True)
optional = db.Column(db.Boolean, nullable=False, default=False)
- __table_args__ = (db.UniqueConstraint('depender_id', 'package_id', 'meta_package_id', name='_dependency_uc'), )
+ __table_args__ = (db.UniqueConstraint("depender_id", "package_id", "meta_package_id", name="_dependency_uc"), )
def __init__(self, depender=None, package=None, meta=None):
if depender is None:
@@ -377,14 +376,17 @@ class Package(db.Model):
# Basic details
author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
- name = db.Column(db.String(100), nullable=False)
+ name = db.Column(db.Unicode(100), nullable=False)
title = db.Column(db.Unicode(100), nullable=False)
short_desc = db.Column(db.Unicode(200), nullable=False)
desc = db.Column(db.UnicodeText, nullable=True)
type = db.Column(db.Enum(PackageType))
created_at = db.Column(db.DateTime, nullable=False, default=datetime.datetime.utcnow)
- search_vector = db.Column(TSVectorType("title", "short_desc", "desc"))
+ name_valid = db.CheckConstraint("name ~* '^[a-z0-9_]+$'")
+
+ search_vector = db.Column(TSVectorType("title", "short_desc", "desc", \
+ weights={ "title": "A", "short_desc": "B", "desc": "C" }))
license_id = db.Column(db.Integer, db.ForeignKey("license.id"), nullable=False, default=1)
license = db.relationship("License", foreign_keys=[license_id])
diff --git a/app/querybuilder.py b/app/querybuilder.py
index d6b5504..5fa4ec6 100644
--- a/app/querybuilder.py
+++ b/app/querybuilder.py
@@ -62,7 +62,7 @@ class QueryBuilder:
query = query.filter(Package.type.in_(self.types))
if self.search:
- query = query.search(self.search)
+ query = query.search(self.search, sort=True)
if self.random:
query = query.order_by(func.random())
diff --git a/migrations/versions/6dca6eceb04d_.py b/migrations/versions/6dca6eceb04d_.py
new file mode 100644
index 0000000..e22efda
--- /dev/null
+++ b/migrations/versions/6dca6eceb04d_.py
@@ -0,0 +1,30 @@
+"""empty message
+
+Revision ID: 6dca6eceb04d
+Revises: fd25bf3e57c3
+Create Date: 2020-01-18 17:32:21.885068
+
+"""
+from alembic import op
+import sqlalchemy as sa
+from sqlalchemy.dialects import postgresql
+from sqlalchemy_searchable import sync_trigger
+
+
+# revision identifiers, used by Alembic.
+revision = '6dca6eceb04d'
+down_revision = 'fd25bf3e57c3'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ conn = op.get_bind()
+ sync_trigger(conn, 'package', 'search_vector', ["name", "title", "short_desc", "desc"])
+ op.create_check_constraint("name_valid", "package", "name ~* '^[a-z0-9_]+$'")
+
+
+def downgrade():
+ conn = op.get_bind()
+ sync_trigger(conn, 'package', 'search_vector', ["title", "short_desc", "desc"])
+ op.drop_constraint("name_valid", "package", type_="check")