diff --git a/greenmine/core/fields.py b/greenmine/base/fields.py similarity index 100% rename from greenmine/core/fields.py rename to greenmine/base/fields.py diff --git a/greenmine/core/formats/__init__.py b/greenmine/base/formats/__init__.py similarity index 100% rename from greenmine/core/formats/__init__.py rename to greenmine/base/formats/__init__.py diff --git a/greenmine/core/formats/en/__init__.py b/greenmine/base/formats/en/__init__.py similarity index 100% rename from greenmine/core/formats/en/__init__.py rename to greenmine/base/formats/en/__init__.py diff --git a/greenmine/core/formats/en/formats.py b/greenmine/base/formats/en/formats.py similarity index 100% rename from greenmine/core/formats/en/formats.py rename to greenmine/base/formats/en/formats.py diff --git a/greenmine/core/formats/es/__init__.py b/greenmine/base/formats/es/__init__.py similarity index 100% rename from greenmine/core/formats/es/__init__.py rename to greenmine/base/formats/es/__init__.py diff --git a/greenmine/core/formats/es/formats.py b/greenmine/base/formats/es/formats.py similarity index 100% rename from greenmine/core/formats/es/formats.py rename to greenmine/base/formats/es/formats.py diff --git a/greenmine/core/__init__.py b/greenmine/base/mail/__init__.py similarity index 100% rename from greenmine/core/__init__.py rename to greenmine/base/mail/__init__.py diff --git a/greenmine/core/widgets.py b/greenmine/base/mail/models.py similarity index 100% rename from greenmine/core/widgets.py rename to greenmine/base/mail/models.py diff --git a/greenmine/core/mail/async_tasks.py b/greenmine/base/mail/tasks.py similarity index 77% rename from greenmine/core/mail/async_tasks.py rename to greenmine/base/mail/tasks.py index cba675e7..86898b84 100644 --- a/greenmine/core/mail/async_tasks.py +++ b/greenmine/base/mail/tasks.py @@ -2,22 +2,21 @@ import logging -from greenqueue.core import Library -register = Library() +from celery import task from django.template import loader from django.utils import translation from django.core import mail -from greenmine.core.utils.auth import set_token +from greenmine.base.utils.auth import set_token -@register.task(name='send-mail') +@task(name='send-mail') def send_mail(subject, body, to): email_message = mail.EmailMessage(body=body, subject=subject, to=to) email_message.content_subtype = "html" email_message.send() -@register.task(name='send-bulk-mail') +@task(name='send-bulk-mail') def send_bulk_mail(emails): emessages = [mail.EmailMessage(body=body, subject=subject, to=to) for subject, body, to in emails] diff --git a/greenmine/core/permissions.py b/greenmine/base/permissions.py similarity index 100% rename from greenmine/core/permissions.py rename to greenmine/base/permissions.py diff --git a/greenmine/core/signals.py b/greenmine/base/signals.py similarity index 100% rename from greenmine/core/signals.py rename to greenmine/base/signals.py diff --git a/greenmine/core/utils/__init__.py b/greenmine/base/utils/__init__.py similarity index 100% rename from greenmine/core/utils/__init__.py rename to greenmine/base/utils/__init__.py diff --git a/greenmine/core/utils/auth.py b/greenmine/base/utils/auth.py similarity index 100% rename from greenmine/core/utils/auth.py rename to greenmine/base/utils/auth.py diff --git a/greenmine/core/utils/markup.py b/greenmine/base/utils/markup.py similarity index 100% rename from greenmine/core/utils/markup.py rename to greenmine/base/utils/markup.py diff --git a/greenmine/core/utils/slug.py b/greenmine/base/utils/slug.py similarity index 100% rename from greenmine/core/utils/slug.py rename to greenmine/base/utils/slug.py diff --git a/greenmine/core/decorators.py b/greenmine/core/decorators.py deleted file mode 100644 index 5b455a52..00000000 --- a/greenmine/core/decorators.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- - -from django.conf import settings -from django.http import HttpResponseRedirect, HttpResponse -from django.utils.translation import ugettext_lazy as _ -from functools import wraps -import json - -from superview.views import LazyEncoder - -def login_required(view_func): - @wraps(view_func) - def _wrapper(self, request, *args, **kwargs): - if request.user.is_authenticated(): - return view_func(self, request, *args, **kwargs) - - if request.is_ajax(): - response_dict = {'valid': False, 'errors':[_(u"Permission denied.")]} - response_data = json.dumps(response_dict, cls=LazyEncoder, indent=4, sort_keys=True) - return HttpResponse(response_data, mimetype='text/plain') - - return HttpResponseRedirect(settings.LOGIN_URL) - return _wrapper - - -def staff_required(view_func): - @wraps(view_func) - def _wrapper(self, request, *args, **kwargs): - if request.user.is_staff: - return view_func(self, request, *args, **kwargs) - - if request.is_ajax(): - response_dict = {'valid': False, 'errors':[_(u"Permission denied.")]} - response_data = json.dumps(response_dict, cls=LazyEncoder, indent=4, sort_keys=True) - return HttpResponse(response_data, mimetype='text/plain') - - return HttpResponseRedirect(settings.LOGIN_URL) - return _wrapper diff --git a/greenmine/core/generic.py b/greenmine/core/generic.py deleted file mode 100644 index 871afbeb..00000000 --- a/greenmine/core/generic.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- - -from django.views.decorators.cache import cache_page -from django.utils.translation import ugettext_lazy as _ -from django.utils.encoding import force_unicode -from django.http import HttpResponseRedirect, HttpResponse, Http404 -from django.core.paginator import Paginator, InvalidPage, EmptyPage -from django.core.urlresolvers import reverse -from django.core.mail import EmailMessage -from django.shortcuts import render_to_response, get_object_or_404 -from django.template.loader import render_to_string -from django.template import RequestContext, loader -from django.contrib import messages -from django.db.utils import IntegrityError -from django.utils.decorators import method_decorator -from superview.views import SuperView as View - -from greenmine.core import permissions -from greenmine.core.middleware import PermissionDeniedException - - -class GenericView(View): - """ Generic view with some util methods. """ - - def render_to_ok(self, context={}): - response = {'valid': True, 'errors': []} - response.update(context) - return self.render_json(response, ok=True) - - def render_to_error(self, context={}): - response = {'valid': False, 'errors': []} - response.update(context) - return self.render_json(response, ok=False) - - def redirect_referer(self, msg=None): - if msg is not None: - messages.info(self.request, msg) - - referer = self.request.META.get('HTTP_REFERER', '/') - return self.render_redirect(referer) - - def check_role(self, user, project, perms, exception=PermissionDeniedException): - ok = permissions.has_perms(user, project, perms) - if exception is not None and not ok: - raise exception() - return ok diff --git a/greenmine/core/mail/__init__.py b/greenmine/core/mail/__init__.py deleted file mode 100644 index faaaf799..00000000 --- a/greenmine/core/mail/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- - - diff --git a/greenmine/core/middleware.py b/greenmine/core/middleware.py deleted file mode 100644 index 6c11eb80..00000000 --- a/greenmine/core/middleware.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- - -from django.http import HttpResponse, HttpResponseForbidden - -class PermissionDeniedException(Exception): - pass - -class PermissionMiddleware(object): - def process_exception(self, request, exception): - if not isinstance(exception, PermissionDeniedException): - return None - - return HttpResponseForbidden("Permission denied for %s" % (request.path)) diff --git a/greenmine/documents/models.py b/greenmine/documents/models.py index 0db021d1..a2801d2d 100644 --- a/greenmine/documents/models.py +++ b/greenmine/documents/models.py @@ -1,7 +1,7 @@ # -* coding: utf-8 -*- from django.db import models -from greenmine.core.utils.slug import slugify_uniquely as slugify +from greenmine.base.utils.slug import slugify_uniquely as slugify from greenmine.taggit.managers import TaggableManager diff --git a/greenmine/profile/models.py b/greenmine/profile/models.py index 003df944..de1c8936 100644 --- a/greenmine/profile/models.py +++ b/greenmine/profile/models.py @@ -10,8 +10,8 @@ from django.core.files.storage import FileSystemStorage from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import User -from greenmine.core.fields import DictField, ListField -from greenmine.core.utils import iter_points +from greenmine.base.fields import DictField, ListField +from greenmine.base.utils import iter_points import datetime import re diff --git a/greenmine/questions/models.py b/greenmine/questions/models.py index ba4a55b5..1cce77f9 100644 --- a/greenmine/questions/models.py +++ b/greenmine/questions/models.py @@ -1,5 +1,5 @@ from django.db import models -from greenmine.core.utils.slug import slugify_uniquely +from greenmine.base.utils.slug import slugify_uniquely from greenmine.taggit.managers import TaggableManager diff --git a/greenmine/scrum/models.py b/greenmine/scrum/models.py index 6559de25..0f87da37 100644 --- a/greenmine/scrum/models.py +++ b/greenmine/scrum/models.py @@ -10,9 +10,9 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic from django.contrib.auth.models import User -from greenmine.core.utils.slug import slugify_uniquely, ref_uniquely -from greenmine.core.fields import DictField -from greenmine.core.utils import iter_points +from greenmine.base.utils.slug import slugify_uniquely, ref_uniquely +from greenmine.base.fields import DictField +from greenmine.base.utils import iter_points from greenmine.taggit.managers import TaggableManager from greenmine.scrum.choices import * @@ -113,7 +113,7 @@ class Project(models.Model): super(Project, self).save(*args, **kwargs) def add_user(self, user, role): - from greenmine.core import permissions + from greenmine.base import permissions return ProjectUserRole.objects.create( project=self, user=user, diff --git a/greenmine/scrum/sigdispatch.py b/greenmine/scrum/sigdispatch.py index 7eeb4c9b..3da6affc 100644 --- a/greenmine/scrum/sigdispatch.py +++ b/greenmine/scrum/sigdispatch.py @@ -2,18 +2,20 @@ from django.db.models.signals import post_save from django.dispatch import receiver -from django.contrib.auth.models import User +from django.conf import settings from django.utils import timezone +from django.utils.translation import ugettext +from django.template.loader import render_to_string + +from django.contrib.auth.models import User from greenmine.profile.models import Profile from greenmine.scrum.models import UserStory, Task, ProjectUserRole -from greenmine.core.utils import normalize_tagname -from greenmine.core import signals -from greenmine.core.utils.auth import set_token +from greenmine.base import signals +from greenmine.base.utils import normalize_tagname +from greenmine.base.utils.auth import set_token +from greenmine.base.mail.task import send_email, send_bulk_email -from django.conf import settings -from django.utils.translation import ugettext -from django.template.loader import render_to_string @receiver(signals.mail_new_user) def mail_new_user(sender, user, **kwargs): @@ -24,8 +26,8 @@ def mail_new_user(sender, user, **kwargs): }) subject = ugettext("Greenmine: wellcome!") - # TODO: convert to celery - #send_task("send-mail", args = [subject, template, [user.email]]) + send_mail.delay(subject, template, [user.email]) + @receiver(signals.mail_recovery_password) def mail_recovery_password(sender, user, **kwargs): @@ -35,8 +37,7 @@ def mail_recovery_password(sender, user, **kwargs): "current_host": settings.HOST, }) subject = ugettext("Greenmine: password recovery.") - # TODO: convert to celery - #send_task("send-mail", args = [subject, template, [user.email]]) + send_mail.delay(subject, template, [user.email]) @receiver(signals.mail_milestone_created) @@ -59,8 +60,7 @@ def mail_milestone_created(sender, milestone, user, **kwargs): emails_list.append([subject, template, [person.email]]) - # TODO: convert to celery - #send_task("send-bulk-mail", args=[emails_list]) + send_bulk_mail.delay(emails_list) @receiver(signals.mail_userstory_created) def mail_userstory_created(sender, us, user, **kwargs): @@ -83,8 +83,7 @@ def mail_userstory_created(sender, us, user, **kwargs): emails_list.append([subject, template, [person.email]]) - # TODO: convert to celery - #send_task("send-bulk-mail", args=[emails_list]) + send_bulk_mail.delay(emails_list) @receiver(signals.mail_task_created) @@ -108,8 +107,7 @@ def mail_task_created(sender, task, user, **kwargs): emails_list.append([subject, template, [person.email]]) - # TODO: convert to celery - #send_task("send-bulk-mail", args=[emails_list]) + send_bulk_mail.delay(emails_list) @receiver(signals.mail_task_assigned) @@ -122,5 +120,4 @@ def mail_task_assigned(sender, task, user, **kwargs): }) subject = ugettext("Greenmine: task assigned") - # TODO: convert to celery - #send_task("send-mail", args = [subject, template, [task.assigned_to.email]]) + send_mail.delay(subject, template, [task.assigned_to.email]) diff --git a/greenmine/search/views.py b/greenmine/search/views.py index cac4f726..d66fa6e0 100644 --- a/greenmine/search/views.py +++ b/greenmine/search/views.py @@ -4,10 +4,10 @@ from django.conf import settings from django.http import Http404 from haystack.query import EmptySearchQuerySet -from greenmine.core.decorators import login_required -from greenmine.core.generic import GenericView +from greenmine.base.decorators import login_required +from greenmine.base.generic import GenericView from greenmine.scrum.models import Project -from .forms import SearchForm +from greenmine.search.forms import SearchForm SEARCH_RESULTS_PER_PAGE = getattr(settings, 'SEARCH_RESULTS_PER_PAGE', 20) diff --git a/greenmine/settings/common.py b/greenmine/settings/common.py index 72b0a036..97c24fc5 100644 --- a/greenmine/settings/common.py +++ b/greenmine/settings/common.py @@ -1,7 +1,11 @@ # -*- coding: utf-8 -*- -from django.utils.translation import ugettext_lazy as _ import os.path, sys, os +import djcelery + +from django.utils.translation import ugettext_lazy as _ + +djcelery.setup_loader() PROJECT_ROOT = os.path.abspath( os.path.join(os.path.dirname(os.path.realpath(__file__)), '..') @@ -163,7 +167,6 @@ MIDDLEWARE_CLASSES = [ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'greenmine.core.middleware.PermissionMiddleware', 'django.middleware.transaction.TransactionMiddleware', 'reversion.middleware.RevisionMiddleware', ] @@ -284,7 +287,7 @@ LOGGING = { AUTH_PROFILE_MODULE = 'profile.Profile' -FORMAT_MODULE_PATH = 'greenmine.core.formats' +FORMAT_MODULE_PATH = 'greenmine.base.formats' DATE_INPUT_FORMATS = ( '%Y-%m-%d', '%m/%d/%Y', '%d/%m/%Y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y',