Commit a80fcb8f167a03cf0ffce9fca01b8c7447b50271
1 parent
64f04f30
Exists in
master
and in
39 other branches
Adding complete search_indexes to revision, wiki and ticket
Showing
5 changed files
with
158 additions
and
120 deletions
Show diff stats
src/proxy/models.py
@@ -2,107 +2,81 @@ | @@ -2,107 +2,81 @@ | ||
2 | 2 | ||
3 | from django.db import models | 3 | from django.db import models |
4 | 4 | ||
5 | - | ||
6 | -class Attachment(models.Model): | ||
7 | - type = models.TextField() | ||
8 | - filename = models.TextField() | ||
9 | - size = models.IntegerField(blank=True, null=True) | ||
10 | - time = models.BigIntegerField(blank=True, null=True) | ||
11 | - description = models.TextField(blank=True) | ||
12 | - author = models.TextField(blank=True) | ||
13 | - ipnr = models.TextField(blank=True) | ||
14 | - | ||
15 | - class Meta: | ||
16 | - managed = False | ||
17 | - db_table = 'attachment' | 5 | +from accounts.models import User |
18 | 6 | ||
19 | 7 | ||
20 | -class Repository(models.Model): | ||
21 | - name = models.TextField() | ||
22 | - value = models.TextField(blank=True) | ||
23 | - | ||
24 | - class Meta: | ||
25 | - managed = False | ||
26 | - db_table = 'repository' | 8 | +# get_absolute_url em todos |
9 | +# get_author_url em todos | ||
27 | 10 | ||
28 | 11 | ||
29 | class Revision(models.Model): | 12 | class Revision(models.Model): |
30 | - repos = models.IntegerField() | ||
31 | - rev = models.TextField() | ||
32 | - time = models.BigIntegerField(blank=True, null=True) | 13 | + rev = models.TextField(blank=True, primary_key=True) |
33 | author = models.TextField(blank=True) | 14 | author = models.TextField(blank=True) |
34 | message = models.TextField(blank=True) | 15 | message = models.TextField(blank=True) |
16 | + repository_name = models.TextField(blank=True) | ||
17 | + created = models.DateTimeField(blank=True, null=True) | ||
35 | 18 | ||
36 | class Meta: | 19 | class Meta: |
37 | managed = False | 20 | managed = False |
38 | - db_table = 'revision' | 21 | + db_table = 'revision_view' |
22 | + | ||
23 | + def get_absolute_url(self): | ||
24 | + return u'/changeset/{}/{}'.format(self.rev, self.repository_name) | ||
39 | 25 | ||
26 | + def get_author(self): | ||
27 | + try: | ||
28 | + return User.objects.get(username=self.author) | ||
29 | + except User.DoesNotExist: | ||
30 | + return None | ||
40 | 31 | ||
41 | class Ticket(models.Model): | 32 | class Ticket(models.Model): |
42 | id = models.IntegerField(primary_key=True) | 33 | id = models.IntegerField(primary_key=True) |
43 | - type = models.TextField(blank=True) | ||
44 | - time = models.BigIntegerField(blank=True, null=True) | ||
45 | - changetime = models.BigIntegerField(blank=True, null=True) | 34 | + summary = models.TextField(blank=True) |
35 | + description = models.TextField(blank=True) | ||
36 | + milestone = models.TextField(blank=True) | ||
37 | + priority = models.TextField(blank=True) | ||
46 | component = models.TextField(blank=True) | 38 | component = models.TextField(blank=True) |
39 | + version = models.TextField(blank=True) | ||
47 | severity = models.TextField(blank=True) | 40 | severity = models.TextField(blank=True) |
48 | - priority = models.TextField(blank=True) | ||
49 | - owner = models.TextField(blank=True) | ||
50 | reporter = models.TextField(blank=True) | 41 | reporter = models.TextField(blank=True) |
51 | - cc = models.TextField(blank=True) | ||
52 | - version = models.TextField(blank=True) | ||
53 | - milestone = models.TextField(blank=True) | 42 | + author = models.TextField(blank=True) |
54 | status = models.TextField(blank=True) | 43 | status = models.TextField(blank=True) |
55 | - resolution = models.TextField(blank=True) | ||
56 | - summary = models.TextField(blank=True) | ||
57 | - description = models.TextField(blank=True) | ||
58 | keywords = models.TextField(blank=True) | 44 | keywords = models.TextField(blank=True) |
45 | + collaborators = models.TextField(blank=True) | ||
46 | + created = models.DateTimeField(blank=True, null=True) | ||
47 | + modified = models.DateTimeField(blank=True, null=True) | ||
59 | 48 | ||
60 | class Meta: | 49 | class Meta: |
61 | managed = False | 50 | managed = False |
62 | - db_table = 'ticket' | ||
63 | - | ||
64 | - | ||
65 | -class TicketChange(models.Model): | ||
66 | - ticket = models.IntegerField() | ||
67 | - time = models.BigIntegerField() | ||
68 | - author = models.TextField(blank=True) | ||
69 | - field = models.TextField() | ||
70 | - oldvalue = models.TextField(blank=True) | ||
71 | - newvalue = models.TextField(blank=True) | ||
72 | - | ||
73 | - class Meta: | ||
74 | - managed = False | ||
75 | - db_table = 'ticket_change' | 51 | + db_table = 'ticket_view' |
76 | 52 | ||
53 | + def get_absolute_url(self): | ||
54 | + return u'/ticket/{}'.format(self.id) | ||
77 | 55 | ||
78 | -class TicketCustom(models.Model): | ||
79 | - ticket = models.IntegerField() | ||
80 | - name = models.TextField() | ||
81 | - value = models.TextField(blank=True) | ||
82 | - | ||
83 | - class Meta: | ||
84 | - managed = False | ||
85 | - db_table = 'ticket_custom' | 56 | + def get_author(self): |
57 | + try: | ||
58 | + return User.objects.get(username=self.author) | ||
59 | + except User.DoesNotExist: | ||
60 | + return None | ||
86 | 61 | ||
87 | 62 | ||
88 | class Wiki(models.Model): | 63 | class Wiki(models.Model): |
89 | name = models.TextField(primary_key=True) | 64 | name = models.TextField(primary_key=True) |
90 | - version = models.IntegerField() | ||
91 | - time = models.BigIntegerField(blank=True, null=True) | 65 | + wiki_text = models.TextField(blank=True) |
92 | author = models.TextField(blank=True) | 66 | author = models.TextField(blank=True) |
93 | - ipnr = models.TextField(blank=True) | ||
94 | - text = models.TextField(blank=True) | ||
95 | - comment = models.TextField(blank=True) | ||
96 | - readonly = models.IntegerField(blank=True, null=True) | 67 | + collaborators = models.TextField(blank=True) |
68 | + created = models.DateTimeField(blank=True, null=True) | ||
69 | + modified = models.DateTimeField(blank=True, null=True) | ||
97 | 70 | ||
98 | class Meta: | 71 | class Meta: |
99 | managed = False | 72 | managed = False |
100 | - db_table = 'wiki' | 73 | + db_table = 'wiki_view' |
101 | 74 | ||
102 | - def get_collaborators(self): | ||
103 | - return Wiki.objects.filter( | ||
104 | - name=self.name, | ||
105 | - ).values_list('author', flat=True) | 75 | + def get_absolute_url(self): |
76 | + return u'/ticket/{}'.format(self.name) | ||
106 | 77 | ||
107 | def get_author(self): | 78 | def get_author(self): |
108 | - return Wiki.objects.get(name=self.name, version=1).author | 79 | + try: |
80 | + return User.objects.get(username=self.author) | ||
81 | + except User.DoesNotExist: | ||
82 | + return None |
src/proxy/search_indexes.py
1 | # -*- coding: utf-8 -*- | 1 | # -*- coding: utf-8 -*- |
2 | 2 | ||
3 | from datetime import datetime | 3 | from datetime import datetime |
4 | + | ||
4 | from django.db.models import Q | 5 | from django.db.models import Q |
5 | from haystack import indexes | 6 | from haystack import indexes |
6 | 7 | ||
7 | -from .models import Wiki | 8 | +from .models import Ticket, Wiki, Revision |
8 | 9 | ||
9 | 10 | ||
10 | class WikiIndex(indexes.SearchIndex, indexes.Indexable): | 11 | class WikiIndex(indexes.SearchIndex, indexes.Indexable): |
11 | text = indexes.CharField(document=True, use_template=True) | 12 | text = indexes.CharField(document=True, use_template=True) |
12 | - wiki_text = indexes.CharField(model_attr='text') | ||
13 | - name = indexes.CharField(model_attr='name') | ||
14 | - author = indexes.CharField(model_attr='get_author', null=True) | ||
15 | - collaborators = indexes.CharField( | ||
16 | - model_attr='get_collaborators', null=True | ||
17 | - ) | ||
18 | - comment = indexes.CharField(model_attr='comment', null=True) | ||
19 | - time = indexes.DateTimeField(model_attr='time', null=True) | ||
20 | - | ||
21 | - url = indexes.CharField() | 13 | + wiki_text = indexes.CharField(model_attr='wiki_text') |
14 | + author = indexes.CharField(null=True) | ||
15 | + author_url = indexes.CharField(null=True) | ||
16 | + collaborators = indexes.CharField(model_attr='collaborators', null=True) | ||
17 | + created = indexes.DateTimeField(model_attr='created', null=True) | ||
18 | + modified = indexes.DateTimeField(model_attr='modified', null=True) | ||
19 | + | ||
20 | + url = indexes.CharField(model_attr='get_absolute_url') | ||
22 | type = indexes.CharField() | 21 | type = indexes.CharField() |
23 | 22 | ||
24 | def get_model(self): | 23 | def get_model(self): |
25 | return Wiki | 24 | return Wiki |
26 | 25 | ||
27 | - def prepare_time(self, obj): | ||
28 | - return datetime.fromtimestamp(self.prepared_data['time']/1000000) | 26 | + def get_updated_field(self): |
27 | + return 'modified' | ||
28 | + | ||
29 | + def prepare_author(self, obj): | ||
30 | + author = obj.get_author() | ||
31 | + if author: | ||
32 | + return author.get_full_name() | ||
33 | + return obj.author | ||
34 | + | ||
35 | + def prepare_author_url(self, obj): | ||
36 | + author = obj.get_author() | ||
37 | + if author: | ||
38 | + return author.get_absolute_url() | ||
39 | + return None | ||
29 | 40 | ||
30 | def prepare_type(self, obj): | 41 | def prepare_type(self, obj): |
31 | return u'wiki' | 42 | return u'wiki' |
32 | 43 | ||
33 | - def prepare_url(self, obj): | ||
34 | - return u'/wiki/{}'.format(obj.name) | ||
35 | - | ||
36 | - def index_queryset(self, using=None): | ||
37 | - wiki = self.get_model().objects.raw( | ||
38 | - ''' | ||
39 | - SELECT "wiki"."name", MAX("wiki"."version") AS version | ||
40 | - FROM "wiki" | ||
41 | - GROUP BY "wiki"."name" | ||
42 | - ''' | ||
43 | - ) | ||
44 | - | ||
45 | - q = Q() | ||
46 | - for obj in wiki: | ||
47 | - q |= Q(name=obj.name, version=obj.version) | ||
48 | - | ||
49 | - return self.get_model().objects.filter(q) | ||
50 | - | ||
51 | - | ||
52 | -# def TicketIndex(indexes.SearchIndex, indexes.Indexable): | ||
53 | -# text = = indexes.CharField(document=True, use_template=True) | ||
54 | -# time = indexes.CharField( | ||
55 | -# changetime = indexes.CharField( | ||
56 | -# component = indexes.CharField( | ||
57 | -# severity = indexes.CharField( | ||
58 | -# priority = indexes.CharField( | ||
59 | -# owner = indexes.CharField( | ||
60 | -# reporter = indexes.CharField( | ||
61 | -# cc = indexes.CharField( | ||
62 | -# version = indexes.CharField( | ||
63 | -# milestone = indexes.CharField( | ||
64 | -# status = indexes.CharField( | ||
65 | -# resolution = indexes.CharField( | ||
66 | -# summary = indexes.CharField( | ||
67 | -# description = indexes.CharField( | ||
68 | -# keywords = indexes.CharField( | 44 | + |
45 | +class TicketIndex(indexes.SearchIndex, indexes.Indexable): | ||
46 | + text = indexes.CharField(document=True, use_template=True) | ||
47 | + summary = indexes.CharField(model_attr='summary', null=True) | ||
48 | + description = indexes.CharField(model_attr='description', null=True) | ||
49 | + milestone = indexes.CharField(model_attr='milestone', null=True) | ||
50 | + component = indexes.CharField(model_attr='component', null=True) | ||
51 | + version = indexes.CharField(model_attr='version', null=True) | ||
52 | + severity = indexes.CharField(model_attr='severity', null=True) | ||
53 | + reporter = indexes.CharField(model_attr='reporter', null=True) | ||
54 | + author = indexes.CharField(null=True) | ||
55 | + author_url = indexes.CharField(null=True) | ||
56 | + status = indexes.CharField(model_attr='status', null=True) | ||
57 | + keywords = indexes.CharField(model_attr='keywords', null=True) | ||
58 | + collaborators = indexes.CharField(model_attr='collaborators', null=True) | ||
59 | + created = indexes.DateTimeField(model_attr='created', null=True) | ||
60 | + modified = indexes.DateTimeField(model_attr='modified', null=True) | ||
61 | + | ||
62 | + url = indexes.CharField(model_attr='get_absolute_url') | ||
63 | + type = indexes.CharField() | ||
64 | + | ||
65 | + def get_model(self): | ||
66 | + return Ticket | ||
67 | + | ||
68 | + def get_updated_field(self): | ||
69 | + return 'modified' | ||
70 | + | ||
71 | + def prepare_author(self, obj): | ||
72 | + author = obj.get_author() | ||
73 | + if author: | ||
74 | + return author.get_full_name() | ||
75 | + return obj.author | ||
76 | + | ||
77 | + def prepare_author_url(self, obj): | ||
78 | + author = obj.get_author() | ||
79 | + if author: | ||
80 | + return author.get_absolute_url() | ||
81 | + return None | ||
82 | + | ||
83 | + def prepare_type(self, obj): | ||
84 | + return 'ticket' | ||
85 | + | ||
86 | + | ||
87 | +class RevisionIndex(indexes.SearchIndex, indexes.Indexable): | ||
88 | + text = indexes.CharField(document=True, use_template=True) | ||
89 | + repository_name = indexes.CharField(model_attr='repository_name') | ||
90 | + revision = indexes.CharField(model_attr='rev') | ||
91 | + created = indexes.DateTimeField(model_attr='created', null=True) | ||
92 | + modified = indexes.DateTimeField(model_attr='created', null=True) | ||
93 | + author = indexes.CharField(null=True) | ||
94 | + author_url = indexes.CharField(null=True) | ||
95 | + message = indexes.CharField(model_attr='message', null=True) | ||
96 | + | ||
97 | + url = indexes.CharField(model_attr='get_absolute_url') | ||
98 | + type = indexes.CharField() | ||
99 | + | ||
100 | + def get_model(self): | ||
101 | + return Revision | ||
102 | + | ||
103 | + def get_updated_field(self): | ||
104 | + return 'created' | ||
105 | + | ||
106 | + def prepare_author(self, obj): | ||
107 | + author = obj.get_author() | ||
108 | + if author: | ||
109 | + return author.get_full_name() | ||
110 | + return obj.author | ||
111 | + | ||
112 | + def prepare_author_url(self, obj): | ||
113 | + author = obj.get_author() | ||
114 | + if author: | ||
115 | + return author.get_absolute_url() | ||
116 | + return None | ||
117 | + | ||
118 | + def prepare_type(self, obj): | ||
119 | + return 'changeset' |
src/proxy/templates/search/indexes/proxy/revision_text.txt
0 → 100644
src/proxy/templates/search/indexes/proxy/ticket_text.txt
0 → 100644
@@ -0,0 +1,11 @@ | @@ -0,0 +1,11 @@ | ||
1 | +{{ object.summary }} | ||
2 | +{{ object.description }} | ||
3 | +{{ object.milestone }} | ||
4 | +{{ object.component }} | ||
5 | +{{ object.version }} | ||
6 | +{{ object.severity }} | ||
7 | +{{ object.reporter }} | ||
8 | +{% firstof object.get_author.get_fullname or object.author %} | ||
9 | +{{ object.status }} | ||
10 | +{{ object.keywords }} | ||
11 | +{{ object.collaborators }} |
src/proxy/templates/search/indexes/proxy/wiki_text.txt