Пример #1
0
 def set_default(db, migrator, table_name, column_name, field):
   default = field.default
   if callable(default): default = default()
   migration = ( migrator.make_context()
     .literal('UPDATE ').sql(pw.Entity(table_name))
     .literal(' SET ').sql(pw.Expression(pw.Entity(column_name), pw.OP.EQ, field.db_value(default), flat=True))
     .literal(' WHERE ').sql(pw.Expression(pw.Entity(column_name), pw.OP.IS, pw.SQL('NULL'), flat=True))
   )
   return extract_query_from_migration(migration)
Пример #2
0
    def validate_unique_indexes(self):
        for names, unique in self.model._meta.indexes:
            if not unique:
                continue
            where = []
            for name in names:
                field = getattr(self.model, name)

                value = None
                if name in self.data:
                    value = self.data.get(name)
                else:
                    if self.instance:
                        value = getattr(self.instance, name)

                if value and name not in self.model._meta.case_ignoring:
                    where.append(field == value)
                elif value and name in self.model._meta.case_ignoring:
                    where.append(peewee.Expression(field, peewee.OP.ILIKE, value))

            if where != []:
                qs = self.model.select().where(*where)
            else:
                qs = self.model.select()
            if self.instance:
                qs = qs.where(self.model.pk != self.instance.pk)
            if qs.exists():
                self.foundDuplicate = qs.get()
                msg = 'Duplicate entries: {}'.format(', '.join(names))
                for name in names:
                    self.error(name, msg)
Пример #3
0
 def as_expr(self, arg):
     if isinstance(self.field, ArrayField):
         return self.field.contains(*arg)
     elif isinstance(self.field, JSONField):
         return self.field.contains(arg)
     # or for substring
     return peewee.Expression(self.field, peewee.OP.LIKE,
                              '%{0}%'.format(arg))
Пример #4
0
 def get_queryset(self):
     qs = super().get_queryset()
     version = request.args.get('version')
     resource = request.args.get('resource')
     if version is not None and resource is not None:
         qs = self.filter_versions(qs)
     dep = request.args.get('dep')
     if dep:
         qs = qs.where(
             peewee.Expression(versioning.Anomaly.insee, peewee.OP.LIKE,
                               dep + '%'))
     insee = request.args.get('insee')
     if insee:
         qs = qs.where(versioning.Anomaly.insee == insee)
     return qs
Пример #5
0
def cast(self, as_type):
    return peewee.Expression(self, '::', peewee.SQL(as_type))
Пример #6
0
def BeerPerCharacter(character, amount):
    """Helper function to generate the SQL expression for the total amount
  of beer drunk."""
    return peewee.Expression(character.glass, '*', amount)
Пример #7
0
 def contains(self, geom):
     return peewee.Expression(self, peewee.OP.BBOXCONTAINS, geom)
Пример #8
0
 def search(self, **kwargs):
     ponctuation = '[\.\(\)\[\]\"\'\-,;:\/]'
     articles = '(^| )((LA|L|LE|LES|DU|DE|DES|D|ET|A|AU) )*'
     if kwargs['type'] is None or kwargs['search'] is None:
         raise ValueError('None value for search.')
     if kwargs['type'] == 'strict':
         return peewee.Expression(self, peewee.OP.EQ, kwargs['search'])
     elif kwargs['type'] == 'case':
         return peewee.Expression(peewee.fn.unaccent(self), peewee.OP.ILIKE,
                                  peewee.fn.unaccent(kwargs['search']))
     elif kwargs['type'] == 'ponctuation':
         return peewee.Expression(
             peewee.fn.regexp_replace(peewee.fn.unaccent(self), ponctuation,
                                      ' ', 'g'), peewee.OP.ILIKE,
             peewee.fn.regexp_replace(peewee.fn.unaccent(kwargs['search']),
                                      ponctuation, ' ', 'g'))
     elif kwargs['type'] == 'abbrev':
         import csv
         abbrev = []
         with open('../../abbrev_type_voie.csv', newline='') as csvfile:
             csv = csv.reader(csvfile, delimiter=';')
             for row in csv:
                 if re.match(r"^{} ".format(row[1]),
                             re.sub(ponctuation, ' ', kwargs['search'].upper())) is not None \
                         or re.match(r"^{} ".format(row[0]),
                                     re.sub(ponctuation, ' ', kwargs['search'].upper())) is not None:
                     abbrev = row
                     break
             if not abbrev:
                 return peewee.Expression(
                     peewee.fn.regexp_replace(peewee.fn.unaccent(self),
                                              ponctuation, ' ', 'g'),
                     peewee.OP.ILIKE,
                     peewee.fn.regexp_replace(
                         peewee.fn.unaccent(kwargs['search']), ponctuation,
                         ' ', 'g'))
             return peewee.Expression(
                 peewee.fn.regexp_replace(
                     peewee.fn.regexp_replace(
                         peewee.fn.unaccent(peewee.fn.upper(self)),
                         ponctuation, ' ', 'g'), "^{} ".format(abbrev[1]),
                     "{} ".format(abbrev[0]), 'g'), peewee.OP.REGEXP,
                 peewee.fn.regexp_replace(
                     peewee.fn.regexp_replace(
                         peewee.fn.unaccent(
                             peewee.fn.upper(kwargs['search'])),
                         ponctuation, ' ', 'g'), "^{} ".format(abbrev[1]),
                     "{} ".format(abbrev[0]), 'g'))
     elif kwargs['type'] == 'libelle':
         import csv
         abbrev = '^('
         with open('../../abbrev_type_voie.csv', newline='') as csvfile:
             csv = csv.reader(csvfile, delimiter=';')
             for row in csv:
                 abbrev = '{}|{}|{}'.format(abbrev, row[0], row[1])
             abbrev = '{})( |$)'.format(abbrev)
             return peewee.Expression(
                 peewee.fn.regexp_replace(
                     peewee.fn.regexp_replace(
                         peewee.fn.unaccent(peewee.fn.upper(self)),
                         ponctuation, ' ', 'g'), abbrev, "", 'g'),
                 peewee.OP.ILIKE,
                 peewee.fn.regexp_replace(
                     peewee.fn.regexp_replace(
                         peewee.fn.unaccent(
                             peewee.fn.upper(kwargs['search'])),
                         ponctuation, ' ', 'g'), abbrev, "", 'g'))
     elif kwargs['type'] == 'direct':
         import csv
         abbrev = '^('
         with open('../../abbrev_type_voie.csv', newline='') as csvfile:
             csv = csv.reader(csvfile, delimiter=';')
             for row in csv:
                 abbrev = '{}|{}|{}'.format(abbrev, row[0], row[1])
             abbrev = '{})( |$)'.format(abbrev)
             return peewee.Expression(
                 peewee.fn.trim(
                     peewee.fn.regexp_replace(
                         peewee.fn.regexp_replace(
                             peewee.fn.regexp_replace(
                                 peewee.fn.unaccent(peewee.fn.upper(self)),
                                 ponctuation, ' ', 'g'), abbrev, "", 'g'),
                         articles, ' ', 'g')), peewee.OP.ILIKE,
                 peewee.fn.trim(
                     peewee.fn.regexp_replace(
                         peewee.fn.regexp_replace(
                             peewee.fn.regexp_replace(
                                 peewee.fn.unaccent(
                                     peewee.fn.upper(kwargs['search'])),
                                 ponctuation, ' ', 'g'), abbrev, "", 'g'),
                         articles, ' ', 'g')))
     elif kwargs['type'] == 'approx':
         import csv
         abbrev = '^('
         with open('../../abbrev_type_voie.csv', newline='') as csvfile:
             csv = csv.reader(csvfile, delimiter=';')
             for row in csv:
                 abbrev = '{}|{}|{}'.format(abbrev, row[0], row[1])
             abbrev = '{})( |$)'.format(abbrev)
             return peewee.Expression(
                 peewee.fn.levenshtein(
                     peewee.fn.trim(
                         peewee.fn.regexp_replace(
                             peewee.fn.regexp_replace(
                                 peewee.fn.regexp_replace(
                                     peewee.fn.unaccent(
                                         peewee.fn.upper(self)),
                                     ponctuation, ' ', 'g'), abbrev, "",
                                 'g'), articles, ' ', 'g')),
                     peewee.fn.trim(
                         peewee.fn.regexp_replace(
                             peewee.fn.regexp_replace(
                                 peewee.fn.regexp_replace(
                                     peewee.fn.unaccent(
                                         peewee.fn.upper(kwargs['search'])),
                                     ponctuation, ' ', 'g'), abbrev, "",
                                 'g'), articles, ' ', 'g'))), peewee.OP.LTE,
                 2)
     else:
         raise ValueError('Search type {} is unknown'.format(
             kwargs['type']))
Пример #9
0
 def contains(self, dt):
     return peewee.Expression(self, peewee.OP.ACONTAINS, dt)
Пример #10
0
 def as_expr(self, arg):
     return peewee.Expression(self.field, peewee.OP.ILIKE,
                              '%{0}'.format(arg))