From 8770dec79370ad7e89350a74dafdc1e5a1cf8d02 Mon Sep 17 00:00:00 2001
From: Benjamin Bertrand <benjamin.bertrand@esss.se>
Date: Wed, 9 Aug 2017 23:06:56 +0200
Subject: [PATCH] Add citext module for case-insensitive string type

The citext module provides a case-insensitive character string type.
Use CIText for QRCodeMixin name column.
name should be case-insensitive to avoid duplicate names.
---
 app/factory.py  | 1 +
 app/models.py   | 3 ++-
 environment.yml | 1 +
 3 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/app/factory.py b/app/factory.py
index 66b20c2..ea0ca8d 100644
--- a/app/factory.py
+++ b/app/factory.py
@@ -25,6 +25,7 @@ def register_cli(app):
     @app.cli.command()
     def initdb():
         """Create the database tables and initialize them with default values"""
+        db.engine.execute('CREATE EXTENSION IF NOT EXISTS citext')
         db.create_all()
         for instance in defaults:
             db.session.add(instance)
diff --git a/app/models.py b/app/models.py
index 727b66e..01107be 100644
--- a/app/models.py
+++ b/app/models.py
@@ -13,6 +13,7 @@ import uuid
 import qrcode
 from sqlalchemy.types import TypeDecorator, CHAR
 from sqlalchemy.dialects.postgresql import UUID
+from citext import CIText
 from flask_login import UserMixin
 from .extensions import db, login_manager, ldap_manager
 from . import utils
@@ -126,7 +127,7 @@ class User(db.Model, UserMixin):
 
 class QRCodeMixin:
     id = db.Column(db.Integer, primary_key=True)
-    name = db.Column(db.String(50), nullable=False, unique=True)
+    name = db.Column(CIText, nullable=False, unique=True)
 
     def image(self):
         """Return a QRCode image to identify a record
diff --git a/environment.yml b/environment.yml
index 20d4c15..c2a7f72 100644
--- a/environment.yml
+++ b/environment.yml
@@ -56,4 +56,5 @@ dependencies:
   - ldap3==2.2.4
   - pyasn1==0.2.3
   - pyjwt==1.4.2
+  - sqlalchemy-citext==1.3.post0
   - visitor==0.1.3
-- 
GitLab