From ef092edc64ac489fe25d83bad05e4c1660b2444b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20=27Necoro=27=20Neumann?= Date: Sun, 3 Dec 2017 18:06:10 +0100 Subject: Enhance CharField with 'nocase' option --- archivist/model.py | 6 +++--- archivist/peewee_ext.py | 10 +++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/archivist/model.py b/archivist/model.py index 1544f3f..2676204 100644 --- a/archivist/model.py +++ b/archivist/model.py @@ -8,7 +8,7 @@ import datetime from enum import Enum, unique from pkg_resources import resource_filename -from .peewee_ext import EnumField, CompressedField, SQLIndex +from .peewee_ext import EnumField, CharField, CompressedField, SQLIndex from .peewee_fixes import * # dummy to force evaluation of those fixes db = SqliteExtDatabase('test.db', pragmas=[('foreign_keys', 'ON')]) @@ -96,7 +96,7 @@ class Document(BaseModel): @table class Prefix(BaseModel): __keys__ = ('name',) - name = CharField(primary_key = True) + name = CharField(primary_key = True, nocase=True) virtual = BooleanField(default = False) description = CharField(null=True) @@ -122,7 +122,7 @@ class Prefix(BaseModel): class Tag(BaseModel): __keys__ = ('name', 'prefix') - name = CharField() + name = CharField(nocase=True) prefix = ForeignKeyField(Prefix, null=True, related_name = 'tag', db_column = 'prefix') description = CharField(null=True) default = BooleanField(default = False) diff --git a/archivist/peewee_ext.py b/archivist/peewee_ext.py index edcb9c9..011f80d 100644 --- a/archivist/peewee_ext.py +++ b/archivist/peewee_ext.py @@ -1,5 +1,5 @@ from peewee import Field, SQL -from playhouse.fields import CompressedField as _CompressedField +from playhouse.fields import CompressedField as _CompressedField, CharField as _CharField from itertools import starmap from functools import reduce @@ -11,6 +11,14 @@ def sqlite_tuple_in(fields, values): subqueries = (reduce(op.and_, starmap(op.eq, zip(fields, value_tuple))) for value_tuple in values) return reduce(op.or_, subqueries) +class CharField(_CharField): + def __init__(self, *args, **kwargs): + constraints = kwargs.pop('constraints', []) + nocase = kwargs.pop('nocase', False) + if nocase: + constraints.append(SQL('COLLATE NOCASE')) + super().__init__(*args, constraints=constraints, **kwargs) + class CompressedField(_CompressedField): def db_value(self, value): return value if value is None else self.compress(value) -- cgit v1.2.3