diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..afbacac --- /dev/null +++ b/.coveragerc @@ -0,0 +1,2 @@ +[run] +include = invitations* diff --git a/.gitignore b/.gitignore index 0f73a71..82c2424 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ dist/ django_invitations.egg-info/ .gitchangelog.rc .python-version - +.coverage diff --git a/.travis.yml b/.travis.yml index 476709f..f954523 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,9 +24,13 @@ matrix: install: - pip install tox - pip install flake8 + - pip install coveralls branches: - devel - master script: tox -e $TOX_ENV + +after_success: + - coveralls diff --git a/README.md b/README.md index f2c2510..17e372d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ ##Django-invitations - Invitation integration for django-allauth -[![Build Status](https://travis-ci.org/bee-keeper/django-invitations.svg?branch=devel)](https://travis-ci.org/bee-keeper/django-invitations) +[![Build Status](https://travis-ci.org/bee-keeper/django-invitations.svg?branch=master)](https://travis-ci.org/bee-keeper/django-invitations) + +[![Coverage Status](https://coveralls.io/repos/bee-keeper/django-invitations/badge.svg?branch=devel&service=github)](https://coveralls.io/github/bee-keeper/django-invitations?branch=devel) ###About A Django invite app for the excellent [django-allauth](https://github.com/pennersr/django-allauth). All emails and messages are fully customisable. diff --git a/invitations/forms.py b/invitations/forms.py index c0815b4..0e769e1 100644 --- a/invitations/forms.py +++ b/invitations/forms.py @@ -64,14 +64,17 @@ class InvitationAdminAddForm(forms.ModelForm, CleanEmailMixin): def save(self, *args, **kwargs): cleaned_data = super(InvitationAdminAddForm, self).clean() email = cleaned_data.get("email") - instance = Invitation.create(email=email) + params = {'email': email} + if cleaned_data.get("inviter"): + params['inviter'] = cleaned_data.get("inviter") + instance = Invitation.create(**params) instance.send_invitation(self.request) super(InvitationAdminAddForm, self).save(*args, **kwargs) return instance class Meta: model = Invitation - fields = ("email", ) + fields = ("email", "inviter") class InvitationAdminChangeForm(forms.ModelForm): diff --git a/invitations/migrations/0003_auto_20151126_1523.py b/invitations/migrations/0003_auto_20151126_1523.py new file mode 100644 index 0000000..6bcdb5a --- /dev/null +++ b/invitations/migrations/0003_auto_20151126_1523.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('invitations', '0002_auto_20151126_0426'), + ] + + operations = [ + migrations.AlterField( + model_name='invitation', + name='inviter', + field=models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, null=True), + ), + ] diff --git a/invitations/models.py b/invitations/models.py index 2657652..656020d 100644 --- a/invitations/models.py +++ b/invitations/models.py @@ -26,17 +26,18 @@ class Invitation(models.Model): default=timezone.now) key = models.CharField(verbose_name=_('key'), max_length=64, unique=True) sent = models.DateTimeField(verbose_name=_('sent'), null=True) - inviter = models.ForeignKey(settings.AUTH_USER_MODEL, null=True) + inviter = models.ForeignKey( + settings.AUTH_USER_MODEL, null=True, blank=True) objects = InvitationManager() @classmethod - def create(cls, email, user=None): + def create(cls, email, inviter=None): key = get_random_string(64).lower() instance = cls._default_manager.create( email=email, key=key, - inviter=user) + inviter=inviter) return instance def key_expired(self): diff --git a/invitations/tests.py b/invitations/tests.py index f3ca655..fdda9b8 100644 --- a/invitations/tests.py +++ b/invitations/tests.py @@ -145,7 +145,8 @@ def setUpClass(cls): cls.user = get_user_model().objects.create_user( username='flibble', password='password') - cls.invitation = Invitation.create('email@example.com', user=cls.user) + cls.invitation = Invitation.create( + 'email@example.com', inviter=cls.user) @classmethod def tearDownClass(cls): diff --git a/requirements.txt b/requirements.txt index dac3220..d56c8c2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -django-allauth>=0.22 +django-allauth tox>=2.1.1 mock>=1.3.0 coverage>=3.7.1 diff --git a/test_settings.py b/test_settings.py index a83a958..06ea950 100644 --- a/test_settings.py +++ b/test_settings.py @@ -9,10 +9,6 @@ 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:', - 'USER': '', - 'PASSWORD': '', - 'HOST': '', - 'PORT': '', } } @@ -56,6 +52,7 @@ INSTALLED_APPS = ( 'django.contrib.auth', + 'django.contrib.admin', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', @@ -68,6 +65,7 @@ ) EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend' +# EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', diff --git a/test_urls.py b/test_urls.py index dcbc172..3e5cc2b 100644 --- a/test_urls.py +++ b/test_urls.py @@ -1,8 +1,11 @@ from django.conf.urls import patterns, url, include +from django.contrib import admin + urlpatterns = patterns( '', url(r'^invitations/', include( 'invitations.urls', namespace='invitations')), url(r'^accounts/', include('allauth.urls')), + url(r'^admin/', include(admin.site.urls)), ) diff --git a/tox.ini b/tox.ini index fcc27af..c35d690 100644 --- a/tox.ini +++ b/tox.ini @@ -11,7 +11,9 @@ deps = commands = python -V - python manage.py test + coverage run manage.py test + coverage report + coverage html [testenv:flake8] basepython=python