Projet

Général

Profil

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

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

1 3355038a Jérôme Schneider
# -*- coding: utf-8 -*-
2 caf6b116 Frédéric Péters
import itertools
3 81411908 Jérôme Schneider
import re
4
5
from django.db.models import Q
6 0ef0e3d1 Frédéric Péters
7 fe0dcf03 Jérôme Schneider
from calebasse.cbv import HOME_SERVICE_COOKIE
8 9f39f12f Jérôme Schneider
from calebasse.lookups import CalebasseLookup
9 0ef0e3d1 Frédéric Péters
from calebasse.personnes.models import Worker
10 3355038a Jérôme Schneider
from calebasse.ressources.models import Service, School
11 caf6b116 Frédéric Péters
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 0ef0e3d1 Frédéric Péters
24 9f39f12f Jérôme Schneider
class WorkerOrGroupLookup(CalebasseLookup):
25 0ef0e3d1 Frédéric Péters
    model = Worker
26 9dc52fdd Jérôme Schneider
    search_field = 'last_name'
27 b7befbb6 Mikaël Ates
    enabled = True
28 caf6b116 Frédéric Péters
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 9dc52fdd Jérôme Schneider
            kwargs = { "%s__istartswith" % self.search_field : q }
41 caf6b116 Frédéric Péters
            group = FakeGroup('group:%s' % service.id, service.name)
42 3db8d984 Jérôme Schneider
            return itertools.chain([group], self.model.objects.for_service(service.id).order_by('last_name'))
43 caf6b116 Frédéric Péters
44 9dc52fdd Jérôme Schneider
        kwargs = { "%s__istartswith" % self.search_field : q }
45 b7befbb6 Mikaël Ates
        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 4e4c4c50 Jérôme Schneider
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 dea76c1b Jérôme Schneider
        if isinstance(obj, FakeGroup):
57
            text = obj.label
58
        else:
59
            text = obj.last_name.upper() + ' ' + obj.first_name
60 4e4c4c50 Jérôme Schneider
        return unicode(text)
61
62 b7befbb6 Mikaël Ates
class AllWorkerOrGroupLookup(WorkerOrGroupLookup):
63
    enabled = False
64 3355038a Jérôme Schneider
65
class SchoolLookup(CalebasseLookup):
66
    model = School
67
    search_field = 'name'
68 81411908 Jérôme Schneider
    query_words = []
69
70
    def get_query(self, q, request):
71 fe0dcf03 Jérôme Schneider
        service = ''
72
        if request.COOKIES.has_key(HOME_SERVICE_COOKIE):
73
            service = request.COOKIES[HOME_SERVICE_COOKIE]
74 81411908 Jérôme Schneider
        words = q.split()
75
        self.query_words = words
76
        lookups = [Q(display_name__icontains=word) for word in words]
77 fe0dcf03 Jérôme Schneider
        return School.objects.filter(*lookups).\
78 7caf5070 Jérôme Schneider
                filter(services__slug=service).\
79
                filter(school_type__services__slug=service)
80 3355038a Jérôme Schneider
81
    def get_result(self, obj):
82
        return self.format_item_display(obj)
83
84
    def format_match(self, obj):
85 81411908 Jérôme Schneider
        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 3355038a Jérôme Schneider
91
    def format_item_display(self, obj):
92 81411908 Jérôme Schneider
        return obj.display_name