Django. Создаём простейшую CRM

Эту статью пишу специально для аргументации идей, изложенных в моей книге: realbigdata.ru. Цель описанной далее работы — оценить скорость создания собственной CRM с минимальным функционалом (спойлер: меньше часа). В этой системе будет всего 4 базовых сущности, которые нужны всем CRM:

  • Клиенты.
  • Продавцы (они же пользователи системы).
  • Заказы клиентов.
  • Коммуникации с клиентами (когда кому последний раз звонили и о чём договорились).

Для создания такой системы будем использовать фреймворк (набор инструментов) под названием django. Он сделан специально для создания систем, похожих на новостные сайты, в которых есть административный раздел, где пишутся новости, и публичный раздел, где читаются новости. По логике CRM нам не нужен публичный раздел, поэтому ограничимся только административным разделом, в который сотрудники нашей компании будут входить для редактирования данных о клиентам и коммуникаций с ними.

Django написан на языке программирования Python, который дети проходят в школе, поэтому работодателю не составит труда найти специалиста по этому языку.

В процессе разработки будем буквально проходить по первым двум главам официального учебника django.

Засекаем время, приступаем к установке и разработке. Устанавливаем django:

pip install django

Создаём папку проекта «intranet»:

django-admin startproject intranet

Отредактируем файл intranet/urls.py, изменим там путь к панели администрирования. Сделаем его путём на титульную страницу сайта, чтобы при заходе на сайт сразу открывалась форма авторизации. Ведь всё содержимое системы будет доступно только сотрудникам после вводи логина и пароля. Оставим в файле следующие строчки:

from django.contrib import admin



urlpatterns = [

    path('', admin.site.urls)

]

Приступаем к разработке CRM. Создаём приложение внутри проекта:

python3 manage.py startapp crm

Теперь выполним первую миграцию, чтобы у предустановленных приложений всё наладилось. Выполняем команду:

python3 manage.py migrate

По умолчанию django использует базу данных sqlite. Не будем утруждаться изменением её на полноценную *SQL версию. Потому что всё общение с базой у django и так проходит «под капотом». Для нас нет разницы, мы не будем писать SQL запросы в чистом виде.

Теперь надо открыть файл crm/models.py. Там надо прописать программный код для управления таблицами базы данных. Так как в системе будет всего четыре сущности (включая продавцов, о которых сейчас не говорим), то код в этом файле будет выглядеть так:

import datetime

from django.db import models

from django.utils import timezone



# Клиенты

class Client(models.Model):

    # ФИО клиента

    full_name = models.CharField(max_length=200)

    # Дата рождения клиента

    birth_date = models.DateTimeField("День рождения")

    

    def __str__(self):

        return f'{self.full_name}'



# Заказы клиентов

class Order(models.Model):

        

    # Привязка к клиенту

    client = models.ForeignKey(Client, on_delete=models.CASCADE)

    # Описание заказа

    descr = models.CharField(max_length=200) 

    # Адрес доставки

    address = models.CharField(max_length=200)

    # Стоимость заказа

    votes = models.DecimalField("Стоимость заказа", max_digits=5, decimal_places=2)

    # Факт оплаты заказа

    is_paid = models.BooleanField("Заказ оплачен?", default=False)

    # Дата создания заказа

    pub_date = models.DateTimeField("Дата создания", auto_now_add=True)

    

    def __str__(self):

        return f'Заказ №{self.id} - {self.client} - {self.address}'



# Коммуникации с клиентами

# (когда кому последний раз звонили и о чём договорились)

class Communication(models.Model):

    # Привязка к клиенту

    client = models.ForeignKey(Client, on_delete=models.CASCADE)

    # О чём договорились с клиентом

    text = models.CharField(max_length=200) 

    # Дата коммуникации

    pub_date = models.DateTimeField("Дата коммуникации", auto_now_add=True)

    

    def __str__(self):

        return f'Коммуникация №{self.id} - {self.client} - {self.text}'

После сохранения файла идём в общий файл проекта intranet/settings.py и добавляем туда «crm.apps.CrmConfig» к установленным приложениям:

INSTALLED_APPS = [

    "crm.apps.CrmConfig",

    "django.contrib.admin",

    "django.contrib.auth",

    ...

]

В этом же файле в блок MIDDLEWARE добавляем ‘django.middleware.locale.LocaleMiddleware’, чтобы в административной панели сайта надписи были на языке пользователя (иначе на английском):

MIDDLEWARE = [

    'django.middleware.locale.LocaleMiddleware',

    'django.middleware.security.SecurityMiddleware',

    'django.contrib.sessions.middleware.SessionMiddleware',

    ...

]

Подготавливаем миграцию и выполняем её, чтобы в базу данных были внесены изменения:

python3 manage.py makemigrations crm

python3 manage.py migrate

Теперь перейдём к созданию и настройке административного раздела сайта. Сотрудники нашей компании будут входит в этот раздел и вести там свою работу: добавлять данные о клиентах, их заказах и переговорах с ними. Этот раздел мы не будет программировать вручную, он уже есть у django. Конечно, в нём сотрудники могут натворить много беды: удалить данные клиентов и т.п. Но будем рассчитывать, что в компании работают адекватные люди, которые будут в состоянии вести подобный примитивный учёт без полного уничтожения данных.

Для начала создаём суперпользователя:

python3 manage.py createsuperuser

Отвечаем на вопросы, вводим мэйл и пароль нового пользователя.

Запускаем сервер:

python3 manage.py runserver

Можно указать порт и ip, на котором запускать:

python3 manage.py runserver 0.0.0.0:8080

Открываем страницу http://ip_сервера:8080/ и видим форму авторизации. Вводим в неё данные суперпользователя.

В панели управления находим страницу настроек групп пользователей и добавления новых. Там создаём группу обычных сотрудников компании. Разрешаем им изменять данные в приложении CRM. Но не даём возможности удалять клиентов (они могут только создавать).

Далее добавляем в систему учётные записи сотрудников, каждому сотруднику свою личную.

Теперь настроим отображение нашего приложение crm в административной панели. Для этого в файле crm/admin.py пишем следующее:

from django.contrib import admin

from .models import Client, Order, Communication



admin.site.register(Client)

admin.site.register(Order)

admin.site.register(Communication)

Перезагружаем титульную страницу сайта в браузере и видим, что теперь там есть возможность изменять все сущности: клиентов, заказы и коммуникаций. На этом надо остановить таймер, потому что система готова. Оказалось, что для создания простейшей CRM нам потребовалось менее одного часа. Конечно, система выглядит топорно, а часть надписей в панели администратора вообще на английском. Но в этой системе уже есть минимальный функционал, который нужен для работы компании:

  • Авторизация для сотрудников через логин/пароль.
  • Информация о клиентах, их заказах и коммуникациях.

Некоторые могут возразить, что в такой системе недостаточно полей. Но это вопрос лишь одной строки в файле crm/models.py, содержимое которого описывалось выше. То есть изменить систему можно за считанные минуты, подстроив под бизнес процессы. И в отличии от обычной CMS это будет бесплатно.

В такую систему уже можно добавлять информацию, с ней уже можно работать. При этом на её создание ушёл всего один час времени. А если потрудиться не один час, а пару дней, то можно добавить ещё много украшений и функций. Например, можно сортировать список клиентов, чтобы сверху оказывались те, с кем давно не было коммуникации и т.п.

Эта статья была написана исключительно с одной целью — засечь время создания простейшей CRM для использования в небольшой компании, сотрудникам которой нужны лишь базовые функции подобной системы. Все описанное удалось сделать за один (!) час.