diff --git a/api/urls.py b/api/urls.py index 072e52b..13a76a6 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) -### CRM +### bizdev 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 c69c63a..db4b1e3 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 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 diff --git a/crm/__init__.py b/bizdev/__init__.py similarity index 100% rename from crm/__init__.py rename to bizdev/__init__.py diff --git a/bizdev/_instructions/base.md b/bizdev/_instructions/base.md new file mode 100644 index 0000000..d6d8c2b --- /dev/null +++ b/bizdev/_instructions/base.md @@ -0,0 +1 @@ +This is a django customer relationship managemement app. diff --git a/crm/admin.py b/bizdev/admin.py similarity index 96% rename from crm/admin.py rename to bizdev/admin.py index 5b72094..79d6735 100644 --- a/crm/admin.py +++ b/bizdev/admin.py @@ -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'{event.html_desc()}') return format_html('
'.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' diff --git a/crm/admin_urls.py b/bizdev/admin_urls.py similarity index 91% rename from crm/admin_urls.py rename to bizdev/admin_urls.py index 5d94c6e..76b42c7 100644 --- a/crm/admin_urls.py +++ b/bizdev/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='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'), ] diff --git a/crm/apps.py b/bizdev/apps.py similarity index 64% rename from crm/apps.py rename to bizdev/apps.py index 7593b92..deacc18 100644 --- a/crm/apps.py +++ b/bizdev/apps.py @@ -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' diff --git a/crm/filters.py b/bizdev/filters.py similarity index 100% rename from crm/filters.py rename to bizdev/filters.py diff --git a/crm/forms.py b/bizdev/forms.py similarity index 100% rename from crm/forms.py rename to bizdev/forms.py diff --git a/crm/migrations/0001_initial.py b/bizdev/migrations/0001_initial.py similarity index 97% rename from crm/migrations/0001_initial.py rename to bizdev/migrations/0001_initial.py index 53b1496..abdc3d9 100644 --- a/crm/migrations/0001_initial.py +++ b/bizdev/migrations/0001_initial.py @@ -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'), ), ] diff --git a/crm/migrations/__init__.py b/bizdev/migrations/__init__.py similarity index 100% rename from crm/migrations/__init__.py rename to bizdev/migrations/__init__.py diff --git a/crm/mixins.py b/bizdev/mixins.py similarity index 51% rename from crm/mixins.py rename to bizdev/mixins.py index debe594..dac9358 100644 --- a/crm/mixins.py +++ b/bizdev/mixins.py @@ -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() diff --git a/crm/models.py b/bizdev/models.py similarity index 100% rename from crm/models.py rename to bizdev/models.py diff --git a/crm/serializers.py b/bizdev/serializers.py similarity index 100% rename from crm/serializers.py rename to bizdev/serializers.py diff --git a/crm/services.py b/bizdev/services.py similarity index 100% rename from crm/services.py rename to bizdev/services.py diff --git a/crm/static/crm/js/prospects.js b/bizdev/static/crm/js/prospects.js similarity index 100% rename from crm/static/crm/js/prospects.js rename to bizdev/static/crm/js/prospects.js diff --git a/crm/templates/admin/crm/app_index.html b/bizdev/templates/admin/bizdev/app_index.html similarity index 61% rename from crm/templates/admin/crm/app_index.html rename to bizdev/templates/admin/bizdev/app_index.html index 0da9f93..9c83f1a 100644 --- a/crm/templates/admin/crm/app_index.html +++ b/bizdev/templates/admin/bizdev/app_index.html @@ -1,4 +1,4 @@ - + {% extends "admin/app_index.html" %} {% load i18n %} @@ -6,13 +6,13 @@
- + {% trans "Count Users no event" %} - + {% trans "Insta send email no event" %} - + {% trans "Count Users" %} diff --git a/crm/templates/admin/crm/email_users.html b/bizdev/templates/admin/bizdev/email_users.html similarity index 100% rename from crm/templates/admin/crm/email_users.html rename to bizdev/templates/admin/bizdev/email_users.html diff --git a/crm/templates/admin/crm/prospect/change_list.html b/bizdev/templates/admin/bizdev/prospect/change_list.html similarity index 100% rename from crm/templates/admin/crm/prospect/change_list.html rename to bizdev/templates/admin/bizdev/prospect/change_list.html diff --git a/crm/templates/admin/crm/prospect/import_file.html b/bizdev/templates/admin/bizdev/prospect/import_file.html similarity index 100% rename from crm/templates/admin/crm/prospect/import_file.html rename to bizdev/templates/admin/bizdev/prospect/import_file.html diff --git a/crm/templates/admin/crm/select_email_template.html b/bizdev/templates/admin/bizdev/select_email_template.html similarity index 100% rename from crm/templates/admin/crm/select_email_template.html rename to bizdev/templates/admin/bizdev/select_email_template.html diff --git a/crm/templates/crm/add_prospect.html b/bizdev/templates/bizdev/add_prospect.html similarity index 98% rename from crm/templates/crm/add_prospect.html rename to bizdev/templates/bizdev/add_prospect.html index 53a667a..a74e4d9 100644 --- a/crm/templates/crm/add_prospect.html +++ b/bizdev/templates/bizdev/add_prospect.html @@ -1,4 +1,4 @@ -{% extends "crm/base.html" %} +{% extends "bizdev/base.html" %} {% block content %}
diff --git a/crm/templates/crm/base.html b/bizdev/templates/bizdev/base.html similarity index 100% rename from crm/templates/crm/base.html rename to bizdev/templates/bizdev/base.html diff --git a/crm/templates/crm/csv_import.html b/bizdev/templates/bizdev/csv_import.html similarity index 96% rename from crm/templates/crm/csv_import.html rename to bizdev/templates/bizdev/csv_import.html index 5041a0a..44c3ab1 100644 --- a/crm/templates/crm/csv_import.html +++ b/bizdev/templates/bizdev/csv_import.html @@ -1,4 +1,4 @@ -{% extends "crm/base.html" %} +{% extends "bizdev/base.html" %} {% block content %}
diff --git a/crm/templates/crm/event_form.html b/bizdev/templates/bizdev/event_form.html similarity index 85% rename from crm/templates/crm/event_form.html rename to bizdev/templates/bizdev/event_form.html index 534b611..74f2a10 100644 --- a/crm/templates/crm/event_form.html +++ b/bizdev/templates/bizdev/event_form.html @@ -1,4 +1,4 @@ -{% extends "crm/base.html" %} {% block content %} +{% extends "bizdev/base.html" %} {% block content %}
@@ -14,7 +14,7 @@ Save Event Cancel diff --git a/crm/templates/crm/event_row.html b/bizdev/templates/bizdev/event_row.html similarity index 71% rename from crm/templates/crm/event_row.html rename to bizdev/templates/bizdev/event_row.html index 2042fef..a37fc7b 100644 --- a/crm/templates/crm/event_row.html +++ b/bizdev/templates/bizdev/event_row.html @@ -7,9 +7,9 @@
{{ event.date|date:"d/m/Y H:i" }} - Edit + Edit
diff --git a/crm/templates/crm/events.html b/bizdev/templates/bizdev/events.html similarity index 66% rename from crm/templates/crm/events.html rename to bizdev/templates/bizdev/events.html index 372ff23..feda717 100644 --- a/crm/templates/crm/events.html +++ b/bizdev/templates/bizdev/events.html @@ -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 %} @@ -31,7 +31,7 @@
{% for event in completed_events %} - {% include "crm/event_row.html" with event=event %} + {% include "bizdev/event_row.html" with event=event %} {% empty %}
No completed events.
{% endfor %} @@ -47,7 +47,7 @@
{% for event in planned_events %} - {% include "crm/event_row.html" with event=event %} + {% include "bizdev/event_row.html" with event=event %} {% empty %}
No planned events.
{% endfor %} diff --git a/crm/templates/crm/prospect_form.html b/bizdev/templates/bizdev/prospect_form.html similarity index 93% rename from crm/templates/crm/prospect_form.html rename to bizdev/templates/bizdev/prospect_form.html index 334e8bf..c22dcd0 100644 --- a/crm/templates/crm/prospect_form.html +++ b/bizdev/templates/bizdev/prospect_form.html @@ -1,4 +1,4 @@ -{% extends "crm/base.html" %} +{% extends "bizdev/base.html" %} {% block head_title %}{{ first_title }}{% endblock %} {% block first_title %}{{ first_title }}{% endblock %} diff --git a/crm/templates/crm/prospect_list.html b/bizdev/templates/bizdev/prospect_list.html similarity index 81% rename from crm/templates/crm/prospect_list.html rename to bizdev/templates/bizdev/prospect_list.html index 0068867..7ccf716 100644 --- a/crm/templates/crm/prospect_list.html +++ b/bizdev/templates/bizdev/prospect_list.html @@ -1,4 +1,4 @@ -{% extends "crm/base.html" %} +{% extends "bizdev/base.html" %} {% load static %} @@ -18,15 +18,15 @@ {% endfor %}
- Clear + Clear
{{ filter.qs|length }} résultats @@ -60,11 +60,11 @@ {% endfor %} - + - + @@ -77,5 +77,5 @@ {% endblock %} {% block extra_js %} - + {% endblock %} diff --git a/crm/templates/crm/send_bulk_email.html b/bizdev/templates/bizdev/send_bulk_email.html similarity index 91% rename from crm/templates/crm/send_bulk_email.html rename to bizdev/templates/bizdev/send_bulk_email.html index 53bdfac..f1b9200 100644 --- a/crm/templates/crm/send_bulk_email.html +++ b/bizdev/templates/bizdev/send_bulk_email.html @@ -1,4 +1,4 @@ -{% extends "crm/base.html" %} +{% extends "bizdev/base.html" %} {% block content %}
@@ -41,7 +41,7 @@
- Cancel + Cancel
{% endblock %} diff --git a/crm/templatetags/__init__.py b/bizdev/templatetags/__init__.py similarity index 100% rename from crm/templatetags/__init__.py rename to bizdev/templatetags/__init__.py diff --git a/bizdev/templatetags/crm_tags.py b/bizdev/templatetags/crm_tags.py new file mode 100644 index 0000000..4b0ee8e --- /dev/null +++ b/bizdev/templatetags/crm_tags.py @@ -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() diff --git a/crm/tests.py b/bizdev/tests.py similarity index 100% rename from crm/tests.py rename to bizdev/tests.py diff --git a/crm/urls.py b/bizdev/urls.py similarity index 97% rename from crm/urls.py rename to bizdev/urls.py index adbd5e6..beceab4 100644 --- a/crm/urls.py +++ b/bizdev/urls.py @@ -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'), diff --git a/crm/views.py b/bizdev/views.py similarity index 84% rename from crm/views.py rename to bizdev/views.py index 93b74a8..c170a71 100644 --- a/crm/views.py +++ b/bizdev/views.py @@ -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'] diff --git a/crm/_instructions/base.md b/crm/_instructions/base.md deleted file mode 100644 index a45abd0..0000000 --- a/crm/_instructions/base.md +++ /dev/null @@ -1 +0,0 @@ -This is a django customer relationship managemement (CRM) app. diff --git a/crm/templatetags/crm_tags.py b/crm/templatetags/crm_tags.py deleted file mode 100644 index 9c39ee3..0000000 --- a/crm/templatetags/crm_tags.py +++ /dev/null @@ -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() diff --git a/padelclub_backend/settings.py b/padelclub_backend/settings.py index 9d55d1b..9209ee4 100644 --- a/padelclub_backend/settings.py +++ b/padelclub_backend/settings.py @@ -36,7 +36,7 @@ INSTALLED_APPS = [ 'sync', 'tournaments', 'shop', - 'crm', + 'bizdev', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', diff --git a/padelclub_backend/urls.py b/padelclub_backend/urls.py index 7703e47..e4f5c5c 100644 --- a/padelclub_backend/urls.py +++ b/padelclub_backend/urls.py @@ -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')), diff --git a/tournaments/migrations/0134_alter_club_timezone.py b/tournaments/migrations/0134_alter_club_timezone.py new file mode 100644 index 0000000..04cc7f6 --- /dev/null +++ b/tournaments/migrations/0134_alter_club_timezone.py @@ -0,0 +1,18 @@ +# Generated by Django 5.1 on 2025-07-09 15:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tournaments', '0133_alter_club_timezone'), + ] + + operations = [ + migrations.AlterField( + model_name='club', + name='timezone', + field=models.CharField(blank=True, choices=[('Africa/Abidjan', 'Africa/Abidjan'), ('Africa/Accra', 'Africa/Accra'), ('Africa/Addis_Ababa', 'Africa/Addis_Ababa'), ('Africa/Algiers', 'Africa/Algiers'), ('Africa/Asmara', 'Africa/Asmara'), ('Africa/Asmera', 'Africa/Asmera'), ('Africa/Bamako', 'Africa/Bamako'), ('Africa/Bangui', 'Africa/Bangui'), ('Africa/Banjul', 'Africa/Banjul'), ('Africa/Bissau', 'Africa/Bissau'), ('Africa/Blantyre', 'Africa/Blantyre'), ('Africa/Brazzaville', 'Africa/Brazzaville'), ('Africa/Bujumbura', 'Africa/Bujumbura'), ('Africa/Cairo', 'Africa/Cairo'), ('Africa/Casablanca', 'Africa/Casablanca'), ('Africa/Ceuta', 'Africa/Ceuta'), ('Africa/Conakry', 'Africa/Conakry'), ('Africa/Dakar', 'Africa/Dakar'), ('Africa/Dar_es_Salaam', 'Africa/Dar_es_Salaam'), ('Africa/Djibouti', 'Africa/Djibouti'), ('Africa/Douala', 'Africa/Douala'), ('Africa/El_Aaiun', 'Africa/El_Aaiun'), ('Africa/Freetown', 'Africa/Freetown'), ('Africa/Gaborone', 'Africa/Gaborone'), ('Africa/Harare', 'Africa/Harare'), ('Africa/Johannesburg', 'Africa/Johannesburg'), ('Africa/Juba', 'Africa/Juba'), ('Africa/Kampala', 'Africa/Kampala'), ('Africa/Khartoum', 'Africa/Khartoum'), ('Africa/Kigali', 'Africa/Kigali'), ('Africa/Kinshasa', 'Africa/Kinshasa'), ('Africa/Lagos', 'Africa/Lagos'), ('Africa/Libreville', 'Africa/Libreville'), ('Africa/Lome', 'Africa/Lome'), ('Africa/Luanda', 'Africa/Luanda'), ('Africa/Lubumbashi', 'Africa/Lubumbashi'), ('Africa/Lusaka', 'Africa/Lusaka'), ('Africa/Malabo', 'Africa/Malabo'), ('Africa/Maputo', 'Africa/Maputo'), ('Africa/Maseru', 'Africa/Maseru'), ('Africa/Mbabane', 'Africa/Mbabane'), ('Africa/Mogadishu', 'Africa/Mogadishu'), ('Africa/Monrovia', 'Africa/Monrovia'), ('Africa/Nairobi', 'Africa/Nairobi'), ('Africa/Ndjamena', 'Africa/Ndjamena'), ('Africa/Niamey', 'Africa/Niamey'), ('Africa/Nouakchott', 'Africa/Nouakchott'), ('Africa/Ouagadougou', 'Africa/Ouagadougou'), ('Africa/Porto-Novo', 'Africa/Porto-Novo'), ('Africa/Sao_Tome', 'Africa/Sao_Tome'), ('Africa/Timbuktu', 'Africa/Timbuktu'), ('Africa/Tripoli', 'Africa/Tripoli'), ('Africa/Tunis', 'Africa/Tunis'), ('Africa/Windhoek', 'Africa/Windhoek'), ('America/Adak', 'America/Adak'), ('America/Anchorage', 'America/Anchorage'), ('America/Anguilla', 'America/Anguilla'), ('America/Antigua', 'America/Antigua'), ('America/Araguaina', 'America/Araguaina'), ('America/Argentina/Buenos_Aires', 'America/Argentina/Buenos_Aires'), ('America/Argentina/Catamarca', 'America/Argentina/Catamarca'), ('America/Argentina/ComodRivadavia', 'America/Argentina/ComodRivadavia'), ('America/Argentina/Cordoba', 'America/Argentina/Cordoba'), ('America/Argentina/Jujuy', 'America/Argentina/Jujuy'), ('America/Argentina/La_Rioja', 'America/Argentina/La_Rioja'), ('America/Argentina/Mendoza', 'America/Argentina/Mendoza'), ('America/Argentina/Rio_Gallegos', 'America/Argentina/Rio_Gallegos'), ('America/Argentina/Salta', 'America/Argentina/Salta'), ('America/Argentina/San_Juan', 'America/Argentina/San_Juan'), ('America/Argentina/San_Luis', 'America/Argentina/San_Luis'), ('America/Argentina/Tucuman', 'America/Argentina/Tucuman'), ('America/Argentina/Ushuaia', 'America/Argentina/Ushuaia'), ('America/Aruba', 'America/Aruba'), ('America/Asuncion', 'America/Asuncion'), ('America/Atikokan', 'America/Atikokan'), ('America/Atka', 'America/Atka'), ('America/Bahia', 'America/Bahia'), ('America/Bahia_Banderas', 'America/Bahia_Banderas'), ('America/Barbados', 'America/Barbados'), ('America/Belem', 'America/Belem'), ('America/Belize', 'America/Belize'), ('America/Blanc-Sablon', 'America/Blanc-Sablon'), ('America/Boa_Vista', 'America/Boa_Vista'), ('America/Bogota', 'America/Bogota'), ('America/Boise', 'America/Boise'), ('America/Buenos_Aires', 'America/Buenos_Aires'), ('America/Cambridge_Bay', 'America/Cambridge_Bay'), ('America/Campo_Grande', 'America/Campo_Grande'), ('America/Cancun', 'America/Cancun'), ('America/Caracas', 'America/Caracas'), ('America/Catamarca', 'America/Catamarca'), ('America/Cayenne', 'America/Cayenne'), ('America/Cayman', 'America/Cayman'), ('America/Chicago', 'America/Chicago'), ('America/Chihuahua', 'America/Chihuahua'), ('America/Ciudad_Juarez', 'America/Ciudad_Juarez'), ('America/Coral_Harbour', 'America/Coral_Harbour'), ('America/Cordoba', 'America/Cordoba'), ('America/Costa_Rica', 'America/Costa_Rica'), ('America/Coyhaique', 'America/Coyhaique'), ('America/Creston', 'America/Creston'), ('America/Cuiaba', 'America/Cuiaba'), ('America/Curacao', 'America/Curacao'), ('America/Danmarkshavn', 'America/Danmarkshavn'), ('America/Dawson', 'America/Dawson'), ('America/Dawson_Creek', 'America/Dawson_Creek'), ('America/Denver', 'America/Denver'), ('America/Detroit', 'America/Detroit'), ('America/Dominica', 'America/Dominica'), ('America/Edmonton', 'America/Edmonton'), ('America/Eirunepe', 'America/Eirunepe'), ('America/El_Salvador', 'America/El_Salvador'), ('America/Ensenada', 'America/Ensenada'), ('America/Fort_Nelson', 'America/Fort_Nelson'), ('America/Fort_Wayne', 'America/Fort_Wayne'), ('America/Fortaleza', 'America/Fortaleza'), ('America/Glace_Bay', 'America/Glace_Bay'), ('America/Godthab', 'America/Godthab'), ('America/Goose_Bay', 'America/Goose_Bay'), ('America/Grand_Turk', 'America/Grand_Turk'), ('America/Grenada', 'America/Grenada'), ('America/Guadeloupe', 'America/Guadeloupe'), ('America/Guatemala', 'America/Guatemala'), ('America/Guayaquil', 'America/Guayaquil'), ('America/Guyana', 'America/Guyana'), ('America/Halifax', 'America/Halifax'), ('America/Havana', 'America/Havana'), ('America/Hermosillo', 'America/Hermosillo'), ('America/Indiana/Indianapolis', 'America/Indiana/Indianapolis'), ('America/Indiana/Knox', 'America/Indiana/Knox'), ('America/Indiana/Marengo', 'America/Indiana/Marengo'), ('America/Indiana/Petersburg', 'America/Indiana/Petersburg'), ('America/Indiana/Tell_City', 'America/Indiana/Tell_City'), ('America/Indiana/Vevay', 'America/Indiana/Vevay'), ('America/Indiana/Vincennes', 'America/Indiana/Vincennes'), ('America/Indiana/Winamac', 'America/Indiana/Winamac'), ('America/Indianapolis', 'America/Indianapolis'), ('America/Inuvik', 'America/Inuvik'), ('America/Iqaluit', 'America/Iqaluit'), ('America/Jamaica', 'America/Jamaica'), ('America/Jujuy', 'America/Jujuy'), ('America/Juneau', 'America/Juneau'), ('America/Kentucky/Louisville', 'America/Kentucky/Louisville'), ('America/Kentucky/Monticello', 'America/Kentucky/Monticello'), ('America/Knox_IN', 'America/Knox_IN'), ('America/Kralendijk', 'America/Kralendijk'), ('America/La_Paz', 'America/La_Paz'), ('America/Lima', 'America/Lima'), ('America/Los_Angeles', 'America/Los_Angeles'), ('America/Louisville', 'America/Louisville'), ('America/Lower_Princes', 'America/Lower_Princes'), ('America/Maceio', 'America/Maceio'), ('America/Managua', 'America/Managua'), ('America/Manaus', 'America/Manaus'), ('America/Marigot', 'America/Marigot'), ('America/Martinique', 'America/Martinique'), ('America/Matamoros', 'America/Matamoros'), ('America/Mazatlan', 'America/Mazatlan'), ('America/Mendoza', 'America/Mendoza'), ('America/Menominee', 'America/Menominee'), ('America/Merida', 'America/Merida'), ('America/Metlakatla', 'America/Metlakatla'), ('America/Mexico_City', 'America/Mexico_City'), ('America/Miquelon', 'America/Miquelon'), ('America/Moncton', 'America/Moncton'), ('America/Monterrey', 'America/Monterrey'), ('America/Montevideo', 'America/Montevideo'), ('America/Montreal', 'America/Montreal'), ('America/Montserrat', 'America/Montserrat'), ('America/Nassau', 'America/Nassau'), ('America/New_York', 'America/New_York'), ('America/Nipigon', 'America/Nipigon'), ('America/Nome', 'America/Nome'), ('America/Noronha', 'America/Noronha'), ('America/North_Dakota/Beulah', 'America/North_Dakota/Beulah'), ('America/North_Dakota/Center', 'America/North_Dakota/Center'), ('America/North_Dakota/New_Salem', 'America/North_Dakota/New_Salem'), ('America/Nuuk', 'America/Nuuk'), ('America/Ojinaga', 'America/Ojinaga'), ('America/Panama', 'America/Panama'), ('America/Pangnirtung', 'America/Pangnirtung'), ('America/Paramaribo', 'America/Paramaribo'), ('America/Phoenix', 'America/Phoenix'), ('America/Port-au-Prince', 'America/Port-au-Prince'), ('America/Port_of_Spain', 'America/Port_of_Spain'), ('America/Porto_Acre', 'America/Porto_Acre'), ('America/Porto_Velho', 'America/Porto_Velho'), ('America/Puerto_Rico', 'America/Puerto_Rico'), ('America/Punta_Arenas', 'America/Punta_Arenas'), ('America/Rainy_River', 'America/Rainy_River'), ('America/Rankin_Inlet', 'America/Rankin_Inlet'), ('America/Recife', 'America/Recife'), ('America/Regina', 'America/Regina'), ('America/Resolute', 'America/Resolute'), ('America/Rio_Branco', 'America/Rio_Branco'), ('America/Rosario', 'America/Rosario'), ('America/Santa_Isabel', 'America/Santa_Isabel'), ('America/Santarem', 'America/Santarem'), ('America/Santiago', 'America/Santiago'), ('America/Santo_Domingo', 'America/Santo_Domingo'), ('America/Sao_Paulo', 'America/Sao_Paulo'), ('America/Scoresbysund', 'America/Scoresbysund'), ('America/Shiprock', 'America/Shiprock'), ('America/Sitka', 'America/Sitka'), ('America/St_Barthelemy', 'America/St_Barthelemy'), ('America/St_Johns', 'America/St_Johns'), ('America/St_Kitts', 'America/St_Kitts'), ('America/St_Lucia', 'America/St_Lucia'), ('America/St_Thomas', 'America/St_Thomas'), ('America/St_Vincent', 'America/St_Vincent'), ('America/Swift_Current', 'America/Swift_Current'), ('America/Tegucigalpa', 'America/Tegucigalpa'), ('America/Thule', 'America/Thule'), ('America/Thunder_Bay', 'America/Thunder_Bay'), ('America/Tijuana', 'America/Tijuana'), ('America/Toronto', 'America/Toronto'), ('America/Tortola', 'America/Tortola'), ('America/Vancouver', 'America/Vancouver'), ('America/Virgin', 'America/Virgin'), ('America/Whitehorse', 'America/Whitehorse'), ('America/Winnipeg', 'America/Winnipeg'), ('America/Yakutat', 'America/Yakutat'), ('America/Yellowknife', 'America/Yellowknife'), ('Antarctica/Casey', 'Antarctica/Casey'), ('Antarctica/Davis', 'Antarctica/Davis'), ('Antarctica/DumontDUrville', 'Antarctica/DumontDUrville'), ('Antarctica/Macquarie', 'Antarctica/Macquarie'), ('Antarctica/Mawson', 'Antarctica/Mawson'), ('Antarctica/McMurdo', 'Antarctica/McMurdo'), ('Antarctica/Palmer', 'Antarctica/Palmer'), ('Antarctica/Rothera', 'Antarctica/Rothera'), ('Antarctica/South_Pole', 'Antarctica/South_Pole'), ('Antarctica/Syowa', 'Antarctica/Syowa'), ('Antarctica/Troll', 'Antarctica/Troll'), ('Antarctica/Vostok', 'Antarctica/Vostok'), ('Arctic/Longyearbyen', 'Arctic/Longyearbyen'), ('Asia/Aden', 'Asia/Aden'), ('Asia/Almaty', 'Asia/Almaty'), ('Asia/Amman', 'Asia/Amman'), ('Asia/Anadyr', 'Asia/Anadyr'), ('Asia/Aqtau', 'Asia/Aqtau'), ('Asia/Aqtobe', 'Asia/Aqtobe'), ('Asia/Ashgabat', 'Asia/Ashgabat'), ('Asia/Ashkhabad', 'Asia/Ashkhabad'), ('Asia/Atyrau', 'Asia/Atyrau'), ('Asia/Baghdad', 'Asia/Baghdad'), ('Asia/Bahrain', 'Asia/Bahrain'), ('Asia/Baku', 'Asia/Baku'), ('Asia/Bangkok', 'Asia/Bangkok'), ('Asia/Barnaul', 'Asia/Barnaul'), ('Asia/Beirut', 'Asia/Beirut'), ('Asia/Bishkek', 'Asia/Bishkek'), ('Asia/Brunei', 'Asia/Brunei'), ('Asia/Calcutta', 'Asia/Calcutta'), ('Asia/Chita', 'Asia/Chita'), ('Asia/Choibalsan', 'Asia/Choibalsan'), ('Asia/Chongqing', 'Asia/Chongqing'), ('Asia/Chungking', 'Asia/Chungking'), ('Asia/Colombo', 'Asia/Colombo'), ('Asia/Dacca', 'Asia/Dacca'), ('Asia/Damascus', 'Asia/Damascus'), ('Asia/Dhaka', 'Asia/Dhaka'), ('Asia/Dili', 'Asia/Dili'), ('Asia/Dubai', 'Asia/Dubai'), ('Asia/Dushanbe', 'Asia/Dushanbe'), ('Asia/Famagusta', 'Asia/Famagusta'), ('Asia/Gaza', 'Asia/Gaza'), ('Asia/Harbin', 'Asia/Harbin'), ('Asia/Hebron', 'Asia/Hebron'), ('Asia/Ho_Chi_Minh', 'Asia/Ho_Chi_Minh'), ('Asia/Hong_Kong', 'Asia/Hong_Kong'), ('Asia/Hovd', 'Asia/Hovd'), ('Asia/Irkutsk', 'Asia/Irkutsk'), ('Asia/Istanbul', 'Asia/Istanbul'), ('Asia/Jakarta', 'Asia/Jakarta'), ('Asia/Jayapura', 'Asia/Jayapura'), ('Asia/Jerusalem', 'Asia/Jerusalem'), ('Asia/Kabul', 'Asia/Kabul'), ('Asia/Kamchatka', 'Asia/Kamchatka'), ('Asia/Karachi', 'Asia/Karachi'), ('Asia/Kashgar', 'Asia/Kashgar'), ('Asia/Kathmandu', 'Asia/Kathmandu'), ('Asia/Katmandu', 'Asia/Katmandu'), ('Asia/Khandyga', 'Asia/Khandyga'), ('Asia/Kolkata', 'Asia/Kolkata'), ('Asia/Krasnoyarsk', 'Asia/Krasnoyarsk'), ('Asia/Kuala_Lumpur', 'Asia/Kuala_Lumpur'), ('Asia/Kuching', 'Asia/Kuching'), ('Asia/Kuwait', 'Asia/Kuwait'), ('Asia/Macao', 'Asia/Macao'), ('Asia/Macau', 'Asia/Macau'), ('Asia/Magadan', 'Asia/Magadan'), ('Asia/Makassar', 'Asia/Makassar'), ('Asia/Manila', 'Asia/Manila'), ('Asia/Muscat', 'Asia/Muscat'), ('Asia/Nicosia', 'Asia/Nicosia'), ('Asia/Novokuznetsk', 'Asia/Novokuznetsk'), ('Asia/Novosibirsk', 'Asia/Novosibirsk'), ('Asia/Omsk', 'Asia/Omsk'), ('Asia/Oral', 'Asia/Oral'), ('Asia/Phnom_Penh', 'Asia/Phnom_Penh'), ('Asia/Pontianak', 'Asia/Pontianak'), ('Asia/Pyongyang', 'Asia/Pyongyang'), ('Asia/Qatar', 'Asia/Qatar'), ('Asia/Qostanay', 'Asia/Qostanay'), ('Asia/Qyzylorda', 'Asia/Qyzylorda'), ('Asia/Rangoon', 'Asia/Rangoon'), ('Asia/Riyadh', 'Asia/Riyadh'), ('Asia/Saigon', 'Asia/Saigon'), ('Asia/Sakhalin', 'Asia/Sakhalin'), ('Asia/Samarkand', 'Asia/Samarkand'), ('Asia/Seoul', 'Asia/Seoul'), ('Asia/Shanghai', 'Asia/Shanghai'), ('Asia/Singapore', 'Asia/Singapore'), ('Asia/Srednekolymsk', 'Asia/Srednekolymsk'), ('Asia/Taipei', 'Asia/Taipei'), ('Asia/Tashkent', 'Asia/Tashkent'), ('Asia/Tbilisi', 'Asia/Tbilisi'), ('Asia/Tehran', 'Asia/Tehran'), ('Asia/Tel_Aviv', 'Asia/Tel_Aviv'), ('Asia/Thimbu', 'Asia/Thimbu'), ('Asia/Thimphu', 'Asia/Thimphu'), ('Asia/Tokyo', 'Asia/Tokyo'), ('Asia/Tomsk', 'Asia/Tomsk'), ('Asia/Ujung_Pandang', 'Asia/Ujung_Pandang'), ('Asia/Ulaanbaatar', 'Asia/Ulaanbaatar'), ('Asia/Ulan_Bator', 'Asia/Ulan_Bator'), ('Asia/Urumqi', 'Asia/Urumqi'), ('Asia/Ust-Nera', 'Asia/Ust-Nera'), ('Asia/Vientiane', 'Asia/Vientiane'), ('Asia/Vladivostok', 'Asia/Vladivostok'), ('Asia/Yakutsk', 'Asia/Yakutsk'), ('Asia/Yangon', 'Asia/Yangon'), ('Asia/Yekaterinburg', 'Asia/Yekaterinburg'), ('Asia/Yerevan', 'Asia/Yerevan'), ('Atlantic/Azores', 'Atlantic/Azores'), ('Atlantic/Bermuda', 'Atlantic/Bermuda'), ('Atlantic/Canary', 'Atlantic/Canary'), ('Atlantic/Cape_Verde', 'Atlantic/Cape_Verde'), ('Atlantic/Faeroe', 'Atlantic/Faeroe'), ('Atlantic/Faroe', 'Atlantic/Faroe'), ('Atlantic/Jan_Mayen', 'Atlantic/Jan_Mayen'), ('Atlantic/Madeira', 'Atlantic/Madeira'), ('Atlantic/Reykjavik', 'Atlantic/Reykjavik'), ('Atlantic/South_Georgia', 'Atlantic/South_Georgia'), ('Atlantic/St_Helena', 'Atlantic/St_Helena'), ('Atlantic/Stanley', 'Atlantic/Stanley'), ('Australia/ACT', 'Australia/ACT'), ('Australia/Adelaide', 'Australia/Adelaide'), ('Australia/Brisbane', 'Australia/Brisbane'), ('Australia/Broken_Hill', 'Australia/Broken_Hill'), ('Australia/Canberra', 'Australia/Canberra'), ('Australia/Currie', 'Australia/Currie'), ('Australia/Darwin', 'Australia/Darwin'), ('Australia/Eucla', 'Australia/Eucla'), ('Australia/Hobart', 'Australia/Hobart'), ('Australia/LHI', 'Australia/LHI'), ('Australia/Lindeman', 'Australia/Lindeman'), ('Australia/Lord_Howe', 'Australia/Lord_Howe'), ('Australia/Melbourne', 'Australia/Melbourne'), ('Australia/NSW', 'Australia/NSW'), ('Australia/North', 'Australia/North'), ('Australia/Perth', 'Australia/Perth'), ('Australia/Queensland', 'Australia/Queensland'), ('Australia/South', 'Australia/South'), ('Australia/Sydney', 'Australia/Sydney'), ('Australia/Tasmania', 'Australia/Tasmania'), ('Australia/Victoria', 'Australia/Victoria'), ('Australia/West', 'Australia/West'), ('Australia/Yancowinna', 'Australia/Yancowinna'), ('Brazil/Acre', 'Brazil/Acre'), ('Brazil/DeNoronha', 'Brazil/DeNoronha'), ('Brazil/East', 'Brazil/East'), ('Brazil/West', 'Brazil/West'), ('CET', 'CET'), ('CST6CDT', 'CST6CDT'), ('Canada/Atlantic', 'Canada/Atlantic'), ('Canada/Central', 'Canada/Central'), ('Canada/Eastern', 'Canada/Eastern'), ('Canada/Mountain', 'Canada/Mountain'), ('Canada/Newfoundland', 'Canada/Newfoundland'), ('Canada/Pacific', 'Canada/Pacific'), ('Canada/Saskatchewan', 'Canada/Saskatchewan'), ('Canada/Yukon', 'Canada/Yukon'), ('Chile/Continental', 'Chile/Continental'), ('Chile/EasterIsland', 'Chile/EasterIsland'), ('Cuba', 'Cuba'), ('EET', 'EET'), ('EST', 'EST'), ('EST5EDT', 'EST5EDT'), ('Egypt', 'Egypt'), ('Eire', 'Eire'), ('Etc/GMT', 'Etc/GMT'), ('Etc/GMT+0', 'Etc/GMT+0'), ('Etc/GMT+1', 'Etc/GMT+1'), ('Etc/GMT+10', 'Etc/GMT+10'), ('Etc/GMT+11', 'Etc/GMT+11'), ('Etc/GMT+12', 'Etc/GMT+12'), ('Etc/GMT+2', 'Etc/GMT+2'), ('Etc/GMT+3', 'Etc/GMT+3'), ('Etc/GMT+4', 'Etc/GMT+4'), ('Etc/GMT+5', 'Etc/GMT+5'), ('Etc/GMT+6', 'Etc/GMT+6'), ('Etc/GMT+7', 'Etc/GMT+7'), ('Etc/GMT+8', 'Etc/GMT+8'), ('Etc/GMT+9', 'Etc/GMT+9'), ('Etc/GMT-0', 'Etc/GMT-0'), ('Etc/GMT-1', 'Etc/GMT-1'), ('Etc/GMT-10', 'Etc/GMT-10'), ('Etc/GMT-11', 'Etc/GMT-11'), ('Etc/GMT-12', 'Etc/GMT-12'), ('Etc/GMT-13', 'Etc/GMT-13'), ('Etc/GMT-14', 'Etc/GMT-14'), ('Etc/GMT-2', 'Etc/GMT-2'), ('Etc/GMT-3', 'Etc/GMT-3'), ('Etc/GMT-4', 'Etc/GMT-4'), ('Etc/GMT-5', 'Etc/GMT-5'), ('Etc/GMT-6', 'Etc/GMT-6'), ('Etc/GMT-7', 'Etc/GMT-7'), ('Etc/GMT-8', 'Etc/GMT-8'), ('Etc/GMT-9', 'Etc/GMT-9'), ('Etc/GMT0', 'Etc/GMT0'), ('Etc/Greenwich', 'Etc/Greenwich'), ('Etc/UCT', 'Etc/UCT'), ('Etc/UTC', 'Etc/UTC'), ('Etc/Universal', 'Etc/Universal'), ('Etc/Zulu', 'Etc/Zulu'), ('Europe/Amsterdam', 'Europe/Amsterdam'), ('Europe/Andorra', 'Europe/Andorra'), ('Europe/Astrakhan', 'Europe/Astrakhan'), ('Europe/Athens', 'Europe/Athens'), ('Europe/Belfast', 'Europe/Belfast'), ('Europe/Belgrade', 'Europe/Belgrade'), ('Europe/Berlin', 'Europe/Berlin'), ('Europe/Bratislava', 'Europe/Bratislava'), ('Europe/Brussels', 'Europe/Brussels'), ('Europe/Bucharest', 'Europe/Bucharest'), ('Europe/Budapest', 'Europe/Budapest'), ('Europe/Busingen', 'Europe/Busingen'), ('Europe/Chisinau', 'Europe/Chisinau'), ('Europe/Copenhagen', 'Europe/Copenhagen'), ('Europe/Dublin', 'Europe/Dublin'), ('Europe/Gibraltar', 'Europe/Gibraltar'), ('Europe/Guernsey', 'Europe/Guernsey'), ('Europe/Helsinki', 'Europe/Helsinki'), ('Europe/Isle_of_Man', 'Europe/Isle_of_Man'), ('Europe/Istanbul', 'Europe/Istanbul'), ('Europe/Jersey', 'Europe/Jersey'), ('Europe/Kaliningrad', 'Europe/Kaliningrad'), ('Europe/Kiev', 'Europe/Kiev'), ('Europe/Kirov', 'Europe/Kirov'), ('Europe/Kyiv', 'Europe/Kyiv'), ('Europe/Lisbon', 'Europe/Lisbon'), ('Europe/Ljubljana', 'Europe/Ljubljana'), ('Europe/London', 'Europe/London'), ('Europe/Luxembourg', 'Europe/Luxembourg'), ('Europe/Madrid', 'Europe/Madrid'), ('Europe/Malta', 'Europe/Malta'), ('Europe/Mariehamn', 'Europe/Mariehamn'), ('Europe/Minsk', 'Europe/Minsk'), ('Europe/Monaco', 'Europe/Monaco'), ('Europe/Moscow', 'Europe/Moscow'), ('Europe/Nicosia', 'Europe/Nicosia'), ('Europe/Oslo', 'Europe/Oslo'), ('Europe/Paris', 'Europe/Paris'), ('Europe/Podgorica', 'Europe/Podgorica'), ('Europe/Prague', 'Europe/Prague'), ('Europe/Riga', 'Europe/Riga'), ('Europe/Rome', 'Europe/Rome'), ('Europe/Samara', 'Europe/Samara'), ('Europe/San_Marino', 'Europe/San_Marino'), ('Europe/Sarajevo', 'Europe/Sarajevo'), ('Europe/Saratov', 'Europe/Saratov'), ('Europe/Simferopol', 'Europe/Simferopol'), ('Europe/Skopje', 'Europe/Skopje'), ('Europe/Sofia', 'Europe/Sofia'), ('Europe/Stockholm', 'Europe/Stockholm'), ('Europe/Tallinn', 'Europe/Tallinn'), ('Europe/Tirane', 'Europe/Tirane'), ('Europe/Tiraspol', 'Europe/Tiraspol'), ('Europe/Ulyanovsk', 'Europe/Ulyanovsk'), ('Europe/Uzhgorod', 'Europe/Uzhgorod'), ('Europe/Vaduz', 'Europe/Vaduz'), ('Europe/Vatican', 'Europe/Vatican'), ('Europe/Vienna', 'Europe/Vienna'), ('Europe/Vilnius', 'Europe/Vilnius'), ('Europe/Volgograd', 'Europe/Volgograd'), ('Europe/Warsaw', 'Europe/Warsaw'), ('Europe/Zagreb', 'Europe/Zagreb'), ('Europe/Zaporozhye', 'Europe/Zaporozhye'), ('Europe/Zurich', 'Europe/Zurich'), ('Factory', 'Factory'), ('GB', 'GB'), ('GB-Eire', 'GB-Eire'), ('GMT', 'GMT'), ('GMT+0', 'GMT+0'), ('GMT-0', 'GMT-0'), ('GMT0', 'GMT0'), ('Greenwich', 'Greenwich'), ('HST', 'HST'), ('Hongkong', 'Hongkong'), ('Iceland', 'Iceland'), ('Indian/Antananarivo', 'Indian/Antananarivo'), ('Indian/Chagos', 'Indian/Chagos'), ('Indian/Christmas', 'Indian/Christmas'), ('Indian/Cocos', 'Indian/Cocos'), ('Indian/Comoro', 'Indian/Comoro'), ('Indian/Kerguelen', 'Indian/Kerguelen'), ('Indian/Mahe', 'Indian/Mahe'), ('Indian/Maldives', 'Indian/Maldives'), ('Indian/Mauritius', 'Indian/Mauritius'), ('Indian/Mayotte', 'Indian/Mayotte'), ('Indian/Reunion', 'Indian/Reunion'), ('Iran', 'Iran'), ('Israel', 'Israel'), ('Jamaica', 'Jamaica'), ('Japan', 'Japan'), ('Kwajalein', 'Kwajalein'), ('Libya', 'Libya'), ('MET', 'MET'), ('MST', 'MST'), ('MST7MDT', 'MST7MDT'), ('Mexico/BajaNorte', 'Mexico/BajaNorte'), ('Mexico/BajaSur', 'Mexico/BajaSur'), ('Mexico/General', 'Mexico/General'), ('NZ', 'NZ'), ('NZ-CHAT', 'NZ-CHAT'), ('Navajo', 'Navajo'), ('PRC', 'PRC'), ('PST8PDT', 'PST8PDT'), ('Pacific/Apia', 'Pacific/Apia'), ('Pacific/Auckland', 'Pacific/Auckland'), ('Pacific/Bougainville', 'Pacific/Bougainville'), ('Pacific/Chatham', 'Pacific/Chatham'), ('Pacific/Chuuk', 'Pacific/Chuuk'), ('Pacific/Easter', 'Pacific/Easter'), ('Pacific/Efate', 'Pacific/Efate'), ('Pacific/Enderbury', 'Pacific/Enderbury'), ('Pacific/Fakaofo', 'Pacific/Fakaofo'), ('Pacific/Fiji', 'Pacific/Fiji'), ('Pacific/Funafuti', 'Pacific/Funafuti'), ('Pacific/Galapagos', 'Pacific/Galapagos'), ('Pacific/Gambier', 'Pacific/Gambier'), ('Pacific/Guadalcanal', 'Pacific/Guadalcanal'), ('Pacific/Guam', 'Pacific/Guam'), ('Pacific/Honolulu', 'Pacific/Honolulu'), ('Pacific/Johnston', 'Pacific/Johnston'), ('Pacific/Kanton', 'Pacific/Kanton'), ('Pacific/Kiritimati', 'Pacific/Kiritimati'), ('Pacific/Kosrae', 'Pacific/Kosrae'), ('Pacific/Kwajalein', 'Pacific/Kwajalein'), ('Pacific/Majuro', 'Pacific/Majuro'), ('Pacific/Marquesas', 'Pacific/Marquesas'), ('Pacific/Midway', 'Pacific/Midway'), ('Pacific/Nauru', 'Pacific/Nauru'), ('Pacific/Niue', 'Pacific/Niue'), ('Pacific/Norfolk', 'Pacific/Norfolk'), ('Pacific/Noumea', 'Pacific/Noumea'), ('Pacific/Pago_Pago', 'Pacific/Pago_Pago'), ('Pacific/Palau', 'Pacific/Palau'), ('Pacific/Pitcairn', 'Pacific/Pitcairn'), ('Pacific/Pohnpei', 'Pacific/Pohnpei'), ('Pacific/Ponape', 'Pacific/Ponape'), ('Pacific/Port_Moresby', 'Pacific/Port_Moresby'), ('Pacific/Rarotonga', 'Pacific/Rarotonga'), ('Pacific/Saipan', 'Pacific/Saipan'), ('Pacific/Samoa', 'Pacific/Samoa'), ('Pacific/Tahiti', 'Pacific/Tahiti'), ('Pacific/Tarawa', 'Pacific/Tarawa'), ('Pacific/Tongatapu', 'Pacific/Tongatapu'), ('Pacific/Truk', 'Pacific/Truk'), ('Pacific/Wake', 'Pacific/Wake'), ('Pacific/Wallis', 'Pacific/Wallis'), ('Pacific/Yap', 'Pacific/Yap'), ('Poland', 'Poland'), ('Portugal', 'Portugal'), ('ROC', 'ROC'), ('ROK', 'ROK'), ('Singapore', 'Singapore'), ('Turkey', 'Turkey'), ('UCT', 'UCT'), ('US/Alaska', 'US/Alaska'), ('US/Aleutian', 'US/Aleutian'), ('US/Arizona', 'US/Arizona'), ('US/Central', 'US/Central'), ('US/East-Indiana', 'US/East-Indiana'), ('US/Eastern', 'US/Eastern'), ('US/Hawaii', 'US/Hawaii'), ('US/Indiana-Starke', 'US/Indiana-Starke'), ('US/Michigan', 'US/Michigan'), ('US/Mountain', 'US/Mountain'), ('US/Pacific', 'US/Pacific'), ('US/Samoa', 'US/Samoa'), ('UTC', 'UTC'), ('Universal', 'Universal'), ('W-SU', 'W-SU'), ('WET', 'WET'), ('Zulu', 'Zulu')], default='CET', max_length=50, null=True), + ), + ]