Microsegment.ru
  • Главная страница
  • О проекте
  • Портфолио
  • Блог
Системы

Генерация тестовых данных для анализа правил доступа в Tessa

Генерация тестовых данных для анализа правил доступа в Tessa
Системы

Для анализа ролевой модели предоставления прав в Tessa требуется выгрузка соответствующих данных из БД Tessa. При анализе требуются тестовые данные, чтобы избежать использование реальных данных в целях конфиденциальности. Если подобные модели строить в Python с помощью Pandas, можно использовать генератор датафреймов, разработанный в Microsegment.ru.

И так, предположим, что для анализа ролевой модели предоставления прав в Tessa используются следующие файлы RoleUsers.csv, ContextRoles.csv, KrPermissions.csv, KrPermissions.csv, krPermissionRoles.csv, KrPermissionTypes.csv, KrPermissionStates.csv, KrPermissionExtendedcard.csv, содержащие данных из определенных таблиц БД Tessa:

  1. Данные о вхождении персональных ролей из таблицы PersonalRoles (pr) в любые роли из таблицы Roles (r) через таблицу связей RoleUsers (ru), кроме контекстных ролей, описанных в таблице ContextRoles, выгруженные в файл RoleUsers.csv.
  2. Данные о контекстных ролях из таблицы ContextRoles (cr), выгруженные в файл ContextRoles.csv.
  3. Все правила доступа с русским переводом параметров из таблицы базы данных (далее БД) KrPermissions (kp), выгруженные в файл KrPermissions.csv.
  4. Обогащение правил доступа дополнительными данными о ролях из таблицы БД krPermissionRoles (kpr), выгруженной в файл krPermissionRoles.csv.
  5. Обогащение правил доступа дополнительными данными о типах документов из таблицы БД KrPermissionTypes (kpt), выгруженной в файл KrPermissionTypes.csv.
  6. Обогащение правил доступа дополнительными данными о состояниях документов из таблицы БД KrPermissionStates (kps), выгруженной в файл KrPermissionStates.csv.
  7. Данные о расширенных правилах доступа (далее РПД) из таблиц БД 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;

Функция автоматической генерации датафрейма с тестовыми данными¶

In [5]:
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)

Основные особенности реализации:

  1. Типы столбцов задаются парой (имя, тип), где тип может быть:
    • str — строковые значения
    • int — целые числа
    • float — числа с плавающей точкой
    • bool — булевы значения
  2. Для каждого типа данных используются свои параметры генерации:
    • Строки: объединяются случайные подстроки из заданного списка
    • Числа: генерируются в заданном диапазоне
    • Булевы значения: учитывают вероятность появления True
  3. Вероятностные параметры:
    • text_probability — вероятность появления текстового значения
    • numeric_probability — вероятность появления числового значения
    • bool_probability — вероятность появления булевого значения
  4. Контроль количества строк:
    • mean_row_count — среднее количество строк
    • deviation_row_count — допустимое отклонение
    • Фактическое количество строк генерируется случайно в диапазоне [mean — deviation, mean + deviation]
  5. Особенности генерации:
    • Для строковых значений используется случайная комбинация подстрок
    • Для числовых значений равномерное распределение в заданном диапазоне
    • Для булевых значений используется бинарная генерация с заданной вероятностью
    • Все типы данных могут содержать 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 — роль задания
In [10]:
# Пользователи мужчины
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 Васильев М.А.
In [11]:
# Пользователи мужчины
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 Волкова О.Р.
In [12]:
# 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 Отдел продаж
In [13]:
# Добавление логина пользователя
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
Out[13]:
Имя пользователя Должность пользователя Уровень доступа пользователя Тип учетной записи пользователя Блокировка учетной записи пользователя Название роли Логин пользователя
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
In [14]:
# Создание идентификаторов
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
Out[14]:
Имя пользователя Должность пользователя Уровень доступа пользователя Тип учетной записи пользователя Блокировка учетной записи пользователя Название роли Логин пользователя 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
In [15]:
# Назначение начальников олтделов
role_users.loc[role_users.groupby('Название роли').head(1).index, 'Должность пользователя'] = 'Начальник отдела'

role_users[role_users['Должность пользователя'] == 'Начальник отдела']
Out[15]:
Имя пользователя Должность пользователя Уровень доступа пользователя Тип учетной записи пользователя Блокировка учетной записи пользователя Название роли Логин пользователя 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
In [16]:
# Назначение директоров
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:]
Out[16]:
Имя пользователя Должность пользователя Уровень доступа пользователя Тип учетной записи пользователя Блокировка учетной записи пользователя Название роли Логин пользователя 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
In [17]:
# Добавление тиапа роли (2 - подразделение)
role_users['Тип роли'] = 2

role_users.head(5)
Out[17]:
Имя пользователя Должность пользователя Уровень доступа пользователя Тип учетной записи пользователя Блокировка учетной записи пользователя Название роли Логин пользователя 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
In [18]:
# Создание системных ролей
_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(['Сервис', 'Робот'])]
Out[18]:
Имя пользователя Должность пользователя Уровень доступа пользователя Тип учетной записи пользователя Блокировка учетной записи пользователя Название роли Логин пользователя 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
In [19]:
# Вхождение персональных ролей самих в себя в таблице 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
Out[19]:
Имя пользователя Должность пользователя Уровень доступа пользователя Тип учетной записи пользователя Блокировка учетной записи пользователя Название роли Логин пользователя 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
In [20]:
# Добавление данных о вхождении персональных ролей в статические роли

# Статические роли для бизнес-процессов
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 строк:
Out[20]:
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
In [21]:
# Проверка сгенерированных данных таблицы 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
In [22]:
# Выгрузка данных датафрейма `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)
Out[22]:
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 запроса
In [25]:
# Создание таблицы `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
Out[25]:
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 …
In [26]:
# Выгрузка данных датафрейма `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)
Out[26]:
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
In [29]:
# Создание датафрейма с идентификаторами 
# и названиями правил доступа и разрешениями

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
Out[29]:
Правило отключено Всегда проверять правило РПД Типы условий Создание карточки Чтение карточки Редактирование карточки Удаление карточки Добавление файлов Редактирование собственных файлов … Создание резолюций Подписание файлов Создание обсуждений Права супермодератора Подписка на уведомления Создание шаблона и копирование Редактирование своих сообщений Редактирование всех сообщений Чтение обсуждений Чтение и отправка сообщений
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

In [30]:
# Создание идентификаторов
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
Out[30]:
Правило отключено Всегда проверять правило РПД Типы условий Создание карточки Чтение карточки Редактирование карточки Удаление карточки Добавление файлов Редактирование собственных файлов … Подписание файлов Создание обсуждений Права супермодератора Подписка на уведомления Создание шаблона и копирование Редактирование своих сообщений Редактирование всех сообщений Чтение обсуждений Чтение и отправка сообщений 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

In [31]:
# Присваивание формальных названий правилам доступа
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
Out[31]:
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

In [32]:
# Выгрузка данных датафрейма `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)
Out[32]:
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
In [35]:
# Создание датафрейма `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
Out[35]:
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
In [36]:
# Добавлеие названий ролей 
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
Out[36]:
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 Согласующий финансовых документов
In [37]:
# Выгрузка данных датафрейма `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)
Out[37]:
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
In [40]:
# Создание справочника типов карточек
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
Out[40]:
Тип карточки 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
In [41]:
# Создание таблицы `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
Out[41]:
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
In [42]:
# Не может быть пустого идентификатора правила доступа
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
Out[42]:
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
In [43]:
# Выгрузка данных датафрейма `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)
Out[43]:
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
In [46]:
# Создание справочника состояний карточек
states = pd.DataFrame({
    'Состояние карточки': [
        'Проект', 
        'На согласовании', 
        'На подписании', 
        'На регистрации', 
        'Зарегистрирован', 
        'На обработке', 
        'Отмена'
]})

# Создание идентификаторов
uniqueidentifier = [str(uuid.uuid4()) for _ in range(len(states)*10)]

# Идентификаторы состояний карточек
states['ID состояния карточки'] = uniqueidentifier[0:len(states)]

states
Out[46]:
Состояние карточки 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
In [47]:
# Создание таблицы `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
Out[47]:
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
In [48]:
# Не может быть пустого идентификатора правила доступа
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
Out[48]:
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 Зарегистрирован
In [49]:
# Выгрузка данных датафрейма `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)
Out[49]:
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 Роль ≠ 'Автор'.
Цель: защитить поле «Тема» от удаления после того, как документ поступил на утверждение.’
In [53]:
# Создание таблицы `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
Out[53]:
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 Запрещено удалять
In [54]:
# Выгрузка данных датафрейма `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)
Out[54]:
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 Запрещено удалять

ms sql Python sql анализ информационная система информация корпоративная информационная система модель предоставления прав практика ролевая модель

Предыдущая статьяРасчет параметров инфраструктуры гибридного хранилища данных

Рубрики

Метки

abc abcd AI-Ready платформа Data Lakehouse ELT excel ms sql pandas PostgreSQL Python sql tessa VBA xyz анализ виртуальный помощник гибридное хранилище данных данные знания информационная система информация искусственный интеллект кластерный анализ комбинаторика компетенции корпоративная информационная система маркетинг математика медальон-архитектура модель предоставления прав мудрость о проекте оптимизация ошибка практика программное обеспечение пэст ролевая модель теория теория вероятностей тесса тест юмор языки программирования

Политика конфиденциальности

Продолжая использовать данный сайт вы подтверждаете свое согласие с условиями его политики конфиденциальности. Подробнее…




Администрация и владельцы данного информационного ресурса не несут ответственности за возможные последствия, связанные с использованием информации, размещенной на нем.


Все права защищены. При копировании материалов сайта обязательно указывать ссылку на © Microsegment.ru (2020-2026)