From b3108e39972cb29c7da6cf724e74fc6bbf1269bb Mon Sep 17 00:00:00 2001 From: Gust Date: Mon, 4 Aug 2014 17:53:45 -0300 Subject: [PATCH] Fixing and extracting Trac dependencies --- src/accounts/search_indexes.py | 2 +- src/accounts/views.py | 2 +- src/api/resources.py | 2 +- src/badger/utils.py | 2 +- src/colab/custom_settings.py | 24 ++++++++++++------------ src/home/views.py | 14 +++++++++----- src/proxy/models.py | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/proxy/search_indexes.py | 2 +- src/proxy/trac/migrations/0001_initial.py | 216 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------- src/proxy/trac/models.py | 178 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/proxy/views.py | 2 +- src/search/templates/search/includes/search_filters.html | 44 ++++++++++++++++++++++++-------------------- src/search/views.py | 46 ++++++++++++++++++++++++++-------------------- src/super_archives/templatetags/superarchives.py | 5 +++++ 14 files changed, 365 insertions(+), 350 deletions(-) diff --git a/src/accounts/search_indexes.py b/src/accounts/search_indexes.py index 5315713..9700310 100644 --- a/src/accounts/search_indexes.py +++ b/src/accounts/search_indexes.py @@ -3,7 +3,7 @@ from haystack import indexes from django.db.models import Count -from proxy.trac.models import Revision, Ticket, Wiki +from proxy.models import Revision, Ticket, Wiki from badger.utils import get_users_counters from .models import User diff --git a/src/accounts/views.py b/src/accounts/views.py index c8a250c..7745da7 100644 --- a/src/accounts/views.py +++ b/src/accounts/views.py @@ -25,7 +25,7 @@ from haystack.query import SearchQuerySet from super_archives.models import EmailAddress, Message from super_archives.utils.email import send_email_lists from search.utils import trans -from proxy.trac.models import WikiCollabCount, TicketCollabCount +from proxy.models import WikiCollabCount, TicketCollabCount from .forms import (UserCreationForm, ListsForm, UserUpdateForm, ChangeXMPPPasswordForm) from .errors import XMPPChangePwdException diff --git a/src/api/resources.py b/src/api/resources.py index 002f983..9395432 100644 --- a/src/api/resources.py +++ b/src/api/resources.py @@ -7,7 +7,7 @@ from tastypie.constants import ALL_WITH_RELATIONS, ALL from tastypie.resources import ModelResource from super_archives.models import Message, EmailAddress -from proxy.trac.models import Revision, Ticket, Wiki +from proxy.models import Revision, Ticket, Wiki User = get_user_model() diff --git a/src/badger/utils.py b/src/badger/utils.py index 94ac88f..dd3f70f 100644 --- a/src/badger/utils.py +++ b/src/badger/utils.py @@ -2,7 +2,7 @@ from django.db.models import Count -from proxy.trac.models import (Revision, Ticket, Wiki, +from proxy.models import (Revision, Ticket, Wiki, WikiCollabCount, TicketCollabCount) from accounts.models import User diff --git a/src/colab/custom_settings.py b/src/colab/custom_settings.py index fe91bb7..9f87afe 100644 --- a/src/colab/custom_settings.py +++ b/src/colab/custom_settings.py @@ -255,18 +255,6 @@ MESSAGE_TAGS = { messages.ERROR: 'alert-danger', } - -### Trac -TRAC_ENABLED = False - -if TRAC_ENABLED: - from trac_settings import * - DATABASES['trac'] = TRAC_DATABASE - INSTALLED_APPS = INSTALLED_APPS + ( - 'proxy.trac', - ) - - ### Feedzilla (planet) from feedzilla.settings import * FEEDZILLA_PAGE_SIZE = 5 @@ -321,7 +309,19 @@ DPASTE_EXPIRE_DEFAULT = DPASTE_EXPIRE_CHOICES[4][0] DPASTE_DEFAULT_GIST_DESCRIPTION = 'Gist created on Colab Interlegis' DPASTE_DEFAULT_GIST_NAME = 'colab_paste' + +### Trac +TRAC_ENABLED = False + +from trac_settings import * +DATABASES['trac'] = TRAC_DATABASE + try: from local_settings import * except ImportError: pass + +if TRAC_ENABLED: + INSTALLED_APPS = INSTALLED_APPS + ( + 'proxy.trac', + ) \ No newline at end of file diff --git a/src/home/views.py b/src/home/views.py index ef0c3d3..2530083 100644 --- a/src/home/views.py +++ b/src/home/views.py @@ -9,7 +9,7 @@ from django.http import HttpResponse, Http404 from search.utils import trans from haystack.query import SearchQuerySet -from proxy.trac.models import WikiCollabCount, TicketCollabCount +from proxy.models import WikiCollabCount, TicketCollabCount from super_archives.models import Thread @@ -23,12 +23,16 @@ def index(request): count_types = cache.get('home_chart') if count_types is None: count_types = OrderedDict() - for type in ['thread', 'changeset', 'attachment']: - count_types[type] = SearchQuerySet().filter( - type=type, - ).count() + count_types['thread'] = SearchQuerySet().filter( + type='thread', + ).count() if settings.TRAC_ENABLED: + for type in ['changeset', 'attachment']: + count_types[type] = SearchQuerySet().filter( + type=type, + ).count() + count_types['ticket'] = sum([ ticket.count for ticket in TicketCollabCount.objects.all() ]) diff --git a/src/proxy/models.py b/src/proxy/models.py index 20a46b0..f6a4431 100644 --- a/src/proxy/models.py +++ b/src/proxy/models.py @@ -1,6 +1,178 @@ # -*- coding: utf-8 -*- from django.db import models from django.conf import settings +import os +import urllib2 -if settings.TRAC_ENABLED: - import trac.trac.models +from django.conf import settings +from django.db import models, connections +from django.db.models.signals import post_save +from django.dispatch import receiver + +from accounts.models import User +from hitcounter.models import HitCounterModelMixin + +class Attachment(models.Model, HitCounterModelMixin): + url = models.TextField(primary_key=True) + attach_id = models.TextField() + used_by = models.TextField() + filename = models.TextField() + author = models.TextField(blank=True) + description = models.TextField(blank=True) + created = models.DateTimeField(blank=True) + mimetype = models.TextField(blank=True) + size = models.IntegerField(blank=True) + + class Meta: + managed = False + db_table = 'attachment_view' + + @property + def filepath(self): + return os.path.join( + settings.ATTACHMENTS_FOLDER_PATH, + self.used_by, + self.attach_id, + urllib2.quote(self.filename.encode('utf8')) + ) + + def get_absolute_url(self): + return u'/raw-attachment/{}'.format(self.url) + + def get_author(self): + try: + return User.objects.get(username=self.author) + except User.DoesNotExist: + return None + + +class Revision(models.Model, HitCounterModelMixin): + key = models.TextField(blank=True, primary_key=True) + rev = models.TextField(blank=True) + author = models.TextField(blank=True) + message = models.TextField(blank=True) + repository_name = models.TextField(blank=True) + created = models.DateTimeField(blank=True, null=True) + + class Meta: + managed = False + db_table = 'revision_view' + + def get_absolute_url(self): + return u'/changeset/{}/{}'.format(self.rev, self.repository_name) + + def get_author(self): + try: + return User.objects.get(username=self.author) + except User.DoesNotExist: + return None + +class Ticket(models.Model, HitCounterModelMixin): + id = models.IntegerField(primary_key=True) + summary = models.TextField(blank=True) + description = models.TextField(blank=True) + milestone = models.TextField(blank=True) + priority = models.TextField(blank=True) + component = models.TextField(blank=True) + version = models.TextField(blank=True) + severity = models.TextField(blank=True) + reporter = models.TextField(blank=True) + author = models.TextField(blank=True) + status = models.TextField(blank=True) + keywords = models.TextField(blank=True) + collaborators = models.TextField(blank=True) + created = models.DateTimeField(blank=True, null=True) + modified = models.DateTimeField(blank=True, null=True) + modified_by = models.TextField(blank=True) + + class Meta: + managed = False + db_table = 'ticket_view' + + def get_absolute_url(self): + return u'/ticket/{}'.format(self.id) + + def get_author(self): + try: + return User.objects.get(username=self.author) + except User.DoesNotExist: + return None + + def get_modified_by(self): + try: + return User.objects.get(username=self.modified_by) + except User.DoesNotExist: + return None + +class Wiki(models.Model, HitCounterModelMixin): + name = models.TextField(primary_key=True) + wiki_text = models.TextField(blank=True) + author = models.TextField(blank=True) + collaborators = models.TextField(blank=True) + created = models.DateTimeField(blank=True, null=True) + modified = models.DateTimeField(blank=True, null=True) + modified_by = models.TextField(blank=True) + + class Meta: + managed = False + db_table = 'wiki_view' + + def get_absolute_url(self): + return u'/wiki/{}'.format(self.name) + + def get_author(self): + try: + return User.objects.get(username=self.author) + except User.DoesNotExist: + return None + + def get_modified_by(self): + try: + return User.objects.get(username=self.modified_by) + except User.DoesNotExist: + return None + + +class WikiCollabCount(models.Model): + author = models.TextField(primary_key=True) + count = models.IntegerField() + + class Meta: + managed = False + db_table = 'wiki_collab_count_view' + + +class TicketCollabCount(models.Model): + author = models.TextField(primary_key=True) + count = models.IntegerField() + + class Meta: + managed = False + db_table = 'ticket_collab_count_view' + + +@receiver(post_save, sender=User) +def change_session_attribute_email(sender, instance, **kwargs): + cursor = connections['trac'].cursor() + + cursor.execute(("UPDATE session_attribute SET value=%s " + "WHERE name='email' AND sid=%s"), + [instance.email, instance.username]) + cursor.execute(("UPDATE session_attribute SET value=%s " + "WHERE name='name' AND sid=%s"), + [instance.get_full_name(), instance.username]) + + cursor.execute(("INSERT INTO session_attribute " + "(sid, authenticated, name, value) " + "SELECT %s, '1', 'email', %s WHERE NOT EXISTS " + "(SELECT 1 FROM session_attribute WHERE sid=%s " + "AND name='email')"), + [instance.username, instance.email, instance.username]) + + cursor.execute(("INSERT INTO session_attribute " + "(sid, authenticated, name, value) " + "SELECT %s, '1', 'name', %s WHERE NOT EXISTS " + "(SELECT 1 FROM session_attribute WHERE sid=%s " + "AND name='name')"), + [instance.username, instance.get_full_name(), + instance.username]) diff --git a/src/proxy/search_indexes.py b/src/proxy/search_indexes.py index 088fc5b..794f019 100644 --- a/src/proxy/search_indexes.py +++ b/src/proxy/search_indexes.py @@ -9,7 +9,7 @@ from haystack import indexes from haystack.utils import log as logging from search.base_indexes import BaseIndex -from trac.models import Attachment, Ticket, Wiki, Revision +from proxy.models import Attachment, Ticket, Wiki, Revision logger = logging.getLogger('haystack') diff --git a/src/proxy/trac/migrations/0001_initial.py b/src/proxy/trac/migrations/0001_initial.py index 6b2355f..1fe5d32 100644 --- a/src/proxy/trac/migrations/0001_initial.py +++ b/src/proxy/trac/migrations/0001_initial.py @@ -9,7 +9,7 @@ from django.db import models class Migration(SchemaMigration): def forwards(self, orm): - connection = connections['trac'] + connection = connections['trac'] cursor = connection.cursor() cursor.execute(''' @@ -60,111 +60,111 @@ class Migration(SchemaMigration): ); ''') cursor.execute(''' -CREATE OR REPLACE VIEW revision_view AS SELECT -revision.rev, -revision.author, -revision.message, -repository.value AS repository_name, -TIMESTAMP WITH TIME ZONE 'epoch' + (revision.time/1000000) * INTERVAL '1s' AS created, -CONCAT(revision.repos, '-', revision.rev) AS key -FROM revision -INNER JOIN repository ON( -repository.id = revision.repos -AND repository.name = 'name' -AND repository.value != '' -); -''') + CREATE OR REPLACE VIEW revision_view AS SELECT + revision.rev, + revision.author, + revision.message, + repository.value AS repository_name, + TIMESTAMP WITH TIME ZONE 'epoch' + (revision.time/1000000) * INTERVAL '1s' AS created, + CONCAT(revision.repos, '-', revision.rev) AS key + FROM revision + INNER JOIN repository ON( + repository.id = revision.repos + AND repository.name = 'name' + AND repository.value != '' + ); + ''') cursor.execute(''' -CREATE OR REPLACE VIEW attachment_view AS SELECT -CONCAT(attachment.type, '/' , attachment.id, '/', attachment.filename) AS url, -attachment.type AS used_by, -attachment.filename AS filename, -attachment.id as attach_id, -(SELECT LOWER(SUBSTRING(attachment.filename FROM '\.(\w+)$'))) AS mimetype, -attachment.author AS author, -attachment.description AS description, -attachment.size AS size, -TIMESTAMP WITH TIME ZONE 'epoch' + (attachment.time/1000000)* INTERVAL '1s' AS created -FROM attachment; -''') + CREATE OR REPLACE VIEW attachment_view AS SELECT + CONCAT(attachment.type, '/' , attachment.id, '/', attachment.filename) AS url, + attachment.type AS used_by, + attachment.filename AS filename, + attachment.id as attach_id, + (SELECT LOWER(SUBSTRING(attachment.filename FROM '\.(\w+)$'))) AS mimetype, + attachment.author AS author, + attachment.description AS description, + attachment.size AS size, + TIMESTAMP WITH TIME ZONE 'epoch' + (attachment.time/1000000)* INTERVAL '1s' AS created + FROM attachment; + ''') cursor.execute(''' -CREATE OR REPLACE VIEW wiki_view AS SELECT -wiki.name AS name, -(SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name -AND wiki2.version = MAX(wiki.version)) AS wiki_text, -(SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name -AND wiki3.version = 1) AS author, -string_agg(DISTINCT wiki.author, ', ') AS collaborators, -TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created, -TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified -FROM wiki -GROUP BY wiki.name; -''') + CREATE OR REPLACE VIEW wiki_view AS SELECT + wiki.name AS name, + (SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name + AND wiki2.version = MAX(wiki.version)) AS wiki_text, + (SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name + AND wiki3.version = 1) AS author, + string_agg(DISTINCT wiki.author, ', ') AS collaborators, + TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created, + TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified + FROM wiki + GROUP BY wiki.name; + ''') cursor.execute(''' -CREATE OR REPLACE VIEW wiki_view AS SELECT -wiki.name AS name, -(SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name -AND wiki2.version = MAX(wiki.version)) AS wiki_text, -(SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name -AND wiki3.version = 1) AS author, -string_agg(DISTINCT wiki.author, ', ') AS collaborators, -TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created, -TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified, -(SELECT wiki4.author FROM wiki AS wiki4 WHERE wiki4.name = wiki.name -AND wiki4.version = MAX(wiki.version)) AS modified_by -FROM wiki -GROUP BY wiki.name; + CREATE OR REPLACE VIEW wiki_view AS SELECT + wiki.name AS name, + (SELECT wiki2.text FROM wiki AS wiki2 WHERE wiki2.name = wiki.name + AND wiki2.version = MAX(wiki.version)) AS wiki_text, + (SELECT wiki3.author FROM wiki AS wiki3 WHERE wiki3.name = wiki.name + AND wiki3.version = 1) AS author, + string_agg(DISTINCT wiki.author, ', ') AS collaborators, + TIMESTAMP WITH TIME ZONE 'epoch' + (MIN(wiki.time)/1000000) * INTERVAL '1s' AS created, + TIMESTAMP WITH TIME ZONE 'epoch' + (MAX(wiki.time)/1000000) * INTERVAL '1s' AS modified, + (SELECT wiki4.author FROM wiki AS wiki4 WHERE wiki4.name = wiki.name + AND wiki4.version = MAX(wiki.version)) AS modified_by + FROM wiki + GROUP BY wiki.name; -CREATE OR REPLACE VIEW ticket_view AS SELECT -ticket.id AS id, -ticket.summary as summary, -ticket.description as description, -ticket.milestone as milestone, -ticket.priority as priority, -ticket.component as component, -ticket.version as version, -ticket.severity as severity, -ticket.reporter as reporter, -ticket.reporter as author, -ticket.status as status, -ticket.keywords as keywords, -(SELECT -string_agg(DISTINCT ticket_change.author, ', ') -FROM ticket_change WHERE ticket_change.ticket = ticket.id -GROUP BY ticket_change.ticket) as collaborators, -TIMESTAMP WITH TIME ZONE 'epoch' + (time/1000000)* INTERVAL '1s' AS created, -TIMESTAMP WITH TIME ZONE 'epoch' + (changetime/1000000) * INTERVAL '1s' AS modified, -(SELECT -ticket_change.author -FROM ticket_change -WHERE ticket_change.ticket = ticket.id -AND ticket_change.time = ticket.changetime -LIMIT 1 -) AS modified_by -FROM ticket; -''') + CREATE OR REPLACE VIEW ticket_view AS SELECT + ticket.id AS id, + ticket.summary as summary, + ticket.description as description, + ticket.milestone as milestone, + ticket.priority as priority, + ticket.component as component, + ticket.version as version, + ticket.severity as severity, + ticket.reporter as reporter, + ticket.reporter as author, + ticket.status as status, + ticket.keywords as keywords, + (SELECT + string_agg(DISTINCT ticket_change.author, ', ') + FROM ticket_change WHERE ticket_change.ticket = ticket.id + GROUP BY ticket_change.ticket) as collaborators, + TIMESTAMP WITH TIME ZONE 'epoch' + (time/1000000)* INTERVAL '1s' AS created, + TIMESTAMP WITH TIME ZONE 'epoch' + (changetime/1000000) * INTERVAL '1s' AS modified, + (SELECT + ticket_change.author + FROM ticket_change + WHERE ticket_change.ticket = ticket.id + AND ticket_change.time = ticket.changetime + LIMIT 1 + ) AS modified_by + FROM ticket; + ''') cursor.execute(''' -CREATE OR REPLACE VIEW ticket_collab_count_view AS -SELECT -COALESCE (t1.author, t2.author) as author, -(COALESCE(t1.count, 0) + COALESCE(t2.count, 0)) as count -FROM -(SELECT author, count(*) as count -FROM ticket_change -GROUP BY author -ORDER BY author -) AS t1 -FULL OUTER JOIN -(SELECT reporter as author, count(*) as count -FROM ticket -GROUP BY reporter -ORDER BY reporter -) AS t2 -ON t1.author = t2.author; + CREATE OR REPLACE VIEW ticket_collab_count_view AS + SELECT + COALESCE (t1.author, t2.author) as author, + (COALESCE(t1.count, 0) + COALESCE(t2.count, 0)) as count + FROM + (SELECT author, count(*) as count + FROM ticket_change + GROUP BY author + ORDER BY author + ) AS t1 + FULL OUTER JOIN + (SELECT reporter as author, count(*) as count + FROM ticket + GROUP BY reporter + ORDER BY reporter + ) AS t2 + ON t1.author = t2.author; -CREATE OR REPLACE VIEW wiki_collab_count_view AS -SELECT author, count(*) from wiki GROUP BY author; -''') + CREATE OR REPLACE VIEW wiki_collab_count_view AS + SELECT author, count(*) from wiki GROUP BY author; + ''') pass @@ -173,13 +173,15 @@ SELECT author, count(*) from wiki GROUP BY author; cursor = connection.cursor() cursor.execute(''' -DROP VIEW IF EXISTS revision_view; -DROP VIEW IF EXISTS ticket_view; -DROP VIEW IF EXISTS wiki_view; -''') - cursor.execute('DROP VIEW IF EXISTS attachment_view;') + DROP VIEW IF EXISTS revision_view; + DROP VIEW IF EXISTS ticket_view; + DROP VIEW IF EXISTS wiki_view; + DROP VIEW IF EXISTS ticket_collab_count_view; + DROP VIEW IF EXISTS wiki_collab_count_view; + DROP VIEW IF EXISTS attachment_view; + ''') - pass + pass models = { u'proxy.attachment': { @@ -245,4 +247,4 @@ DROP VIEW IF EXISTS wiki_view; } complete_apps = ['proxy'] - symmetrical = True + symmetrical = True \ No newline at end of file diff --git a/src/proxy/trac/models.py b/src/proxy/trac/models.py index 360a90d..e69de29 100644 --- a/src/proxy/trac/models.py +++ b/src/proxy/trac/models.py @@ -1,178 +0,0 @@ -# -*- coding: utf-8 -*- - -import os -import urllib2 - -from django.conf import settings -from django.db import models, connections -from django.db.models.signals import post_save -from django.dispatch import receiver - -from accounts.models import User -from hitcounter.models import HitCounterModelMixin - - -class Attachment(models.Model, HitCounterModelMixin): - url = models.TextField(primary_key=True) - attach_id = models.TextField() - used_by = models.TextField() - filename = models.TextField() - author = models.TextField(blank=True) - description = models.TextField(blank=True) - created = models.DateTimeField(blank=True) - mimetype = models.TextField(blank=True) - size = models.IntegerField(blank=True) - - class Meta: - managed = False - db_table = 'attachment_view' - - @property - def filepath(self): - return os.path.join( - settings.ATTACHMENTS_FOLDER_PATH, - self.used_by, - self.attach_id, - urllib2.quote(self.filename.encode('utf8')) - ) - - def get_absolute_url(self): - return u'/raw-attachment/{}'.format(self.url) - - def get_author(self): - try: - return User.objects.get(username=self.author) - except User.DoesNotExist: - return None - - -class Revision(models.Model, HitCounterModelMixin): - key = models.TextField(blank=True, primary_key=True) - rev = models.TextField(blank=True) - author = models.TextField(blank=True) - message = models.TextField(blank=True) - repository_name = models.TextField(blank=True) - created = models.DateTimeField(blank=True, null=True) - - class Meta: - managed = False - db_table = 'revision_view' - - def get_absolute_url(self): - return u'/changeset/{}/{}'.format(self.rev, self.repository_name) - - def get_author(self): - try: - return User.objects.get(username=self.author) - except User.DoesNotExist: - return None - -class Ticket(models.Model, HitCounterModelMixin): - id = models.IntegerField(primary_key=True) - summary = models.TextField(blank=True) - description = models.TextField(blank=True) - milestone = models.TextField(blank=True) - priority = models.TextField(blank=True) - component = models.TextField(blank=True) - version = models.TextField(blank=True) - severity = models.TextField(blank=True) - reporter = models.TextField(blank=True) - author = models.TextField(blank=True) - status = models.TextField(blank=True) - keywords = models.TextField(blank=True) - collaborators = models.TextField(blank=True) - created = models.DateTimeField(blank=True, null=True) - modified = models.DateTimeField(blank=True, null=True) - modified_by = models.TextField(blank=True) - - class Meta: - managed = False - db_table = 'ticket_view' - - def get_absolute_url(self): - return u'/ticket/{}'.format(self.id) - - def get_author(self): - try: - return User.objects.get(username=self.author) - except User.DoesNotExist: - return None - - def get_modified_by(self): - try: - return User.objects.get(username=self.modified_by) - except User.DoesNotExist: - return None - -class Wiki(models.Model, HitCounterModelMixin): - name = models.TextField(primary_key=True) - wiki_text = models.TextField(blank=True) - author = models.TextField(blank=True) - collaborators = models.TextField(blank=True) - created = models.DateTimeField(blank=True, null=True) - modified = models.DateTimeField(blank=True, null=True) - modified_by = models.TextField(blank=True) - - class Meta: - managed = False - db_table = 'wiki_view' - - def get_absolute_url(self): - return u'/wiki/{}'.format(self.name) - - def get_author(self): - try: - return User.objects.get(username=self.author) - except User.DoesNotExist: - return None - - def get_modified_by(self): - try: - return User.objects.get(username=self.modified_by) - except User.DoesNotExist: - return None - - -class WikiCollabCount(models.Model): - author = models.TextField(primary_key=True) - count = models.IntegerField() - - class Meta: - managed = False - db_table = 'wiki_collab_count_view' - - -class TicketCollabCount(models.Model): - author = models.TextField(primary_key=True) - count = models.IntegerField() - - class Meta: - managed = False - db_table = 'ticket_collab_count_view' - - -@receiver(post_save, sender=User) -def change_session_attribute_email(sender, instance, **kwargs): - cursor = connections['trac'].cursor() - - cursor.execute(("UPDATE session_attribute SET value=%s " - "WHERE name='email' AND sid=%s"), - [instance.email, instance.username]) - cursor.execute(("UPDATE session_attribute SET value=%s " - "WHERE name='name' AND sid=%s"), - [instance.get_full_name(), instance.username]) - - cursor.execute(("INSERT INTO session_attribute " - "(sid, authenticated, name, value) " - "SELECT %s, '1', 'email', %s WHERE NOT EXISTS " - "(SELECT 1 FROM session_attribute WHERE sid=%s " - "AND name='email')"), - [instance.username, instance.email, instance.username]) - - cursor.execute(("INSERT INTO session_attribute " - "(sid, authenticated, name, value) " - "SELECT %s, '1', 'name', %s WHERE NOT EXISTS " - "(SELECT 1 FROM session_attribute WHERE sid=%s " - "AND name='name')"), - [instance.username, instance.get_full_name(), - instance.username]) diff --git a/src/proxy/views.py b/src/proxy/views.py index cdea939..56d864b 100644 --- a/src/proxy/views.py +++ b/src/proxy/views.py @@ -4,7 +4,7 @@ import os from django.conf import settings from revproxy.views import ProxyView -from trac.models import Wiki, Ticket, Revision +from .models import Wiki, Ticket, Revision from hitcounter.views import HitCounterViewMixin diff --git a/src/search/templates/search/includes/search_filters.html b/src/search/templates/search/includes/search_filters.html index d7e1c5b..8cdd437 100644 --- a/src/search/templates/search/includes/search_filters.html +++ b/src/search/templates/search/includes/search_filters.html @@ -111,30 +111,34 @@

{% trans "Types" %}

{% endif %}
diff --git a/src/search/views.py b/src/search/views.py index da3b84f..1633dfc 100644 --- a/src/search/views.py +++ b/src/search/views.py @@ -5,7 +5,7 @@ from django.utils.translation import ugettext as _ from haystack.views import SearchView -from proxy.trac.models import Attachment +from proxy.models import Attachment class ColabSearchView(SearchView): @@ -16,17 +16,6 @@ class ColabSearchView(SearchView): ) types = { - 'wiki': { - 'name': _(u'Wiki'), - 'fields': ( - ('author', _(u'Author'), self.request.GET.get('author')), - ( - 'collaborators', - _(u'Collaborators'), - self.request.GET.get('collaborators'), - ), - ), - }, 'thread': { 'name': _(u'Discussion'), 'fields': ( @@ -38,7 +27,22 @@ class ColabSearchView(SearchView): ), ), }, - 'ticket': { + } + + if settings.TRAC_ENABLED: + types['wiki'] = { + 'name': _(u'Wiki'), + 'fields': ( + ('author', _(u'Author'), self.request.GET.get('author')), + ( + 'collaborators', + _(u'Collaborators'), + self.request.GET.get('collaborators'), + ), + ), + } + + types['ticket'] = { 'name': _(u'Ticket'), 'fields': ( ( @@ -79,8 +83,9 @@ class ColabSearchView(SearchView): self.request.GET.get('collaborators') ), ), - }, - 'changeset': { + } + + types['changeset'] = { 'name': _(u'Changeset'), 'fields': ( ('author', _(u'Author'), self.request.GET.get('author')), @@ -90,8 +95,9 @@ class ColabSearchView(SearchView): self.request.GET.get('repository_name'), ), ) - }, - 'user': { + } + + types['user'] = { 'name': _(u'User'), 'fields': ( ( @@ -107,8 +113,9 @@ class ColabSearchView(SearchView): ), ('role', _(u'Role'), self.request.GET.get('role')) ), - }, - 'attachment': { + } + + types['attachment'] = { 'name': _(u'Attachment'), 'fields': ( ( @@ -128,7 +135,6 @@ class ColabSearchView(SearchView): ('size', _(u'Size'), self.request.GET.get('size')), ) } - } try: type_chosen = self.form.cleaned_data.get('type') diff --git a/src/super_archives/templatetags/superarchives.py b/src/super_archives/templatetags/superarchives.py index 0434633..62a4f2d 100644 --- a/src/super_archives/templatetags/superarchives.py +++ b/src/super_archives/templatetags/superarchives.py @@ -2,6 +2,7 @@ from django import template from super_archives.utils import url +from django.conf import settings register = template.Library() @@ -32,3 +33,7 @@ def pop_from_get(context, **kwargs): context['request'].META['QUERY_STRING'], **kwargs ) + +@register.assignment_tag +def is_trac_enable(): + return settings.TRAC_ENABLED \ No newline at end of file -- libgit2 0.21.2