From eadd3e77f83460e0531d709444cbc110315886dc Mon Sep 17 00:00:00 2001 From: Jay Date: Sun, 12 Oct 2014 10:32:17 +0200 Subject: [PATCH 01/11] added optional celery support out of the box --- CONTRIBUTORS.txt | 1 + README.rst | 2 ++ cookiecutter.json | 1 + {{cookiecutter.repo_name}}/README.rst | 15 +++++++++++ .../config/settings/common.py | 8 ++++++ .../config/settings/local.py | 7 +++++ .../requirements/base.txt | 4 +++ .../{{cookiecutter.repo_name}}/__init__.py | 4 +++ .../{{cookiecutter.repo_name}}/celery.py | 26 +++++++++++++++++++ 9 files changed, 68 insertions(+) create mode 100644 {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 9bbbfd4b..dc35a60c 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -47,6 +47,7 @@ Harry Percival / @hjwp Cullen Rhodes / @c-rhodes Audrey Roy Greenfeld / @audreyr (and creator/maintainer of cookiecutter) * Burhan Khalid / @burhan +Jannis Gebauer / @got_nil * Possesses commit rights diff --git a/README.rst b/README.rst index fd6c3eb0..d74c9f59 100644 --- a/README.rst +++ b/README.rst @@ -27,6 +27,7 @@ Features * Basic e-mail configurations for send emails via Mailgun_ * Media storage using Amazon S3 * Serve static files from Amazon S3 or Whitenoise_ (optional) +* Pre configured Celery_ (optional) .. _Bootstrap: https://github.com/twbs/bootstrap .. _AngularJS: https://github.com/angular/angular.js @@ -37,6 +38,7 @@ Features .. _Procfile: https://devcenter.heroku.com/articles/procfile .. _Mailgun: https://mailgun.com/ .. _Whitenoise: https://whitenoise.readthedocs.org/ +.. _Celery: http://www.celeryproject.org/ Constraints diff --git a/cookiecutter.json b/cookiecutter.json index 25233dbb..b61ca307 100644 --- a/cookiecutter.json +++ b/cookiecutter.json @@ -10,5 +10,6 @@ "now": "2015/01/13", "year": "{{ cookiecutter.now[:4] }}", "use_whitenoise": "y", + "use_celery": "n", "windows": "n" } diff --git a/{{cookiecutter.repo_name}}/README.rst b/{{cookiecutter.repo_name}}/README.rst index 9c0859bc..bc3b1c50 100644 --- a/{{cookiecutter.repo_name}}/README.rst +++ b/{{cookiecutter.repo_name}}/README.rst @@ -108,6 +108,21 @@ To get live reloading to work you'll probably need to install an `appropriate br .. _appropriate browser extension: http://feedback.livereload.com/knowledgebase/articles/86242-how-do-i-install-and-use-the-browser-extensions- +{% if cookiecutter.use_celery == "y" %} +Celery +^^^^^^ +This app comes with Celery. + +To run a celery worker: + +.. code-block:: bash + + cd {{cookiecutter.repo_name}} + celery -A {{cookiecutter.repo_name}} worker -l info + +Please note: For Celerys import magic to work, it is important *where* the celery commands are run. If you are in the same folder with *manage.py*, you should be right. +{% endif %} + It's time to write the code!!! diff --git a/{{cookiecutter.repo_name}}/config/settings/common.py b/{{cookiecutter.repo_name}}/config/settings/common.py index 957d3110..a3c9b38d 100644 --- a/{{cookiecutter.repo_name}}/config/settings/common.py +++ b/{{cookiecutter.repo_name}}/config/settings/common.py @@ -256,4 +256,12 @@ LOGGING = { } } +{% if cookiecutter.use_celery == "y" %} +########## CELERY +# if you are not using the django database broker (e.g. rabbitmq, redis, memcached), you can remove the next line. +INSTALLED_APPS += ('kombu.transport.django',) +BROKER_URL = env("CELERY_BROKER_URL", default='django://') +########## END CELERY +{% endif %} + # Your common stuff: Below this line define 3rd party library settings diff --git a/{{cookiecutter.repo_name}}/config/settings/local.py b/{{cookiecutter.repo_name}}/config/settings/local.py index 8126310b..050ac23b 100644 --- a/{{cookiecutter.repo_name}}/config/settings/local.py +++ b/{{cookiecutter.repo_name}}/config/settings/local.py @@ -59,4 +59,11 @@ INSTALLED_APPS += ('django_extensions', ) # ------------------------------------------------------------------------------ TEST_RUNNER = 'django.test.runner.DiscoverRunner' +{% if cookiecutter.celery_support == "y" %} +########## CELERY +# In development, all tasks will be executed locally by blocking until the task returns +CELERY_ALWAYS_EAGER = True +########## END CELERY +{% endif %} + # Your local stuff: Below this line define 3rd party library settings diff --git a/{{cookiecutter.repo_name}}/requirements/base.txt b/{{cookiecutter.repo_name}}/requirements/base.txt index d9dc0c35..a9c6f39e 100644 --- a/{{cookiecutter.repo_name}}/requirements/base.txt +++ b/{{cookiecutter.repo_name}}/requirements/base.txt @@ -34,4 +34,8 @@ django-autoslug==1.8.0 # Time zones support pytz==2015.4 +{% if cookiecutter.use_celery == "y" %} +celery==3.1.18 +{% endif %} + # Your custom requirements go here diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py index ebc6a5e1..c51fe1a1 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py @@ -1,3 +1,7 @@ # -*- coding: utf-8 -*- +{% if cookiecutter.use_celery == "y" %} +from __future__ import absolute_import +from {{cookiecutter.repo_name}}.celery import app as celery_app +{% endif %} __version__ = '{{ cookiecutter.version }}' __version_info__ = tuple([int(num) if num.isdigit() else num for num in __version__.replace('-', '.', 1).split('.')]) diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py new file mode 100644 index 00000000..6bdbff2e --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py @@ -0,0 +1,26 @@ +{% if cookiecutter.use_celery == "y" %} +from __future__ import absolute_import + +import os + +from celery import Celery + +# set the default Django settings module for the 'celery' program. +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local") + +from django.conf import settings + +app = Celery('{{cookiecutter.repo_name}}') + +# Using a string here means the worker will not have to +# pickle the object when using Windows. +app.config_from_object('django.conf:settings') +app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) + + +@app.task(bind=True) +def debug_task(self): + print('Request: {0!r}'.format(self.request)) +{% else %} +# use this as a starting point for your project with celery. +{% endif %} \ No newline at end of file From 073666e09ccf214f178a99f0326dfdc96aea716e Mon Sep 17 00:00:00 2001 From: Jay Date: Sun, 12 Oct 2014 10:32:17 +0200 Subject: [PATCH 02/11] now passes flake8 --- {{cookiecutter.repo_name}}/config/settings/common.py | 2 -- {{cookiecutter.repo_name}}/config/settings/local.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/{{cookiecutter.repo_name}}/config/settings/common.py b/{{cookiecutter.repo_name}}/config/settings/common.py index a3c9b38d..324a8efd 100644 --- a/{{cookiecutter.repo_name}}/config/settings/common.py +++ b/{{cookiecutter.repo_name}}/config/settings/common.py @@ -255,7 +255,6 @@ LOGGING = { }, } } - {% if cookiecutter.use_celery == "y" %} ########## CELERY # if you are not using the django database broker (e.g. rabbitmq, redis, memcached), you can remove the next line. @@ -263,5 +262,4 @@ INSTALLED_APPS += ('kombu.transport.django',) BROKER_URL = env("CELERY_BROKER_URL", default='django://') ########## END CELERY {% endif %} - # Your common stuff: Below this line define 3rd party library settings diff --git a/{{cookiecutter.repo_name}}/config/settings/local.py b/{{cookiecutter.repo_name}}/config/settings/local.py index 050ac23b..2124fcc6 100644 --- a/{{cookiecutter.repo_name}}/config/settings/local.py +++ b/{{cookiecutter.repo_name}}/config/settings/local.py @@ -58,12 +58,10 @@ INSTALLED_APPS += ('django_extensions', ) # TESTING # ------------------------------------------------------------------------------ TEST_RUNNER = 'django.test.runner.DiscoverRunner' - {% if cookiecutter.celery_support == "y" %} ########## CELERY # In development, all tasks will be executed locally by blocking until the task returns CELERY_ALWAYS_EAGER = True ########## END CELERY {% endif %} - # Your local stuff: Below this line define 3rd party library settings From 7837c4e09914ec002e3c4ea4377919c8ca9c634f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20C=2E=20Barrionuevo=20da=20Luz?= Date: Thu, 9 Jul 2015 11:47:10 -0300 Subject: [PATCH 03/11] update Django version to 1.8.3 https://www.djangoproject.com/weblog/2015/jul/08/security-releases/ --- {{cookiecutter.repo_name}}/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/{{cookiecutter.repo_name}}/requirements/base.txt b/{{cookiecutter.repo_name}}/requirements/base.txt index d9dc0c35..ddbdc62c 100644 --- a/{{cookiecutter.repo_name}}/requirements/base.txt +++ b/{{cookiecutter.repo_name}}/requirements/base.txt @@ -1,5 +1,5 @@ # Bleeding edge Django -django==1.8.2 +django==1.8.3 # Configuration django-environ==0.3.0 From 9bfca28f6f34affa74b950d46e7c821ace6034d4 Mon Sep 17 00:00:00 2001 From: Jay Date: Fri, 10 Jul 2015 11:30:42 +0200 Subject: [PATCH 04/11] refactored to load celery from an AppConfig --- .../config/settings/common.py | 1 + .../{{cookiecutter.repo_name}}/__init__.py | 4 --- .../{{cookiecutter.repo_name}}/celery.py | 26 --------------- .../taskman/__init__.py | 0 .../taskman/celery.py | 32 +++++++++++++++++++ 5 files changed, 33 insertions(+), 30 deletions(-) delete mode 100644 {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py create mode 100644 {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/__init__.py create mode 100644 {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py diff --git a/{{cookiecutter.repo_name}}/config/settings/common.py b/{{cookiecutter.repo_name}}/config/settings/common.py index 324a8efd..072cb75c 100644 --- a/{{cookiecutter.repo_name}}/config/settings/common.py +++ b/{{cookiecutter.repo_name}}/config/settings/common.py @@ -257,6 +257,7 @@ LOGGING = { } {% if cookiecutter.use_celery == "y" %} ########## CELERY +INSTALLED_APPS += ('{{cookiecutter.repo_name}}.taskman.celery.CeleryConfig',) # if you are not using the django database broker (e.g. rabbitmq, redis, memcached), you can remove the next line. INSTALLED_APPS += ('kombu.transport.django',) BROKER_URL = env("CELERY_BROKER_URL", default='django://') diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py index c51fe1a1..ebc6a5e1 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/__init__.py @@ -1,7 +1,3 @@ # -*- coding: utf-8 -*- -{% if cookiecutter.use_celery == "y" %} -from __future__ import absolute_import -from {{cookiecutter.repo_name}}.celery import app as celery_app -{% endif %} __version__ = '{{ cookiecutter.version }}' __version_info__ = tuple([int(num) if num.isdigit() else num for num in __version__.replace('-', '.', 1).split('.')]) diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py deleted file mode 100644 index 6bdbff2e..00000000 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/celery.py +++ /dev/null @@ -1,26 +0,0 @@ -{% if cookiecutter.use_celery == "y" %} -from __future__ import absolute_import - -import os - -from celery import Celery - -# set the default Django settings module for the 'celery' program. -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local") - -from django.conf import settings - -app = Celery('{{cookiecutter.repo_name}}') - -# Using a string here means the worker will not have to -# pickle the object when using Windows. -app.config_from_object('django.conf:settings') -app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) - - -@app.task(bind=True) -def debug_task(self): - print('Request: {0!r}'.format(self.request)) -{% else %} -# use this as a starting point for your project with celery. -{% endif %} \ No newline at end of file diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/__init__.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py new file mode 100644 index 00000000..cd238af8 --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py @@ -0,0 +1,32 @@ +{% if cookiecutter.use_celery == "y" %} +from __future__ import absolute_import +import os +from celery import Celery +from django.apps import AppConfig +from django.conf import settings + +if not settings.configured: + # set the default Django settings module for the 'celery' program. + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local") + + +app = Celery('{{cookiecutter.repo_name}}') + + +class CeleryConfig(AppConfig): + name = '{{cookiecutter.repo_name}}.taskman' + verbose_name = 'Celery Config' + + def ready(self): + # Using a string here means the worker will not have to + # pickle the object when using Windows. + app.config_from_object('django.conf:settings') + app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, force=True) + + +@app.task(bind=True) +def debug_task(self): + print('Request: {0!r}'.format(self.request)) +{% else %} +# use this as a starting point for your project with celery. +{% endif %} \ No newline at end of file From 3710e9b953159788a419c1532364dbd218bec817 Mon Sep 17 00:00:00 2001 From: Daniel Greenfeld Date: Mon, 13 Jul 2015 13:32:47 -0700 Subject: [PATCH 05/11] Changed 'taskman' to 'taskapp --- {{cookiecutter.repo_name}}/config/settings/common.py | 2 +- .../{taskman => taskapp}/__init__.py | 0 .../{taskman => taskapp}/celery.py | 5 +++-- 3 files changed, 4 insertions(+), 3 deletions(-) rename {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/{taskman => taskapp}/__init__.py (100%) rename {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/{taskman => taskapp}/celery.py (83%) diff --git a/{{cookiecutter.repo_name}}/config/settings/common.py b/{{cookiecutter.repo_name}}/config/settings/common.py index 072cb75c..22d3d084 100644 --- a/{{cookiecutter.repo_name}}/config/settings/common.py +++ b/{{cookiecutter.repo_name}}/config/settings/common.py @@ -257,7 +257,7 @@ LOGGING = { } {% if cookiecutter.use_celery == "y" %} ########## CELERY -INSTALLED_APPS += ('{{cookiecutter.repo_name}}.taskman.celery.CeleryConfig',) +INSTALLED_APPS += ('{{cookiecutter.repo_name}}.taskapp.celery.CeleryConfig',) # if you are not using the django database broker (e.g. rabbitmq, redis, memcached), you can remove the next line. INSTALLED_APPS += ('kombu.transport.django',) BROKER_URL = env("CELERY_BROKER_URL", default='django://') diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/__init__.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskapp/__init__.py similarity index 100% rename from {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/__init__.py rename to {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskapp/__init__.py diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskapp/celery.py similarity index 83% rename from {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py rename to {{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskapp/celery.py index cd238af8..33cda5c6 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskman/celery.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/taskapp/celery.py @@ -14,7 +14,7 @@ app = Celery('{{cookiecutter.repo_name}}') class CeleryConfig(AppConfig): - name = '{{cookiecutter.repo_name}}.taskman' + name = '{{cookiecutter.repo_name}}.taskapp' verbose_name = 'Celery Config' def ready(self): @@ -28,5 +28,6 @@ class CeleryConfig(AppConfig): def debug_task(self): print('Request: {0!r}'.format(self.request)) {% else %} -# use this as a starting point for your project with celery. +# Use this as a starting point for your project with celery. +# If you are not using celery, you can remove this app {% endif %} \ No newline at end of file From acfef44b6420048613c39d8642158a090b507011 Mon Sep 17 00:00:00 2001 From: Daniel Greenfeld Date: Mon, 13 Jul 2015 15:39:51 -0700 Subject: [PATCH 06/11] Remove specification for installing just grunt. Otherwise it ignores the other modules. --- {{cookiecutter.repo_name}}/README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/{{cookiecutter.repo_name}}/README.rst b/{{cookiecutter.repo_name}}/README.rst index bc3b1c50..90ea0c7c 100644 --- a/{{cookiecutter.repo_name}}/README.rst +++ b/{{cookiecutter.repo_name}}/README.rst @@ -94,7 +94,7 @@ If you'd like to take advantage of live reloading and Sass / Compass CSS compila Make sure that nodejs_ is installed. Then in the project root run:: - $ npm install grunt + $ npm install .. _nodejs: http://nodejs.org/download/ From e25942652d1999b2398a10477bd3d4c9ce1f25b8 Mon Sep 17 00:00:00 2001 From: Daniel Greenfeld Date: Mon, 13 Jul 2015 15:50:00 -0700 Subject: [PATCH 07/11] Added instructions on how to install compass. --- {{cookiecutter.repo_name}}/README.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/{{cookiecutter.repo_name}}/README.rst b/{{cookiecutter.repo_name}}/README.rst index 90ea0c7c..54c3d305 100644 --- a/{{cookiecutter.repo_name}}/README.rst +++ b/{{cookiecutter.repo_name}}/README.rst @@ -90,7 +90,7 @@ For convenience, you can keep your normal user logged in on Chrome and your supe Live reloading and Sass CSS compilation ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -If you'd like to take advantage of live reloading and Sass / Compass CSS compilation you can do so with the included Grunt task. +If you'd like to take advantage of live reloading and Sass / Compass CSS compilation you can do so with a little bit of prep work. Make sure that nodejs_ is installed. Then in the project root run:: @@ -98,6 +98,10 @@ Make sure that nodejs_ is installed. Then in the project root run:: .. _nodejs: http://nodejs.org/download/ +If you don't already have it, install `compass` (doesn't hurt if you run this command twice):: + + gem install compass + Now you just need:: $ grunt serve From 7a147e72e2dc823af5893a4b00534aa1cb39977b Mon Sep 17 00:00:00 2001 From: Audrey Roy Date: Mon, 13 Jul 2015 19:20:13 -0700 Subject: [PATCH 08/11] Update navbar HTML to latest Bootstrap as per http://getbootstrap.com/components/#navbar --- .../templates/base.html | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/base.html b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/base.html index a46ca11c..558ba25b 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/base.html +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/base.html @@ -34,13 +34,27 @@ -