renamed crm into bizdev

apikeys
Laurent 4 months ago
parent edead66c2e
commit 9db872e35c
  1. 2
      api/urls.py
  2. 6
      api/views.py
  3. 0
      bizdev/__init__.py
  4. 1
      bizdev/_instructions/base.md
  5. 20
      bizdev/admin.py
  6. 6
      bizdev/admin_urls.py
  7. 4
      bizdev/apps.py
  8. 0
      bizdev/filters.py
  9. 0
      bizdev/forms.py
  10. 8
      bizdev/migrations/0001_initial.py
  11. 0
      bizdev/migrations/__init__.py
  12. 4
      bizdev/mixins.py
  13. 0
      bizdev/models.py
  14. 0
      bizdev/serializers.py
  15. 0
      bizdev/services.py
  16. 0
      bizdev/static/crm/js/prospects.js
  17. 8
      bizdev/templates/admin/bizdev/app_index.html
  18. 0
      bizdev/templates/admin/bizdev/email_users.html
  19. 0
      bizdev/templates/admin/bizdev/prospect/change_list.html
  20. 0
      bizdev/templates/admin/bizdev/prospect/import_file.html
  21. 0
      bizdev/templates/admin/bizdev/select_email_template.html
  22. 2
      bizdev/templates/bizdev/add_prospect.html
  23. 0
      bizdev/templates/bizdev/base.html
  24. 2
      bizdev/templates/bizdev/csv_import.html
  25. 4
      bizdev/templates/bizdev/event_form.html
  26. 4
      bizdev/templates/bizdev/event_row.html
  27. 18
      bizdev/templates/bizdev/events.html
  28. 2
      bizdev/templates/bizdev/prospect_form.html
  29. 14
      bizdev/templates/bizdev/prospect_list.html
  30. 4
      bizdev/templates/bizdev/send_bulk_email.html
  31. 0
      bizdev/templatetags/__init__.py
  32. 7
      bizdev/templatetags/crm_tags.py
  33. 0
      bizdev/tests.py
  34. 2
      bizdev/urls.py
  35. 54
      bizdev/views.py
  36. 1
      crm/_instructions/base.md
  37. 7
      crm/templatetags/crm_tags.py
  38. 2
      padelclub_backend/settings.py
  39. 2
      padelclub_backend/urls.py
  40. 18
      tournaments/migrations/0134_alter_club_timezone.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)
### CRM
### bizdev
router.register(r'crm-prospects', views.CRMProspectViewSet)
router.register(r'crm-entities', views.CRMEntityViewSet)
router.register(r'crm-activities', views.CRMActivityViewSet)

@ -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 crm.serializers import CRMActivitySerializer, CRMProspectSerializer, CRMEntitySerializer
from crm.models import Activity, Prospect, Entity
from bizdev.serializers import CRMActivitySerializer, CRMProspectSerializer, CRMEntitySerializer
from bizdev.models import Activity, Prospect, Entity
from rest_framework import viewsets
from rest_framework.response import Response
@ -887,7 +887,7 @@ def get_fft_club_tournaments_with_umpire_data(request):
'message': f'Unexpected error: {str(e)}'
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
### CRM
### bizdev
class CRMActivityViewSet(SoftDeleteViewSet):
queryset = Activity.objects.all()
serializer_class = CRMActivitySerializer

@ -0,0 +1 @@
This is a django customer relationship managemement app.

@ -77,7 +77,7 @@ def create_activity_for_prospect(modeladmin, request, queryset):
prospect = queryset.first()
# Build the URL with pre-populated fields
url = reverse('admin:crm_activity_add')
url = reverse('admin:bizdev_activity_add')
url += f'?prospect={prospect.id}'
# You can add more fields as URL parameters
@ -98,7 +98,7 @@ class ProspectAdmin(SyncedObjectAdmin):
list_filter = ('creation_date', StaffUserFilter, 'source', ProspectProfileFilter)
search_fields = ('first_name', 'last_name', 'email')
date_hierarchy = 'creation_date'
change_list_template = "admin/crm/prospect/change_list.html"
change_list_template = "admin/bizdev/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]
@ -108,7 +108,7 @@ class ProspectAdmin(SyncedObjectAdmin):
if events:
event_links = []
for event in events:
url = f"/kingdom/crm/event/{event.id}/change/"
url = f"/kingdom/bizdev/event/{event.id}/change/"
event_links.append(f'<a href="{url}">{event.html_desc()}</a>')
return format_html('<br>'.join(event_links))
return "No events"
@ -118,7 +118,7 @@ class ProspectAdmin(SyncedObjectAdmin):
def changelist_view(self, request, extra_context=None):
# Add the URL with a filter for the current user
user_filter_url = "{}?related_user__id__exact={}".format(
reverse('admin:crm_prospect_changelist'),
reverse('admin:bizdev_prospect_changelist'),
request.user.id
)
extra_context = extra_context or {}
@ -139,8 +139,8 @@ class ProspectAdmin(SyncedObjectAdmin):
Prospect.objects.all().delete()
Activity.objects.all().delete()
messages.success(request, 'cleanup CRM objects')
return redirect('admin:crm_prospect_changelist')
messages.success(request, 'cleanup bizdev objects')
return redirect('admin:bizdev_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:crm_prospect_changelist')
return redirect('admin:bizdev_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:crm_prospect_changelist')
return redirect('admin:bizdev_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/crm/prospect/import_file.html', context)
return render(request, 'admin/bizdev/prospect/import_file.html', context)
def import_csv(self, file, source):
"""
@ -336,7 +336,7 @@ class ProspectAdmin(SyncedObjectAdmin):
else:
form = EmailTemplateSelectionForm()
return render(request, 'admin/crm/select_email_template.html', {
return render(request, 'admin/bizdev/select_email_template.html', {
'prospects': queryset,
'form': form,
'title': 'Send Email to Prospects'

@ -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='crm_email_users'),
path('email_users_count/', email_users_count, name='crm_email_count'),
path('email_users_with_tournaments_count/', email_users_with_tournaments_count, name='crm_email_with_tournaments_count'),
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_with_tournaments/', email_users_with_tournaments, name='email_users_with_tournaments'),
]

@ -1,5 +1,5 @@
from django.apps import AppConfig
class CrmConfig(AppConfig):
class bizdevConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'crm'
name = 'bizdev'

@ -1,4 +1,4 @@
# Generated by Django 5.1 on 2025-07-09 13:33
# Generated by Django 5.1 on 2025-07-09 15:18
import django.db.models.deletion
import django.utils.timezone
@ -45,7 +45,7 @@ class Migration(migrations.Migration):
('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='crm.activity')),
('activities', models.ManyToManyField(blank=True, related_name='email_templates', to='bizdev.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)),
],
@ -85,7 +85,7 @@ class Migration(migrations.Migration):
('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='crm.entity')),
('entities', models.ManyToManyField(blank=True, related_name='prospects', to='bizdev.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)),
@ -97,6 +97,6 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='activity',
name='prospects',
field=models.ManyToManyField(related_name='activities', to='crm.prospect'),
field=models.ManyToManyField(related_name='activities', to='bizdev.prospect'),
),
]

@ -1,6 +1,6 @@
from django.contrib.auth.mixins import UserPassesTestMixin, LoginRequiredMixin
from django.core.exceptions import PermissionDenied
class CRMAccessMixin(LoginRequiredMixin, UserPassesTestMixin):
class bizdevAccessMixin(LoginRequiredMixin, UserPassesTestMixin):
def test_func(self):
return self.request.user.groups.filter(name='CRM Manager').exists()
return self.request.user.groups.filter(name='bizdev Manager').exists()

@ -1,4 +1,4 @@
<!-- templates/admin/crm/app_index.html -->
<!-- templates/admin/bizdev/app_index.html -->
{% extends "admin/app_index.html" %}
{% load i18n %}
@ -6,13 +6,13 @@
<div class="module" style="margin-bottom: 20px;">
<!-- <h2>{% trans "Actions" %}</h2> -->
<div class="form-row">
<a href="{% url 'crm_email_count' %}" class="button default" style="margin-right: 5px;">
<a href="{% url 'bizdev_email_count' %}" class="button default" style="margin-right: 5px;">
{% trans "Count Users no event" %}
</a>
<a href="{% url 'crm_email_users' %}" class="button default" style="margin-right: 5px;">
<a href="{% url 'bizdev_email_users' %}" class="button default" style="margin-right: 5px;">
{% trans "Insta send email no event" %}
</a>
<a href="{% url 'crm_email_with_tournaments_count' %}" class="button default" style="margin-right: 5px;">
<a href="{% url 'bizdev_email_with_tournaments_count' %}" class="button default" style="margin-right: 5px;">
{% trans "Count Users" %}
</a>
<a href="{% url 'email_users_with_tournaments' %}" class="button default" style="margin-right: 5px;">

@ -1,4 +1,4 @@
{% extends "crm/base.html" %}
{% extends "bizdev/base.html" %}
{% block content %}
<div class="container padding-bottom">

@ -1,4 +1,4 @@
{% extends "crm/base.html" %}
{% extends "bizdev/base.html" %}
{% block content %}
<div class="container mt-4">

@ -1,4 +1,4 @@
{% extends "crm/base.html" %} {% block content %}
{% extends "bizdev/base.html" %} {% block content %}
<div class="container">
<div class="grid-x padding-bottom">
<div class="cell medium-6 large-6 padding10 bubble">
@ -14,7 +14,7 @@
Save Event
</button>
<a
href="{% url 'crm:planned_events' %}"
href="{% url 'bizdev:planned_events' %}"
class="btn btn-secondary"
>Cancel</a
>

@ -7,9 +7,9 @@
<div class="right-column">
<span>{{ event.date|date:"d/m/Y H:i" }}</span>
<a href="{% url 'crm:edit_event' event.id %}" class="small-button">Edit</a>
<a href="{% url 'bizdev:edit_event' event.id %}" class="small-button">Edit</a>
<!-- {% if event.status == 'PLANNED' %}
<a href="{% url 'crm:start_event' event.id %}" class="small-button">Start</a>
<a href="{% url 'bizdev:start_event' event.id %}" class="small-button">Start</a>
{% endif %} -->
</div>
</div>

@ -1,23 +1,23 @@
{% extends "crm/base.html" %}
{% load crm_tags %}
{% extends "bizdev/base.html" %}
{% load bizdev_tags %}
{% block content %}
{% if request.user|is_crm_manager %}
{% if request.user|is_bizdev_manager %}
<div class="d-flex">
<a href="{% url 'crm:prospect-list' %}" class="small-button margin-v20">
<a href="{% url 'bizdev:prospect-list' %}" class="small-button margin-v20">
Prospects
</a>
<a href="{% url 'crm:add-event' %}" class="small-button margin-v20">
<a href="{% url 'bizdev:add-event' %}" class="small-button margin-v20">
Ajouter un évènement
</a>
<a href="{% url 'crm:add-prospect' %}" class="small-button margin-v20 left-margin">
<a href="{% url 'bizdev:add-prospect' %}" class="small-button margin-v20 left-margin">
Ajouter un prospect
</a>
<a href="{% url 'crm:csv-import' %}" class="small-button margin-v20 left-margin">
<a href="{% url 'bizdev:csv-import' %}" class="small-button margin-v20 left-margin">
Import
</a>
</div>
@ -31,7 +31,7 @@
<div class="list-group">
{% for event in completed_events %}
{% include "crm/event_row.html" with event=event %}
{% include "bizdev/event_row.html" with event=event %}
{% empty %}
<div class="list-group-item">No completed events.</div>
{% endfor %}
@ -47,7 +47,7 @@
<div class="list-group">
{% for event in planned_events %}
{% include "crm/event_row.html" with event=event %}
{% include "bizdev/event_row.html" with event=event %}
{% empty %}
<div class="list-group-item">No planned events.</div>
{% endfor %}

@ -1,4 +1,4 @@
{% extends "crm/base.html" %}
{% extends "bizdev/base.html" %}
{% block head_title %}{{ first_title }}{% endblock %}
{% block first_title %}{{ first_title }}{% endblock %}

@ -1,4 +1,4 @@
{% extends "crm/base.html" %}
{% extends "bizdev/base.html" %}
{% load static %}
@ -18,15 +18,15 @@
{% endfor %}
<div class="filter-buttons">
<button type="submit" class="btn btn-primary">Filter</button>
<a href="{% url 'crm:prospect-list' %}" class="btn btn-secondary">Clear</a>
<a href="{% url 'bizdev:prospect-list' %}" class="btn btn-secondary">Clear</a>
</div>
</form>
</div>
</div>
<!-- <div class="mb-3">
<a href="{% url 'crm:csv-import' %}" class="btn btn-success">Import CSV</a>
<a href="{% url 'crm:send-bulk-email' %}" class="btn btn-primary">Send Email</a>
<a href="{% url 'bizdev:csv-import' %}" class="btn btn-success">Import CSV</a>
<a href="{% url 'bizdev:send-bulk-email' %}" class="btn btn-primary">Send Email</a>
</div> -->
<span>{{ filter.qs|length }} résultats</span>
@ -60,11 +60,11 @@
{% endfor %}
</td>
<td>
<a href="{% url 'crm:edit-prospect' prospect.id %}">
<a href="{% url 'bizdev:edit-prospect' prospect.id %}">
<button class="btn btn-sm btn-secondary">Edit</button>
</a>
<a href="{% url 'crm:add-event-for-prospect' prospect.id %}">
<a href="{% url 'bizdev:add-event-for-prospect' prospect.id %}">
<button class="btn btn-sm btn-secondary">+ Event</button>
</a>
</td>
@ -77,5 +77,5 @@
{% endblock %}
{% block extra_js %}
<script src="{% static 'crm/js/prospects.js' %}"></script>
<script src="{% static 'bizdev/js/prospects.js' %}"></script>
{% endblock %}

@ -1,4 +1,4 @@
{% extends "crm/base.html" %}
{% extends "bizdev/base.html" %}
{% block content %}
<div class="container mt-4">
@ -41,7 +41,7 @@
</div>
<button type="submit" class="btn btn-primary">Send Email</button>
<a href="{% url 'crm:prospect-list' %}" class="btn btn-secondary">Cancel</a>
<a href="{% url 'bizdev:prospect-list' %}" class="btn btn-secondary">Cancel</a>
</form>
</div>
{% endblock %}

@ -0,0 +1,7 @@
from django import template
register = template.Library()
@register.filter(name='is_bizdev_manager')
def is_bizdev_manager(user):
return user.groups.filter(name='bizdev Manager').exists()

@ -1,7 +1,7 @@
from django.urls import path
from . import views
app_name = 'crm'
app_name = 'bizdev'
urlpatterns = [
path('', views.EventListView.as_view(), name='planned_events'),path('', views.EventListView.as_view(), name='events'),

@ -19,13 +19,13 @@ from .models import Event, Prospect, ActivityType
from .filters import ProspectFilter
from .forms import CSVImportForm
from .mixins import CRMAccessMixin
from .mixins import bizdevAccessMixin
import csv
from io import TextIOWrapper
from datetime import datetime
# @permission_required('crm.view_crm', raise_exception=True)
# @permission_required('bizdev.view_bizdev', raise_exception=True)
# def prospect_form(request, pk=None):
# # Get the prospect instance if pk is provided (edit mode)
# prospect = get_object_or_404(Prospect, pk=pk) if pk else None
@ -42,7 +42,7 @@ from datetime import datetime
# action = 'updated' if pk else 'added'
# messages.success(request,
# f'Prospect {prospect.entity_name} has been {action} successfully!')
# return redirect('crm:events')
# return redirect('bizdev:events')
# else:
# form = ProspectForm(instance=prospect)
@ -52,9 +52,9 @@ from datetime import datetime
# 'first_title': prospect.entity_name if prospect else 'Add Prospect',
# 'second_title': prospect.full_name() if prospect else None
# }
# return render(request, 'crm/prospect_form.html', context)
# return render(request, 'bizdev/prospect_form.html', context)
# # @permission_required('crm.view_crm', raise_exception=True)
# # @permission_required('bizdev.view_bizdev', raise_exception=True)
# # def add_prospect(request):
# # if request.method == 'POST':
# # entity_name = request.POST.get('entity_name')
@ -82,17 +82,17 @@ from datetime import datetime
# # modified_by=request.user
# # )
# # messages.success(request, f'Prospect {name} has been added successfully!')
# # return redirect('crm:events') # or wherever you want to redirect after success
# # return redirect('bizdev:events') # or wherever you want to redirect after success
# # except Exception as e:
# # messages.error(request, f'Error adding prospect: {str(e)}')
# # return render(request, 'crm/add_prospect.html')
# # return render(request, 'bizdev/add_prospect.html')
# class EventCreateView(CRMAccessMixin, CreateView):
# class EventCreateView(bizdevAccessMixin, CreateView):
# model = Event
# form_class = EventForm
# template_name = 'crm/event_form.html'
# success_url = reverse_lazy('crm:planned_events')
# template_name = 'bizdev/event_form.html'
# success_url = reverse_lazy('bizdev:planned_events')
# def get_initial(self):
# initial = super().get_initial()
@ -106,11 +106,11 @@ from datetime import datetime
# form.instance.modified_by = self.request.user
# return super().form_valid(form)
# class EditEventView(CRMAccessMixin, UpdateView):
# class EditEventView(bizdevAccessMixin, UpdateView):
# model = Event
# form_class = EventForm
# template_name = 'crm/event_form.html'
# success_url = reverse_lazy('crm:planned_events')
# template_name = 'bizdev/event_form.html'
# success_url = reverse_lazy('bizdev:planned_events')
# def form_valid(self, form):
# form.instance.modified_by = self.request.user
@ -118,7 +118,7 @@ from datetime import datetime
# messages.success(self.request, 'Event updated successfully!')
# return response
# class StartEventView(CRMAccessMixin, BaseUpdateView):
# class StartEventView(bizdevAccessMixin, BaseUpdateView):
# model = Event
# http_method_names = ['post', 'get']
@ -132,23 +132,23 @@ from datetime import datetime
# if event.type == 'MAIL':
# return HttpResponseRedirect(
# reverse_lazy('crm:setup_email_campaign', kwargs={'event_id': event.id})
# reverse_lazy('bizdev:setup_email_campaign', kwargs={'event_id': event.id})
# )
# elif event.type == 'SMS':
# return HttpResponseRedirect(
# reverse_lazy('crm:setup_sms_campaign', kwargs={'event_id': event.id})
# reverse_lazy('bizdev:setup_sms_campaign', kwargs={'event_id': event.id})
# )
# elif event.type == 'PRESS':
# return HttpResponseRedirect(
# reverse_lazy('crm:setup_press_release', kwargs={'event_id': event.id})
# reverse_lazy('bizdev:setup_press_release', kwargs={'event_id': event.id})
# )
# messages.success(request, 'Event started successfully!')
# return HttpResponseRedirect(reverse_lazy('crm:planned_events'))
# return HttpResponseRedirect(reverse_lazy('bizdev:planned_events'))
# class EventListView(CRMAccessMixin, ListView):
# class EventListView(bizdevAccessMixin, ListView):
# model = Event
# template_name = 'crm/events.html'
# template_name = 'bizdev/events.html'
# context_object_name = 'events' # We won't use this since we're providing custom context
# def get_context_data(self, **kwargs):
@ -161,9 +161,9 @@ from datetime import datetime
# ).order_by('-date')
# return context
# class ProspectListView(CRMAccessMixin, ListView):
# class ProspectListView(bizdevAccessMixin, ListView):
# model = Prospect
# template_name = 'crm/prospect_list.html'
# template_name = 'bizdev/prospect_list.html'
# context_object_name = 'prospects'
# filterset_class = ProspectFilter
@ -178,8 +178,8 @@ from datetime import datetime
# )
# return context
# class CSVImportView(CRMAccessMixin, FormView):
# template_name = 'crm/csv_import.html'
# class CSVImportView(bizdevAccessMixin, FormView):
# template_name = 'bizdev/csv_import.html'
# form_class = CSVImportForm
# success_url = reverse_lazy('prospect-list')
@ -247,10 +247,10 @@ from datetime import datetime
# return super().form_valid(form)
# class SendBulkEmailView(CRMAccessMixin, FormView):
# template_name = 'crm/send_bulk_email.html'
# class SendBulkEmailView(bizdevAccessMixin, FormView):
# template_name = 'bizdev/send_bulk_email.html'
# form_class = BulkEmailForm
# success_url = reverse_lazy('crm:prospect-list')
# success_url = reverse_lazy('bizdev:prospect-list')
# def form_valid(self, form):
# prospects = form.cleaned_data['prospects']

@ -1 +0,0 @@
This is a django customer relationship managemement (CRM) app.

@ -1,7 +0,0 @@
from django import template
register = template.Library()
@register.filter(name='is_crm_manager')
def is_crm_manager(user):
return user.groups.filter(name='CRM Manager').exists()

@ -36,7 +36,7 @@ INSTALLED_APPS = [
'sync',
'tournaments',
'shop',
'crm',
'bizdev',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',

@ -34,7 +34,7 @@ urlpatterns = [
path('kingdom/debug/player-license-lookup/', get_player_license_info, name='player_license_lookup'),
path('kingdom/debug/bulk-license-lookup/', bulk_license_lookup, name='bulk_license_lookup'),
path('kingdom/debug/explore-api-endpoints/', explore_fft_api_endpoints, name='explore_api_endpoints'),
path('kingdom/crm/', include('crm.admin_urls')),
path('kingdom/bizdev/', include('bizdev.admin_urls')),
path('kingdom/', admin.site.urls),
path('api-auth/', include('rest_framework.urls')),
path('dj-auth/', include('django.contrib.auth.urls')),

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save