[Python-modules-commits] [django-organizations] 01/04: Imported Upstream version 0.9.2
Scott Kitterman
kitterman at moszumanska.debian.org
Mon Aug 7 05:31:44 UTC 2017
This is an automated email from the git hooks/post-receive script.
kitterman pushed a commit to branch debian/master
in repository django-organizations.
commit 6d6716ce721f43474db94194b289e6dbce1c5c2c
Author: Scott Kitterman <scott at kitterman.com>
Date: Mon Aug 7 01:20:57 2017 -0400
Imported Upstream version 0.9.2
---
HISTORY.rst | 5 +++
PKG-INFO | 11 ++++--
README.rst | 4 +--
django_organizations.egg-info/PKG-INFO | 11 ++++--
organizations/__init__.py | 2 +-
organizations/abstract.py | 14 ++++++--
organizations/admin.py | 12 ++++---
organizations/app_settings.py | 2 +-
organizations/backends/__init__.py | 4 +--
organizations/backends/defaults.py | 65 ++++++++++++++++------------------
organizations/backends/forms.py | 27 ++++++++------
organizations/base.py | 6 ++--
organizations/forms.py | 7 ++--
organizations/mixins.py | 3 +-
organizations/models.py | 6 ++--
organizations/urls.py | 29 ++++++++-------
organizations/utils.py | 11 +++---
organizations/views.py | 34 ++++++++++++------
18 files changed, 148 insertions(+), 105 deletions(-)
diff --git a/HISTORY.rst b/HISTORY.rst
index f335196..265aeac 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -3,6 +3,11 @@
History
=======
+0.9.2
+-----
+
+* Decouple concrete organizations.Organization model from the invitation/registration backends
+
0.9.1
-----
diff --git a/PKG-INFO b/PKG-INFO
index 6c24cea..53b3945 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: django-organizations
-Version: 0.9.1
+Version: 0.9.2
Summary: Group accounts for Django
Home-page: https://github.com/bennylope/django-organizations/
Author: Ben Lopatin
@@ -134,7 +134,7 @@ Description: ====================
the `invitation_backend` function will provide the URLs defined by that
backend::
- ORGS_INVITATION_BACKEND = 'myapp.backends.MyInvitationBackend'
+ INVITATION_BACKEND = 'myapp.backends.MyInvitationBackend'
Usage Overview
@@ -214,7 +214,7 @@ Description: ====================
* Django 1.10.x against Python 2.7, 3.4, 3.5, and PyPy
To run the tests against all target environments, install `tox
- <https://testrun.org/tox/latest/>`_ and then execute the command:
+ <https://testrun.org/tox/latest/>`_ and then execute the command::
tox
@@ -277,6 +277,11 @@ Description: ====================
History
=======
+ 0.9.2
+ -----
+
+ * Decouple concrete organizations.Organization model from the invitation/registration backends
+
0.9.1
-----
diff --git a/README.rst b/README.rst
index c6f5a0f..1dbb447 100644
--- a/README.rst
+++ b/README.rst
@@ -126,7 +126,7 @@ You can specify a different invitation backend in your project settings, and
the `invitation_backend` function will provide the URLs defined by that
backend::
- ORGS_INVITATION_BACKEND = 'myapp.backends.MyInvitationBackend'
+ INVITATION_BACKEND = 'myapp.backends.MyInvitationBackend'
Usage Overview
@@ -206,7 +206,7 @@ The codebase is targeted and tested against:
* Django 1.10.x against Python 2.7, 3.4, 3.5, and PyPy
To run the tests against all target environments, install `tox
-<https://testrun.org/tox/latest/>`_ and then execute the command:
+<https://testrun.org/tox/latest/>`_ and then execute the command::
tox
diff --git a/django_organizations.egg-info/PKG-INFO b/django_organizations.egg-info/PKG-INFO
index 6c24cea..53b3945 100644
--- a/django_organizations.egg-info/PKG-INFO
+++ b/django_organizations.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: django-organizations
-Version: 0.9.1
+Version: 0.9.2
Summary: Group accounts for Django
Home-page: https://github.com/bennylope/django-organizations/
Author: Ben Lopatin
@@ -134,7 +134,7 @@ Description: ====================
the `invitation_backend` function will provide the URLs defined by that
backend::
- ORGS_INVITATION_BACKEND = 'myapp.backends.MyInvitationBackend'
+ INVITATION_BACKEND = 'myapp.backends.MyInvitationBackend'
Usage Overview
@@ -214,7 +214,7 @@ Description: ====================
* Django 1.10.x against Python 2.7, 3.4, 3.5, and PyPy
To run the tests against all target environments, install `tox
- <https://testrun.org/tox/latest/>`_ and then execute the command:
+ <https://testrun.org/tox/latest/>`_ and then execute the command::
tox
@@ -277,6 +277,11 @@ Description: ====================
History
=======
+ 0.9.2
+ -----
+
+ * Decouple concrete organizations.Organization model from the invitation/registration backends
+
0.9.1
-----
diff --git a/organizations/__init__.py b/organizations/__init__.py
index 9cbd29d..9ebcf4a 100644
--- a/organizations/__init__.py
+++ b/organizations/__init__.py
@@ -26,7 +26,7 @@
__author__ = 'Ben Lopatin'
__email__ = 'ben at wellfire.co'
-__version__ = '0.9.1'
+__version__ = '0.9.2'
default_app_config = 'organizations.apps.OrganizationsConfig'
diff --git a/organizations/abstract.py b/organizations/abstract.py
index 2299510..a9890d7 100644
--- a/organizations/abstract.py
+++ b/organizations/abstract.py
@@ -29,14 +29,22 @@ from django.conf import settings
from django.core.urlresolvers import reverse
from django.db import models
from django.utils.translation import ugettext_lazy as _
+
try:
import six
except ImportError:
from django.utils import six
-from .base import OrgMeta, AbstractBaseOrganization, AbstractBaseOrganizationUser, AbstractBaseOrganizationOwner
-from .fields import SlugField, AutoCreatedField, AutoLastModifiedField
-from .signals import user_added, user_removed, owner_changed
+from organizations.base import OrgMeta
+from organizations.base import AbstractBaseOrganization
+from organizations.base import AbstractBaseOrganizationUser
+from organizations.base import AbstractBaseOrganizationOwner
+from organizations.fields import SlugField
+from organizations.fields import AutoCreatedField
+from organizations.fields import AutoLastModifiedField
+from organizations.signals import user_added
+from organizations.signals import user_removed
+from organizations.signals import owner_changed
USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
ORGS_TIMESTAMPED_MODEL = getattr(settings, 'ORGS_TIMESTAMPED_MODEL', None)
diff --git a/organizations/admin.py b/organizations/admin.py
index 08395eb..88684cc 100644
--- a/organizations/admin.py
+++ b/organizations/admin.py
@@ -25,11 +25,13 @@
from django.contrib import admin
-from .base_admin import (BaseOwnerInline,
- BaseOrganizationAdmin,
- BaseOrganizationUserAdmin,
- BaseOrganizationOwnerAdmin)
-from .models import Organization, OrganizationUser, OrganizationOwner
+from organizations.base_admin import BaseOrganizationAdmin
+from organizations.base_admin import BaseOrganizationOwnerAdmin
+from organizations.base_admin import BaseOrganizationUserAdmin
+from organizations.base_admin import BaseOwnerInline
+from organizations.models import Organization
+from organizations.models import OrganizationOwner
+from organizations.models import OrganizationUser
class OwnerInline(BaseOwnerInline):
diff --git a/organizations/app_settings.py b/organizations/app_settings.py
index 201ec91..48d2e88 100644
--- a/organizations/app_settings.py
+++ b/organizations/app_settings.py
@@ -26,7 +26,7 @@
from django.conf import settings
from django.contrib.auth.models import User
-from .utils import model_field_attr
+from organizations.utils import model_field_attr
ORGS_INVITATION_BACKEND = getattr(settings, 'INVITATION_BACKEND',
diff --git a/organizations/backends/__init__.py b/organizations/backends/__init__.py
index 81ad627..8f00030 100644
--- a/organizations/backends/__init__.py
+++ b/organizations/backends/__init__.py
@@ -25,8 +25,8 @@
from importlib import import_module
-from organizations.app_settings import (ORGS_INVITATION_BACKEND,
- ORGS_REGISTRATION_BACKEND)
+from organizations.app_settings import ORGS_INVITATION_BACKEND
+from organizations.app_settings import ORGS_REGISTRATION_BACKEND
def invitation_backend():
diff --git a/organizations/backends/defaults.py b/organizations/backends/defaults.py
index d0c2f63..f537557 100644
--- a/organizations/backends/defaults.py
+++ b/organizations/backends/defaults.py
@@ -31,29 +31,35 @@ import uuid
from django.conf import settings
from django.conf.urls import url
-from django.contrib.auth import authenticate, login, get_user_model
-from django.core.urlresolvers import reverse
+from django.contrib.auth import authenticate
+from django.contrib.auth import get_user_model
+from django.contrib.auth import login
from django.core.mail import EmailMessage
+from django.core.urlresolvers import reverse
from django.http import Http404
-from django.shortcuts import render, redirect
+from django.shortcuts import redirect
+from django.shortcuts import render
from django.template import loader
from django.utils.translation import ugettext as _
-from ..utils import create_organization
-from ..utils import model_field_attr
-from .forms import UserRegistrationForm, OrganizationRegistrationForm
-from .tokens import RegistrationTokenGenerator
+from organizations.backends.forms import UserRegistrationForm
+from organizations.backends.forms import org_registration_form
+from organizations.backends.tokens import RegistrationTokenGenerator
+from organizations.utils import create_organization
+from organizations.utils import default_org_model
+from organizations.utils import model_field_attr
class BaseBackend(object):
"""
Base backend class for registering and inviting users to an organization
"""
- org_model = None
+ registration_form_template = 'organizations/register_form.html'
+ activation_success_template = 'organizations/register_success.html'
- def __init__(self, org_model=None, *args, **kwargs):
+ def __init__(self, org_model=None):
self.user_model = get_user_model()
- self.org_model = org_model
+ self.org_model = org_model or default_org_model()
def get_urls(self):
raise NotImplementedError
@@ -92,7 +98,7 @@ class BaseBackend(object):
relation_name = self.org_model().user_relation_name
except TypeError:
# No org_model specified, raises a TypeError because NoneType is
- # not callable. Thiis the most sensible default
+ # not callable. This the most sensible default:
relation_name = "organizations_organization"
organization_set = getattr(user, relation_name)
for org in organization_set.filter(is_active=False):
@@ -121,8 +127,7 @@ class BaseBackend(object):
password=form.cleaned_data['password'])
login(request, user)
return redirect(self.get_success_url())
- return render(request, 'organizations/register_form.html',
- {'form': form})
+ return render(request, self.registration_form_template, {'form': form})
def send_reminder(self, user, sender=None, **kwargs):
"""Sends a reminder email to the specified user"""
@@ -130,8 +135,7 @@ class BaseBackend(object):
return False
token = RegistrationTokenGenerator().make_token(user)
kwargs.update({'token': token})
- self._send_email(user, self.reminder_subject, self.reminder_body,
- sender, **kwargs)
+ self._send_email(user, self.reminder_subject, self.reminder_body, sender, **kwargs)
# This could be replaced with a more channel agnostic function, most likely
# in a custom backend.
@@ -141,8 +145,7 @@ class BaseBackend(object):
if sender:
from_email = "%s %s <%s>" % (sender.first_name, sender.last_name,
email.utils.parseaddr(settings.DEFAULT_FROM_EMAIL)[1])
- reply_to = "%s %s <%s>" % (sender.first_name, sender.last_name,
- sender.email)
+ reply_to = "%s %s <%s>" % (sender.first_name, sender.last_name, sender.email)
else:
from_email = settings.DEFAULT_FROM_EMAIL
reply_to = from_email
@@ -154,8 +157,7 @@ class BaseBackend(object):
body_template = loader.get_template(body_template)
subject = subject_template.render(kwargs).strip() # Remove stray newline characters
body = body_template.render(kwargs)
- return EmailMessage(subject, body, from_email, [user.email],
- headers=headers).send()
+ return EmailMessage(subject, body, from_email, [user.email], headers=headers).send()
class RegistrationBackend(BaseBackend):
@@ -206,8 +208,7 @@ class RegistrationBackend(BaseBackend):
return False
token = self.get_token(user)
kwargs.update({'token': token})
- self._send_email(user, self.activation_subject, self.activation_body,
- sender, **kwargs)
+ self._send_email(user, self.activation_subject, self.activation_body, sender, **kwargs)
def create_view(self, request):
"""
@@ -215,7 +216,7 @@ class RegistrationBackend(BaseBackend):
"""
if request.user.is_authenticated():
return redirect("organization_add")
- form = OrganizationRegistrationForm(request.POST or None)
+ form = org_registration_form(self.org_model)(request.POST or None)
if form.is_valid():
try:
user = self.user_model.objects.get(email=form.cleaned_data['email'])
@@ -229,13 +230,11 @@ class RegistrationBackend(BaseBackend):
return redirect("organization_add")
organization = create_organization(user, form.cleaned_data['name'],
form.cleaned_data['slug'], is_active=False)
- return render(request, 'organizations/register_success.html',
- {'user': user, 'organization': organization})
- return render(request, 'organizations/register_form.html',
- {'form': form})
+ return render(request, self.activation_success_template, {'user': user, 'organization': organization})
+ return render(request, self.registration_form_template, {'form': form})
def success_view(self, request):
- return render(request, 'organizations/register_success.html', {})
+ return render(request, self.activation_success_template, {})
class InvitationBackend(BaseBackend):
@@ -289,8 +288,8 @@ class InvitationBackend(BaseBackend):
return False
token = self.get_token(user)
kwargs.update({'token': token})
- self._send_email(user, self.invitation_subject, self.invitation_body,
- sender, **kwargs)
+ self._send_email(user, self.invitation_subject, self.invitation_body, sender, **kwargs)
+ return True
def send_notification(self, user, sender=None, **kwargs):
"""
@@ -300,9 +299,5 @@ class InvitationBackend(BaseBackend):
"""
if not user.is_active:
return False
- self._send_email(
- user,
- self.notification_subject,
- self.notification_body,
- sender,
- **kwargs)
+ self._send_email(user, self.notification_subject, self.notification_body, sender, **kwargs)
+ return True
diff --git a/organizations/backends/forms.py b/organizations/backends/forms.py
index 0d249bc..aed6ac8 100644
--- a/organizations/backends/forms.py
+++ b/organizations/backends/forms.py
@@ -27,8 +27,6 @@ from django import forms
from django.contrib.auth import get_user_model
from django.utils.translation import ugettext_lazy as _
-from ..models import Organization
-
class UserRegistrationForm(forms.ModelForm):
"""
@@ -61,14 +59,21 @@ class UserRegistrationForm(forms.ModelForm):
'date_joined', 'groups', 'user_permissions')
-class OrganizationRegistrationForm(forms.ModelForm):
- """Form class for creating new organizations owned by new users."""
- email = forms.EmailField()
+def org_registration_form(org_model):
+ """
+ Generates a registration ModelForm for the given organization model class
+ """
+
+ class OrganizationRegistrationForm(forms.ModelForm):
+ """Form class for creating new organizations owned by new users."""
+ email = forms.EmailField()
+
+ class Meta:
+ model = org_model
+ exclude = ('is_active', 'users')
- class Meta:
- model = Organization
- exclude = ('is_active', 'users')
+ def save(self, *args, **kwargs):
+ self.instance.is_active = False
+ super(OrganizationRegistrationForm, self).save(*args, **kwargs)
- def save(self, *args, **kwargs):
- self.instance.is_active = False
- super(OrganizationRegistrationForm, self).save(*args, **kwargs)
+ return OrganizationRegistrationForm
diff --git a/organizations/base.py b/organizations/base.py
index 8589c42..f06f2cd 100644
--- a/organizations/base.py
+++ b/organizations/base.py
@@ -25,15 +25,17 @@
from django.conf import settings
from django.db import models
-from django.db.models.fields import FieldDoesNotExist
from django.db.models.base import ModelBase
+from django.db.models.fields import FieldDoesNotExist
+
try:
import six
except ImportError:
from django.utils import six
from django.utils.translation import ugettext_lazy as _
-from .managers import OrgManager, ActiveOrgManager
+from organizations.managers import ActiveOrgManager
+from organizations.managers import OrgManager
USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
diff --git a/organizations/forms.py b/organizations/forms.py
index 8ffb445..197135d 100644
--- a/organizations/forms.py
+++ b/organizations/forms.py
@@ -28,9 +28,10 @@ from django.contrib.auth import get_user_model
from django.contrib.sites.shortcuts import get_current_site
from django.utils.translation import ugettext_lazy as _
-from .models import Organization, OrganizationUser
-from .utils import create_organization
-from .backends import invitation_backend
+from organizations.backends import invitation_backend
+from organizations.models import Organization
+from organizations.models import OrganizationUser
+from organizations.utils import create_organization
class OrganizationForm(forms.ModelForm):
diff --git a/organizations/mixins.py b/organizations/mixins.py
index f17dc16..2e49d7e 100644
--- a/organizations/mixins.py
+++ b/organizations/mixins.py
@@ -27,7 +27,8 @@ from django.core.exceptions import PermissionDenied
from django.shortcuts import get_object_or_404
from django.utils.translation import ugettext_lazy as _
-from .models import Organization, OrganizationUser
+from organizations.models import Organization
+from organizations.models import OrganizationUser
class OrganizationMixin(object):
diff --git a/organizations/models.py b/organizations/models.py
index b999412..0eabf19 100644
--- a/organizations/models.py
+++ b/organizations/models.py
@@ -23,9 +23,9 @@
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-from .abstract import (AbstractOrganization,
- AbstractOrganizationUser,
- AbstractOrganizationOwner)
+from organizations.abstract import AbstractOrganization
+from organizations.abstract import AbstractOrganizationOwner
+from organizations.abstract import AbstractOrganizationUser
class Organization(AbstractOrganization):
diff --git a/organizations/urls.py b/organizations/urls.py
index b7a1a81..516573e 100644
--- a/organizations/urls.py
+++ b/organizations/urls.py
@@ -26,45 +26,44 @@
from django.conf.urls import url
from django.contrib.auth.decorators import login_required
-from .views import (OrganizationList, OrganizationDetail,
- OrganizationUpdate, OrganizationDelete, OrganizationCreate,
- OrganizationUserList, OrganizationUserDetail, OrganizationUserUpdate,
- OrganizationUserCreate, OrganizationUserRemind, OrganizationUserDelete)
+from organizations import views
urlpatterns = [
# Organization URLs
- url(r'^$', view=login_required(OrganizationList.as_view()),
+ url(r'^$',
+ view=login_required(views.OrganizationList.as_view()),
name="organization_list"),
- url(r'^add/$', view=login_required(OrganizationCreate.as_view()),
+ url(r'^add/$',
+ view=login_required(views.OrganizationCreate.as_view()),
name="organization_add"),
url(r'^(?P<organization_pk>[\d]+)/$',
- view=login_required(OrganizationDetail.as_view()),
+ view=login_required(views.OrganizationDetail.as_view()),
name="organization_detail"),
url(r'^(?P<organization_pk>[\d]+)/edit/$',
- view=login_required(OrganizationUpdate.as_view()),
+ view=login_required(views.OrganizationUpdate.as_view()),
name="organization_edit"),
url(r'^(?P<organization_pk>[\d]+)/delete/$',
- view=login_required(OrganizationDelete.as_view()),
+ view=login_required(views.OrganizationDelete.as_view()),
name="organization_delete"),
# Organization user URLs
url(r'^(?P<organization_pk>[\d]+)/people/$',
- view=login_required(OrganizationUserList.as_view()),
+ view=login_required(views.OrganizationUserList.as_view()),
name="organization_user_list"),
url(r'^(?P<organization_pk>[\d]+)/people/add/$',
- view=login_required(OrganizationUserCreate.as_view()),
+ view=login_required(views.OrganizationUserCreate.as_view()),
name="organization_user_add"),
url(r'^(?P<organization_pk>[\d]+)/people/(?P<user_pk>[\d]+)/remind/$',
- view=login_required(OrganizationUserRemind.as_view()),
+ view=login_required(views.OrganizationUserRemind.as_view()),
name="organization_user_remind"),
url(r'^(?P<organization_pk>[\d]+)/people/(?P<user_pk>[\d]+)/$',
- view=login_required(OrganizationUserDetail.as_view()),
+ view=login_required(views.OrganizationUserDetail.as_view()),
name="organization_user_detail"),
url(r'^(?P<organization_pk>[\d]+)/people/(?P<user_pk>[\d]+)/edit/$',
- view=login_required(OrganizationUserUpdate.as_view()),
+ view=login_required(views.OrganizationUserUpdate.as_view()),
name="organization_user_edit"),
url(r'^(?P<organization_pk>[\d]+)/people/(?P<user_pk>[\d]+)/delete/$',
- view=login_required(OrganizationUserDelete.as_view()),
+ view=login_required(views.OrganizationUserDelete.as_view()),
name="organization_user_delete"),
]
diff --git a/organizations/utils.py b/organizations/utils.py
index 035c647..2e5ce6a 100644
--- a/organizations/utils.py
+++ b/organizations/utils.py
@@ -25,7 +25,11 @@
from itertools import chain
-from .models import Organization
+
+def default_org_model():
+ """Encapsulates importing the concrete model"""
+ from organizations.models import Organization
+ return Organization
def model_field_names(model):
@@ -41,8 +45,7 @@ def model_field_names(model):
)))
-def create_organization(user, name, slug=None, is_active=None,
- org_defaults=None, org_user_defaults=None, **kwargs):
+def create_organization(user, name, slug=None, is_active=None, org_defaults=None, org_user_defaults=None, **kwargs):
"""
Returns a new organization, also creating an initial organization user who
is the owner.
@@ -56,7 +59,7 @@ def create_organization(user, name, slug=None, is_active=None,
>>> create_account = partial(create_organization, model=Account)
"""
- org_model = kwargs.pop('model', None) or kwargs.pop('org_model', None) or Organization
+ org_model = kwargs.pop('model', None) or kwargs.pop('org_model', None) or default_org_model()
kwargs.pop('org_user_model', None) # Discard deprecated argument
org_owner_model = org_model.owner.related.related_model
diff --git a/organizations/views.py b/organizations/views.py
index cf1fe20..1193759 100644
--- a/organizations/views.py
+++ b/organizations/views.py
@@ -26,18 +26,30 @@
from django.contrib.sites.shortcuts import get_current_site
from django.core.urlresolvers import reverse
from django.http import HttpResponseBadRequest
-from django.shortcuts import render, redirect
+from django.shortcuts import redirect
+from django.shortcuts import render
from django.utils.translation import ugettext as _
-from django.views.generic import (ListView, DetailView, UpdateView, CreateView,
- DeleteView, FormView)
-
-from .backends import invitation_backend, registration_backend
-from .forms import (OrganizationForm, OrganizationUserForm,
- OrganizationUserAddForm, OrganizationAddForm, SignUpForm)
-from .mixins import (OrganizationMixin, OrganizationUserMixin,
- MembershipRequiredMixin, AdminRequiredMixin, OwnerRequiredMixin)
-from .models import Organization
-from .utils import create_organization
+from django.views.generic import CreateView
+from django.views.generic import DeleteView
+from django.views.generic import DetailView
+from django.views.generic import FormView
+from django.views.generic import ListView
+from django.views.generic import UpdateView
+
+from organizations.backends import invitation_backend
+from organizations.backends import registration_backend
+from organizations.forms import OrganizationAddForm
+from organizations.forms import OrganizationForm
+from organizations.forms import OrganizationUserAddForm
+from organizations.forms import OrganizationUserForm
+from organizations.forms import SignUpForm
+from organizations.mixins import AdminRequiredMixin
+from organizations.mixins import MembershipRequiredMixin
+from organizations.mixins import OrganizationMixin
+from organizations.mixins import OrganizationUserMixin
+from organizations.mixins import OwnerRequiredMixin
+from organizations.models import Organization
+from organizations.utils import create_organization
class BaseOrganizationList(ListView):
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/django-organizations.git
More information about the Python-modules-commits
mailing list