Projet

Général

Profil

Télécharger (2,5 ko) Statistiques
| Branche: | Tag: | Révision:

calebasse / calebasse / ressources / lookups.py @ 81411908

1
# -*- coding: utf-8 -*-
2
import itertools
3
import re
4

    
5
from django.db.models import Q
6

    
7
from calebasse.lookups import CalebasseLookup
8
from calebasse.personnes.models import Worker
9
from calebasse.ressources.models import Service, School
10

    
11
class FakeGroup:
12
    pk = None
13
    label = None
14

    
15
    def __init__(self, pk, label):
16
        self.pk = pk
17
        self.label = label
18

    
19
    def __unicode__(self):
20
        return u'Groupe: %s' % self.label
21

    
22

    
23
class WorkerOrGroupLookup(CalebasseLookup):
24
    model = Worker
25
    search_field = 'last_name'
26
    enabled = True
27

    
28
    def get_query(self, q, request):
29
        service = None
30
        if q.startswith('group:'):
31
            service = Service.objects.get(pk=int(q[6:]))
32
        else:
33
            try:
34
                service = Service.objects.get(name__iexact=q)
35
            except Service.DoesNotExist:
36
                pass
37

    
38
        if service:
39
            kwargs = { "%s__istartswith" % self.search_field : q }
40
            group = FakeGroup('group:%s' % service.id, service.name)
41
            return itertools.chain([group], self.model.objects.for_service(service.id).order_by('last_name'))
42

    
43
        kwargs = { "%s__istartswith" % self.search_field : q }
44
        if self.enabled:
45
            return self.model.objects.filter(enabled=True).filter(**kwargs).order_by('last_name')
46
        return self.model.objects.filter(**kwargs).order_by('last_name')
47

    
48
    def get_result(self, obj):
49
        return self.format_item_display(obj)
50

    
51
    def format_match(self, obj):
52
        return self.format_item_display(obj)
53

    
54
    def format_item_display(self,obj):
55
        if isinstance(obj, FakeGroup):
56
            text = obj.label
57
        else:
58
            text = obj.last_name.upper() + ' ' + obj.first_name
59
        return unicode(text)
60

    
61
class AllWorkerOrGroupLookup(WorkerOrGroupLookup):
62
    enabled = False
63

    
64
class SchoolLookup(CalebasseLookup):
65
    model = School
66
    search_field = 'name'
67
    query_words = []
68

    
69
    def get_query(self, q, request):
70
        words = q.split()
71
        self.query_words = words
72
        lookups = [Q(display_name__icontains=word) for word in words]
73
        return School.objects.filter(*lookups)
74

    
75
    def get_result(self, obj):
76
        return self.format_item_display(obj)
77

    
78
    def format_match(self, obj):
79
        display = obj.display_name
80
        for word in self.query_words:
81
            pattern = re.compile(r"(%s)" % word, re.IGNORECASE)
82
            display = re.sub(pattern, r"<strong>\1</strong>", display)
83
        return display
84

    
85
    def format_item_display(self, obj):
86
        return obj.display_name
87

    
(3-3/7)