diff --git a/api/urls.py b/api/urls.py
index ed87f4f..0f62dd1 100644
--- a/api/urls.py
+++ b/api/urls.py
@@ -29,7 +29,7 @@ router.register(r'device-token', views.DeviceTokenViewSet)
router.register(r'data-access', DataAccessViewSet)
router.register(r'unregistered-teams', views.UnregisteredTeamViewSet)
router.register(r'unregistered-players', views.UnregisteredPlayerViewSet)
-### bizdev
+### biz
router.register(r'crm-prospects', views.CRMProspectViewSet)
router.register(r'crm-entities', views.CRMEntityViewSet)
router.register(r'crm-activities', views.CRMActivityViewSet)
diff --git a/api/views.py b/api/views.py
index 467c2aa..fd95ed6 100644
--- a/api/views.py
+++ b/api/views.py
@@ -15,8 +15,8 @@ from django.shortcuts import get_object_or_404
from .serializers import ClubSerializer, CourtSerializer, DateIntervalSerializer, DrawLogSerializer, TournamentSerializer, UserSerializer, EventSerializer, RoundSerializer, GroupStageSerializer, MatchSerializer, TeamScoreSerializer, TeamRegistrationSerializer, PlayerRegistrationSerializer, PurchaseSerializer, ShortUserSerializer, FailedApiCallSerializer, LogSerializer, DeviceTokenSerializer, CustomUserSerializer, UnregisteredTeamSerializer, UnregisteredPlayerSerializer, ImageSerializer
from tournaments.models import Club, Tournament, CustomUser, Event, Round, GroupStage, Match, TeamScore, TeamRegistration, PlayerRegistration, Court, DateInterval, Purchase, FailedApiCall, Log, DeviceToken, DrawLog, UnregisteredTeam, UnregisteredPlayer, Image
-from bizdev.serializers import CRMActivitySerializer, CRMProspectSerializer, CRMEntitySerializer
-from bizdev.models import Activity, Prospect, Entity
+from biz.serializers import CRMActivitySerializer, CRMProspectSerializer, CRMEntitySerializer
+from biz.models import Activity, Prospect, Entity
from rest_framework import viewsets
from rest_framework.response import Response
@@ -858,7 +858,7 @@ def get_fft_federal_clubs(request):
"club_markers": []
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
-### bizdev
+### biz
class CRMActivityViewSet(SoftDeleteViewSet):
queryset = Activity.objects.all()
serializer_class = CRMActivitySerializer
diff --git a/bizdev/__init__.py b/biz/__init__.py
similarity index 100%
rename from bizdev/__init__.py
rename to biz/__init__.py
diff --git a/bizdev/admin.py b/biz/admin.py
similarity index 96%
rename from bizdev/admin.py
rename to biz/admin.py
index 093698f..9acdc81 100644
--- a/bizdev/admin.py
+++ b/biz/admin.py
@@ -91,7 +91,7 @@ def create_activity_for_prospect(modeladmin, request, queryset):
prospect = queryset.first()
# Build the URL with pre-populated fields
- url = reverse('admin:bizdev_activity_add')
+ url = reverse('admin:biz_activity_add')
url += f'?prospect={prospect.id}'
return redirect(url)
create_activity_for_prospect.short_description = "Create activity"
@@ -108,7 +108,7 @@ class ProspectAdmin(SyncedObjectAdmin):
list_filter = (ProspectStatusFilter, ProspectDeclineReasonFilter, 'creation_date', StaffUserFilter, 'source', ProspectProfileFilter)
search_fields = ('first_name', 'last_name', 'email', 'entities__name')
date_hierarchy = 'creation_date'
- change_list_template = "admin/bizdev/prospect/change_list.html"
+ change_list_template = "admin/biz/prospect/change_list.html"
ordering = ['-last_update']
filter_horizontal = ['entities']
actions = ['send_email', create_activity_for_prospect, contacted_by_sms, mark_as_should_test, mark_as_testing, mark_as_customer, declined_too_expensive, declined_use_something_else]
@@ -119,7 +119,7 @@ class ProspectAdmin(SyncedObjectAdmin):
if activities:
activity_links = []
for activity in activities:
- url = f"/kingdom/bizdev/activity/{activity.id}/change/"
+ url = f"/kingdom/biz/activity/{activity.id}/change/"
activity_links.append(f'{activity.html_desc()}')
return format_html('
'.join(activity_links))
return "No events"
@@ -139,8 +139,8 @@ class ProspectAdmin(SyncedObjectAdmin):
Prospect.objects.all().delete()
Activity.objects.all().delete()
- messages.success(request, 'cleanup bizdev objects')
- return redirect('admin:bizdev_prospect_changelist')
+ messages.success(request, 'cleanup biz objects')
+ return redirect('admin:biz_prospect_changelist')
def import_app_users(self, request):
users = CustomUser.objects.filter(origin=UserOrigin.APP)
@@ -177,7 +177,7 @@ class ProspectAdmin(SyncedObjectAdmin):
created_count += 1
messages.success(request, f'Imported {created_count} app users into prospects')
- return redirect('admin:bizdev_prospect_changelist')
+ return redirect('admin:biz_prospect_changelist')
def import_file(self, request):
"""
@@ -190,7 +190,7 @@ class ProspectAdmin(SyncedObjectAdmin):
try:
result = self.import_csv(form.cleaned_data['file'], form.cleaned_data['source'])
messages.success(request, f'File imported successfully: {result}')
- return redirect('admin:bizdev_prospect_changelist')
+ return redirect('admin:biz_prospect_changelist')
except Exception as e:
messages.error(request, f'Error importing file: {str(e)}')
else:
@@ -205,7 +205,7 @@ class ProspectAdmin(SyncedObjectAdmin):
'opts': self.model._meta,
'has_change_permission': self.has_change_permission(request),
}
- return render(request, 'admin/bizdev/prospect/import_file.html', context)
+ return render(request, 'admin/biz/prospect/import_file.html', context)
def import_csv(self, file, source):
"""
@@ -350,7 +350,7 @@ class ProspectAdmin(SyncedObjectAdmin):
else:
form = EmailTemplateSelectionForm()
- return render(request, 'admin/bizdev/select_email_template.html', {
+ return render(request, 'admin/biz/select_email_template.html', {
'prospects': queryset,
'form': form,
'title': 'Send Email to Prospects'
diff --git a/bizdev/admin_urls.py b/biz/admin_urls.py
similarity index 91%
rename from bizdev/admin_urls.py
rename to biz/admin_urls.py
index 76b42c7..17f608b 100644
--- a/bizdev/admin_urls.py
+++ b/biz/admin_urls.py
@@ -63,8 +63,8 @@ def template(user, index):
return f'Bonjour {user.first_name}, \n\nJe te remercie d\'avoir téléchargé Padel Club. J\'ai pu voir que tu avais créé quelques tournois mais sans aller plus loin, est-ce que tu pourrais me dire ce qui t\'as freiné ?\n\nLaurent Morvillier'
urlpatterns = [
- path('email_users/', email_users_view, name='bizdev_email_users'),
- path('email_users_count/', email_users_count, name='bizdev_email_count'),
- path('email_users_with_tournaments_count/', email_users_with_tournaments_count, name='bizdev_email_with_tournaments_count'),
+ path('email_users/', email_users_view, name='biz_email_users'),
+ path('email_users_count/', email_users_count, name='biz_email_count'),
+ path('email_users_with_tournaments_count/', email_users_with_tournaments_count, name='biz_email_with_tournaments_count'),
path('email_users_with_tournaments/', email_users_with_tournaments, name='email_users_with_tournaments'),
]
diff --git a/bizdev/apps.py b/biz/apps.py
similarity index 64%
rename from bizdev/apps.py
rename to biz/apps.py
index deacc18..4962b1e 100644
--- a/bizdev/apps.py
+++ b/biz/apps.py
@@ -1,5 +1,5 @@
from django.apps import AppConfig
-class bizdevConfig(AppConfig):
+class BizConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
- name = 'bizdev'
+ name = 'biz'
diff --git a/bizdev/filters.py b/biz/filters.py
similarity index 100%
rename from bizdev/filters.py
rename to biz/filters.py
diff --git a/bizdev/forms.py b/biz/forms.py
similarity index 100%
rename from bizdev/forms.py
rename to biz/forms.py
diff --git a/bizdev/migrations/0001_initial.py b/biz/migrations/0001_initial.py
similarity index 79%
rename from bizdev/migrations/0001_initial.py
rename to biz/migrations/0001_initial.py
index abdc3d9..da4fa80 100644
--- a/bizdev/migrations/0001_initial.py
+++ b/biz/migrations/0001_initial.py
@@ -1,7 +1,8 @@
-# Generated by Django 5.1 on 2025-07-09 15:18
+# Generated by Django 5.1 on 2025-07-20 10:20
import django.db.models.deletion
import django.utils.timezone
+import uuid
from django.conf import settings
from django.db import migrations, models
@@ -18,12 +19,13 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Activity',
fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('creation_date', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
('last_update', models.DateTimeField(default=django.utils.timezone.now)),
('data_access_ids', models.JSONField(default=list)),
- ('status', models.CharField(blank=True, choices=[('NONE', 'None'), ('CONTACTED', 'Contacted'), ('RESPONDED', 'Responded'), ('SHOULD_TEST', 'Should test'), ('TESTING', 'Testing'), ('CUSTOMER', 'Customer'), ('LOST', 'Lost customer'), ('DECLINED_TOO_EXPENSIVE', 'Too expensive'), ('DECLINED_USE_SOMETHING_ELSE', 'Use something else'), ('DECLINED_OTHER', 'Declined other reason'), ('DECLINED_UNRELATED', 'Declined without significance')], default='NONE', max_length=50, null=True)),
- ('type', models.CharField(blank=True, choices=[('MAIL', 'Mailing List'), ('SMS', 'SMS Campaign'), ('CALL', 'Call'), ('PRESS', 'Press Release')], max_length=20, null=True)),
+ ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
+ ('status', models.CharField(blank=True, choices=[('NONE', 'None'), ('INBOUND', 'Inbound'), ('CONTACTED', 'Contacted'), ('RESPONDED', 'Responded'), ('SHOULD_TEST', 'Should test'), ('TESTING', 'Testing'), ('CUSTOMER', 'Customer'), ('LOST', 'Lost customer'), ('DECLINED', 'Declined'), ('DECLINED_UNRELATED', 'Declined without significance')], max_length=50, null=True)),
+ ('declination_reason', models.CharField(blank=True, choices=[('TOO_EXPENSIVE', 'Too expensive'), ('USE_OTHER_PRODUCT', 'Use other product'), ('USE_ANDROID', 'Use Android'), ('UNKNOWN', 'Unknown')], max_length=50, null=True)),
+ ('type', models.CharField(blank=True, choices=[('MAIL', 'Mail'), ('SMS', 'SMS'), ('CALL', 'Call'), ('PRESS', 'Press Release'), ('WORD_OF_MOUTH', 'Word of mouth')], max_length=20, null=True)),
('description', models.TextField(blank=True, null=True)),
('attachment_text', models.TextField(blank=True, null=True)),
('last_updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
@@ -32,20 +34,19 @@ class Migration(migrations.Migration):
options={
'verbose_name_plural': 'Activities',
'ordering': ['-creation_date'],
- 'permissions': [('manage_events', 'Can manage events'), ('view_events', 'Can view events')],
},
),
migrations.CreateModel(
name='EmailTemplate',
fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('creation_date', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
('last_update', models.DateTimeField(default=django.utils.timezone.now)),
('data_access_ids', models.JSONField(default=list)),
+ ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('name', models.CharField(max_length=100)),
('subject', models.CharField(max_length=200)),
('body', models.TextField(blank=True, null=True)),
- ('activities', models.ManyToManyField(blank=True, related_name='email_templates', to='bizdev.activity')),
+ ('activities', models.ManyToManyField(blank=True, related_name='email_templates', to='biz.activity')),
('last_updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
('related_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
],
@@ -56,10 +57,10 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Entity',
fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('creation_date', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
('last_update', models.DateTimeField(default=django.utils.timezone.now)),
('data_access_ids', models.JSONField(default=list)),
+ ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('name', models.CharField(blank=True, max_length=200, null=True)),
('address', models.CharField(blank=True, max_length=200, null=True)),
('zip_code', models.CharField(blank=True, max_length=20, null=True)),
@@ -75,28 +76,28 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='Prospect',
fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('creation_date', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
('last_update', models.DateTimeField(default=django.utils.timezone.now)),
('data_access_ids', models.JSONField(default=list)),
+ ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
('first_name', models.CharField(blank=True, max_length=200, null=True)),
('last_name', models.CharField(blank=True, max_length=200, null=True)),
('email', models.EmailField(max_length=254, unique=True)),
('phone', models.CharField(blank=True, max_length=25, null=True)),
('name_unsure', models.BooleanField(default=False)),
('source', models.CharField(blank=True, max_length=100, null=True)),
- ('entities', models.ManyToManyField(blank=True, related_name='prospects', to='bizdev.entity')),
+ ('entities', models.ManyToManyField(blank=True, related_name='prospects', to='biz.entity')),
('last_updated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
('official_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
('related_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
],
options={
- 'permissions': [('manage_prospects', 'Can manage prospects'), ('view_prospects', 'Can view prospects')],
+ 'abstract': False,
},
),
migrations.AddField(
model_name='activity',
name='prospects',
- field=models.ManyToManyField(related_name='activities', to='bizdev.prospect'),
+ field=models.ManyToManyField(related_name='activities', to='biz.prospect'),
),
]
diff --git a/bizdev/migrations/__init__.py b/biz/migrations/__init__.py
similarity index 100%
rename from bizdev/migrations/__init__.py
rename to biz/migrations/__init__.py
diff --git a/bizdev/mixins.py b/biz/mixins.py
similarity index 51%
rename from bizdev/mixins.py
rename to biz/mixins.py
index dac9358..3c3f98a 100644
--- a/bizdev/mixins.py
+++ b/biz/mixins.py
@@ -1,6 +1,6 @@
from django.contrib.auth.mixins import UserPassesTestMixin, LoginRequiredMixin
from django.core.exceptions import PermissionDenied
-class bizdevAccessMixin(LoginRequiredMixin, UserPassesTestMixin):
+class bizAccessMixin(LoginRequiredMixin, UserPassesTestMixin):
def test_func(self):
- return self.request.user.groups.filter(name='bizdev Manager').exists()
+ return self.request.user.groups.filter(name='biz Manager').exists()
diff --git a/bizdev/models.py b/biz/models.py
similarity index 100%
rename from bizdev/models.py
rename to biz/models.py
diff --git a/bizdev/serializers.py b/biz/serializers.py
similarity index 100%
rename from bizdev/serializers.py
rename to biz/serializers.py
diff --git a/bizdev/services.py b/biz/services.py
similarity index 100%
rename from bizdev/services.py
rename to biz/services.py
diff --git a/bizdev/templates/admin/bizdev/email_users.html b/biz/templates/admin/biz/email_users.html
similarity index 100%
rename from bizdev/templates/admin/bizdev/email_users.html
rename to biz/templates/admin/biz/email_users.html
diff --git a/bizdev/templates/admin/bizdev/prospect/change_list.html b/biz/templates/admin/biz/prospect/change_list.html
similarity index 100%
rename from bizdev/templates/admin/bizdev/prospect/change_list.html
rename to biz/templates/admin/biz/prospect/change_list.html
diff --git a/bizdev/templates/admin/bizdev/prospect/import_file.html b/biz/templates/admin/biz/prospect/import_file.html
similarity index 100%
rename from bizdev/templates/admin/bizdev/prospect/import_file.html
rename to biz/templates/admin/biz/prospect/import_file.html
diff --git a/bizdev/templates/admin/bizdev/select_email_template.html b/biz/templates/admin/biz/select_email_template.html
similarity index 100%
rename from bizdev/templates/admin/bizdev/select_email_template.html
rename to biz/templates/admin/biz/select_email_template.html
diff --git a/bizdev/templates/bizdev/add_prospect.html b/biz/templates/biz/add_prospect.html
similarity index 98%
rename from bizdev/templates/bizdev/add_prospect.html
rename to biz/templates/biz/add_prospect.html
index a74e4d9..1cf24cd 100644
--- a/bizdev/templates/bizdev/add_prospect.html
+++ b/biz/templates/biz/add_prospect.html
@@ -1,4 +1,4 @@
-{% extends "bizdev/base.html" %}
+{% extends "biz/base.html" %}
{% block content %}