Для анализа ролевой модели предоставления прав в Tessa требуется выгрузка соответствующих данных из БД Tessa. При анализе требуются тестовые данные, чтобы избежать использование реальных данных в целях конфиденциальности. Если подобные модели строить в Python с помощью Pandas, можно использовать генератор датафреймов, разработанный в Microsegment.ru.
И так, предположим, что для анализа ролевой модели предоставления прав в Tessa используются следующие файлы RoleUsers.csv, ContextRoles.csv, KrPermissions.csv, KrPermissions.csv, krPermissionRoles.csv, KrPermissionTypes.csv, KrPermissionStates.csv, KrPermissionExtendedcard.csv, содержащие данных из определенных таблиц БД Tessa:
- Данные о вхождении персональных ролей из таблицы
PersonalRoles(pr) в любые роли из таблицыRoles(r) через таблицу связейRoleUsers(ru), кроме контекстных ролей, описанных в таблицеContextRoles, выгруженные в файлRoleUsers.csv. - Данные о контекстных ролях из таблицы
ContextRoles(cr), выгруженные в файлContextRoles.csv. - Все правила доступа с русским переводом параметров из таблицы базы данных (далее БД)
KrPermissions(kp), выгруженные в файлKrPermissions.csv. - Обогащение правил доступа дополнительными данными о ролях из таблицы БД
krPermissionRoles(kpr), выгруженной в файлkrPermissionRoles.csv. - Обогащение правил доступа дополнительными данными о типах документов из таблицы БД
KrPermissionTypes(kpt), выгруженной в файлKrPermissionTypes.csv. - Обогащение правил доступа дополнительными данными о состояниях документов из таблицы БД
KrPermissionStates(kps), выгруженной в файлKrPermissionStates.csv. - Данные о расширенных правилах доступа (далее РПД) из таблиц БД
KrPermissionExtendedcardRules(kpecr) иKrPermissionExtendedcardRulefields(kpecrf), выгруженные в файлKrPermissionExtendedcard.csv.
Для каждого файла, выгруженного из БД, требуется отдельный датафрейм, название которого будет соответствовать правилам формирования названий переменных в Python. Например, для файла RoleUsers.csv требуется создать датафрейм role_users. Принцип формирования названий полей и требуемых значений останутся неизменными относительно тех, что используются в выгрузках.
Код MS SQL для получения данных о правилах и ролях¶
-- Вхождение PersonalRoles в любые Roles, кроме ContextRoles
SELECT pr.ID AS [ID пользователя],
pr.Name AS [Имя пользователя],
pr.Position AS [Должность пользователя],
pr.AccessLevelID AS [Уровень доступа пользователя],
pr.LoginTypeID AS [Тип учетной записи пользователя],
pr.Login AS [Логин пользователя],
CASE WHEN pr.Blocked ='1' THEN 'True' END AS [Блокировка учетной записи пользователя],
r.ID AS [ID роли],
r.Name AS [Название роли],
r.TypeID AS [Тип роли]
FROM Roles (NOLOCK)r
LEFT JOIN RoleUsers (NOLOCK) ru ON ru.ID = r.ID
LEFT JOIN PersonalRoles (NOLOCK) pr ON pr.ID - ru.UserID
WHERE (ru. IsDeputy = O OR ru.IsDeputy IS NULL)
ORDER BY pr.Name, r.Name;
-- ContextRoles
SELECT cr.ID AS [ID роли],
cr.SqlText AS [Код SQL]
FROM ContextRoles (NOLOCK) cr;
-- Для выявления вхождения идентификаторов ролей в коды контекстных ролей
-- (очень долгая операция, лучше реализовать локально на Python)
--LEFT JOIN Roles (NOLOCK) r ON cr.SqlText LIKE '%'+CONVERT(VARCHAR(50), .ID)+'%'
-- Все правила доступа с русским переводом параметров
SELECT kp.ID AS [ID правила доступа],
kp.Caption AS [Название правила доступа],
CASE WHEN kp.IsDisabled ='1' THEN 'True' ELSE 'False' END AS [Правило отключено],
CASE WHEN kp.IsRequired ='1' THEN 'True' ELSE 'False' END AS [Всегда проверять правило],
CASE WHEN kp.IsExtended ='1' THEN 'True'ELSE 'False' END AS [РПД],
CASE WHEN kp.Conditions LIKE '%ConditionTypeID%' THEN 'True' ELSE 'False' END AS [Типы условий],
-- Разрешения из правил доступа
CASE WHEN kp.CanCreateCard ='1' THEN 'True' ELSE 'False' END AS [Создание карточки],
CASE WHEN kp.CanReadCard ='1' THEN 'True' ELSE 'False' END AS [Чтение карточки],
CASE WHEN kp.CanEditCard ='1' THEN 'True' ELSE 'False' END AS [Редактирование карточки],
CASE WHEN kp.CanEditFiles ='1' THEN 'True' ELSE 'False' END AS [Редактирование файлов],
CASE WHEN kp.CanAddFiles ='1' THEN 'True' ELSE 'False' END AS [Добавление файлов],
CASE WHEN kp.CanEditRoute ='1' THEN 'True' ELSE 'False' END AS [Редактирование маршрута],
CASE WHEN kp.CanDeleteCard ='1' THEN 'True' ELSE 'False' END AS [Удаление карточки],
CASE WHEN kp.CanStartProcess ='1' THEN 'True' ELSE 'False' END AS [Инициация типового процесса отправки задач],
CASE WHEN kp.CanEditNumber ='1' THEN 'True' ELSE 'False' END AS [Ручное редактирование номера],
CASE WHEN kp.CanCreateResolutions ='1' THEN 'True' ELSE 'False' END AS [Создание резолюций],
CASE WHEN kp.CanDeleteFiles ='1' THEN 'True' ELSE 'False' END AS [Удаление всех файлов],
CASE WHEN kp.CanEditOwnFiles ='1' THEN 'True' ELSE 'False' END AS [Редактирование собственных файлов].
CASE WHEN kp.CanDeleteownFiles ='1' THEN 'True'ELSE 'False' END AS [Удаление собственных файлов],
CASE WHEN kp.CansignFiles ='1' THEN 'True' ELSE 'False' END AS [Подписание файлов],
CASE WHEN kp.CanAddTopics ='1' THEN 'True'ELSE 'False'END AS [Создание обсуждений].
CASE WHEN kp.CanSuperModeratorMode ='1' THEN 'True'ELSE 'False' END AS [Права супермодератора],
CASE WHEN kp.CanSubscribeForNotifications = '1' THEN 'True' ELSE 'False' END AS [Подписка на уведомления],
CASE WHEN kp.CanCreateTemplateAndCopy ='1' THEN 'True' ELSE 'False' END AS [Создание шаблона и копирование],
CASE WHEN kp.CanSkipStages ='1' THEN 'True' ELSE 'False' END AS [Пропуск этапов],
CASE WHEN kp.CanFullRecalcRoute ='1' THEN 'True' ELSE 'False' END AS [Полный пересчет маршрута].
CASE WHEN kp.CanEditMyMessages ='1' THEN 'True' ELSE 'False' END AS [Редактирование своих сообщений],
CASE WHEN kp.CanEditAllMessages ='1' THEN 'True' ELSE 'False' END AS [Редактирование всех сообщений],
CASE WHEN kp.CanReadAllTopics ='1' THEN 'True' ELSE 'False' END AS [Чтение обсуждений],
CASE WHEN kp.CanReadAndSendMessageInAllTopics ='1' THEN 'True' ELSE 'False' END AS [Чтение и отправка сообщений]
FROM KrPermissions (NOLOCK) kp;
-- Обогащение правил доступа дополнительными данными о ролях
SELECT DISTINCT
-- Правила доступа
kpr.ID AS [ID правила доступа],
-- Роли
kpr.RoleID AS [ID роли],
kpr.RoleName AS [Название роли]
FROM krPermissionRoles (NOLOCK) kpr;
-- Обогащение правил доступа дополнительными данными о типах документов
SELECT DISTINCT
-- Правила доступа
kpt.ID AS [ID правила доступа],
-- Тип карточки
kpt.TypeCaption AS [ID ЛФО типа карточки]
dbo.Localize(kpt.TypeCaption, 25) AS [Тип карточки]
FROM KrPermissionTypes (NOLOCK) kpt;
-- Обогащение правил доступа дополнительными данными о состояниях документов
SELECT DISTINCT
-- Правила доступа
kpt.ID AS [ID правила доступа],
-- Состояние карточки
kps.StateName AS [ID ЛФО состояния карточки]
dbo.Localize(kps.StateName, 25) AS [Состояние карточки]
FROM KrPermissionStates (NOLOCK) kps
-- Расширенные правила доступа (РПД)
SELECT
DISTINCT
-- Правила доступа
kp.ID AS [ID правила доступа],
-- Параметры РПД
kpecr.SectionName AS [РПД. Секция карточки].
kpecrf.FieldName AS [РПД. Поле карточки],
kpecr.AccessSettingName AS [РПД. Разрешение],
dbo.Localize(kpecr.AccesssettingName, 25) AS [РПД. Разрешение (рус)]
FROM KrPermissions AS kp
LEFT JOIN KrPermissionExtendedcardRules (NOLOCK) kpecr ON kpecr.ID = kp. ID
LEFT JOIN KrPermissionExtendedcardRulefields (NOLOCK) kpecrf ON kpecrf. ID = kp.ID;
Функция автоматической генерации датафрейма с тестовыми данными¶
import pandas as pd
import numpy as np
import random
import uuid
from typing import List, Tuple, Dict, Any, Union, Optional
def generate_dataframe(
columns: List[Tuple[str, str]],
text_substrings: Dict[str, List[str]],
numeric_ranges: Dict[str, Tuple[Union[int, float], Union[int, float]]],
bool_probabilities: Dict[str, float],
text_probability: float,
numeric_probability: float,
bool_probability: float,
mean_row_count: int,
deviation_row_count: int
) -> pd.DataFrame:
"""
Генерирует DataFrame со случайными данными по заданным параметрам.
Args:
columns: Список кортежей (имя_столбца, тип)
text_substrings: Словарь {имя_столбца: [список подстрок]} для строковых столбцов
numeric_ranges: Словарь {имя_столбца: (мин, макс)} для числовых столбцов
bool_probabilities: Словарь {имя_столбца: вероятность_True} для булевых столбцов
text_probability: Вероятность появления текстового значения
numeric_probability: Вероятность появления числового значения
bool_probability: Вероятность появления булевого значения
mean_row_count: Среднее количество строк
deviation_row_count: Допустимое отклонение количества строк
Returns:
pd.DataFrame: Сгенерированный DataFrame
"""
# Генерация случайного количества строк
row_count = random.randint(
max(0, mean_row_count - deviation_row_count),
mean_row_count + deviation_row_count
)
data = {}
for col_name, col_type in columns:
col_values = []
if col_type == 'str':
for _ in range(row_count):
if random.random() < text_probability:
# Случайное объединение подстрок
parts = random.sample(
text_substrings[col_name],
#k = random.randint(1, len(text_substrings[col_name]))
k = random.randint(1, 1)
)
col_values.append(' '.join(parts))
else:
col_values.append(None)
elif col_type in ['int', 'float']:
min_val, max_val = numeric_ranges[col_name]
for _ in range(row_count):
if random.random() < numeric_probability:
if col_type == 'int':
col_values.append(random.randint(int(min_val), int(max_val)))
else:
col_values.append(random.uniform(min_val, max_val))
else:
col_values.append(None)
elif col_type == 'bool':
for _ in range(row_count):
if random.random() < bool_probability:
col_values.append(random.random() < bool_probabilities[col_name])
else:
col_values.append(None)
data[col_name] = col_values
return pd.DataFrame(data)
Основные особенности реализации:
- Типы столбцов задаются парой (имя, тип), где тип может быть:
str— строковые значенияint— целые числаfloat— числа с плавающей точкойbool— булевы значения
- Для каждого типа данных используются свои параметры генерации:
- Строки: объединяются случайные подстроки из заданного списка
- Числа: генерируются в заданном диапазоне
- Булевы значения: учитывают вероятность появления True
- Вероятностные параметры:
text_probability— вероятность появления текстового значенияnumeric_probability— вероятность появления числового значенияbool_probability— вероятность появления булевого значения
- Контроль количества строк:
mean_row_count— среднее количество строкdeviation_row_count— допустимое отклонение- Фактическое количество строк генерируется случайно в диапазоне [
mean—deviation,mean+deviation]
- Особенности генерации:
- Для строковых значений используется случайная комбинация подстрок
- Для числовых значений равномерное распределение в заданном диапазоне
- Для булевых значений используется бинарная генерация с заданной вероятностью
- Все типы данных могут содержать None-значения в соответствии с вероятностными параметрами
Создание датафреймов с тестовыми данными¶
Создание датафрейма role_users и выгрузка данных в файл RoleUsers.csv¶
Данные о вхождении персональных ролей из таблицы PersonalRoles (pr) в любые роли из таблицы Roles (r) через таблицу связей RoleUsers (ru), кроме контекстных ролей, описанных в таблице ContextRoles, выгруженные в файл RoleUsers.csv:
| № | Поле БД | Название поля после выгрузки | Тип поля после выгрузки | Комментарии |
|---|---|---|---|---|
| 1 | pr.ID | ID пользователя | str | |
| 2 | pr.Name | Имя пользователя | str | |
| 3 | pr.Position | Должность пользователя | str | |
| 4 | pr.AccessLevelID | Уровень доступа пользователя | int | 0 — обычный, 1 — администратор |
| 5 | pr.LoginTypeID | Тип учетной записи пользователя | int | 0 — вход запрещен, 1 — пользователь Tessa, 2 — пользователь Windows, 3 — пользователь LDAP |
| 6 | pr.Login | Логин пользователя | str | |
| 7 | pr.Blocked | Блокировка учетной записи пользователя | bool | True — заблокирован, False — не заблокирован |
| 8 | r.ID | ID роли | str | |
| 9 | r.Name | Название роли | str | |
| 10 | r.TypeID | Тип роли | int | 0 — статическая роль, 1 — сотрудник, 2 — подразделение, 3 — динамическая роль, 4 — контекстная роль, 5 — метароль, 6 — роль задания |
# Пользователи мужчины
man_lastname = ['Иванов', 'Смирнов', 'Кузнецов', 'Соколов', 'Попов',
'Лебедев', 'Козлов', 'Новиков', 'Морозов', 'Петров',
'Волков', 'Соловьёв', 'Васильев', 'Зайцев', 'Павлов',
'Семёнов', 'Голубев', 'Виноградов', 'Богданов', 'Воробьёв',
'Фёдоров', 'Михайлов', 'Беляев', 'Тарасов', 'Белов',
'Комаров', 'Орлов', 'Киселёв', 'Макаров', 'Андреев',
'Ковалёв', 'Ильин', 'Гусев', 'Титов', 'Кузьмин',
'Кудрявцев', 'Баранов', 'Куликов', 'Алексеев', 'Степанов',
'Яковлев', 'Сорокин', 'Сергеев', 'Романов', 'Захаров',
'Борисов', 'Королёв', 'Герасимов', 'Пономарёв', 'Григорьев']
initial = ['А.', 'Б.', 'В.', 'Г.', 'Д.', 'Е.', 'И.', 'К.', 'Л.', 'М.', 'О.', 'Р.', 'С.', 'Т.']
columns = [
('man_lastname', 'str'),
('initial_1', 'str'),
('initial_2', 'str')
]
text_substrings = {
'man_lastname': man_lastname,
'initial_1': initial,
'initial_2': initial
}
numeric_ranges = []
bool_probabilities = []
# Генерация DataFrame
df_man = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=1.,
numeric_probability=0.95,
bool_probability=0.95,
mean_row_count=100,
deviation_row_count=10
)
df_man['Имя пользователя'] = df_man['man_lastname'] + ' ' + df_man['initial_1'] + df_man['initial_2']
df_man = df_man.drop(['man_lastname', 'initial_1', 'initial_2'], axis=1)
print(f"\nСгенерировано строк: {len(df_man)}")
print("\nИнформация о данных:")
display(df_man.info())
print("\nПервые 5 строк:")
display(df_man.head())
Сгенерировано строк: 96 Информация о данных: <class 'pandas.core.frame.DataFrame'> RangeIndex: 96 entries, 0 to 95 Data columns (total 1 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Имя пользователя 96 non-null object dtypes: object(1) memory usage: 900.0+ bytes
None
Первые 5 строк:
| Имя пользователя | |
|---|---|
| 0 | Михайлов М.И. |
| 1 | Степанов А.Б. |
| 2 | Зайцев А.Т. |
| 3 | Королёв Т.О. |
| 4 | Васильев М.А. |
# Пользователи мужчины
woman_lastname = ['Иванова', 'Смирнова', 'Кузнецова', 'Соколова', 'Попова',
'Васильева', 'Петрова', 'Лебедева', 'Козлова', 'Новикова',
'Морозова', 'Волкова', 'Соловьёва', 'Зайцева', 'Павлова',
'Семёнова', 'Голубева', 'Виноградова', 'Богданова', 'Воробьёва',
'Фёдорова', 'Михайлова', 'Беляева', 'Тарасова', 'Белова',
'Комарова', 'Орлова', 'Киселёва', 'Макарова', 'Андреева',
'Ковалёва', 'Ильина', 'Гусева', 'Титова', 'Кузьмина',
'Кудрявцева', 'Баранова', 'Куликова', 'Алексеева', 'Степанова',
'Яковлева', 'Сорокина', 'Сергеева', 'Романова', 'Захарова',
'Борисова', 'Королёва', 'Герасимова', 'Пономарёва', 'Григорьева']
initial = ['А.', 'Б.', 'В.', 'Г.', 'Д.', 'Е.', 'И.', 'К.', 'Л.', 'М.', 'О.', 'Р.', 'С.', 'Т.']
columns = [
('woman_lastname', 'str'),
('initial_1', 'str'),
('initial_2', 'str')
]
text_substrings = {
'woman_lastname': woman_lastname,
'initial_1': initial,
'initial_2': initial
}
numeric_ranges = []
bool_probabilities = []
# Генерация DataFrame
df_woman = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=1.,
numeric_probability=0.95,
bool_probability=0.95,
mean_row_count=100,
deviation_row_count=10
)
df_woman['Имя пользователя'] = df_woman['woman_lastname'] + ' ' + df_woman['initial_1'] + df_woman['initial_2']
df_woman = df_woman.drop(['woman_lastname', 'initial_1', 'initial_2'], axis=1)
print(f"\nСгенерировано строк: {len(df_woman)}")
print("\nИнформация о данных:")
display(df_woman.info())
print("\nПервые 5 строк:")
display(df_woman.head())
Сгенерировано строк: 103 Информация о данных: <class 'pandas.core.frame.DataFrame'> RangeIndex: 103 entries, 0 to 102 Data columns (total 1 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Имя пользователя 103 non-null object dtypes: object(1) memory usage: 956.0+ bytes
None
Первые 5 строк:
| Имя пользователя | |
|---|---|
| 0 | Беляева И.Б. |
| 1 | Голубева А.Т. |
| 2 | Виноградова Г.Л. |
| 3 | Беляева Т.И. |
| 4 | Волкова О.Р. |
# PersonalRoles
# Пользователи
name = pd.concat([df_man, df_woman], axis=0, ignore_index=True)
name = name['Имя пользователя'].values.tolist()
# Должности
positions = [
'Менеджер проекта', 'Старший специалист',
'Специалист', 'Младший специалист', 'Ассистент'
]
# Подразделения
departments = [
'Руководство', 'IT-отдел', 'Бухгалтерия', 'Отдел продаж',
'Юридический отдел', 'Отдел кадров', 'Производственный отдел'
]
columns = [
('Имя пользователя', 'str'),
('Должность пользователя', 'str'),
('Уровень доступа пользователя', 'int'),
('Тип учетной записи пользователя', 'int'),
('Блокировка учетной записи пользователя', 'bool'),
('Название роли', 'str')
]
text_substrings = {
'Имя пользователя': name,
'Должность пользователя': positions,
'Название роли': departments
}
numeric_ranges = {
'Уровень доступа пользователя': (0, 1),
'Тип учетной записи пользователя': (0, 2)
}
bool_probabilities = {
'Блокировка учетной записи пользователя': .1
}
# Генерация DataFrame
role_users = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=1.,
numeric_probability=0.95,
bool_probability=0.75,
mean_row_count=200,
deviation_row_count=10
)
print(f"\nСгенерировано строк: {len(role_users)}")
print("\nИнформация о данных:")
display(role_users.info())
print("\nПервые 5 строк:")
display(role_users.head())
Сгенерировано строк: 209 Информация о данных: <class 'pandas.core.frame.DataFrame'> RangeIndex: 209 entries, 0 to 208 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Имя пользователя 209 non-null object 1 Должность пользователя 209 non-null object 2 Уровень доступа пользователя 204 non-null float64 3 Тип учетной записи пользователя 199 non-null float64 4 Блокировка учетной записи пользователя 152 non-null object 5 Название роли 209 non-null object dtypes: float64(2), object(4) memory usage: 9.9+ KB
None
Первые 5 строк:
| Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Блокировка учетной записи пользователя | Название роли | |
|---|---|---|---|---|---|---|
| 0 | Комаров Р.Т. | Менеджер проекта | 1.0 | 0.0 | False | IT-отдел |
| 1 | Ильин О.К. | Специалист | 0.0 | 0.0 | None | Отдел продаж |
| 2 | Соколов Р.Е. | Младший специалист | 1.0 | 1.0 | False | Отдел кадров |
| 3 | Комаров И.А. | Старший специалист | 1.0 | 1.0 | False | Отдел продаж |
| 4 | Смирнова О.Б. | Менеджер проекта | 0.0 | 0.0 | True | Отдел продаж |
# Добавление логина пользователя
trans_dict = {'А':'a', 'Б':'b', 'В':'v', 'Г':'g', 'Д':'d', 'Е':'e', 'Ё':'eo',
'Ж':'zh', 'З':'z', 'И':'i', 'Й':'iy', 'К':'k', 'Л':'l', 'М':'m', 'Н':'n',
'О':'o', 'П':'p', 'Р':'r', 'С':'s', 'Т':'t', 'У':'u', 'Ф':'f',
'Х':'h', 'Ц':'c', 'Ч':'ch', 'Ш':'sh', 'Щ':'shi', 'Ъ':'', 'Ы':'iy',
'Ь':'', 'Э':'e', 'Ю':'yu', 'Я':'ya',
'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'eo',
'ж':'zh', 'з':'z', 'и':'i', 'й':'iy', 'к':'k', 'л':'l', 'м':'m', 'н':'n',
'о':'o', 'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f',
'х':'h', 'ц':'c', 'ч':'ch', 'ш':'sh', 'щ':'shi', 'ъ':'', 'ы':'iy',
'ь':'', 'э':'e', 'ю':'yu', 'я':'ya'}
trans_table = str.maketrans(trans_dict)
role_users['Логин пользователя'] = role_users['Имя пользователя'].str.translate(trans_table)
role_users['Логин пользователя'] = role_users['Логин пользователя'].str.replace(' ', '')
role_users['Логин пользователя'] = role_users['Логин пользователя'].str.replace('.', '')
print(role_users.info())
role_users.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 209 entries, 0 to 208 Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Имя пользователя 209 non-null object 1 Должность пользователя 209 non-null object 2 Уровень доступа пользователя 204 non-null float64 3 Тип учетной записи пользователя 199 non-null float64 4 Блокировка учетной записи пользователя 152 non-null object 5 Название роли 209 non-null object 6 Логин пользователя 209 non-null object dtypes: float64(2), object(5) memory usage: 11.6+ KB None
| Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Блокировка учетной записи пользователя | Название роли | Логин пользователя | |
|---|---|---|---|---|---|---|---|
| 0 | Комаров Р.Т. | Менеджер проекта | 1.0 | 0.0 | False | IT-отдел | komarovrt |
| 1 | Ильин О.К. | Специалист | 0.0 | 0.0 | None | Отдел продаж | ilinok |
| 2 | Соколов Р.Е. | Младший специалист | 1.0 | 1.0 | False | Отдел кадров | sokolovre |
| 3 | Комаров И.А. | Старший специалист | 1.0 | 1.0 | False | Отдел продаж | komarovia |
| 4 | Смирнова О.Б. | Менеджер проекта | 0.0 | 0.0 | True | Отдел продаж | smirnovaob |
# Создание идентификаторов
uniqueidentifier = [str(uuid.uuid4()) for _ in range(len(role_users)*10)]
# Идентификаторы пользьвателей
role_users['ID пользователя'] = uniqueidentifier[0:len(role_users)]
# Идентификаторы ролей
role_users['ID роли'] = uniqueidentifier[len(role_users)+1:len(role_users)*2+1]
print(role_users.info())
role_users.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 209 entries, 0 to 208 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Имя пользователя 209 non-null object 1 Должность пользователя 209 non-null object 2 Уровень доступа пользователя 204 non-null float64 3 Тип учетной записи пользователя 199 non-null float64 4 Блокировка учетной записи пользователя 152 non-null object 5 Название роли 209 non-null object 6 Логин пользователя 209 non-null object 7 ID пользователя 209 non-null object 8 ID роли 209 non-null object dtypes: float64(2), object(7) memory usage: 14.8+ KB None
| Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Блокировка учетной записи пользователя | Название роли | Логин пользователя | ID пользователя | ID роли | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Комаров Р.Т. | Менеджер проекта | 1.0 | 0.0 | False | IT-отдел | komarovrt | b554a73d-e711-404c-a92f-6b532d590f73 | 0ebe84b4-137e-4020-b29e-3749d2a6310b |
| 1 | Ильин О.К. | Специалист | 0.0 | 0.0 | None | Отдел продаж | ilinok | 8da6a188-ec22-4d89-832a-ebbfaba2eebf | 3a7ba0fd-8929-438a-9b24-26a7bd547ec2 |
| 2 | Соколов Р.Е. | Младший специалист | 1.0 | 1.0 | False | Отдел кадров | sokolovre | 628d7ee9-3f74-4d66-bfc6-5ab086c5c903 | daf6589d-885b-49ed-a347-2ea54076ea56 |
| 3 | Комаров И.А. | Старший специалист | 1.0 | 1.0 | False | Отдел продаж | komarovia | d12eb580-8dac-4371-bb7d-66261719caef | 66d273c8-d957-4bb3-9623-3e790daa54d9 |
| 4 | Смирнова О.Б. | Менеджер проекта | 0.0 | 0.0 | True | Отдел продаж | smirnovaob | b42fa3ea-2482-460f-abd2-4a0e3531738c | 581bcaa7-d3fe-4483-8cc2-6446e1ea33b4 |
# Назначение начальников олтделов
role_users.loc[role_users.groupby('Название роли').head(1).index, 'Должность пользователя'] = 'Начальник отдела'
role_users[role_users['Должность пользователя'] == 'Начальник отдела']
| Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Блокировка учетной записи пользователя | Название роли | Логин пользователя | ID пользователя | ID роли | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Комаров Р.Т. | Начальник отдела | 1.0 | 0.0 | False | IT-отдел | komarovrt | b554a73d-e711-404c-a92f-6b532d590f73 | 0ebe84b4-137e-4020-b29e-3749d2a6310b |
| 1 | Ильин О.К. | Начальник отдела | 0.0 | 0.0 | None | Отдел продаж | ilinok | 8da6a188-ec22-4d89-832a-ebbfaba2eebf | 3a7ba0fd-8929-438a-9b24-26a7bd547ec2 |
| 2 | Соколов Р.Е. | Начальник отдела | 1.0 | 1.0 | False | Отдел кадров | sokolovre | 628d7ee9-3f74-4d66-bfc6-5ab086c5c903 | daf6589d-885b-49ed-a347-2ea54076ea56 |
| 8 | Кузьмина Л.Е. | Начальник отдела | 0.0 | 1.0 | False | Производственный отдел | kuzminale | 2f5f522f-b38b-451c-8854-17544baa3fd7 | 4673a94b-6f22-4d34-b440-57a4a559f916 |
| 14 | Соловьёва Р.Д. | Начальник отдела | 1.0 | 1.0 | False | Бухгалтерия | soloveovard | 470cafb7-2f30-4b8f-8b53-6b2f62e367b7 | 00090679-2296-42b7-8b18-3c98d47e1379 |
| 17 | Иванова В.Е. | Начальник отдела | 1.0 | 0.0 | None | Руководство | ivanovave | 325fa7f0-741b-4d03-a997-bb1b8be45af3 | 8bc6c157-9189-4b2b-a0b1-b7f866c86865 |
| 36 | Богданова Е.Б. | Начальник отдела | 0.0 | 2.0 | False | Юридический отдел | bogdanovaeb | edc05724-4df7-4ddf-a47b-32f07e281635 | 1807dab9-eaba-4bd7-b3a5-213b82bb3542 |
# Назначение директоров
n = -4
for i in ['Генеральный директор', 'Финансовый директор', 'Директор по развитию']:
role_users.loc[role_users[role_users['Название роли'] == 'Руководство'].iloc[n:n+1].index, 'Должность пользователя'] = i
n = n + 1
role_users[role_users['Название роли'] == 'Руководство'].iloc[-4:]
| Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Блокировка учетной записи пользователя | Название роли | Логин пользователя | ID пользователя | ID роли | |
|---|---|---|---|---|---|---|---|---|---|
| 171 | Куликов Б.В. | Генеральный директор | 1.0 | 2.0 | False | Руководство | kulikovbv | 578f781d-f3a0-4158-9cdb-9493c4f7a04d | a076e8a6-e11d-4e1d-a44a-542d14f898d6 |
| 183 | Попова Р.Р. | Финансовый директор | 0.0 | NaN | False | Руководство | popovarr | 9ccecbc0-9243-442a-b62c-8b194b66eb88 | 0eb9741d-4460-4de8-9834-1252c4dc288a |
| 185 | Тарасова К.Т. | Директор по развитию | 1.0 | 0.0 | False | Руководство | tarasovakt | f68fda21-b543-4884-81c0-02a73b83bc13 | d8f3ebed-ee33-48ca-84fc-9364eab112e2 |
| 200 | Петрова Г.Е. | Ассистент | 1.0 | 1.0 | False | Руководство | petrovage | 2b982862-98bd-4bd1-9d77-9634dee05247 | 085bfc68-5071-4b5e-8ef7-11ebc0946d7f |
# Добавление тиапа роли (2 - подразделение)
role_users['Тип роли'] = 2
role_users.head(5)
| Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Блокировка учетной записи пользователя | Название роли | Логин пользователя | ID пользователя | ID роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Комаров Р.Т. | Начальник отдела | 1.0 | 0.0 | False | IT-отдел | komarovrt | b554a73d-e711-404c-a92f-6b532d590f73 | 0ebe84b4-137e-4020-b29e-3749d2a6310b | 2 |
| 1 | Ильин О.К. | Начальник отдела | 0.0 | 0.0 | None | Отдел продаж | ilinok | 8da6a188-ec22-4d89-832a-ebbfaba2eebf | 3a7ba0fd-8929-438a-9b24-26a7bd547ec2 | 2 |
| 2 | Соколов Р.Е. | Начальник отдела | 1.0 | 1.0 | False | Отдел кадров | sokolovre | 628d7ee9-3f74-4d66-bfc6-5ab086c5c903 | daf6589d-885b-49ed-a347-2ea54076ea56 | 2 |
| 3 | Комаров И.А. | Старший специалист | 1.0 | 1.0 | False | Отдел продаж | komarovia | d12eb580-8dac-4371-bb7d-66261719caef | 66d273c8-d957-4bb3-9623-3e790daa54d9 | 2 |
| 4 | Смирнова О.Б. | Менеджер проекта | 0.0 | 0.0 | True | Отдел продаж | smirnovaob | b42fa3ea-2482-460f-abd2-4a0e3531738c | 581bcaa7-d3fe-4483-8cc2-6446e1ea33b4 | 2 |
# Создание системных ролей
_system_roles = pd.DataFrame({
'ID пользователя': [
'11111111-1111-1111-1111-111111111111', # 'System'
'00000000-0000-0000-0000-000000000002', # 'Бухгалтерские сервисы'
'00000000-0000-0000-0000-000000000003', # 'ИТ-сервисы'
'00000000-0000-0000-0000-000000000004', # 'Сайт компании'
'00000000-0000-0000-0000-000000000005', # 'Робот службы безопасности'
'00000000-0000-0000-0000-000000000006', # 'Робот финансовой службы'
'00000000-0000-0000-0000-000000000007' # 'Юридические сервисы'
],
'Имя пользователя': [
'System',
'Бухгалтерские сервисы',
'ИТ-сервисы',
'Сайт компании',
'Робот службы безопасности',
'Робот финансовой службы',
'Юридические сервисы'
],
'Должность пользователя': [
'Сервис',
'Сервис',
'Сервис',
'Сервис',
'Робот',
'Робот',
'Сервис'
],
'Уровень доступа пользователя': [
1, 0, 0, 0, 1, 0, 0
],
'Тип учетной записи пользователя': [
1, 2, 2, 2, 2, 2, 2
],
'Логин пользователя': [
'system',
'accounting_services',
'it_services',
'company_website',
'security_service_robot',
'financial_service_robot',
'legal_services'
],
'Блокировка учетной записи пользователя': [
False, False, False, False, False, False, False
]
})
# Вхожденрие системных ролей самих в себя
_system_roles['ID роли'] = _system_roles['ID пользователя']
_system_roles['Название роли'] = _system_roles['Имя пользователя']
_system_roles['Тип роли'] = 1
# Добавление системных ролей
role_users = pd.concat([role_users, _system_roles], ignore_index=True)
role_users[role_users['Должность пользователя'].isin(['Сервис', 'Робот'])]
| Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Блокировка учетной записи пользователя | Название роли | Логин пользователя | ID пользователя | ID роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 209 | System | Сервис | 1.0 | 1.0 | False | System | system | 11111111-1111-1111-1111-111111111111 | 11111111-1111-1111-1111-111111111111 | 1 |
| 210 | Бухгалтерские сервисы | Сервис | 0.0 | 2.0 | False | Бухгалтерские сервисы | accounting_services | 00000000-0000-0000-0000-000000000002 | 00000000-0000-0000-0000-000000000002 | 1 |
| 211 | ИТ-сервисы | Сервис | 0.0 | 2.0 | False | ИТ-сервисы | it_services | 00000000-0000-0000-0000-000000000003 | 00000000-0000-0000-0000-000000000003 | 1 |
| 212 | Сайт компании | Сервис | 0.0 | 2.0 | False | Сайт компании | company_website | 00000000-0000-0000-0000-000000000004 | 00000000-0000-0000-0000-000000000004 | 1 |
| 213 | Робот службы безопасности | Робот | 1.0 | 2.0 | False | Робот службы безопасности | security_service_robot | 00000000-0000-0000-0000-000000000005 | 00000000-0000-0000-0000-000000000005 | 1 |
| 214 | Робот финансовой службы | Робот | 0.0 | 2.0 | False | Робот финансовой службы | financial_service_robot | 00000000-0000-0000-0000-000000000006 | 00000000-0000-0000-0000-000000000006 | 1 |
| 215 | Юридические сервисы | Сервис | 0.0 | 2.0 | False | Юридические сервисы | legal_services | 00000000-0000-0000-0000-000000000007 | 00000000-0000-0000-0000-000000000007 | 1 |
# Вхождение персональных ролей самих в себя в таблице RoleUsers
role_users_ = role_users.copy()
role_users_['ID роли'] = role_users_['ID пользователя']
role_users_['Название роли'] = role_users_['Имя пользователя']
# Добавление тиапа роли (1 - сотрудник)
role_users_['Тип роли'] = 1
role_users = pd.concat([role_users, role_users_], ignore_index=True)
print(role_users.info())
display(role_users[role_users['ID роли'] != role_users['ID пользователя']].head(5))
role_users[role_users['ID роли'] == role_users['ID пользователя']].head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 432 entries, 0 to 431 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Имя пользователя 432 non-null object 1 Должность пользователя 432 non-null object 2 Уровень доступа пользователя 422 non-null float64 3 Тип учетной записи пользователя 412 non-null float64 4 Блокировка учетной записи пользователя 318 non-null object 5 Название роли 432 non-null object 6 Логин пользователя 432 non-null object 7 ID пользователя 432 non-null object 8 ID роли 432 non-null object 9 Тип роли 432 non-null int64 dtypes: float64(2), int64(1), object(7) memory usage: 33.9+ KB None
| Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Блокировка учетной записи пользователя | Название роли | Логин пользователя | ID пользователя | ID роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Комаров Р.Т. | Начальник отдела | 1.0 | 0.0 | False | IT-отдел | komarovrt | b554a73d-e711-404c-a92f-6b532d590f73 | 0ebe84b4-137e-4020-b29e-3749d2a6310b | 2 |
| 1 | Ильин О.К. | Начальник отдела | 0.0 | 0.0 | None | Отдел продаж | ilinok | 8da6a188-ec22-4d89-832a-ebbfaba2eebf | 3a7ba0fd-8929-438a-9b24-26a7bd547ec2 | 2 |
| 2 | Соколов Р.Е. | Начальник отдела | 1.0 | 1.0 | False | Отдел кадров | sokolovre | 628d7ee9-3f74-4d66-bfc6-5ab086c5c903 | daf6589d-885b-49ed-a347-2ea54076ea56 | 2 |
| 3 | Комаров И.А. | Старший специалист | 1.0 | 1.0 | False | Отдел продаж | komarovia | d12eb580-8dac-4371-bb7d-66261719caef | 66d273c8-d957-4bb3-9623-3e790daa54d9 | 2 |
| 4 | Смирнова О.Б. | Менеджер проекта | 0.0 | 0.0 | True | Отдел продаж | smirnovaob | b42fa3ea-2482-460f-abd2-4a0e3531738c | 581bcaa7-d3fe-4483-8cc2-6446e1ea33b4 | 2 |
| Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Блокировка учетной записи пользователя | Название роли | Логин пользователя | ID пользователя | ID роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 209 | System | Сервис | 1.0 | 1.0 | False | System | system | 11111111-1111-1111-1111-111111111111 | 11111111-1111-1111-1111-111111111111 | 1 |
| 210 | Бухгалтерские сервисы | Сервис | 0.0 | 2.0 | False | Бухгалтерские сервисы | accounting_services | 00000000-0000-0000-0000-000000000002 | 00000000-0000-0000-0000-000000000002 | 1 |
| 211 | ИТ-сервисы | Сервис | 0.0 | 2.0 | False | ИТ-сервисы | it_services | 00000000-0000-0000-0000-000000000003 | 00000000-0000-0000-0000-000000000003 | 1 |
| 212 | Сайт компании | Сервис | 0.0 | 2.0 | False | Сайт компании | company_website | 00000000-0000-0000-0000-000000000004 | 00000000-0000-0000-0000-000000000004 | 1 |
| 213 | Робот службы безопасности | Робот | 1.0 | 2.0 | False | Робот службы безопасности | security_service_robot | 00000000-0000-0000-0000-000000000005 | 00000000-0000-0000-0000-000000000005 | 1 |
# Добавление данных о вхождении персональных ролей в статические роли
# Статические роли для бизнес-процессов
business_roles = [
'Обработчик входящих документов',
'Ответственный за договоры',
'Согласующий финансовых документов',
'Контролер качества'
]
# Идентификаторы пользователей, которые могут получить доступ к статическим ролям
personal_roles_id = role_users[role_users['ID роли'] != role_users['ID пользователя']]['ID пользователя'].tolist()
# Идентификаторы статических ролей
business_roles_id = uniqueidentifier[len(role_users)*3:len(role_users)*3+len(business_roles)]
# Создание датафрейма с данными о статических ролях
business_roles_data = pd.DataFrame({'ID роли': business_roles_id, 'Название роли': business_roles})
columns = [
('ID пользователя', 'str'),
('ID роли', 'str')
]
text_substrings = {
'ID пользователя': personal_roles_id,
'ID роли': business_roles_id
}
numeric_ranges = []
bool_probabilities = []
# Генерация DataFrame
role_users_ = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=.75,
numeric_probability=.5,
bool_probability=.5,
mean_row_count=100,
deviation_row_count=20
)
# Удаление пустых связей между ролями
role_users_ = role_users_[(~role_users_['ID пользователя'].isnull()) & ~role_users_['ID роли'].isnull()]
# Добавление данных пользоватеолей
role_users_ = pd.merge(role_users_, role_users.drop(['ID роли', 'Название роли', 'Тип роли'], axis=1), on='ID пользователя', how='left').drop_duplicates()
# Добавление названия ролей
role_users_ = pd.merge(role_users_, business_roles_data, on='ID роли', how='inner')
# Добавление тиапа роли (0 - статическая)
role_users_['Тип роли'] = 0
# Объединение основного датафрейма role_users и вспомагательного role_users_
role_users = pd.concat([role_users, role_users_], ignore_index=True)
# Ранжирование полей датафрейма
role_users = role_users[[
'ID пользователя', 'Имя пользователя', 'Должность пользователя',
'Уровень доступа пользователя', 'Тип учетной записи пользователя',
'Логин пользователя', 'Блокировка учетной записи пользователя',
'ID роли', 'Название роли', 'Тип роли'
]]
print(f"\nСгенерировано строк: {len(role_users)}")
print("\nИнформация о данных:")
display(role_users[role_users['Тип роли'] == 0].info())
print("\nПервые 5 строк:")
role_users[role_users['Тип роли'] == 0].head(5)
Сгенерировано строк: 483 Информация о данных: <class 'pandas.core.frame.DataFrame'> Index: 51 entries, 432 to 482 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID пользователя 51 non-null object 1 Имя пользователя 51 non-null object 2 Должность пользователя 51 non-null object 3 Уровень доступа пользователя 50 non-null float64 4 Тип учетной записи пользователя 49 non-null float64 5 Логин пользователя 51 non-null object 6 Блокировка учетной записи пользователя 35 non-null object 7 ID роли 51 non-null object 8 Название роли 51 non-null object 9 Тип роли 51 non-null int64 dtypes: float64(2), int64(1), object(7) memory usage: 4.4+ KB
None
Первые 5 строк:
| ID пользователя | Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Логин пользователя | Блокировка учетной записи пользователя | ID роли | Название роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 432 | c565b79e-772b-4350-a32c-affc7e69f86a | Богданов И.Е. | Специалист | 1.0 | 1.0 | bogdanovie | None | 0eda49ad-18db-4d8f-bbfc-5239b3f39252 | Обработчик входящих документов | 0 |
| 433 | 48caada0-93db-4122-91c4-131fa16783d5 | Степанова О.Г. | Специалист | 0.0 | 0.0 | stepanovaog | None | 0eda49ad-18db-4d8f-bbfc-5239b3f39252 | Обработчик входящих документов | 0 |
| 434 | 996b9a6b-1feb-4702-abfc-71bbababde1d | Гусева Л.Д. | Старший специалист | 1.0 | 1.0 | gusevald | False | 0eda49ad-18db-4d8f-bbfc-5239b3f39252 | Обработчик входящих документов | 0 |
| 435 | 79fb1fe7-bdbe-490b-a6ff-9d9021431882 | Кузьмина Л.М. | Старший специалист | 1.0 | 1.0 | kuzminalm | False | 0eda49ad-18db-4d8f-bbfc-5239b3f39252 | Обработчик входящих документов | 0 |
| 436 | b3e8364c-528a-4493-b998-fd75d3cfa58a | Беляева К.С. | Специалист | 0.0 | 2.0 | belyaevaks | None | 0eda49ad-18db-4d8f-bbfc-5239b3f39252 | Обработчик входящих документов | 0 |
# Проверка сгенерированных данных таблицы role_users
print('Вхождение ролей сотрудников в самих себя и в любые другие роли:')
display(role_users[role_users['ID роли'] != role_users['ID пользователя']].head(5))
display(role_users[role_users['ID роли'] == role_users['ID пользователя']].head(5))
print('\nСотрудники подразделений:')
display(role_users[role_users['Тип роли'] == 2].head(5))
print('\nНачальники отделов:')
display(role_users[
(role_users['Должность пользователя'] == 'Начальник отдела')
& (role_users['Тип роли'] == 2)
].head(30))
print('\nДиректора:')
display(role_users[
(role_users['Должность пользователя'].str.contains('иректор'))
& (role_users['Тип роли'] == 2)
].head(5))
print('\nСотрудники, входящие в статические роли:')
display(role_users[role_users['Тип роли'] == 0].head(5))
print('\nСотрудники с неизвестным типом учетной записи:')
display(role_users[
(role_users['Тип учетной записи пользователя'].isna())
& (role_users['Тип роли'] == 1)
].head(5))
Вхождение ролей сотрудников в самих себя и в любые другие роли:
| ID пользователя | Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Логин пользователя | Блокировка учетной записи пользователя | ID роли | Название роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | b554a73d-e711-404c-a92f-6b532d590f73 | Комаров Р.Т. | Начальник отдела | 1.0 | 0.0 | komarovrt | False | 0ebe84b4-137e-4020-b29e-3749d2a6310b | IT-отдел | 2 |
| 1 | 8da6a188-ec22-4d89-832a-ebbfaba2eebf | Ильин О.К. | Начальник отдела | 0.0 | 0.0 | ilinok | None | 3a7ba0fd-8929-438a-9b24-26a7bd547ec2 | Отдел продаж | 2 |
| 2 | 628d7ee9-3f74-4d66-bfc6-5ab086c5c903 | Соколов Р.Е. | Начальник отдела | 1.0 | 1.0 | sokolovre | False | daf6589d-885b-49ed-a347-2ea54076ea56 | Отдел кадров | 2 |
| 3 | d12eb580-8dac-4371-bb7d-66261719caef | Комаров И.А. | Старший специалист | 1.0 | 1.0 | komarovia | False | 66d273c8-d957-4bb3-9623-3e790daa54d9 | Отдел продаж | 2 |
| 4 | b42fa3ea-2482-460f-abd2-4a0e3531738c | Смирнова О.Б. | Менеджер проекта | 0.0 | 0.0 | smirnovaob | True | 581bcaa7-d3fe-4483-8cc2-6446e1ea33b4 | Отдел продаж | 2 |
| ID пользователя | Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Логин пользователя | Блокировка учетной записи пользователя | ID роли | Название роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 209 | 11111111-1111-1111-1111-111111111111 | System | Сервис | 1.0 | 1.0 | system | False | 11111111-1111-1111-1111-111111111111 | System | 1 |
| 210 | 00000000-0000-0000-0000-000000000002 | Бухгалтерские сервисы | Сервис | 0.0 | 2.0 | accounting_services | False | 00000000-0000-0000-0000-000000000002 | Бухгалтерские сервисы | 1 |
| 211 | 00000000-0000-0000-0000-000000000003 | ИТ-сервисы | Сервис | 0.0 | 2.0 | it_services | False | 00000000-0000-0000-0000-000000000003 | ИТ-сервисы | 1 |
| 212 | 00000000-0000-0000-0000-000000000004 | Сайт компании | Сервис | 0.0 | 2.0 | company_website | False | 00000000-0000-0000-0000-000000000004 | Сайт компании | 1 |
| 213 | 00000000-0000-0000-0000-000000000005 | Робот службы безопасности | Робот | 1.0 | 2.0 | security_service_robot | False | 00000000-0000-0000-0000-000000000005 | Робот службы безопасности | 1 |
Сотрудники подразделений:
| ID пользователя | Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Логин пользователя | Блокировка учетной записи пользователя | ID роли | Название роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | b554a73d-e711-404c-a92f-6b532d590f73 | Комаров Р.Т. | Начальник отдела | 1.0 | 0.0 | komarovrt | False | 0ebe84b4-137e-4020-b29e-3749d2a6310b | IT-отдел | 2 |
| 1 | 8da6a188-ec22-4d89-832a-ebbfaba2eebf | Ильин О.К. | Начальник отдела | 0.0 | 0.0 | ilinok | None | 3a7ba0fd-8929-438a-9b24-26a7bd547ec2 | Отдел продаж | 2 |
| 2 | 628d7ee9-3f74-4d66-bfc6-5ab086c5c903 | Соколов Р.Е. | Начальник отдела | 1.0 | 1.0 | sokolovre | False | daf6589d-885b-49ed-a347-2ea54076ea56 | Отдел кадров | 2 |
| 3 | d12eb580-8dac-4371-bb7d-66261719caef | Комаров И.А. | Старший специалист | 1.0 | 1.0 | komarovia | False | 66d273c8-d957-4bb3-9623-3e790daa54d9 | Отдел продаж | 2 |
| 4 | b42fa3ea-2482-460f-abd2-4a0e3531738c | Смирнова О.Б. | Менеджер проекта | 0.0 | 0.0 | smirnovaob | True | 581bcaa7-d3fe-4483-8cc2-6446e1ea33b4 | Отдел продаж | 2 |
Начальники отделов:
| ID пользователя | Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Логин пользователя | Блокировка учетной записи пользователя | ID роли | Название роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | b554a73d-e711-404c-a92f-6b532d590f73 | Комаров Р.Т. | Начальник отдела | 1.0 | 0.0 | komarovrt | False | 0ebe84b4-137e-4020-b29e-3749d2a6310b | IT-отдел | 2 |
| 1 | 8da6a188-ec22-4d89-832a-ebbfaba2eebf | Ильин О.К. | Начальник отдела | 0.0 | 0.0 | ilinok | None | 3a7ba0fd-8929-438a-9b24-26a7bd547ec2 | Отдел продаж | 2 |
| 2 | 628d7ee9-3f74-4d66-bfc6-5ab086c5c903 | Соколов Р.Е. | Начальник отдела | 1.0 | 1.0 | sokolovre | False | daf6589d-885b-49ed-a347-2ea54076ea56 | Отдел кадров | 2 |
| 8 | 2f5f522f-b38b-451c-8854-17544baa3fd7 | Кузьмина Л.Е. | Начальник отдела | 0.0 | 1.0 | kuzminale | False | 4673a94b-6f22-4d34-b440-57a4a559f916 | Производственный отдел | 2 |
| 14 | 470cafb7-2f30-4b8f-8b53-6b2f62e367b7 | Соловьёва Р.Д. | Начальник отдела | 1.0 | 1.0 | soloveovard | False | 00090679-2296-42b7-8b18-3c98d47e1379 | Бухгалтерия | 2 |
| 17 | 325fa7f0-741b-4d03-a997-bb1b8be45af3 | Иванова В.Е. | Начальник отдела | 1.0 | 0.0 | ivanovave | None | 8bc6c157-9189-4b2b-a0b1-b7f866c86865 | Руководство | 2 |
| 36 | edc05724-4df7-4ddf-a47b-32f07e281635 | Богданова Е.Б. | Начальник отдела | 0.0 | 2.0 | bogdanovaeb | False | 1807dab9-eaba-4bd7-b3a5-213b82bb3542 | Юридический отдел | 2 |
Директора:
| ID пользователя | Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Логин пользователя | Блокировка учетной записи пользователя | ID роли | Название роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 171 | 578f781d-f3a0-4158-9cdb-9493c4f7a04d | Куликов Б.В. | Генеральный директор | 1.0 | 2.0 | kulikovbv | False | a076e8a6-e11d-4e1d-a44a-542d14f898d6 | Руководство | 2 |
| 183 | 9ccecbc0-9243-442a-b62c-8b194b66eb88 | Попова Р.Р. | Финансовый директор | 0.0 | NaN | popovarr | False | 0eb9741d-4460-4de8-9834-1252c4dc288a | Руководство | 2 |
| 185 | f68fda21-b543-4884-81c0-02a73b83bc13 | Тарасова К.Т. | Директор по развитию | 1.0 | 0.0 | tarasovakt | False | d8f3ebed-ee33-48ca-84fc-9364eab112e2 | Руководство | 2 |
Сотрудники, входящие в статические роли:
| ID пользователя | Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Логин пользователя | Блокировка учетной записи пользователя | ID роли | Название роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 432 | c565b79e-772b-4350-a32c-affc7e69f86a | Богданов И.Е. | Специалист | 1.0 | 1.0 | bogdanovie | None | 0eda49ad-18db-4d8f-bbfc-5239b3f39252 | Обработчик входящих документов | 0 |
| 433 | 48caada0-93db-4122-91c4-131fa16783d5 | Степанова О.Г. | Специалист | 0.0 | 0.0 | stepanovaog | None | 0eda49ad-18db-4d8f-bbfc-5239b3f39252 | Обработчик входящих документов | 0 |
| 434 | 996b9a6b-1feb-4702-abfc-71bbababde1d | Гусева Л.Д. | Старший специалист | 1.0 | 1.0 | gusevald | False | 0eda49ad-18db-4d8f-bbfc-5239b3f39252 | Обработчик входящих документов | 0 |
| 435 | 79fb1fe7-bdbe-490b-a6ff-9d9021431882 | Кузьмина Л.М. | Старший специалист | 1.0 | 1.0 | kuzminalm | False | 0eda49ad-18db-4d8f-bbfc-5239b3f39252 | Обработчик входящих документов | 0 |
| 436 | b3e8364c-528a-4493-b998-fd75d3cfa58a | Беляева К.С. | Специалист | 0.0 | 2.0 | belyaevaks | None | 0eda49ad-18db-4d8f-bbfc-5239b3f39252 | Обработчик входящих документов | 0 |
Сотрудники с неизвестным типом учетной записи:
| ID пользователя | Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Логин пользователя | Блокировка учетной записи пользователя | ID роли | Название роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 283 | b1446964-1ab8-414d-88dc-dc4e306cad22 | Павлова В.Г. | Младший специалист | 1.0 | NaN | pavlovavg | True | b1446964-1ab8-414d-88dc-dc4e306cad22 | Павлова В.Г. | 1 |
| 304 | cc0aff65-2735-4c2f-8b36-f14fc3c369a4 | Павлова С.Л. | Ассистент | 0.0 | NaN | pavlovasl | False | cc0aff65-2735-4c2f-8b36-f14fc3c369a4 | Павлова С.Л. | 1 |
| 305 | 3194820d-c5cd-463d-bf58-6c15ccc3ba86 | Богданова Е.Б. | Менеджер проекта | 0.0 | NaN | bogdanovaeb | False | 3194820d-c5cd-463d-bf58-6c15ccc3ba86 | Богданова Е.Б. | 1 |
| 346 | e6a02b39-afe6-4cb6-a3c7-1b8dd86ee051 | Пономарёва Б.И. | Ассистент | 0.0 | NaN | ponomareovabi | True | e6a02b39-afe6-4cb6-a3c7-1b8dd86ee051 | Пономарёва Б.И. | 1 |
| 362 | 5b7ff8fc-b9bf-486c-899a-73ba742aa4af | Михайлов Б.Р. | Специалист | 0.0 | NaN | mihaiylovbr | False | 5b7ff8fc-b9bf-486c-899a-73ba742aa4af | Михайлов Б.Р. | 1 |
# Выгрузка данных датафрейма `role_users` в файл `RoleUsers.csv`
role_users.to_csv('files/RoleUsers.csv')
# Проверка выгрзки
df = pd.read_csv('files/RoleUsers.csv').drop('Unnamed: 0', axis=1)
df.head(5)
| ID пользователя | Имя пользователя | Должность пользователя | Уровень доступа пользователя | Тип учетной записи пользователя | Логин пользователя | Блокировка учетной записи пользователя | ID роли | Название роли | Тип роли | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | b554a73d-e711-404c-a92f-6b532d590f73 | Комаров Р.Т. | Начальник отдела | 1.0 | 0.0 | komarovrt | False | 0ebe84b4-137e-4020-b29e-3749d2a6310b | IT-отдел | 2 |
| 1 | 8da6a188-ec22-4d89-832a-ebbfaba2eebf | Ильин О.К. | Начальник отдела | 0.0 | 0.0 | ilinok | NaN | 3a7ba0fd-8929-438a-9b24-26a7bd547ec2 | Отдел продаж | 2 |
| 2 | 628d7ee9-3f74-4d66-bfc6-5ab086c5c903 | Соколов Р.Е. | Начальник отдела | 1.0 | 1.0 | sokolovre | False | daf6589d-885b-49ed-a347-2ea54076ea56 | Отдел кадров | 2 |
| 3 | d12eb580-8dac-4371-bb7d-66261719caef | Комаров И.А. | Старший специалист | 1.0 | 1.0 | komarovia | False | 66d273c8-d957-4bb3-9623-3e790daa54d9 | Отдел продаж | 2 |
| 4 | b42fa3ea-2482-460f-abd2-4a0e3531738c | Смирнова О.Б. | Менеджер проекта | 0.0 | 0.0 | smirnovaob | True | 581bcaa7-d3fe-4483-8cc2-6446e1ea33b4 | Отдел продаж | 2 |
Создание датафрейма context_roles и выгрузка данных в файл ContextRoles.csv¶
Данные о контекстных ролях из таблицы ContextRoles (cr), выгруженные в файл ContextRoles.csv:
| № | Поле БД | Название поля после выгрузки | Тип поля после выгрузки | Комментарии |
|---|---|---|---|---|
| 1 | cr.ID | ID роли | str | |
| 2 | cr.SqlText | Код SQL | str | Текст базового SQL запроса |
# Создание таблицы `ContextRoles`
# Коды SQL контекстных ролей
context_roles = pd.DataFrame({
'Код SQL': [
# Проверка роли "Автор" для текущего документа
"""
SELECT u.UserID, u.Name
FROM Users u
JOIN ContextRoleAssignments cra ON u.UserID = cra.UserID
JOIN Roles r ON cra.RoleID = r.RoleID
WHERE cra.ObjectID = @CurrentDocumentID -- текущий документ
AND u.UserID = @CurrentUserID -- текущий пользователь
AND r.RoleName = 'Автор'
AND cra.ObjectType = 'Документ';
""",
# Проверка роли "Согласующий"
"""
SELECT u.UserID, u.Name
FROM Users u
JOIN ContextRoleAssignments cra ON u.UserID = cra.UserID
JOIN Roles r ON cra.RoleID = r.RoleID
WHERE cra.ObjectID = @CurrentDocumentID
AND u.UserID = @CurrentUserID
AND r.RoleName = 'Согласующий'
AND cra.ObjectType = 'Документ'
AND cra.WorkflowStage = 'Согласование'; -- этап процесса
""",
# Проверка роли "Исполнитель"
"""
SELECT u.UserID, u.Name
FROM Users u
JOIN ContextRoleAssignments cra ON u.UserID = cra.UserID
JOIN Roles r ON cra.RoleID = r.RoleID
WHERE cra.ObjectID = @TaskID -- ID задачи
AND u.UserID = @CurrentUserID
AND r.RoleName = 'Исполнитель'
AND cra.ObjectType = 'Задача'
AND (cra.EndDate IS NULL OR cra.EndDate >= GETDATE()); -- активная роль
""",
# Проверка роли "Утверждающий"
"""
SELECT u.UserID, u.Name
FROM Users u
JOIN ContextRoleAssignments cra ON u.UserID = cra.UserID
JOIN Roles r ON cra.RoleID = r.RoleID
WHERE cra.ObjectID = @DocumentID
AND u.UserID = @CurrentUserID
AND r.RoleName = 'Утверждающий'
AND cra.ObjectType = 'Документ'
AND cra.StartDate <= GETDATE() -- роль активна с даты начала
AND (cra.EndDate IS NULL OR cra.EndDate >= GETDATE());
""",
# Проверка роли "Контролёр"
"""
SELECT u.UserID, u.Name
FROM Users u
JOIN ContextRoleAssignments cra ON u.UserID = cra.UserID
JOIN Roles r ON cra.RoleID = r.RoleID
WHERE cra.ObjectID = @DocumentID
AND u.UserID = @CurrentUserID
AND r.RoleName = 'Контролёр'
AND cra.ObjectType = 'Документ'
AND EXISTS (
SELECT 1
FROM Documents d
WHERE d.DocumentID = cra.ObjectID
AND d.Status = 'На контроле' -- дополнительный фильтр
);
"""
]
})
# Создание идентификаторов
uniqueidentifier = [str(uuid.uuid4()) for _ in range(len(context_roles)*10)]
# Идентификаторы ролей
context_roles['ID роли'] = uniqueidentifier[0:len(context_roles)]
# Ранжирование полей датафрейма
context_roles = context_roles[['ID роли', 'Код SQL']]
print(context_roles.info())
context_roles.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID роли 5 non-null object 1 Код SQL 5 non-null object dtypes: object(2) memory usage: 212.0+ bytes None
| ID роли | Код SQL | |
|---|---|---|
| 0 | 3a39dcf7-49d7-4a5c-a765-4aa3c16a081c | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 1 | 48307771-7cf8-43a1-ae95-92fbf4e0d263 | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 2 | 899889c8-9be5-49fc-bde1-9cdf1a65e8eb | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 3 | cc4461f1-02ed-465e-a4c0-ef6b13845bd4 | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 4 | 4a39f1d5-a3ab-4aa4-b748-1fd725321b6d | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
# Выгрузка данных датафрейма `context_roles` в файл `ContextRoles.csv`
context_roles.to_csv('files/ContextRoles.csv')
# Проверка выгрзки
df = pd.read_csv('files/ContextRoles.csv').drop('Unnamed: 0', axis=1)
df.head(5)
| ID роли | Код SQL | |
|---|---|---|
| 0 | 3a39dcf7-49d7-4a5c-a765-4aa3c16a081c | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 1 | 48307771-7cf8-43a1-ae95-92fbf4e0d263 | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 2 | 899889c8-9be5-49fc-bde1-9cdf1a65e8eb | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 3 | cc4461f1-02ed-465e-a4c0-ef6b13845bd4 | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
| 4 | 4a39f1d5-a3ab-4aa4-b748-1fd725321b6d | \nSELECT u.UserID, u.Name\nFROM Users u\nJOIN … |
Создание датафрейма kr_permissions и выгрузка данных в файл KrPermissions.csv¶
Все правила доступа с русским переводом параметров из таблицы базы данных (далее БД) KrPermissions (kp), выгруженные в файл KrPermissions.csv:
| № | Поле БД | Название поля после выгрузки | Тип поля после выгрузки | Комментарии |
|---|---|---|---|---|
| 1 | kp.ID | ID правила доступа | str | |
| 2 | kp.Caption | Название правила доступа | str | |
| 3 | kp.IsDisabled | Правило отключено | bool | |
| 4 | kp.IsRequired | Всегда проверять правило | bool | |
| 5 | kp.IsExtended | РПД | bool | |
| 6 | kp.Conditions | Типы условий | bool | |
| 7 | kp.CanCreateCard | Создание карточки | bool | |
| 8 | kp.CanReadCard | Чтение карточки | bool | |
| 9 | kp.CanEditCard | Редактирование карточки | bool | |
| 10 | kp.CanDeleteCard | Удаление карточки | bool | |
| 11 | kp.CanAddFiles | Добавление файлов | bool | |
| 12 | kp.CanEditOwnFiles | Редактирование собственных файлов | bool | |
| 13 | kp.CanEditFiles | Редактирование файлов | bool | |
| 14 | kp.CanDeleteownFiles | Удаление собственных файлов | bool | |
| 15 | kp.CanDeleteFiles | Удаление всех файлов | bool | |
| 16 | kp.CanStartProcess | Инициация типового процесса отправки задач | bool | |
| 17 | kp.CanEditRoute | Редактирование маршрута | bool | |
| 18 | kp.CanSkipStages | Пропуск этапов | bool | |
| 19 | kp.CanFullRecalcRoute | Полный пересчет маршрута | bool | |
| 20 | kp.CanEditNumber | Ручное редактирование номера | bool | |
| 21 | kp.CanCreateResolutions | Создание резолюций | bool | |
| 22 | kp.CanSignFiles | Подписание файлов | bool | |
| 23 | kp.CanAddTopics | Создание обсуждений | bool | |
| 24 | kp.CanSuperModeratorMode | Права супермодератора | bool | |
| 25 | kp.CanSubscribeForNotifications | Подписка на уведомления | bool | |
| 26 | kp.CanCreateTemplateAndCopy | Создание шаблона и копирование | bool | |
| 27 | kp.CanEditMyMessages | Редактирование своих сообщений | bool | |
| 28 | kp.CanEditAllMessages | Редактирование всех сообщений | bool | |
| 29 | kp.CanReadAllTopics | Чтение обсуждений | bool | |
| 30 | kp.CanReadAndSendMessageInAllTopics | Чтение и отправка сообщений | bool |
# Создание датафрейма с идентификаторами
# и названиями правил доступа и разрешениями
columns = [
('Правило отключено', 'bool'),
('Всегда проверять правило', 'bool'),
('РПД', 'bool'),
('Типы условий', 'bool'),
('Создание карточки', 'bool'),
('Чтение карточки', 'bool'),
('Редактирование карточки', 'bool'),
('Удаление карточки', 'bool'),
('Добавление файлов', 'bool'),
('Редактирование собственных файлов', 'bool'),
('Редактирование файлов', 'bool'),
('Удаление собственных файлов', 'bool'),
('Удаление всех файлов', 'bool'),
('Инициация типового процесса отправки задач', 'bool'),
('Редактирование маршрута', 'bool'),
('Пропуск этапов', 'bool'),
('Полный пересчет маршрута', 'bool'),
('Ручное редактирование номера', 'bool'),
('Создание резолюций', 'bool'),
('Подписание файлов', 'bool'),
('Создание обсуждений', 'bool'),
('Права супермодератора', 'bool'),
('Подписка на уведомления', 'bool'),
('Создание шаблона и копирование', 'bool'),
('Редактирование своих сообщений', 'bool'),
('Редактирование всех сообщений', 'bool'),
('Чтение обсуждений', 'bool'),
('Чтение и отправка сообщений', 'bool')
]
text_substrings = {}
numeric_ranges = {}
bool_probabilities = {
'Правило отключено': .25,
'Всегда проверять правило': .25,
'РПД': .05,
'Типы условий': .05,
'Создание карточки': .75,
'Чтение карточки': .85,
'Редактирование карточки': .7,
'Удаление карточки': .5,
'Добавление файлов': .6,
'Редактирование собственных файлов': .25,
'Редактирование файлов': .65,
'Удаление собственных файлов': .2,
'Удаление всех файлов': .3,
'Инициация типового процесса отправки задач': .45,
'Редактирование маршрута': .55,
'Пропуск этапов': .006,
'Полный пересчет маршрута': .005,
'Ручное редактирование номера': .4,
'Создание резолюций': .35,
'Подписание файлов': .15,
'Создание обсуждений': .1,
'Права супермодератора': .009,
'Подписка на уведомления': .008,
'Создание шаблона и копирование': .007,
'Редактирование своих сообщений': .004,
'Редактирование всех сообщений': .003,
'Чтение обсуждений': .002,
'Чтение и отправка сообщений': .001
}
kr_permissions = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=.75,
numeric_probability=.75,
bool_probability=1.,
mean_row_count=200,
deviation_row_count=20
)
print(kr_permissions.info())
kr_permissions.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 187 entries, 0 to 186 Data columns (total 28 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Правило отключено 187 non-null bool 1 Всегда проверять правило 187 non-null bool 2 РПД 187 non-null bool 3 Типы условий 187 non-null bool 4 Создание карточки 187 non-null bool 5 Чтение карточки 187 non-null bool 6 Редактирование карточки 187 non-null bool 7 Удаление карточки 187 non-null bool 8 Добавление файлов 187 non-null bool 9 Редактирование собственных файлов 187 non-null bool 10 Редактирование файлов 187 non-null bool 11 Удаление собственных файлов 187 non-null bool 12 Удаление всех файлов 187 non-null bool 13 Инициация типового процесса отправки задач 187 non-null bool 14 Редактирование маршрута 187 non-null bool 15 Пропуск этапов 187 non-null bool 16 Полный пересчет маршрута 187 non-null bool 17 Ручное редактирование номера 187 non-null bool 18 Создание резолюций 187 non-null bool 19 Подписание файлов 187 non-null bool 20 Создание обсуждений 187 non-null bool 21 Права супермодератора 187 non-null bool 22 Подписка на уведомления 187 non-null bool 23 Создание шаблона и копирование 187 non-null bool 24 Редактирование своих сообщений 187 non-null bool 25 Редактирование всех сообщений 187 non-null bool 26 Чтение обсуждений 187 non-null bool 27 Чтение и отправка сообщений 187 non-null bool dtypes: bool(28) memory usage: 5.2 KB None
| Правило отключено | Всегда проверять правило | РПД | Типы условий | Создание карточки | Чтение карточки | Редактирование карточки | Удаление карточки | Добавление файлов | Редактирование собственных файлов | … | Создание резолюций | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | False | True | False | False | True | True | False | False | True | False | … | True | False | False | False | False | False | False | False | False | False |
| 1 | False | False | False | False | True | True | False | False | True | False | … | False | False | False | False | False | False | False | False | False | False |
| 2 | False | False | False | False | True | False | True | False | True | False | … | False | False | False | False | False | False | False | False | False | False |
| 3 | False | True | False | False | True | True | True | False | True | False | … | False | False | False | False | False | False | False | False | False | False |
| 4 | False | False | False | False | False | False | True | True | True | False | … | True | False | False | False | False | False | False | False | False | False |
5 rows × 28 columns
# Создание идентификаторов
uniqueidentifier = [str(uuid.uuid4()) for _ in range(len(kr_permissions)*10)]
# Идентификаторы правил доступа
kr_permissions['ID правила доступа'] = uniqueidentifier[0:len(kr_permissions)]
print(kr_permissions.info())
kr_permissions.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 187 entries, 0 to 186 Data columns (total 29 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Правило отключено 187 non-null bool 1 Всегда проверять правило 187 non-null bool 2 РПД 187 non-null bool 3 Типы условий 187 non-null bool 4 Создание карточки 187 non-null bool 5 Чтение карточки 187 non-null bool 6 Редактирование карточки 187 non-null bool 7 Удаление карточки 187 non-null bool 8 Добавление файлов 187 non-null bool 9 Редактирование собственных файлов 187 non-null bool 10 Редактирование файлов 187 non-null bool 11 Удаление собственных файлов 187 non-null bool 12 Удаление всех файлов 187 non-null bool 13 Инициация типового процесса отправки задач 187 non-null bool 14 Редактирование маршрута 187 non-null bool 15 Пропуск этапов 187 non-null bool 16 Полный пересчет маршрута 187 non-null bool 17 Ручное редактирование номера 187 non-null bool 18 Создание резолюций 187 non-null bool 19 Подписание файлов 187 non-null bool 20 Создание обсуждений 187 non-null bool 21 Права супермодератора 187 non-null bool 22 Подписка на уведомления 187 non-null bool 23 Создание шаблона и копирование 187 non-null bool 24 Редактирование своих сообщений 187 non-null bool 25 Редактирование всех сообщений 187 non-null bool 26 Чтение обсуждений 187 non-null bool 27 Чтение и отправка сообщений 187 non-null bool 28 ID правила доступа 187 non-null object dtypes: bool(28), object(1) memory usage: 6.7+ KB None
| Правило отключено | Всегда проверять правило | РПД | Типы условий | Создание карточки | Чтение карточки | Редактирование карточки | Удаление карточки | Добавление файлов | Редактирование собственных файлов | … | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | ID правила доступа | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | False | True | False | False | True | True | False | False | True | False | … | False | False | False | False | False | False | False | False | False | 5b5a54df-f4c3-429b-9b90-afcbfc94d904 |
| 1 | False | False | False | False | True | True | False | False | True | False | … | False | False | False | False | False | False | False | False | False | 18841597-7fd1-4dd9-a48e-ed7287cb7ca9 |
| 2 | False | False | False | False | True | False | True | False | True | False | … | False | False | False | False | False | False | False | False | False | 49097422-ab5d-43db-8d58-1c2fd2e7b951 |
| 3 | False | True | False | False | True | True | True | False | True | False | … | False | False | False | False | False | False | False | False | False | f3c8942f-da63-456d-8d4f-c9edd97d9568 |
| 4 | False | False | False | False | False | False | True | True | True | False | … | False | False | False | False | False | False | False | False | False | 5286e47f-9078-49a9-b53d-7a832f1d4c36 |
5 rows × 29 columns
# Присваивание формальных названий правилам доступа
for i in kr_permissions.index:
kr_permissions.loc[i, 'Название правила доступа'] = 'Правило ' + str(i)
# Ранжирование полей датафрейма
kr_permissions = kr_permissions[[
'ID правила доступа',
'Название правила доступа',
'Правило отключено',
'Всегда проверять правило',
'РПД',
'Типы условий',
'Создание карточки',
'Чтение карточки',
'Редактирование карточки',
'Удаление карточки',
'Добавление файлов',
'Редактирование собственных файлов',
'Редактирование файлов',
'Удаление собственных файлов',
'Удаление всех файлов',
'Инициация типового процесса отправки задач',
'Редактирование маршрута',
'Пропуск этапов',
'Полный пересчет маршрута',
'Ручное редактирование номера',
'Создание резолюций',
'Подписание файлов',
'Создание обсуждений',
'Права супермодератора',
'Подписка на уведомления',
'Создание шаблона и копирование',
'Редактирование своих сообщений',
'Редактирование всех сообщений',
'Чтение обсуждений',
'Чтение и отправка сообщений'
]]
print(kr_permissions.info())
kr_permissions.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 187 entries, 0 to 186 Data columns (total 30 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 187 non-null object 1 Название правила доступа 187 non-null object 2 Правило отключено 187 non-null bool 3 Всегда проверять правило 187 non-null bool 4 РПД 187 non-null bool 5 Типы условий 187 non-null bool 6 Создание карточки 187 non-null bool 7 Чтение карточки 187 non-null bool 8 Редактирование карточки 187 non-null bool 9 Удаление карточки 187 non-null bool 10 Добавление файлов 187 non-null bool 11 Редактирование собственных файлов 187 non-null bool 12 Редактирование файлов 187 non-null bool 13 Удаление собственных файлов 187 non-null bool 14 Удаление всех файлов 187 non-null bool 15 Инициация типового процесса отправки задач 187 non-null bool 16 Редактирование маршрута 187 non-null bool 17 Пропуск этапов 187 non-null bool 18 Полный пересчет маршрута 187 non-null bool 19 Ручное редактирование номера 187 non-null bool 20 Создание резолюций 187 non-null bool 21 Подписание файлов 187 non-null bool 22 Создание обсуждений 187 non-null bool 23 Права супермодератора 187 non-null bool 24 Подписка на уведомления 187 non-null bool 25 Создание шаблона и копирование 187 non-null bool 26 Редактирование своих сообщений 187 non-null bool 27 Редактирование всех сообщений 187 non-null bool 28 Чтение обсуждений 187 non-null bool 29 Чтение и отправка сообщений 187 non-null bool dtypes: bool(28), object(2) memory usage: 8.2+ KB None
| ID правила доступа | Название правила доступа | Правило отключено | Всегда проверять правило | РПД | Типы условий | Создание карточки | Чтение карточки | Редактирование карточки | Удаление карточки | … | Создание резолюций | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 5b5a54df-f4c3-429b-9b90-afcbfc94d904 | Правило 0 | False | True | False | False | True | True | False | False | … | True | False | False | False | False | False | False | False | False | False |
| 1 | 18841597-7fd1-4dd9-a48e-ed7287cb7ca9 | Правило 1 | False | False | False | False | True | True | False | False | … | False | False | False | False | False | False | False | False | False | False |
| 2 | 49097422-ab5d-43db-8d58-1c2fd2e7b951 | Правило 2 | False | False | False | False | True | False | True | False | … | False | False | False | False | False | False | False | False | False | False |
| 3 | f3c8942f-da63-456d-8d4f-c9edd97d9568 | Правило 3 | False | True | False | False | True | True | True | False | … | False | False | False | False | False | False | False | False | False | False |
| 4 | 5286e47f-9078-49a9-b53d-7a832f1d4c36 | Правило 4 | False | False | False | False | False | False | True | True | … | True | False | False | False | False | False | False | False | False | False |
5 rows × 30 columns
# Выгрузка данных датафрейма `kr_permissions` в файл `KrPermissions.csv`
kr_permissions.to_csv('files/KrPermissions.csv')
# Проверка выгрзки
df = pd.read_csv('files/KrPermissions.csv').drop('Unnamed: 0', axis=1)
df.head(5)
| ID правила доступа | Название правила доступа | Правило отключено | Всегда проверять правило | РПД | Типы условий | Создание карточки | Чтение карточки | Редактирование карточки | Удаление карточки | … | Создание резолюций | Подписание файлов | Создание обсуждений | Права супермодератора | Подписка на уведомления | Создание шаблона и копирование | Редактирование своих сообщений | Редактирование всех сообщений | Чтение обсуждений | Чтение и отправка сообщений | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 5b5a54df-f4c3-429b-9b90-afcbfc94d904 | Правило 0 | False | True | False | False | True | True | False | False | … | True | False | False | False | False | False | False | False | False | False |
| 1 | 18841597-7fd1-4dd9-a48e-ed7287cb7ca9 | Правило 1 | False | False | False | False | True | True | False | False | … | False | False | False | False | False | False | False | False | False | False |
| 2 | 49097422-ab5d-43db-8d58-1c2fd2e7b951 | Правило 2 | False | False | False | False | True | False | True | False | … | False | False | False | False | False | False | False | False | False | False |
| 3 | f3c8942f-da63-456d-8d4f-c9edd97d9568 | Правило 3 | False | True | False | False | True | True | True | False | … | False | False | False | False | False | False | False | False | False | False |
| 4 | 5286e47f-9078-49a9-b53d-7a832f1d4c36 | Правило 4 | False | False | False | False | False | False | True | True | … | True | False | False | False | False | False | False | False | False | False |
5 rows × 30 columns
Создание датафрейма kr_permission_roles и выгрузка данных в файл KrPermissionRoles.csv¶
Обогащение правил доступа дополнительными данными о ролях из таблицы БД KrPermissionRoles (kpr), выгруженной в файл KrPermissionRoles.csv:
| № | Поле БД | Название поля после выгрузки | Тип поля после выгрузки | Комментарии |
|---|---|---|---|---|
| 1 | kpr.ID | ID правила доступа | str | |
| 2 | kpr.RoleID | ID роли | str | |
| 3 | kpr.RoleName | Название роли | str |
# Создание датафрейма `KrPermissionRoles` с идентификаторами
# и названиями правил доступа и разрешениями
columns = [
('ID правила доступа', 'str'),
('ID роли', 'str')
]
text_substrings = {
'ID правила доступа': kr_permissions['ID правила доступа'].tolist(),
'ID роли': role_users['ID роли'].tolist()
}
numeric_ranges = {}
bool_probabilities = {}
kr_permission_roles = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=.75,
numeric_probability=.75,
bool_probability=1.,
mean_row_count=300,
deviation_row_count=30
)
print(kr_permission_roles.info())
kr_permission_roles.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 272 entries, 0 to 271 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 210 non-null object 1 ID роли 205 non-null object dtypes: object(2) memory usage: 4.4+ KB None
| ID правила доступа | ID роли | |
|---|---|---|
| 0 | adf6f20d-b4f2-4501-9372-b3f98045103d | None |
| 1 | 20336af0-1547-4441-b701-abb37eb7e80a | 80e5677f-e1d6-4ae1-ad2f-3d56ac543394 |
| 2 | None | None |
| 3 | 17c8a168-87ff-42ab-a499-a8af288649cf | 6de6127b-f01b-4f2e-a9d8-1b8f53092e91 |
| 4 | None | c048f118-e4dd-47ee-ae36-b9d1890ea4aa |
# Добавлеие названий ролей
kr_permission_roles = pd.merge(kr_permission_roles, role_users[['ID роли', 'Название роли']], on='ID роли', how='left')
# Не может бытть правила без хотя бы одной роли
# или идентификатора правила доступа
kr_permission_roles = kr_permission_roles.dropna()
print(kr_permission_roles.info())
kr_permission_roles.head(5)
<class 'pandas.core.frame.DataFrame'> Index: 403 entries, 1 to 557 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 403 non-null object 1 ID роли 403 non-null object 2 Название роли 403 non-null object dtypes: object(3) memory usage: 12.6+ KB None
| ID правила доступа | ID роли | Название роли | |
|---|---|---|---|
| 1 | 20336af0-1547-4441-b701-abb37eb7e80a | 80e5677f-e1d6-4ae1-ad2f-3d56ac543394 | Беляева В.Д. |
| 3 | 17c8a168-87ff-42ab-a499-a8af288649cf | 6de6127b-f01b-4f2e-a9d8-1b8f53092e91 | Григорьев Б.Д. |
| 5 | ed9ab1be-8faa-4f18-8fc8-1efc5402342b | e96d002f-ee0f-461a-b831-561ff8b457e3 | Юридический отдел |
| 6 | 5286e47f-9078-49a9-b53d-7a832f1d4c36 | fb2f72a0-002b-41f4-b61f-2a9a8660f24b | Согласующий финансовых документов |
| 7 | 5286e47f-9078-49a9-b53d-7a832f1d4c36 | fb2f72a0-002b-41f4-b61f-2a9a8660f24b | Согласующий финансовых документов |
# Выгрузка данных датафрейма `kr_permission_roles` в файл `krPermissionRoles.csv`
kr_permission_roles.to_csv('files/krPermissionRoles.csv')
# Проверка выгрзки
df = pd.read_csv('files/krPermissionRoles.csv').drop('Unnamed: 0', axis=1)
df.head(5)
| ID правила доступа | ID роли | Название роли | |
|---|---|---|---|
| 0 | 20336af0-1547-4441-b701-abb37eb7e80a | 80e5677f-e1d6-4ae1-ad2f-3d56ac543394 | Беляева В.Д. |
| 1 | 17c8a168-87ff-42ab-a499-a8af288649cf | 6de6127b-f01b-4f2e-a9d8-1b8f53092e91 | Григорьев Б.Д. |
| 2 | ed9ab1be-8faa-4f18-8fc8-1efc5402342b | e96d002f-ee0f-461a-b831-561ff8b457e3 | Юридический отдел |
| 3 | 5286e47f-9078-49a9-b53d-7a832f1d4c36 | fb2f72a0-002b-41f4-b61f-2a9a8660f24b | Согласующий финансовых документов |
| 4 | 5286e47f-9078-49a9-b53d-7a832f1d4c36 | fb2f72a0-002b-41f4-b61f-2a9a8660f24b | Согласующий финансовых документов |
Создание датафрейма kr_permission_types и выгрузка данных в файл KrPermissionTypes.csv¶
Обогащение правил доступа дополнительными данными о типах документов из таблицы БД KrPermissionTypes (kpt), выгруженной в файл KrPermissionTypes.csv:
| № | Поле БД | Название поля после выгрузки | Тип поля после выгрузки | Комментарии |
|---|---|---|---|---|
| 1 | kpt.ID | ID правила доступа | str | |
| 2 | kpt.TypeCaption | ID типа карточки | str | |
| 3 | kpt.Localize(kpt.TypeCaption, 25) | Тип карточки | str |
# Создание справочника типов карточек
type_caption = pd.DataFrame({
'Тип карточки': [
'Входящий',
'Исходящий',
'Договор',
'Дополнительное соглашение',
'Счёт',
'Универсальный передаточный документ',
'Распоряжение',
'Служебная записка',
'МЧД'
]})
# Создание идентификаторов
uniqueidentifier = [str(uuid.uuid4()) for _ in range(len(type_caption)*10)]
# Идентификаторы типов карточек
type_caption['ID типа карточки'] = uniqueidentifier[0:len(type_caption)]
type_caption
| Тип карточки | ID типа карточки | |
|---|---|---|
| 0 | Входящий | 1293034c-e069-482c-a710-8738f6145b72 |
| 1 | Исходящий | e6a8f99d-00eb-42b3-a402-3a16180b2f15 |
| 2 | Договор | 94158103-e582-4eb5-879e-16429111d3f6 |
| 3 | Дополнительное соглашение | c86fb70e-7352-480f-a710-e6b75e5cbac2 |
| 4 | Счёт | 934bfcfb-f002-4293-9d63-899a7d08f11e |
| 5 | Универсальный передаточный документ | ee02dc43-ebf1-4298-b6a8-a633ccd8b64d |
| 6 | Распоряжение | 80d39002-1f6e-4a68-b7ee-ba3ea574a738 |
| 7 | Служебная записка | 80525751-1f15-4df0-b06c-76b0a2156ee4 |
| 8 | МЧД | 97ed6f19-5201-441b-acee-8474be8a44db |
# Создание таблицы `kr_permission_types`
columns = [
('ID правила доступа', 'str'),
('ID типа карточки', 'str')
]
text_substrings = {
'ID правила доступа': kr_permissions['ID правила доступа'].tolist(),
'ID типа карточки': type_caption['ID типа карточки'].tolist()
}
numeric_ranges = {}
bool_probabilities = {}
kr_permission_types = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=.75,
numeric_probability=.75,
bool_probability=1.,
mean_row_count=250,
deviation_row_count=25
)
print(kr_permission_types.info())
kr_permission_types.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 246 entries, 0 to 245 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 174 non-null object 1 ID типа карточки 190 non-null object dtypes: object(2) memory usage: 4.0+ KB None
| ID правила доступа | ID типа карточки | |
|---|---|---|
| 0 | de03f571-e211-432c-9c8a-e863d673ebf6 | c86fb70e-7352-480f-a710-e6b75e5cbac2 |
| 1 | d94cda5c-6434-4215-8245-a3ed951d652a | 1293034c-e069-482c-a710-8738f6145b72 |
| 2 | bf756289-8092-477b-a03c-afb2c49fa6ae | 97ed6f19-5201-441b-acee-8474be8a44db |
| 3 | 9fdefb43-5469-4322-8a3d-c9229d89cb72 | c86fb70e-7352-480f-a710-e6b75e5cbac2 |
| 4 | efe9a617-b5cc-432f-be74-620c4f57de40 | None |
# Не может быть пустого идентификатора правила доступа
kr_permission_types = kr_permission_types.dropna(subset='ID правила доступа')
# Добавлеие названий типов карточек
kr_permission_types = pd.merge(
kr_permission_types,
type_caption,
on='ID типа карточки',
how='left'
)
print(kr_permission_types.info())
kr_permission_types.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 174 entries, 0 to 173 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 174 non-null object 1 ID типа карточки 135 non-null object 2 Тип карточки 135 non-null object dtypes: object(3) memory usage: 4.2+ KB None
| ID правила доступа | ID типа карточки | Тип карточки | |
|---|---|---|---|
| 0 | de03f571-e211-432c-9c8a-e863d673ebf6 | c86fb70e-7352-480f-a710-e6b75e5cbac2 | Дополнительное соглашение |
| 1 | d94cda5c-6434-4215-8245-a3ed951d652a | 1293034c-e069-482c-a710-8738f6145b72 | Входящий |
| 2 | bf756289-8092-477b-a03c-afb2c49fa6ae | 97ed6f19-5201-441b-acee-8474be8a44db | МЧД |
| 3 | 9fdefb43-5469-4322-8a3d-c9229d89cb72 | c86fb70e-7352-480f-a710-e6b75e5cbac2 | Дополнительное соглашение |
| 4 | efe9a617-b5cc-432f-be74-620c4f57de40 | None | NaN |
# Выгрузка данных датафрейма `kr_permission_types` в файл `KrPermissionTypes.csv`
kr_permission_types.to_csv('files/KrPermissionTypes.csv')
# Проверка выгрзки
df = pd.read_csv('files/KrPermissionTypes.csv').drop('Unnamed: 0', axis=1)
df.head(5)
| ID правила доступа | ID типа карточки | Тип карточки | |
|---|---|---|---|
| 0 | de03f571-e211-432c-9c8a-e863d673ebf6 | c86fb70e-7352-480f-a710-e6b75e5cbac2 | Дополнительное соглашение |
| 1 | d94cda5c-6434-4215-8245-a3ed951d652a | 1293034c-e069-482c-a710-8738f6145b72 | Входящий |
| 2 | bf756289-8092-477b-a03c-afb2c49fa6ae | 97ed6f19-5201-441b-acee-8474be8a44db | МЧД |
| 3 | 9fdefb43-5469-4322-8a3d-c9229d89cb72 | c86fb70e-7352-480f-a710-e6b75e5cbac2 | Дополнительное соглашение |
| 4 | efe9a617-b5cc-432f-be74-620c4f57de40 | NaN | NaN |
Создание датафрейма kr_permission_states и выгрузка данных в файл KrPermissionStates.csv¶
Обогащение правил доступа дополнительными данными о состояниях документов из таблицы БД KrPermissionStates (kps), выгруженной в файл KrPermissionStates.csv:
| № | Поле БД | Название поля после выгрузки | Тип поля после выгрузки | Комментарии |
|---|---|---|---|---|
| 1 | kps.ID | ID правила доступа | str | |
| 2 | kps.StateName | ID состояния карточки | str | |
| 3 | kps.Localize(kpt.StateName, 25) | Состояние карточки | str |
# Создание справочника состояний карточек
states = pd.DataFrame({
'Состояние карточки': [
'Проект',
'На согласовании',
'На подписании',
'На регистрации',
'Зарегистрирован',
'На обработке',
'Отмена'
]})
# Создание идентификаторов
uniqueidentifier = [str(uuid.uuid4()) for _ in range(len(states)*10)]
# Идентификаторы состояний карточек
states['ID состояния карточки'] = uniqueidentifier[0:len(states)]
states
| Состояние карточки | ID состояния карточки | |
|---|---|---|
| 0 | Проект | 17215e76-92fa-4586-934e-92bc85e7f91b |
| 1 | На согласовании | d3f85efe-2808-416f-93c0-f1589f150e47 |
| 2 | На подписании | 0bb9f31e-3186-4162-825e-801f8dc4ac99 |
| 3 | На регистрации | 9511d9dc-e0c9-4f04-86e7-25a43144917e |
| 4 | Зарегистрирован | cbae96bd-0d35-4a38-aa01-b6fd2b4b208d |
| 5 | На обработке | fdffb12d-be8d-49e2-999e-b5a661dfb955 |
| 6 | Отмена | 41c75173-75df-45c1-a1d7-a34fc69419f5 |
# Создание таблицы `KrPermissionStates`
columns = [
('ID правила доступа', 'str'),
('ID состояния карточки', 'str')
]
text_substrings = {
'ID правила доступа': kr_permissions['ID правила доступа'].tolist(),
'ID состояния карточки': states['ID состояния карточки'].tolist()
}
numeric_ranges = {}
bool_probabilities = {}
kr_permission_states = generate_dataframe(
columns=columns,
text_substrings=text_substrings,
numeric_ranges=numeric_ranges,
bool_probabilities=bool_probabilities,
text_probability=.75,
numeric_probability=.75,
bool_probability=1.,
mean_row_count=250,
deviation_row_count=25
)
print(kr_permission_states.info())
kr_permission_states.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 244 entries, 0 to 243 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 178 non-null object 1 ID состояния карточки 179 non-null object dtypes: object(2) memory usage: 3.9+ KB None
| ID правила доступа | ID состояния карточки | |
|---|---|---|
| 0 | 5549c392-541d-4667-ac61-91596128d1a6 | 17215e76-92fa-4586-934e-92bc85e7f91b |
| 1 | 36a36459-e020-4900-80a5-468ebcaf3ca6 | cbae96bd-0d35-4a38-aa01-b6fd2b4b208d |
| 2 | None | None |
| 3 | 3d74a414-af74-4d28-a331-2d8ee29312e5 | d3f85efe-2808-416f-93c0-f1589f150e47 |
| 4 | 9ed92537-fb02-4cd5-bf60-bb5ec8b690ce | fdffb12d-be8d-49e2-999e-b5a661dfb955 |
# Не может быть пустого идентификатора правила доступа
kr_permission_states = kr_permission_states.dropna(subset='ID правила доступа')
# Добавлеие названий типов карточек
kr_permission_states = pd.merge(
kr_permission_states,
states[['ID состояния карточки', 'Состояние карточки']],
on='ID состояния карточки',
how='left'
)
print(kr_permission_states.info())
kr_permission_states.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 178 entries, 0 to 177 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 178 non-null object 1 ID состояния карточки 134 non-null object 2 Состояние карточки 134 non-null object dtypes: object(3) memory usage: 4.3+ KB None
| ID правила доступа | ID состояния карточки | Состояние карточки | |
|---|---|---|---|
| 0 | 5549c392-541d-4667-ac61-91596128d1a6 | 17215e76-92fa-4586-934e-92bc85e7f91b | Проект |
| 1 | 36a36459-e020-4900-80a5-468ebcaf3ca6 | cbae96bd-0d35-4a38-aa01-b6fd2b4b208d | Зарегистрирован |
| 2 | 3d74a414-af74-4d28-a331-2d8ee29312e5 | d3f85efe-2808-416f-93c0-f1589f150e47 | На согласовании |
| 3 | 9ed92537-fb02-4cd5-bf60-bb5ec8b690ce | fdffb12d-be8d-49e2-999e-b5a661dfb955 | На обработке |
| 4 | 14104765-d331-467f-a9ea-639e0f7d49d2 | cbae96bd-0d35-4a38-aa01-b6fd2b4b208d | Зарегистрирован |
# Выгрузка данных датафрейма `kr_permission_states` в файл `KrPermissionTypes.csv`
kr_permission_states.to_csv('files/KrPermissionStates.csv')
# Проверка выгрзки
df = pd.read_csv('files/KrPermissionStates.csv').drop('Unnamed: 0', axis=1)
df.head(5)
| ID правила доступа | ID состояния карточки | Состояние карточки | |
|---|---|---|---|
| 0 | 5549c392-541d-4667-ac61-91596128d1a6 | 17215e76-92fa-4586-934e-92bc85e7f91b | Проект |
| 1 | 36a36459-e020-4900-80a5-468ebcaf3ca6 | cbae96bd-0d35-4a38-aa01-b6fd2b4b208d | Зарегистрирован |
| 2 | 3d74a414-af74-4d28-a331-2d8ee29312e5 | d3f85efe-2808-416f-93c0-f1589f150e47 | На согласовании |
| 3 | 9ed92537-fb02-4cd5-bf60-bb5ec8b690ce | fdffb12d-be8d-49e2-999e-b5a661dfb955 | На обработке |
| 4 | 14104765-d331-467f-a9ea-639e0f7d49d2 | cbae96bd-0d35-4a38-aa01-b6fd2b4b208d | Зарегистрирован |
Создание датафрейма kr_permission_extendedcard и выгрузка данных в файл KrPermissionExtendedcard.csv¶
Данные о расширенных правилах доступа (далее РПД) из таблиц БД KrPermissionExtendedcardRules (kpecr) и KrPermissionExtendedcardRulefields (kpecrf), выгруженные в файл KrPermissionExtendedcard.csv:
| № | Поле БД | Название поля после выгрузки | Тип поля после выгрузки | Комментарии |
|---|---|---|---|---|
| 1 | kp.ID | ID правила доступа | str | |
| 2 | kpecr.SectionName | РПД. Секция карточки | str | |
| 3 | kpecrf.FieldName | РПД. Поле карточки | str | |
| 4 | kpecr.AccessSettingName | РПД. Разрешение | str | |
| 5 | dbo.Localize(kpecr.AccesssettingName, 25) | РПД. Разрешение (рус) | str |
Пример реализации таблицы:
| ID правила доступа | РПД. Секция карточки | РПД. Поле карточки | РПД. Разрешение | РПД. Разрешение (рус) | Комментарии |
|---|---|---|---|---|---|
| f8194a4b-7e77-466e-9e40-7b44c265 | Document | DocumentText | Write | Редактирование | ‘Условие: Статус документа = 'Черновик' AND Роль пользователя = 'Автор'.Цель: разрешить автору редактировать текст документа до отправки на согласование.’ |
| 8749bac5-ba47-4f26-9b3f-925f7041 | GeneralInformation | CreationDate | DenyWrite | Запрещено редактировать | ‘Условие: Роль пользователя ≠ 'Администратор'.Цель: запретить изменение поля «Дата создания» всем, кроме администраторов.’ |
| 23d76f2b-b2d0-4b30-a0db-65e6be6f | EmployeeCard | Salary | Read | Чтение | ‘Условие: Отдел пользователя = \'HR\'.Цель: ограничить доступ к полю «Зарплата» только сотрудникам отдела кадров.’ |
| cfd2c510-0e49-4e7f-b56c-ac84e15d | ApprovalStage | Comments | Append | Добавление комментариев | ‘Условие: Этап процесса = 'Согласование' AND Роль = 'Согласующий'.\nЦель:** позволить согласующим добавлять комментарии, но не изменять уже внесённые.’ |
| `fc25d61c-4333-4f52-a5ac-70d206f2 | BasicData | Subject | DenyDelete | Запрещено удалять | ‘Условие: Статус = 'На утверждении' AND Роль ≠ 'Автор'.Цель: защитить поле «Тема» от удаления после того, как документ поступил на утверждение.’ |
# Создание таблицы `kr_permission_extendedcard`
data = {
'РПД. Секция карточки': [
'Document', # Документ → Document
'GeneralInformation', # Общие сведения → General Information
'EmployeeCard', # Карточка сотрудника → Employee Card
'ApprovalStage', # Этап согласования → Approval Stage
'BasicData' # Основные данные → Basic Data
],
'РПД. Поле карточки': [
'DocumentText', # Текст документа → Document Text
'CreationDate', # Дата создания → Creation Date
'Salary', # Зарплата → Salary
'Comments', # Замечания → Comments
'Subject' # Тема → Subject
],
'РПД. Разрешение': [
'Write',
'DenyWrite',
'Read',
'Append',
'DenyDelete'
],
'РПД. Разрешение (рус)': [
'Редактирование',
'Запрещено редактировать',
'Чтение',
'Добавление комментариев',
'Запрещено удалять'
]
}
# Создание датафрейма
kr_permission_extendedcard = pd.DataFrame(data)
# Идентификаторы правил доступа
kr_permission_extendedcard['ID правила доступа'] = kr_permissions['ID правила доступа'].head(5)
# Ранжирование полей датафрейма
kr_permission_extendedcard = kr_permission_extendedcard[[
'ID правила доступа',
'РПД. Секция карточки',
'РПД. Поле карточки',
'РПД. Разрешение',
'РПД. Разрешение (рус)']]
print(kr_permission_extendedcard.info())
kr_permission_extendedcard.head(5)
<class 'pandas.core.frame.DataFrame'> RangeIndex: 5 entries, 0 to 4 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID правила доступа 5 non-null object 1 РПД. Секция карточки 5 non-null object 2 РПД. Поле карточки 5 non-null object 3 РПД. Разрешение 5 non-null object 4 РПД. Разрешение (рус) 5 non-null object dtypes: object(5) memory usage: 332.0+ bytes None
| ID правила доступа | РПД. Секция карточки | РПД. Поле карточки | РПД. Разрешение | РПД. Разрешение (рус) | |
|---|---|---|---|---|---|
| 0 | 5b5a54df-f4c3-429b-9b90-afcbfc94d904 | Document | DocumentText | Write | Редактирование |
| 1 | 18841597-7fd1-4dd9-a48e-ed7287cb7ca9 | GeneralInformation | CreationDate | DenyWrite | Запрещено редактировать |
| 2 | 49097422-ab5d-43db-8d58-1c2fd2e7b951 | EmployeeCard | Salary | Read | Чтение |
| 3 | f3c8942f-da63-456d-8d4f-c9edd97d9568 | ApprovalStage | Comments | Append | Добавление комментариев |
| 4 | 5286e47f-9078-49a9-b53d-7a832f1d4c36 | BasicData | Subject | DenyDelete | Запрещено удалять |
# Выгрузка данных датафрейма `kr_permission_extendedcard` в файл `KrPermissionExtendedcard.csv`
kr_permission_extendedcard.to_csv('files/KrPermissionExtendedcard.csv')
# Проверка выгрзки
df = pd.read_csv('files/KrPermissionExtendedcard.csv').drop('Unnamed: 0', axis=1)
df.head(5)
| ID правила доступа | РПД. Секция карточки | РПД. Поле карточки | РПД. Разрешение | РПД. Разрешение (рус) | |
|---|---|---|---|---|---|
| 0 | 5b5a54df-f4c3-429b-9b90-afcbfc94d904 | Document | DocumentText | Write | Редактирование |
| 1 | 18841597-7fd1-4dd9-a48e-ed7287cb7ca9 | GeneralInformation | CreationDate | DenyWrite | Запрещено редактировать |
| 2 | 49097422-ab5d-43db-8d58-1c2fd2e7b951 | EmployeeCard | Salary | Read | Чтение |
| 3 | f3c8942f-da63-456d-8d4f-c9edd97d9568 | ApprovalStage | Comments | Append | Добавление комментариев |
| 4 | 5286e47f-9078-49a9-b53d-7a832f1d4c36 | BasicData | Subject | DenyDelete | Запрещено удалять |

