Projet

Général

Profil

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

calebasse / calebasse / ressources / lookups.py @ 1164bc89

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

    
5
from django.db.models import Q
6

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

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

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

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

    
23

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

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

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

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

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

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

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

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

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

    
70
    def get_query(self, q, request):
71
        service = ''
72
        if request.COOKIES.has_key(HOME_SERVICE_COOKIE):
73
            service = request.COOKIES[HOME_SERVICE_COOKIE]
74
        words = q.split()
75
        self.query_words = words
76
        lookups = [Q(display_name__icontains=word) for word in words]
77
        return School.objects.filter(*lookups).\
78
                filter(services__slug=service).\
79
                filter(school_type__services__slug=service)
80

    
81
    def get_result(self, obj):
82
        return self.format_item_display(obj)
83

    
84
    def format_match(self, obj):
85
        display = obj.display_name
86
        for word in self.query_words:
87
            pattern = re.compile(r"(%s)" % word, re.IGNORECASE)
88
            display = re.sub(pattern, r"<strong>\1</strong>", display)
89
        return display
90

    
91
    def format_item_display(self, obj):
92
        return obj.display_name
93

    
(4-4/8)