Commit 3d927a4a94523cbcd874dc3b452060f1133528c4
1 parent
2a7901fe
Exists in
master
and in
39 other branches
Mass rename and namespace chance
Showing
52 changed files
with
576 additions
and
564 deletions
Show diff stats
colab/accounts/__init__.py
colab/accounts/forms.py
| ... | ... | @@ -6,9 +6,9 @@ from django.utils.translation import ugettext_lazy as _ |
| 6 | 6 | |
| 7 | 7 | from conversejs.models import XMPPAccount |
| 8 | 8 | |
| 9 | -from accounts.utils import mailman | |
| 10 | -from super_archives.models import MailingList | |
| 9 | +from ..super_archives.models import MailingList | |
| 11 | 10 | from .utils.validators import validate_social_account |
| 11 | +from .utils import mailman | |
| 12 | 12 | |
| 13 | 13 | User = get_user_model() |
| 14 | 14 | ... | ... |
colab/accounts/search_indexes.py
colab/accounts/templatetags/gravatar.py
colab/accounts/urls.py
| ... | ... | @@ -4,15 +4,15 @@ from django.conf.urls import patterns, include, url |
| 4 | 4 | from .views import (UserProfileDetailView, UserProfileUpdateView, |
| 5 | 5 | ManageUserSubscriptionsView, ChangeXMPPPasswordView) |
| 6 | 6 | |
| 7 | -from accounts import views | |
| 7 | +from . import views | |
| 8 | 8 | |
| 9 | 9 | urlpatterns = patterns('', |
| 10 | - url(r'^register/$', 'accounts.views.signup', name='signup'), | |
| 10 | + url(r'^register/$', 'colab.accounts.views.signup', name='signup'), | |
| 11 | 11 | |
| 12 | 12 | url(r'^change-password/$', |
| 13 | 13 | ChangeXMPPPasswordView.as_view(), name='change_password'), |
| 14 | 14 | |
| 15 | - url(r'^logout/?$', 'accounts.views.logoutColab', name='logout'), | |
| 15 | + url(r'^logout/?$', 'colab.accounts.views.logoutColab', name='logout'), | |
| 16 | 16 | |
| 17 | 17 | url(r'^(?P<username>[\w@+.-]+)/?$', |
| 18 | 18 | UserProfileDetailView.as_view(), name='user_profile'), | ... | ... |
colab/accounts/views.py
| ... | ... | @@ -22,8 +22,8 @@ from conversejs import xmpp |
| 22 | 22 | from conversejs.models import XMPPAccount |
| 23 | 23 | from haystack.query import SearchQuerySet |
| 24 | 24 | |
| 25 | -from super_archives.models import EmailAddress, Message | |
| 26 | -from search.utils import trans | |
| 25 | +from colab.super_archives.models import EmailAddress, Message | |
| 26 | +from colab.search.utils import trans | |
| 27 | 27 | #from proxy.trac.models import WikiCollabCount, TicketCollabCount |
| 28 | 28 | from .forms import (UserCreationForm, ListsForm, UserUpdateForm, |
| 29 | 29 | ChangeXMPPPasswordForm) | ... | ... |
colab/api/resources.py
| ... | ... | @@ -6,7 +6,7 @@ from tastypie import fields |
| 6 | 6 | from tastypie.constants import ALL_WITH_RELATIONS, ALL |
| 7 | 7 | from tastypie.resources import ModelResource |
| 8 | 8 | |
| 9 | -from super_archives.models import Message, EmailAddress | |
| 9 | +from colab.super_archives.models import Message, EmailAddress | |
| 10 | 10 | #from proxy.trac.models import Revision, Ticket, Wiki |
| 11 | 11 | |
| 12 | 12 | User = get_user_model() | ... | ... |
colab/api/views.py
colab/badger/management/commands/rebuild_badges.py
| ... | ... | @@ -3,8 +3,8 @@ |
| 3 | 3 | from django.core.management.base import BaseCommand, CommandError |
| 4 | 4 | from haystack.query import SearchQuerySet |
| 5 | 5 | |
| 6 | -from accounts.models import User | |
| 7 | -from badger.models import Badge | |
| 6 | +from colab.accounts.models import User | |
| 7 | +from colab.badger.models import Badge | |
| 8 | 8 | |
| 9 | 9 | |
| 10 | 10 | class Command(BaseCommand): | ... | ... |
colab/badger/management/commands/update_badges.py
| ... | ... | @@ -3,8 +3,8 @@ |
| 3 | 3 | from django.core.management.base import BaseCommand, CommandError |
| 4 | 4 | from haystack.query import SearchQuerySet |
| 5 | 5 | |
| 6 | -from accounts.models import User | |
| 7 | -from badger.models import Badge | |
| 6 | +from colab.accounts.models import User | |
| 7 | +from colab.badger.models import Badge | |
| 8 | 8 | |
| 9 | 9 | import logging |
| 10 | 10 | ... | ... |
colab/badger/utils.py
| ... | ... | @@ -0,0 +1,53 @@ |
| 1 | + | |
| 2 | +DEBUG: false | |
| 3 | +TEMPLATE_DEBUG: false | |
| 4 | + | |
| 5 | +ADMINS: &admin | |
| 6 | + - | |
| 7 | + - John Foo | |
| 8 | + - john@example.com | |
| 9 | + - | |
| 10 | + - Mary Bar | |
| 11 | + - mary@example.com | |
| 12 | + | |
| 13 | +MANAGERS: *admin | |
| 14 | + | |
| 15 | +COLAB_FROM_ADDRESS: '"Colab" <noreply@example.com>' | |
| 16 | +SERVER_EMAIL: '"Colab" <noreply@example.com>' | |
| 17 | + | |
| 18 | +EMAIL_HOST: localhost | |
| 19 | +EMAIL_PORT: 25 | |
| 20 | +EMAIL_SUBJECT_PREFIX: '[colab]' | |
| 21 | + | |
| 22 | +SECRET_KEY: '{{ secret_key }}' | |
| 23 | + | |
| 24 | +SITE_URL: 'http://www.example.com/' | |
| 25 | + | |
| 26 | +ALLOWED_HOSTS: | |
| 27 | + - example.com | |
| 28 | + - example.org | |
| 29 | + - example.net | |
| 30 | + | |
| 31 | +CONVERSEJS_ENABLED: false | |
| 32 | + | |
| 33 | +CONVERSEJS_AUTO_REGISTER: 'xmpp.example.com' | |
| 34 | + | |
| 35 | +DATABASES: | |
| 36 | + default: | |
| 37 | + ENGINE: django.db.backends.postgresql_psycopg2 | |
| 38 | + HOST: localhost | |
| 39 | + NAME: colab | |
| 40 | + USER: colab | |
| 41 | + PASSWORD: colab | |
| 42 | + | |
| 43 | +ROBOTS_NOINDEX: false | |
| 44 | + | |
| 45 | +# Set to false to disable | |
| 46 | +RAVEN_DSN: 'http://public:secret@example.com/1' | |
| 47 | + | |
| 48 | +PROXIED_APPS: | |
| 49 | + gitlab: | |
| 50 | + upstream: 'http://localhost:8090/gitlab/' | |
| 51 | + trac: | |
| 52 | + upstream: 'http://localhost:5000/trac/' | |
| 53 | + | ... | ... |
colab/colab/__init__.py
colab/colab/colab.template.yaml
| ... | ... | @@ -1,53 +0,0 @@ |
| 1 | - | |
| 2 | -DEBUG: false | |
| 3 | -TEMPLATE_DEBUG: false | |
| 4 | - | |
| 5 | -ADMINS: &admin | |
| 6 | - - | |
| 7 | - - John Foo | |
| 8 | - - john@example.com | |
| 9 | - - | |
| 10 | - - Mary Bar | |
| 11 | - - mary@example.com | |
| 12 | - | |
| 13 | -MANAGERS: *admin | |
| 14 | - | |
| 15 | -COLAB_FROM_ADDRESS: '"Colab" <noreply@example.com>' | |
| 16 | -SERVER_EMAIL: '"Colab" <noreply@example.com>' | |
| 17 | - | |
| 18 | -EMAIL_HOST: localhost | |
| 19 | -EMAIL_PORT: 25 | |
| 20 | -EMAIL_SUBJECT_PREFIX: '[colab]' | |
| 21 | - | |
| 22 | -SECRET_KEY: '{{ secret_key }}' | |
| 23 | - | |
| 24 | -SITE_URL: 'http://www.example.com/' | |
| 25 | - | |
| 26 | -ALLOWED_HOSTS: | |
| 27 | - - example.com | |
| 28 | - - example.org | |
| 29 | - - example.net | |
| 30 | - | |
| 31 | -CONVERSEJS_ENABLED: false | |
| 32 | - | |
| 33 | -CONVERSEJS_AUTO_REGISTER: 'xmpp.example.com' | |
| 34 | - | |
| 35 | -DATABASES: | |
| 36 | - default: | |
| 37 | - ENGINE: django.db.backends.postgresql_psycopg2 | |
| 38 | - HOST: localhost | |
| 39 | - NAME: colab | |
| 40 | - USER: colab | |
| 41 | - PASSWORD: colab | |
| 42 | - | |
| 43 | -ROBOTS_NOINDEX: false | |
| 44 | - | |
| 45 | -# Set to false to disable | |
| 46 | -RAVEN_DSN: 'http://public:secret@example.com/1' | |
| 47 | - | |
| 48 | -PROXIED_APPS: | |
| 49 | - gitlab: | |
| 50 | - upstream: 'http://localhost:8090/gitlab/' | |
| 51 | - trac: | |
| 52 | - upstream: 'http://localhost:5000/trac/' | |
| 53 | - |
colab/colab/settings.py
| ... | ... | @@ -1,315 +0,0 @@ |
| 1 | -""" | |
| 2 | -Django settings for colab project. | |
| 3 | - | |
| 4 | -For more information on this file, see | |
| 5 | -https://docs.djangoproject.com/en/1.7/topics/settings/ | |
| 6 | - | |
| 7 | -For the full list of settings and their values, see | |
| 8 | -https://docs.djangoproject.com/en/1.7/ref/settings/ | |
| 9 | -""" | |
| 10 | - | |
| 11 | -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) | |
| 12 | -import os | |
| 13 | -BASE_DIR = os.path.dirname(os.path.dirname(__file__)) | |
| 14 | - | |
| 15 | -# Used for settings translation | |
| 16 | -from django.utils.translation import ugettext_lazy as _ | |
| 17 | - | |
| 18 | -# Quick-start development settings - unsuitable for production | |
| 19 | -# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ | |
| 20 | - | |
| 21 | -# SECURITY WARNING: keep the secret key used in production secret! | |
| 22 | -SECRET_KEY = "{{ secret_key }}" | |
| 23 | - | |
| 24 | -# SECURITY WARNING: don't run with debug turned on in production! | |
| 25 | -DEBUG = True | |
| 26 | - | |
| 27 | -TEMPLATE_DEBUG = True | |
| 28 | - | |
| 29 | -ALLOWED_HOSTS = [] | |
| 30 | - | |
| 31 | -DATABASE_ROUTERS = [] | |
| 32 | - | |
| 33 | -# Application definition | |
| 34 | - | |
| 35 | -INSTALLED_APPS = ( | |
| 36 | - 'django.contrib.admin', | |
| 37 | - 'django.contrib.auth', | |
| 38 | - 'django.contrib.contenttypes', | |
| 39 | - 'django.contrib.sessions', | |
| 40 | - 'django.contrib.messages', | |
| 41 | - 'django.contrib.staticfiles', | |
| 42 | - | |
| 43 | - # First app to provide AUTH_USER_MODEL to others | |
| 44 | - 'accounts', | |
| 45 | - | |
| 46 | - # Not standard apps | |
| 47 | - 'raven.contrib.django.raven_compat', | |
| 48 | - 'cliauth', | |
| 49 | - 'django_mobile', | |
| 50 | - 'django_browserid', | |
| 51 | - 'conversejs', | |
| 52 | - 'haystack', | |
| 53 | - 'hitcounter', | |
| 54 | - 'i18n_model', | |
| 55 | - 'mptt', | |
| 56 | - 'dpaste', | |
| 57 | - | |
| 58 | - # Own apps | |
| 59 | - 'super_archives', | |
| 60 | - 'api', | |
| 61 | - 'rss', | |
| 62 | - 'planet', | |
| 63 | - 'search', | |
| 64 | - 'badger', | |
| 65 | - 'tz', | |
| 66 | - | |
| 67 | - # Feedzilla and deps | |
| 68 | - 'feedzilla', | |
| 69 | - 'taggit', | |
| 70 | - 'common', | |
| 71 | -) | |
| 72 | - | |
| 73 | -MIDDLEWARE_CLASSES = ( | |
| 74 | - 'django.contrib.sessions.middleware.SessionMiddleware', | |
| 75 | - 'django.middleware.common.CommonMiddleware', | |
| 76 | - 'django.middleware.csrf.CsrfViewMiddleware', | |
| 77 | - 'django.contrib.auth.middleware.AuthenticationMiddleware', | |
| 78 | - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', | |
| 79 | - 'django.contrib.messages.middleware.MessageMiddleware', | |
| 80 | - 'django.middleware.clickjacking.XFrameOptionsMiddleware', | |
| 81 | -) | |
| 82 | - | |
| 83 | -ROOT_URLCONF = 'colab.urls' | |
| 84 | - | |
| 85 | -WSGI_APPLICATION = 'colab.wsgi.application' | |
| 86 | - | |
| 87 | -# Internationalization | |
| 88 | -# https://docs.djangoproject.com/en/1.7/topics/i18n/ | |
| 89 | - | |
| 90 | -LANGUAGE_CODE = 'en-us' | |
| 91 | - | |
| 92 | -TIME_ZONE = 'UTC' | |
| 93 | - | |
| 94 | -USE_I18N = True | |
| 95 | - | |
| 96 | -USE_L10N = True | |
| 97 | - | |
| 98 | -USE_TZ = True | |
| 99 | - | |
| 100 | - | |
| 101 | -# Static files (CSS, JavaScript, Images) | |
| 102 | -# https://docs.djangoproject.com/en/1.7/howto/static-files/ | |
| 103 | - | |
| 104 | -STATIC_ROOT = '/usr/share/nginx/colab/static/' | |
| 105 | -MEDIA_ROOT = '/usr/share/nginx/colab/media/' | |
| 106 | - | |
| 107 | -STATIC_URL = '/static/' | |
| 108 | -MEDIA_URL = '/media/' | |
| 109 | - | |
| 110 | - | |
| 111 | -# Normally you should not import ANYTHING from Django directly | |
| 112 | -# into your settings, but ImproperlyConfigured is an exception. | |
| 113 | -from django.core.exceptions import ImproperlyConfigured | |
| 114 | - | |
| 115 | - | |
| 116 | -def get_env_setting(setting): | |
| 117 | - """ Get the environment setting or return exception """ | |
| 118 | - try: | |
| 119 | - return os.environ[setting] | |
| 120 | - except KeyError: | |
| 121 | - error_msg = "Set the %s env variable" % setting | |
| 122 | - raise ImproperlyConfigured(error_msg) | |
| 123 | - | |
| 124 | - | |
| 125 | -# Allow Django runserver to serve SVG files | |
| 126 | -# https://code.djangoproject.com/ticket/20162 | |
| 127 | -import mimetypes | |
| 128 | -mimetypes.add_type('image/svg+xml', '.svg') | |
| 129 | - | |
| 130 | -LANGUAGES = ( | |
| 131 | - ('en', _('English')), | |
| 132 | - ('pt-br', _('Portuguese')), | |
| 133 | - ('es', _('Spanish')), | |
| 134 | -) | |
| 135 | - | |
| 136 | -DJANGO_DATE_FORMAT_TO_JS = { | |
| 137 | - 'pt-br': ('pt-BR', 'dd/MM/yyyy'), | |
| 138 | - 'es': ('es', 'dd/MM/yyyy'), | |
| 139 | -} | |
| 140 | - | |
| 141 | -LANGUAGE_CODE = 'en' | |
| 142 | - | |
| 143 | -# The absolute path to the folder containing the attachments | |
| 144 | -ATTACHMENTS_FOLDER_PATH = '/mnt/trac/attachments/' | |
| 145 | - | |
| 146 | -# ORDERING_DATA receives the options to order for as it's keys and a dict as | |
| 147 | -# value, if you want to order for the last name, you can use something like: | |
| 148 | -# 'last_name': {'name': 'Last Name', 'fields': 'last_name'} inside the dict, | |
| 149 | -# you pass two major keys (name, fields) | |
| 150 | -# The major key name is the name to appear on the template | |
| 151 | -# the major key fields it show receive the name of the fields to order for in | |
| 152 | -# the indexes | |
| 153 | - | |
| 154 | -ORDERING_DATA = { | |
| 155 | - 'latest': { | |
| 156 | - 'name': _(u'Recent activity'), | |
| 157 | - 'fields': ('-modified', '-created'), | |
| 158 | - }, | |
| 159 | - 'hottest': { | |
| 160 | - 'name': _(u'Relevance'), | |
| 161 | - 'fields': None, | |
| 162 | - }, | |
| 163 | -} | |
| 164 | - | |
| 165 | - | |
| 166 | -# File type groupings is a tuple of tuples containg what it should filter, | |
| 167 | -# how it should be displayed, and a tuple of which mimetypes it includes | |
| 168 | -FILE_TYPE_GROUPINGS = ( | |
| 169 | - ('document', _(u'Document'), | |
| 170 | - ('doc', 'docx', 'odt', 'otx', 'dotx', 'pdf', 'ott')), | |
| 171 | - ('presentation', _(u'Presentation'), ('ppt', 'pptx', 'odp')), | |
| 172 | - ('text', _(u'Text'), ('txt', 'po', 'conf', 'log')), | |
| 173 | - ('code', _(u'Code'), | |
| 174 | - ('py', 'php', 'js', 'sql', 'sh', 'patch', 'diff', 'html', '')), | |
| 175 | - ('compressed', _(u'Compressed'), ('rar', 'zip', 'gz', 'tgz', 'bz2')), | |
| 176 | - ('image', _(u'Image'), | |
| 177 | - ('jpg', 'jpeg', 'png', 'tiff', 'gif', 'svg', 'psd', 'planner', 'cdr')), | |
| 178 | - ('spreadsheet', _(u'Spreadsheet'), | |
| 179 | - ('ods', 'xls', 'xlsx', 'xslt', 'csv')), | |
| 180 | -) | |
| 181 | - | |
| 182 | -# the following variable define how many characters should be shown before | |
| 183 | -# a highlighted word, to make sure that the highlighted word will appear | |
| 184 | -HIGHLIGHT_NUM_CHARS_BEFORE_MATCH = 30 | |
| 185 | -HAYSTACK_CUSTOM_HIGHLIGHTER = 'colab.utils.highlighting.ColabHighlighter' | |
| 186 | - | |
| 187 | -HAYSTACK_CONNECTIONS = { | |
| 188 | - 'default': { | |
| 189 | - 'ENGINE': 'haystack.backends.solr_backend.SolrEngine', | |
| 190 | - 'URL': 'http://localhost:8983/solr/', | |
| 191 | - } | |
| 192 | -} | |
| 193 | - | |
| 194 | -CACHES = { | |
| 195 | - 'default': { | |
| 196 | - 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', | |
| 197 | - 'LOCATION': '127.0.0.1:11211', | |
| 198 | - } | |
| 199 | -} | |
| 200 | - | |
| 201 | -DATABASE_ROUTERS = [] | |
| 202 | - | |
| 203 | - | |
| 204 | -TEMPLATE_CONTEXT_PROCESSORS = ( | |
| 205 | - 'django.contrib.auth.context_processors.auth', | |
| 206 | - 'django.core.context_processors.debug', | |
| 207 | - 'django.core.context_processors.i18n', | |
| 208 | - 'django.core.context_processors.media', | |
| 209 | - 'django.core.context_processors.static', | |
| 210 | - 'django.core.context_processors.tz', | |
| 211 | - 'django.contrib.messages.context_processors.messages', | |
| 212 | - 'django.core.context_processors.request', | |
| 213 | - 'django_mobile.context_processors.is_mobile', | |
| 214 | - 'super_archives.context_processors.mailarchive', | |
| 215 | - 'proxy.context_processors.proxied_apps', | |
| 216 | - 'home.context_processors.robots', | |
| 217 | -) | |
| 218 | - | |
| 219 | -MIDDLEWARE_CLASSES = ( | |
| 220 | - 'django.contrib.sessions.middleware.SessionMiddleware', | |
| 221 | - 'django.middleware.locale.LocaleMiddleware', | |
| 222 | - 'django.middleware.common.CommonMiddleware', | |
| 223 | - 'django.middleware.csrf.CsrfViewMiddleware', | |
| 224 | - 'django.contrib.auth.middleware.AuthenticationMiddleware', | |
| 225 | - 'django.contrib.messages.middleware.MessageMiddleware', | |
| 226 | - 'django.middleware.clickjacking.XFrameOptionsMiddleware', | |
| 227 | - 'django_mobile.middleware.MobileDetectionMiddleware', | |
| 228 | - 'django_mobile.middleware.SetFlavourMiddleware', | |
| 229 | - 'tz.middleware.TimezoneMiddleware', | |
| 230 | -) | |
| 231 | - | |
| 232 | -# Add the django_browserid authentication backend. | |
| 233 | -AUTHENTICATION_BACKENDS = ( | |
| 234 | - 'django.contrib.auth.backends.ModelBackend', | |
| 235 | - 'accounts.auth.ColabBrowserIDBackend', | |
| 236 | -) | |
| 237 | - | |
| 238 | -STATICFILES_DIRS = ( | |
| 239 | - os.path.join(BASE_DIR, 'static'), | |
| 240 | -) | |
| 241 | - | |
| 242 | -TEMPLATE_DIRS = ( | |
| 243 | - os.path.join(BASE_DIR, 'templates'), | |
| 244 | -) | |
| 245 | - | |
| 246 | -LOCALE_PATHS = ( | |
| 247 | - os.path.join(BASE_DIR, 'locale'), | |
| 248 | -) | |
| 249 | - | |
| 250 | -AUTH_USER_MODEL = 'accounts.User' | |
| 251 | - | |
| 252 | -from django.contrib.messages import constants as messages | |
| 253 | -MESSAGE_TAGS = { | |
| 254 | - messages.INFO: 'alert-info', | |
| 255 | - messages.SUCCESS: 'alert-success', | |
| 256 | - messages.WARNING: 'alert-warning', | |
| 257 | - messages.ERROR: 'alert-danger', | |
| 258 | -} | |
| 259 | - | |
| 260 | -### Feedzilla (planet) | |
| 261 | -from feedzilla.settings import * | |
| 262 | -FEEDZILLA_PAGE_SIZE = 5 | |
| 263 | -FEEDZILLA_SITE_TITLE = _(u'Planet Colab') | |
| 264 | -FEEDZILLA_SITE_DESCRIPTION = _(u'Colab blog aggregator') | |
| 265 | - | |
| 266 | -### Mailman API settings | |
| 267 | -MAILMAN_API_URL = 'http://localhost:9000' | |
| 268 | - | |
| 269 | -### BrowserID / Persona | |
| 270 | -SITE_URL = 'localhost:8000' | |
| 271 | -BROWSERID_AUDIENCES = [SITE_URL, SITE_URL.replace('https', 'http')] | |
| 272 | - | |
| 273 | - | |
| 274 | -LOGIN_URL = '/' | |
| 275 | -LOGIN_REDIRECT_URL = '/' | |
| 276 | -LOGIN_REDIRECT_URL_FAILURE = '/' | |
| 277 | -LOGOUT_REDIRECT_URL = '/user/logout' | |
| 278 | -BROWSERID_CREATE_USER = False | |
| 279 | - | |
| 280 | -REVPROXY_ADD_REMOTE_USER = True | |
| 281 | - | |
| 282 | -## Converse.js settings | |
| 283 | -# This URL must use SSL in order to keep chat sessions secure | |
| 284 | -CONVERSEJS_BOSH_SERVICE_URL = SITE_URL + '/http-bind' | |
| 285 | - | |
| 286 | -CONVERSEJS_ALLOW_CONTACT_REQUESTS = False | |
| 287 | -CONVERSEJS_SHOW_ONLY_ONLINE_USERS = True | |
| 288 | - | |
| 289 | - | |
| 290 | -# Tastypie settings | |
| 291 | -TASTYPIE_DEFAULT_FORMATS = ['json', ] | |
| 292 | - | |
| 293 | -# Dpaste settings | |
| 294 | -DPASTE_EXPIRE_CHOICES = ( | |
| 295 | - ('onetime', _(u'One Time Snippet')), | |
| 296 | - (3600, _(u'In one hour')), | |
| 297 | - (3600 * 24 * 7, _(u'In one week')), | |
| 298 | - (3600 * 24 * 30, _(u'In one month')), | |
| 299 | - ('never', _(u'Never')), | |
| 300 | -) | |
| 301 | -DPASTE_EXPIRE_DEFAULT = DPASTE_EXPIRE_CHOICES[4][0] | |
| 302 | -DPASTE_DEFAULT_GIST_DESCRIPTION = 'Gist created from Colab DPaste' | |
| 303 | -DPASTE_DEFAULT_GIST_NAME = 'colab_paste' | |
| 304 | -DPASTE_LEXER_DEFAULT = 'text' | |
| 305 | - | |
| 306 | -from .utils.conf import load_yaml_settings | |
| 307 | -locals().update(load_yaml_settings()) | |
| 308 | - | |
| 309 | -if locals().get('RAVEN_DSN', False): | |
| 310 | - RAVEN_CONFIG = { | |
| 311 | - 'dsn': RAVEN_DSN + '?timeout=30', | |
| 312 | - } | |
| 313 | - | |
| 314 | -for app_label in locals().get('PROXIED_APPS', {}).keys(): | |
| 315 | - INSTALLED_APPS += ('proxy.{}'.format(app_label),) |
colab/colab/urls.py
| ... | ... | @@ -1,45 +0,0 @@ |
| 1 | -from django.conf.urls import patterns, include, url, static | |
| 2 | -from django.conf import settings | |
| 3 | -from django.views.generic import TemplateView | |
| 4 | -from django.contrib import admin | |
| 5 | - | |
| 6 | -from accounts.models import User | |
| 7 | -from search.forms import ColabSearchForm | |
| 8 | -from super_archives.models import Message | |
| 9 | - | |
| 10 | - | |
| 11 | -admin.autodiscover() | |
| 12 | - | |
| 13 | -urlpatterns = patterns('', | |
| 14 | - url(r'^$', 'home.views.index', name='home'), | |
| 15 | - url(r'^robots.txt$', 'home.views.robots', name='robots'), | |
| 16 | - | |
| 17 | - url(r'^open-data/$', TemplateView.as_view(template_name='open-data.html'), | |
| 18 | - name='opendata'), | |
| 19 | - | |
| 20 | - url(r'^search/', include('search.urls')), | |
| 21 | - url(r'^archives/', include('super_archives.urls')), | |
| 22 | - url(r'^api/', include('api.urls')), | |
| 23 | - url(r'^rss/', include('rss.urls')), | |
| 24 | - | |
| 25 | - url(r'^user/', include('accounts.urls')), # Kept for backwards compatibility | |
| 26 | - url(r'^signup/', include('accounts.urls')), # (same here) TODO: move to nginx | |
| 27 | - url(r'^account/', include('accounts.urls')), | |
| 28 | - | |
| 29 | - url(r'', include('django_browserid.urls')), | |
| 30 | - | |
| 31 | - url(r'^planet/', include('feedzilla.urls')), | |
| 32 | - | |
| 33 | - url(r'paste/', include('dpaste.urls.dpaste')), | |
| 34 | - | |
| 35 | - # Uncomment the next line to enable the admin: | |
| 36 | - url(r'^colab/admin/', include(admin.site.urls)), | |
| 37 | - | |
| 38 | - url(r'^trac/', include('proxy.trac.urls')), | |
| 39 | -) | |
| 40 | - | |
| 41 | -if settings.DEBUG: | |
| 42 | - urlpatterns += static.static( | |
| 43 | - settings.MEDIA_URL, | |
| 44 | - document_root=settings.MEDIA_ROOT | |
| 45 | - ) |
colab/colab/utils/__init__.py
colab/colab/utils/conf.py
| ... | ... | @@ -1,32 +0,0 @@ |
| 1 | - | |
| 2 | -import os | |
| 3 | -import yaml | |
| 4 | - | |
| 5 | -from django.core.exceptions import ImproperlyConfigured | |
| 6 | - | |
| 7 | - | |
| 8 | -class InaccessibleYAMLSettings(ImproperlyConfigured): | |
| 9 | - """Settings YAML is Inaccessible. | |
| 10 | - | |
| 11 | - Check if the file exists and if you have read permissions.""" | |
| 12 | - | |
| 13 | - | |
| 14 | -def load_yaml_settings(): | |
| 15 | - yaml_path = os.getenv('COLAB_SETTINGS', '/etc/colab.yaml') | |
| 16 | - | |
| 17 | - if not os.path.exists(yaml_path): | |
| 18 | - msg = "The yaml file {} does not exist".format(yaml_path) | |
| 19 | - raise InaccessibleYAMLSettings(msg) | |
| 20 | - | |
| 21 | - try: | |
| 22 | - with open(yaml_path) as yaml_file: | |
| 23 | - yaml_settings = yaml.load(yaml_file.read()) | |
| 24 | - except IOError: | |
| 25 | - msg = ('Could not open settings file {}. Please ' | |
| 26 | - 'check if the file exists and if user ' | |
| 27 | - 'has read rights.').format(yaml_path) | |
| 28 | - raise InaccessibleYAMLSettings(msg) | |
| 29 | - | |
| 30 | - return yaml_settings | |
| 31 | - | |
| 32 | -yaml_settings = load_yaml_settings() |
colab/colab/utils/highlighting.py
| ... | ... | @@ -1,38 +0,0 @@ |
| 1 | -from haystack.utils import Highlighter | |
| 2 | -from django.conf import settings | |
| 3 | -from django.utils.html import escape, strip_tags | |
| 4 | - | |
| 5 | - | |
| 6 | -class ColabHighlighter(Highlighter): | |
| 7 | - def highlight(self, text_block): | |
| 8 | - self.text_block = escape(strip_tags(text_block)) | |
| 9 | - highlight_locations = self.find_highlightable_words() | |
| 10 | - start_offset, end_offset = self.find_window(highlight_locations) | |
| 11 | - return self.render_html(highlight_locations, start_offset, end_offset) | |
| 12 | - | |
| 13 | - def find_window(self, highlight_locations): | |
| 14 | - """Getting the HIGHLIGHT_NUM_CHARS_BEFORE_MATCH setting | |
| 15 | - to find how many characters before the first word found should | |
| 16 | - be removed from the window | |
| 17 | - """ | |
| 18 | - | |
| 19 | - if len(self.text_block) <= self.max_length: | |
| 20 | - return (0, self.max_length) | |
| 21 | - | |
| 22 | - num_chars_before = getattr( | |
| 23 | - settings, | |
| 24 | - 'HIGHLIGHT_NUM_CHARS_BEFORE_MATCH', | |
| 25 | - 0 | |
| 26 | - ) | |
| 27 | - | |
| 28 | - best_start, best_end = super(ColabHighlighter, self).find_window( | |
| 29 | - highlight_locations | |
| 30 | - ) | |
| 31 | - if best_start <= num_chars_before: | |
| 32 | - best_end -= best_start | |
| 33 | - best_start = 0 | |
| 34 | - else: | |
| 35 | - best_start -= num_chars_before | |
| 36 | - best_end -= num_chars_before | |
| 37 | - | |
| 38 | - return (best_start, best_end) |
colab/colab/wsgi.py
| ... | ... | @@ -1,14 +0,0 @@ |
| 1 | -""" | |
| 2 | -WSGI config for colab project. | |
| 3 | - | |
| 4 | -It exposes the WSGI callable as a module-level variable named ``application``. | |
| 5 | - | |
| 6 | -For more information on this file, see | |
| 7 | -https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/ | |
| 8 | -""" | |
| 9 | - | |
| 10 | -import os | |
| 11 | -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "colab.settings") | |
| 12 | - | |
| 13 | -from django.core.wsgi import get_wsgi_application | |
| 14 | -application = get_wsgi_application() |
colab/home/views.py
| ... | ... | @@ -6,11 +6,11 @@ from django.core.cache import cache |
| 6 | 6 | from django.shortcuts import render |
| 7 | 7 | from django.http import HttpResponse, Http404 |
| 8 | 8 | |
| 9 | -from search.utils import trans | |
| 10 | 9 | from haystack.query import SearchQuerySet |
| 11 | 10 | |
| 12 | 11 | #from proxy.trac.models import WikiCollabCount, TicketCollabCount |
| 13 | -from super_archives.models import Thread | |
| 12 | +from colab.search.utils import trans | |
| 13 | +from colab.super_archives.models import Thread | |
| 14 | 14 | |
| 15 | 15 | |
| 16 | 16 | def index(request): | ... | ... |
colab/manage.py
colab/proxy/gitlab/__init__.py
colab/proxy/gitlab/apps.py
colab/proxy/jenkins/__init__.py
colab/proxy/jenkins/apps.py
colab/proxy/redmine/__init__.py
colab/proxy/redmine/apps.py
colab/proxy/trac/__init__.py
colab/proxy/trac/apps.py
colab/proxy/trac/models.py
| 1 | 1 | # -*- coding: utf-8 -*- |
| 2 | -from django.db import models | |
| 3 | -from django.conf import settings | |
| 4 | 2 | import os |
| 5 | 3 | import urllib2 |
| 6 | 4 | |
| 7 | -from accounts.models import User | |
| 5 | +from django.db import models | |
| 6 | +from django.conf import settings | |
| 7 | + | |
| 8 | 8 | from hitcounter.models import HitCounterModelMixin |
| 9 | 9 | |
| 10 | +from colab.accounts.models import User | |
| 11 | + | |
| 10 | 12 | |
| 11 | 13 | class Attachment(models.Model, HitCounterModelMixin): |
| 12 | 14 | url = models.TextField(primary_key=True) | ... | ... |
colab/proxy/trac/search_indexes.py
| ... | ... | @@ -8,7 +8,7 @@ from django.utils.text import slugify |
| 8 | 8 | from haystack import indexes |
| 9 | 9 | from haystack.utils import log as logging |
| 10 | 10 | |
| 11 | -from search.base_indexes import BaseIndex | |
| 11 | +from colab.search.base_indexes import BaseIndex | |
| 12 | 12 | from .models import Attachment, Ticket, Wiki, Revision |
| 13 | 13 | |
| 14 | 14 | ... | ... |
colab/proxy/trac/signals.py
colab/rss/feeds.py
colab/search/forms.py
| ... | ... | @@ -8,8 +8,8 @@ from django.utils.translation import ugettext_lazy as _ |
| 8 | 8 | from haystack.forms import SearchForm |
| 9 | 9 | from haystack.inputs import AltParser |
| 10 | 10 | |
| 11 | -from accounts.models import User | |
| 12 | -from super_archives.models import Message, MailingList | |
| 11 | +from colab.accounts.models import User | |
| 12 | +from colab.super_archives.models import Message, MailingList | |
| 13 | 13 | |
| 14 | 14 | |
| 15 | 15 | class ColabSearchForm(SearchForm): | ... | ... |
| ... | ... | @@ -0,0 +1,316 @@ |
| 1 | +""" | |
| 2 | +Django settings for colab project. | |
| 3 | + | |
| 4 | +For more information on this file, see | |
| 5 | +https://docs.djangoproject.com/en/1.7/topics/settings/ | |
| 6 | + | |
| 7 | +For the full list of settings and their values, see | |
| 8 | +https://docs.djangoproject.com/en/1.7/ref/settings/ | |
| 9 | +""" | |
| 10 | + | |
| 11 | +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) | |
| 12 | +import os | |
| 13 | +BASE_DIR = os.path.dirname(__file__) | |
| 14 | + | |
| 15 | +# Used for settings translation | |
| 16 | +from django.utils.translation import ugettext_lazy as _ | |
| 17 | + | |
| 18 | +# Quick-start development settings - unsuitable for production | |
| 19 | +# See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ | |
| 20 | + | |
| 21 | +# SECURITY WARNING: keep the secret key used in production secret! | |
| 22 | +SECRET_KEY = "" | |
| 23 | + | |
| 24 | +# SECURITY WARNING: don't run with debug turned on in production! | |
| 25 | +DEBUG = True | |
| 26 | + | |
| 27 | +TEMPLATE_DEBUG = True | |
| 28 | + | |
| 29 | +ALLOWED_HOSTS = [] | |
| 30 | + | |
| 31 | +DATABASE_ROUTERS = [] | |
| 32 | + | |
| 33 | +# Application definition | |
| 34 | + | |
| 35 | +INSTALLED_APPS = ( | |
| 36 | + 'django.contrib.admin', | |
| 37 | + 'django.contrib.auth', | |
| 38 | + 'django.contrib.contenttypes', | |
| 39 | + 'django.contrib.sessions', | |
| 40 | + 'django.contrib.messages', | |
| 41 | + 'django.contrib.staticfiles', | |
| 42 | + | |
| 43 | + # First app to provide AUTH_USER_MODEL to others | |
| 44 | + 'colab.accounts', | |
| 45 | + | |
| 46 | + # Not standard apps | |
| 47 | + 'cliauth', | |
| 48 | + 'django_mobile', | |
| 49 | + 'django_browserid', | |
| 50 | + 'conversejs', | |
| 51 | + 'haystack', | |
| 52 | + 'hitcounter', | |
| 53 | + 'i18n_model', | |
| 54 | + 'mptt', | |
| 55 | + 'dpaste', | |
| 56 | + | |
| 57 | + # Own apps | |
| 58 | + 'colab.home', | |
| 59 | + 'colab.super_archives', | |
| 60 | + 'colab.api', | |
| 61 | + 'colab.rss', | |
| 62 | + 'colab.planet', | |
| 63 | + 'colab.search', | |
| 64 | + 'colab.badger', | |
| 65 | + 'colab.tz', | |
| 66 | + | |
| 67 | + # Feedzilla and deps | |
| 68 | + 'feedzilla', | |
| 69 | + 'taggit', | |
| 70 | + 'common', | |
| 71 | +) | |
| 72 | + | |
| 73 | +MIDDLEWARE_CLASSES = ( | |
| 74 | + 'django.contrib.sessions.middleware.SessionMiddleware', | |
| 75 | + 'django.middleware.common.CommonMiddleware', | |
| 76 | + 'django.middleware.csrf.CsrfViewMiddleware', | |
| 77 | + 'django.contrib.auth.middleware.AuthenticationMiddleware', | |
| 78 | + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', | |
| 79 | + 'django.contrib.messages.middleware.MessageMiddleware', | |
| 80 | + 'django.middleware.clickjacking.XFrameOptionsMiddleware', | |
| 81 | +) | |
| 82 | + | |
| 83 | +ROOT_URLCONF = 'colab.urls' | |
| 84 | + | |
| 85 | +WSGI_APPLICATION = 'colab.wsgi.application' | |
| 86 | + | |
| 87 | +# Internationalization | |
| 88 | +# https://docs.djangoproject.com/en/1.7/topics/i18n/ | |
| 89 | + | |
| 90 | +LANGUAGE_CODE = 'en-us' | |
| 91 | + | |
| 92 | +TIME_ZONE = 'UTC' | |
| 93 | + | |
| 94 | +USE_I18N = True | |
| 95 | + | |
| 96 | +USE_L10N = True | |
| 97 | + | |
| 98 | +USE_TZ = True | |
| 99 | + | |
| 100 | + | |
| 101 | +# Static files (CSS, JavaScript, Images) | |
| 102 | +# https://docs.djangoproject.com/en/1.7/howto/static-files/ | |
| 103 | + | |
| 104 | +STATIC_ROOT = '/usr/share/nginx/colab/static/' | |
| 105 | +MEDIA_ROOT = '/usr/share/nginx/colab/media/' | |
| 106 | + | |
| 107 | +STATIC_URL = '/static/' | |
| 108 | +MEDIA_URL = '/media/' | |
| 109 | + | |
| 110 | + | |
| 111 | +# Normally you should not import ANYTHING from Django directly | |
| 112 | +# into your settings, but ImproperlyConfigured is an exception. | |
| 113 | +from django.core.exceptions import ImproperlyConfigured | |
| 114 | + | |
| 115 | + | |
| 116 | +def get_env_setting(setting): | |
| 117 | + """ Get the environment setting or return exception """ | |
| 118 | + try: | |
| 119 | + return os.environ[setting] | |
| 120 | + except KeyError: | |
| 121 | + error_msg = "Set the %s env variable" % setting | |
| 122 | + raise ImproperlyConfigured(error_msg) | |
| 123 | + | |
| 124 | + | |
| 125 | +# Allow Django runserver to serve SVG files | |
| 126 | +# https://code.djangoproject.com/ticket/20162 | |
| 127 | +import mimetypes | |
| 128 | +mimetypes.add_type('image/svg+xml', '.svg') | |
| 129 | + | |
| 130 | +LANGUAGES = ( | |
| 131 | + ('en', _('English')), | |
| 132 | + ('pt-br', _('Portuguese')), | |
| 133 | + ('es', _('Spanish')), | |
| 134 | +) | |
| 135 | + | |
| 136 | +DJANGO_DATE_FORMAT_TO_JS = { | |
| 137 | + 'pt-br': ('pt-BR', 'dd/MM/yyyy'), | |
| 138 | + 'es': ('es', 'dd/MM/yyyy'), | |
| 139 | +} | |
| 140 | + | |
| 141 | +LANGUAGE_CODE = 'en' | |
| 142 | + | |
| 143 | +# The absolute path to the folder containing the attachments | |
| 144 | +ATTACHMENTS_FOLDER_PATH = '/mnt/trac/attachments/' | |
| 145 | + | |
| 146 | +# ORDERING_DATA receives the options to order for as it's keys and a dict as | |
| 147 | +# value, if you want to order for the last name, you can use something like: | |
| 148 | +# 'last_name': {'name': 'Last Name', 'fields': 'last_name'} inside the dict, | |
| 149 | +# you pass two major keys (name, fields) | |
| 150 | +# The major key name is the name to appear on the template | |
| 151 | +# the major key fields it show receive the name of the fields to order for in | |
| 152 | +# the indexes | |
| 153 | + | |
| 154 | +ORDERING_DATA = { | |
| 155 | + 'latest': { | |
| 156 | + 'name': _(u'Recent activity'), | |
| 157 | + 'fields': ('-modified', '-created'), | |
| 158 | + }, | |
| 159 | + 'hottest': { | |
| 160 | + 'name': _(u'Relevance'), | |
| 161 | + 'fields': None, | |
| 162 | + }, | |
| 163 | +} | |
| 164 | + | |
| 165 | + | |
| 166 | +# File type groupings is a tuple of tuples containg what it should filter, | |
| 167 | +# how it should be displayed, and a tuple of which mimetypes it includes | |
| 168 | +FILE_TYPE_GROUPINGS = ( | |
| 169 | + ('document', _(u'Document'), | |
| 170 | + ('doc', 'docx', 'odt', 'otx', 'dotx', 'pdf', 'ott')), | |
| 171 | + ('presentation', _(u'Presentation'), ('ppt', 'pptx', 'odp')), | |
| 172 | + ('text', _(u'Text'), ('txt', 'po', 'conf', 'log')), | |
| 173 | + ('code', _(u'Code'), | |
| 174 | + ('py', 'php', 'js', 'sql', 'sh', 'patch', 'diff', 'html', '')), | |
| 175 | + ('compressed', _(u'Compressed'), ('rar', 'zip', 'gz', 'tgz', 'bz2')), | |
| 176 | + ('image', _(u'Image'), | |
| 177 | + ('jpg', 'jpeg', 'png', 'tiff', 'gif', 'svg', 'psd', 'planner', 'cdr')), | |
| 178 | + ('spreadsheet', _(u'Spreadsheet'), | |
| 179 | + ('ods', 'xls', 'xlsx', 'xslt', 'csv')), | |
| 180 | +) | |
| 181 | + | |
| 182 | +# the following variable define how many characters should be shown before | |
| 183 | +# a highlighted word, to make sure that the highlighted word will appear | |
| 184 | +HIGHLIGHT_NUM_CHARS_BEFORE_MATCH = 30 | |
| 185 | +HAYSTACK_CUSTOM_HIGHLIGHTER = 'colab.utils.highlighting.ColabHighlighter' | |
| 186 | + | |
| 187 | +HAYSTACK_CONNECTIONS = { | |
| 188 | + 'default': { | |
| 189 | + 'ENGINE': 'haystack.backends.solr_backend.SolrEngine', | |
| 190 | + 'URL': 'http://localhost:8983/solr/', | |
| 191 | + } | |
| 192 | +} | |
| 193 | + | |
| 194 | +CACHES = { | |
| 195 | + 'default': { | |
| 196 | + 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', | |
| 197 | + 'LOCATION': '127.0.0.1:11211', | |
| 198 | + } | |
| 199 | +} | |
| 200 | + | |
| 201 | +DATABASE_ROUTERS = [] | |
| 202 | + | |
| 203 | + | |
| 204 | +TEMPLATE_CONTEXT_PROCESSORS = ( | |
| 205 | + 'django.contrib.auth.context_processors.auth', | |
| 206 | + 'django.core.context_processors.debug', | |
| 207 | + 'django.core.context_processors.i18n', | |
| 208 | + 'django.core.context_processors.media', | |
| 209 | + 'django.core.context_processors.static', | |
| 210 | + 'django.core.context_processors.tz', | |
| 211 | + 'django.contrib.messages.context_processors.messages', | |
| 212 | + 'django.core.context_processors.request', | |
| 213 | + 'django_mobile.context_processors.is_mobile', | |
| 214 | + 'colab.super_archives.context_processors.mailarchive', | |
| 215 | + 'colab.proxy.context_processors.proxied_apps', | |
| 216 | + 'colab.home.context_processors.robots', | |
| 217 | +) | |
| 218 | + | |
| 219 | +MIDDLEWARE_CLASSES = ( | |
| 220 | + 'django.contrib.sessions.middleware.SessionMiddleware', | |
| 221 | + 'django.middleware.locale.LocaleMiddleware', | |
| 222 | + 'django.middleware.common.CommonMiddleware', | |
| 223 | + 'django.middleware.csrf.CsrfViewMiddleware', | |
| 224 | + 'django.contrib.auth.middleware.AuthenticationMiddleware', | |
| 225 | + 'django.contrib.messages.middleware.MessageMiddleware', | |
| 226 | + 'django.middleware.clickjacking.XFrameOptionsMiddleware', | |
| 227 | + 'django_mobile.middleware.MobileDetectionMiddleware', | |
| 228 | + 'django_mobile.middleware.SetFlavourMiddleware', | |
| 229 | + 'colab.tz.middleware.TimezoneMiddleware', | |
| 230 | +) | |
| 231 | + | |
| 232 | +# Add the django_browserid authentication backend. | |
| 233 | +AUTHENTICATION_BACKENDS = ( | |
| 234 | + 'django.contrib.auth.backends.ModelBackend', | |
| 235 | + 'colab.accounts.auth.ColabBrowserIDBackend', | |
| 236 | +) | |
| 237 | + | |
| 238 | +STATICFILES_DIRS = ( | |
| 239 | + os.path.join(BASE_DIR, 'static'), | |
| 240 | +) | |
| 241 | + | |
| 242 | +TEMPLATE_DIRS = ( | |
| 243 | + os.path.join(BASE_DIR, 'templates'), | |
| 244 | +) | |
| 245 | + | |
| 246 | +LOCALE_PATHS = ( | |
| 247 | + os.path.join(BASE_DIR, 'locale'), | |
| 248 | +) | |
| 249 | + | |
| 250 | +AUTH_USER_MODEL = 'accounts.User' | |
| 251 | + | |
| 252 | +from django.contrib.messages import constants as messages | |
| 253 | +MESSAGE_TAGS = { | |
| 254 | + messages.INFO: 'alert-info', | |
| 255 | + messages.SUCCESS: 'alert-success', | |
| 256 | + messages.WARNING: 'alert-warning', | |
| 257 | + messages.ERROR: 'alert-danger', | |
| 258 | +} | |
| 259 | + | |
| 260 | +### Feedzilla (planet) | |
| 261 | +from feedzilla.settings import * | |
| 262 | +FEEDZILLA_PAGE_SIZE = 5 | |
| 263 | +FEEDZILLA_SITE_TITLE = _(u'Planet Colab') | |
| 264 | +FEEDZILLA_SITE_DESCRIPTION = _(u'Colab blog aggregator') | |
| 265 | + | |
| 266 | +### Mailman API settings | |
| 267 | +MAILMAN_API_URL = 'http://localhost:9000' | |
| 268 | + | |
| 269 | +### BrowserID / Persona | |
| 270 | +SITE_URL = 'localhost:8000' | |
| 271 | +BROWSERID_AUDIENCES = [SITE_URL, SITE_URL.replace('https', 'http')] | |
| 272 | + | |
| 273 | + | |
| 274 | +LOGIN_URL = '/' | |
| 275 | +LOGIN_REDIRECT_URL = '/' | |
| 276 | +LOGIN_REDIRECT_URL_FAILURE = '/' | |
| 277 | +LOGOUT_REDIRECT_URL = '/user/logout' | |
| 278 | +BROWSERID_CREATE_USER = False | |
| 279 | + | |
| 280 | +REVPROXY_ADD_REMOTE_USER = True | |
| 281 | + | |
| 282 | +## Converse.js settings | |
| 283 | +# This URL must use SSL in order to keep chat sessions secure | |
| 284 | +CONVERSEJS_BOSH_SERVICE_URL = SITE_URL + '/http-bind' | |
| 285 | + | |
| 286 | +CONVERSEJS_ALLOW_CONTACT_REQUESTS = False | |
| 287 | +CONVERSEJS_SHOW_ONLY_ONLINE_USERS = True | |
| 288 | + | |
| 289 | + | |
| 290 | +# Tastypie settings | |
| 291 | +TASTYPIE_DEFAULT_FORMATS = ['json', ] | |
| 292 | + | |
| 293 | +# Dpaste settings | |
| 294 | +DPASTE_EXPIRE_CHOICES = ( | |
| 295 | + ('onetime', _(u'One Time Snippet')), | |
| 296 | + (3600, _(u'In one hour')), | |
| 297 | + (3600 * 24 * 7, _(u'In one week')), | |
| 298 | + (3600 * 24 * 30, _(u'In one month')), | |
| 299 | + ('never', _(u'Never')), | |
| 300 | +) | |
| 301 | +DPASTE_EXPIRE_DEFAULT = DPASTE_EXPIRE_CHOICES[4][0] | |
| 302 | +DPASTE_DEFAULT_GIST_DESCRIPTION = 'Gist created from Colab DPaste' | |
| 303 | +DPASTE_DEFAULT_GIST_NAME = 'colab_paste' | |
| 304 | +DPASTE_LEXER_DEFAULT = 'text' | |
| 305 | + | |
| 306 | +from .utils.conf import load_yaml_settings | |
| 307 | +locals().update(load_yaml_settings()) | |
| 308 | + | |
| 309 | +if locals().get('RAVEN_DSN', False): | |
| 310 | + RAVEN_CONFIG = { | |
| 311 | + 'dsn': RAVEN_DSN + '?timeout=30', | |
| 312 | + } | |
| 313 | + INSTALLED_APPS += ('raven.contrib.django.raven_compat',) | |
| 314 | + | |
| 315 | +for app_label in locals().get('PROXIED_APPS', {}).keys(): | |
| 316 | + INSTALLED_APPS += ('colab.proxy.{}'.format(app_label),) | ... | ... |
colab/super_archives/__init__.py
colab/super_archives/apps.py
colab/super_archives/management/commands/import_emails.py
| ... | ... | @@ -12,14 +12,14 @@ from optparse import make_option |
| 12 | 12 | |
| 13 | 13 | from django.db import transaction |
| 14 | 14 | from django.template.defaultfilters import slugify |
| 15 | -from super_archives.utils.email import colab_send_email | |
| 16 | 15 | from django.core.management.base import BaseCommand, CommandError |
| 17 | 16 | from django.template.loader import render_to_string |
| 18 | 17 | from django.utils.translation import ugettext as _ |
| 19 | 18 | |
| 20 | -from super_archives.models import MailingList, Message, \ | |
| 19 | +from colab.super_archives.utils.email import colab_send_email | |
| 20 | +from colab.super_archives.models import MailingList, Message, \ | |
| 21 | 21 | Thread, EmailAddress |
| 22 | -from super_archives.management.commands.message import Message as \ | |
| 22 | +from colab.super_archives.management.commands.message import Message as \ | |
| 23 | 23 | CustomMessage |
| 24 | 24 | |
| 25 | 25 | ... | ... |
colab/super_archives/management/commands/update_blocks.py
colab/super_archives/management/commands/update_keywords.py
colab/super_archives/migrations/0001_initial.py
| ... | ... | @@ -3,7 +3,7 @@ from __future__ import unicode_literals |
| 3 | 3 | |
| 4 | 4 | from django.db import models, migrations |
| 5 | 5 | import hitcounter.models |
| 6 | -import super_archives.models | |
| 6 | +import colab.super_archives.models | |
| 7 | 7 | import django.db.models.deletion |
| 8 | 8 | from django.conf import settings |
| 9 | 9 | import taggit.managers |
| ... | ... | @@ -36,7 +36,7 @@ class Migration(migrations.Migration): |
| 36 | 36 | fields=[ |
| 37 | 37 | ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
| 38 | 38 | ('address', models.EmailField(unique=True, max_length=75)), |
| 39 | - ('validation_key', models.CharField(default=super_archives.models.get_validation_key, max_length=32, null=True)), | |
| 39 | + ('validation_key', models.CharField(default=colab.super_archives.models.get_validation_key, max_length=32, null=True)), | |
| 40 | 40 | ('created', models.DateTimeField(auto_now_add=True)), |
| 41 | 41 | ('user', models.ForeignKey(related_name=b'emails_not_validated', to=settings.AUTH_USER_MODEL, null=True)), |
| 42 | 42 | ], |
| ... | ... | @@ -74,7 +74,7 @@ class Migration(migrations.Migration): |
| 74 | 74 | name='MailingListMembership', |
| 75 | 75 | fields=[ |
| 76 | 76 | ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
| 77 | - ('mailinglist', models.ForeignKey(to='super_archives.MailingList')), | |
| 77 | + ('mailinglist', models.ForeignKey(to='colab.super_archives.MailingList')), | |
| 78 | 78 | ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), |
| 79 | 79 | ], |
| 80 | 80 | options={ |
| ... | ... | @@ -91,7 +91,7 @@ class Migration(migrations.Migration): |
| 91 | 91 | ('received_time', models.DateTimeField(db_index=True)), |
| 92 | 92 | ('message_id', models.CharField(max_length=512)), |
| 93 | 93 | ('spam', models.BooleanField(default=False)), |
| 94 | - ('from_address', models.ForeignKey(to='super_archives.EmailAddress')), | |
| 94 | + ('from_address', models.ForeignKey(to='colab.super_archives.EmailAddress')), | |
| 95 | 95 | ], |
| 96 | 96 | options={ |
| 97 | 97 | 'ordering': ('received_time',), |
| ... | ... | @@ -107,7 +107,7 @@ class Migration(migrations.Migration): |
| 107 | 107 | ('text', models.TextField()), |
| 108 | 108 | ('is_reply', models.BooleanField(default=False)), |
| 109 | 109 | ('order', models.IntegerField()), |
| 110 | - ('message', models.ForeignKey(related_name=b'blocks', to='super_archives.Message')), | |
| 110 | + ('message', models.ForeignKey(related_name=b'blocks', to='colab.super_archives.Message')), | |
| 111 | 111 | ], |
| 112 | 112 | options={ |
| 113 | 113 | 'ordering': ('order',), |
| ... | ... | @@ -120,7 +120,7 @@ class Migration(migrations.Migration): |
| 120 | 120 | ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
| 121 | 121 | ('name', models.CharField(max_length=512)), |
| 122 | 122 | ('value', models.TextField()), |
| 123 | - ('Message', models.ForeignKey(to='super_archives.Message')), | |
| 123 | + ('Message', models.ForeignKey(to='colab.super_archives.Message')), | |
| 124 | 124 | ], |
| 125 | 125 | options={ |
| 126 | 126 | }, |
| ... | ... | @@ -133,8 +133,8 @@ class Migration(migrations.Migration): |
| 133 | 133 | ('subject_token', models.CharField(max_length=512)), |
| 134 | 134 | ('score', models.IntegerField(default=0, help_text='Thread score', verbose_name='Score')), |
| 135 | 135 | ('spam', models.BooleanField(default=False)), |
| 136 | - ('latest_message', models.OneToOneField(related_name=b'+', null=True, to='super_archives.Message', help_text='Latest message posted', verbose_name='Latest message')), | |
| 137 | - ('mailinglist', models.ForeignKey(verbose_name='Mailing List', to='super_archives.MailingList', help_text='The Mailing List where is the thread')), | |
| 136 | + ('latest_message', models.OneToOneField(related_name=b'+', null=True, to='colab.super_archives.Message', help_text='Latest message posted', verbose_name='Latest message')), | |
| 137 | + ('mailinglist', models.ForeignKey(verbose_name='Mailing List', to='colab.super_archives.MailingList', help_text='The Mailing List where is the thread')), | |
| 138 | 138 | ('tags', taggit.managers.TaggableManager(to='taggit.Tag', through='taggit.TaggedItem', help_text='A comma-separated list of tags.', verbose_name='Tags')), |
| 139 | 139 | ], |
| 140 | 140 | options={ |
| ... | ... | @@ -149,7 +149,7 @@ class Migration(migrations.Migration): |
| 149 | 149 | fields=[ |
| 150 | 150 | ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
| 151 | 151 | ('created', models.DateTimeField(auto_now_add=True)), |
| 152 | - ('message', models.ForeignKey(to='super_archives.Message')), | |
| 152 | + ('message', models.ForeignKey(to='colab.super_archives.Message')), | |
| 153 | 153 | ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL)), |
| 154 | 154 | ], |
| 155 | 155 | options={ |
| ... | ... | @@ -167,7 +167,7 @@ class Migration(migrations.Migration): |
| 167 | 167 | migrations.AddField( |
| 168 | 168 | model_name='message', |
| 169 | 169 | name='thread', |
| 170 | - field=models.ForeignKey(to='super_archives.Thread', null=True), | |
| 170 | + field=models.ForeignKey(to='colab.super_archives.Thread', null=True), | |
| 171 | 171 | preserve_default=True, |
| 172 | 172 | ), |
| 173 | 173 | migrations.AlterUniqueTogether( |
| ... | ... | @@ -177,7 +177,7 @@ class Migration(migrations.Migration): |
| 177 | 177 | migrations.AddField( |
| 178 | 178 | model_name='keyword', |
| 179 | 179 | name='thread', |
| 180 | - field=models.ForeignKey(to='super_archives.Thread'), | |
| 180 | + field=models.ForeignKey(to='colab.super_archives.Thread'), | |
| 181 | 181 | preserve_default=True, |
| 182 | 182 | ), |
| 183 | 183 | migrations.AlterUniqueTogether( | ... | ... |
colab/super_archives/search_indexes.py
colab/super_archives/templatetags/superarchives.py
| 1 | 1 | |
| 2 | 2 | from django import template |
| 3 | - | |
| 4 | -from super_archives.utils import url | |
| 5 | 3 | from django.conf import settings |
| 6 | 4 | |
| 5 | +from colab.super_archives.utils import url | |
| 6 | + | |
| 7 | 7 | |
| 8 | 8 | register = template.Library() |
| 9 | 9 | TEMPLATE_PATH = 'superarchives/tags/' |
| ... | ... | @@ -32,4 +32,4 @@ def pop_from_get(context, **kwargs): |
| 32 | 32 | context['request'].META['PATH_INFO'], |
| 33 | 33 | context['request'].META['QUERY_STRING'], |
| 34 | 34 | **kwargs |
| 35 | - ) | |
| 36 | 35 | \ No newline at end of file |
| 36 | + ) | ... | ... |
colab/super_archives/views.py
| ... | ... | @@ -20,7 +20,7 @@ from django.shortcuts import render, redirect, get_object_or_404 |
| 20 | 20 | |
| 21 | 21 | from haystack.query import SearchQuerySet |
| 22 | 22 | |
| 23 | -from accounts.utils import mailman | |
| 23 | +from colab.accounts.utils import mailman | |
| 24 | 24 | from .utils.email import send_verification_email |
| 25 | 25 | from .models import MailingList, Thread, EmailAddress, \ |
| 26 | 26 | EmailAddressValidation, Message | ... | ... |
| ... | ... | @@ -0,0 +1,46 @@ |
| 1 | +from django.conf.urls import patterns, include, url, static | |
| 2 | +from django.conf import settings | |
| 3 | +from django.views.generic import TemplateView | |
| 4 | +from django.contrib import admin | |
| 5 | + | |
| 6 | +from .accounts.models import User | |
| 7 | +from .search.forms import ColabSearchForm | |
| 8 | +from .super_archives.models import Message | |
| 9 | + | |
| 10 | + | |
| 11 | +admin.autodiscover() | |
| 12 | + | |
| 13 | +urlpatterns = patterns('', | |
| 14 | + url(r'^$', 'colab.home.views.index', name='home'), | |
| 15 | + url(r'^robots.txt$', 'colab.home.views.robots', name='robots'), | |
| 16 | + | |
| 17 | + url(r'^open-data/$', TemplateView.as_view(template_name='open-data.html'), | |
| 18 | + name='opendata'), | |
| 19 | + | |
| 20 | + url(r'^search/', include('colab.search.urls')), | |
| 21 | + url(r'^archives/', include('colab.super_archives.urls')), | |
| 22 | + url(r'^api/', include('colab.api.urls')), | |
| 23 | + url(r'^rss/', include('colab.rss.urls')), | |
| 24 | + | |
| 25 | + url(r'^user/', include('colab.accounts.urls')), # Kept for backwards compatibility | |
| 26 | + url(r'^signup/', include('colab.accounts.urls')), # (same here) TODO: move to nginx | |
| 27 | + url(r'^account/', include('colab.accounts.urls')), | |
| 28 | + | |
| 29 | + url(r'', include('django_browserid.urls')), | |
| 30 | + | |
| 31 | + url(r'^planet/', include('feedzilla.urls')), | |
| 32 | + | |
| 33 | + url(r'paste/', include('dpaste.urls.dpaste')), | |
| 34 | + | |
| 35 | + # Uncomment the next line to enable the admin: | |
| 36 | + url(r'^colab/admin/', include(admin.site.urls)), | |
| 37 | + | |
| 38 | + url(r'^trac/', include('colab.proxy.trac.urls')), | |
| 39 | + url(r'^gitlab/', include('colab.proxy.gitlab.urls')), | |
| 40 | +) | |
| 41 | + | |
| 42 | +if settings.DEBUG: | |
| 43 | + urlpatterns += static.static( | |
| 44 | + settings.MEDIA_URL, | |
| 45 | + document_root=settings.MEDIA_ROOT | |
| 46 | + ) | ... | ... |
| ... | ... | @@ -0,0 +1,32 @@ |
| 1 | + | |
| 2 | +import os | |
| 3 | +import yaml | |
| 4 | + | |
| 5 | +from django.core.exceptions import ImproperlyConfigured | |
| 6 | + | |
| 7 | + | |
| 8 | +class InaccessibleYAMLSettings(ImproperlyConfigured): | |
| 9 | + """Settings YAML is Inaccessible. | |
| 10 | + | |
| 11 | + Check if the file exists and if you have read permissions.""" | |
| 12 | + | |
| 13 | + | |
| 14 | +def load_yaml_settings(): | |
| 15 | + yaml_path = os.getenv('COLAB_SETTINGS', '/etc/colab.yaml') | |
| 16 | + | |
| 17 | + if not os.path.exists(yaml_path): | |
| 18 | + msg = "The yaml file {} does not exist".format(yaml_path) | |
| 19 | + raise InaccessibleYAMLSettings(msg) | |
| 20 | + | |
| 21 | + try: | |
| 22 | + with open(yaml_path) as yaml_file: | |
| 23 | + yaml_settings = yaml.load(yaml_file.read()) | |
| 24 | + except IOError: | |
| 25 | + msg = ('Could not open settings file {}. Please ' | |
| 26 | + 'check if the file exists and if user ' | |
| 27 | + 'has read rights.').format(yaml_path) | |
| 28 | + raise InaccessibleYAMLSettings(msg) | |
| 29 | + | |
| 30 | + return yaml_settings | |
| 31 | + | |
| 32 | +yaml_settings = load_yaml_settings() | ... | ... |
| ... | ... | @@ -0,0 +1,38 @@ |
| 1 | +from haystack.utils import Highlighter | |
| 2 | +from django.conf import settings | |
| 3 | +from django.utils.html import escape, strip_tags | |
| 4 | + | |
| 5 | + | |
| 6 | +class ColabHighlighter(Highlighter): | |
| 7 | + def highlight(self, text_block): | |
| 8 | + self.text_block = escape(strip_tags(text_block)) | |
| 9 | + highlight_locations = self.find_highlightable_words() | |
| 10 | + start_offset, end_offset = self.find_window(highlight_locations) | |
| 11 | + return self.render_html(highlight_locations, start_offset, end_offset) | |
| 12 | + | |
| 13 | + def find_window(self, highlight_locations): | |
| 14 | + """Getting the HIGHLIGHT_NUM_CHARS_BEFORE_MATCH setting | |
| 15 | + to find how many characters before the first word found should | |
| 16 | + be removed from the window | |
| 17 | + """ | |
| 18 | + | |
| 19 | + if len(self.text_block) <= self.max_length: | |
| 20 | + return (0, self.max_length) | |
| 21 | + | |
| 22 | + num_chars_before = getattr( | |
| 23 | + settings, | |
| 24 | + 'HIGHLIGHT_NUM_CHARS_BEFORE_MATCH', | |
| 25 | + 0 | |
| 26 | + ) | |
| 27 | + | |
| 28 | + best_start, best_end = super(ColabHighlighter, self).find_window( | |
| 29 | + highlight_locations | |
| 30 | + ) | |
| 31 | + if best_start <= num_chars_before: | |
| 32 | + best_end -= best_start | |
| 33 | + best_start = 0 | |
| 34 | + else: | |
| 35 | + best_start -= num_chars_before | |
| 36 | + best_end -= num_chars_before | |
| 37 | + | |
| 38 | + return (best_start, best_end) | ... | ... |
| ... | ... | @@ -0,0 +1,14 @@ |
| 1 | +""" | |
| 2 | +WSGI config for colab project. | |
| 3 | + | |
| 4 | +It exposes the WSGI callable as a module-level variable named ``application``. | |
| 5 | + | |
| 6 | +For more information on this file, see | |
| 7 | +https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/ | |
| 8 | +""" | |
| 9 | + | |
| 10 | +import os | |
| 11 | +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "colab.settings") | |
| 12 | + | |
| 13 | +from django.core.wsgi import get_wsgi_application | |
| 14 | +application = get_wsgi_application() | ... | ... |
| ... | ... | @@ -0,0 +1,10 @@ |
| 1 | +#!/usr/bin/env python | |
| 2 | +import os | |
| 3 | +import sys | |
| 4 | + | |
| 5 | +if __name__ == "__main__": | |
| 6 | + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "colab.settings") | |
| 7 | + | |
| 8 | + from django.core.management import execute_from_command_line | |
| 9 | + | |
| 10 | + execute_from_command_line(sys.argv) | ... | ... |