1.1. Модуль database¶
Модуль py_cerebro.database содержит описание классов, используемых для осуществления доступа к базе данных.
Классы
-
class
py_cerebro.database.
Database
(db_host, db_port, db_timeout=5, db_reconn_count=3)[исходный код]¶ Параметры: Класс Database предназначен для установления соединения с базой данных, содержит набор методов, выполненяющих стандартные запросы системы Cerebro, а также возможность выполнения произвольных SQL-запросов.
# Устанавливаем соединение с базой данных if db.connect_from_cerebro_client() != 0: # Пробуем установить соединение с помощью запущенного клиента Cerebro. # Если не выходит, устанавливаем соединение с помощью логина и пароля db.connect('user', 'password')
Примечание
В классе существуют функции изменяющие свойства задач, которые могут принимать на вход массив идентификаторов. Если необходимо установить нескольким задачам одинаковое значение свойства, предпочитайте использовать передачу массива идентификаторов в качестве аргумента вместо использования циклов. Это значительно повысит производительность.
# Использование массивов идентификаторов to_do_task_list = db.to_do_task_list(db.current_user_id(), True) # получаем список задач текущего пользователя tsks = set() for task in to_do_task_list: tsks.add(task[dbtypes.TASK_DATA_ID]) db.task_set_priority(tsks, dbtypes.TASK_PRIORITY_ABOVE_NORMAL) # установили сразу нескольким задачам приоритет выше обычного
Методы
activities()
add_attachment()
add_client_review()
add_definition()
add_note()
add_report()
add_resource_report()
add_review()
add_task()
attachment_hashtags()
attachment_remove_hashtags()
attachment_set_hashtags()
connect()
connect_from_cerebro_client()
copy_tasks()
current_user_id()
drop_link_tasks()
execute()
message()
message_attachments()
message_hashtags()
message_remove_hashtags()
message_set_hashtags()
messages()
project_tags()
root_tasks()
set_link_tasks()
statuses()
tag_enums()
task()
task_allocated()
task_attachments()
task_by_url()
task_children()
task_definition()
task_hashtags()
task_links()
task_messages()
task_possible_statuses()
task_remove_allocated()
task_remove_hashtags()
task_set_activity()
task_set_allocated()
task_set_budget()
task_set_finish()
task_set_flag()
task_set_hashtags()
task_set_name()
task_set_planned_time()
task_set_priority()
task_set_progress()
task_set_start()
task_set_status()
task_set_tag_enum()
task_set_tag_float()
task_set_tag_int()
task_set_tag_string()
task_tag_enums()
task_tag_reset()
task_tags()
tasks()
to_do_task_list()
users()
-
activities
()[исходный код]¶ Результат: таблица видов деятельности. Поля таблицы описаны в модуле dbtypes:
ACTIVITY_DATA_...
-
add_attachment
(message_id, carga, filename, thumbnails, description, as_link)[исходный код]¶ Параметры: - message_id (int) – идентификатор сообщения.
- carga (py_cerebro.cargador.Cargador) – объект класса
cargador.Cargador
, для импортирования файлов в файловое хранилище. - filename (string) – полный путь до файла.
- thumbnails – список путей до файлов эскизов (не больше трех). Размер эскизов должен быть 512x512. Формат JPG или PNG.
- description (string) – пояснения(комментарии) к вложению.
- as_link (bool) – способ добавления файла к сообщению: True - файл добавляется как ссылка; False - файл добавляется как вложение, то есть импортируется в файловое хранилище(Cargador).
Добавление вложения к сообщению.
Использование для генерации эскизов.
Если файл является изображением или видео, то можно добавить для него уменьшенные эскизы. Можно добавить до 3-х эскизов (первый, средний, последний кадры). Для генерации эскизов можно использовать программу Mirada. Она поставляется вместе с дистрибутивом Cerebro.
#Пример генерации эскизов с помощью Mirada. gen_path = os.path.dirname(filename) # В качестве директории для генерации эскизов возьмем директорию добавляемого файла mirada_path = './mirada' # путь до исполняемого файла программы Mirada # Запускаем мираду с необходимыми ключами res_code = subprocess.call([mirada_path, filename, '-temp', gen_path, '-hide']) #-temp - директория для генерации эскизов #-hide - ключ запуска мирады в скрытом режиме (без загрузки графического интерфейса) для генерации табнейлов. if res_code != 0: raise Exception("Mirada returned bad exit-status.\n" + mirada_path); #Ищем сгенерированные мирадой эскизы. #Имени эскиза формируется из имени файла, даты и времени генерации - filename_yyyymmdd_hhmmss_thumb[number].jpg #Например: test.mov_20120305_112354_thumb1.jpg - первый эскиз видео-файла test.mov thumbnails = list() for f in os.listdir(gen_path): if fnmatch.fnmatch(f, os.path.basename(filename) + '_*_thumb?.jpg'): thumbnails.append(gen_path + '/' + f) thumbnails.sort()
Можно использовать и другие программы для генерации, например, ffmpeg.
#Пример генерации эскизов с помощью ffmpeg. #Для того, чтобы генерить эскизы с помощью ffmpeg, нужно заранее знать длительность видео, #чтобы корректно получить средний и последний кадры. #Возьмем к примеру ролик длительностью в 30 секунд. thumbnails = list() # список файлов для эскизов thumbnails.append(filename + '_thumb1.jpg') thumbnails.append(filename + '_thumb2.jpg') thumbnails.append(filename + '_thumb3.jpg') subprocess.call(['ffmpeg', '-i', filename, '-s', '512x512', '-an', '-ss', '00:00:00', '-r', 1, '-vframes', 1, '-y', thumbnails[0]]) subprocess.call(['ffmpeg', '-i', filename, '-s', '512x512', '-an', '-ss', '15:00:00', '-r', 1, '-vframes', 1, '-y', thumbnails[1]]) subprocess.call(['ffmpeg', '-i', filename, '-s', '512x512', '-an', '-ss', '30:00:00', '-r', 1, '-vframes', 1, '-y', thumbnails[2]]) # Описание ключей вы можете посмотреть в документации к ffmpeg
-
add_client_review
(task_id, message_id, html_text)[исходный код]¶ Параметры: Результат: идентификатор нового сообщения.
Тип результата: Добавляет сообщение типа «Рецензия клиента».
-
add_definition
(task_id, html_text)[исходный код]¶ Параметры: Результат: идентификатор нового сообщения.
Тип результата: Добавляет сообщение типа «Постановка задачи».
-
add_note
(task_id, message_id, html_text)[исходный код]¶ Параметры: Результат: идентификатор нового сообщения.
Тип результата: Добавляет сообщение типа «Заметка».
-
add_report
(task_id, message_id, html_text, minutes)[исходный код]¶ Параметры: Результат: идентификатор нового сообщения.
Тип результата: Очень важнп устанавливать время в отчетах. Если minutes имеет занчение 0 или None, отчет не попадет в статистику.
Добавляет сообщение типа «Отчет».
-
add_resource_report
(task_id, message_id, resource_id, html_text, minutes)[исходный код]¶ Параметры: Результат: идентификатор нового сообщения.
Тип результата: Добавляет сообщение типа «Отчет за ресурс».
-
add_review
(task_id, message_id, html_text, minutes=None)[исходный код]¶ Параметры: Результат: идентификатор нового сообщения.
Тип результата: Добавляет сообщение типа «Рецензия».
-
add_task
(parent_id, name, activity_id=0)[исходный код]¶ Параметры: Результат: идентификатор новой задачи.
Создание новой задачи. Имя задачи не может содержать символы: \ / # : ? & „ » , + |.
Примечание
Для отправки уведомления пользователю о новой задаче требуется создать в задаче сообщение типа
"Постановка задачи"
.
Параметры: attachment_id (int, set(int, ) или list(int,)) – идентификатор вложения или массив идентификаторов вложений. Получает хэштеги вложения.
Примечание
Рекомендуется для вложений со значением тега ATTACHMENT_DATA_TAG: ATTACHMENT_TAG_FILE или ATTACHMENT_TAG_LINK.
Параметры: Удаляет хэштеги их вложений.
Примечание
Рекомендуется для вложений со значением тега ATTACHMENT_DATA_TAG: ATTACHMENT_TAG_FILE или ATTACHMENT_TAG_LINK.
Параметры: Устанавливает хэштеги на вложения.
Примечание
Рекомендуется для вложений со значением тега ATTACHMENT_DATA_TAG: ATTACHMENT_TAG_FILE или ATTACHMENT_TAG_LINK.
-
connect
(db_user, db_password)[исходный код]¶ Параметры: Соединение с базой данных с авторизацией.
См.также
-
connect_from_cerebro_client
()[исходный код]¶ Соединение с базой данных с уже авторизованным пользователем в клиенте Cerebro. Такое соединения возможно, если на том же комьютере уже запущен клиент Cerebro, и произведен вход. В этом случае произойдет соединение с базой данных из-под пользователя, вошедшего в клиент. При этом соединение в клиенте не прервется, в отличие от обычного соединения Database.connect по логину и паролю, которое прервет установленное соединение из-под того же пользователя в клиенте.
Результат: - статус соединения:
- 0 - соединение установлено;
- 1 - соединение не установлено (клиент Cerebro запущен, но не произведен вход);
- 2 - соединение не установлено (клиент Cerebro не запущен).
# Устанавливаем соединение с базой данных if db.connect_from_cerebro_client() != 0: # Пробуем установить соединение с помощью запущенного клиента Cerebro. # Если не выходит, устанавливаем соединение с помощью логина и пароля db.connect(db_user, db_password)
См.также
-
copy_tasks
(task_id, tasks_list, flags=79)[исходный код]¶ Параметры: Результат: список идентификаторов новых задач.
Копирует задачи.
Подробное описание флагов находится в модуле dbtypes:
COPY_TASKS_...
Если одну задачу нужно скопировать несколько раз (реплицировать), то необходимо передать в tasks_list список кортежей с одинаковыми идентификаторами и разными именами. Например:
[(123, „test_task02“), (123, „test_task03“), (123, „test_task04“), (123, „test_task05“)]
123 - идентификатор задачи, которую нужно скопировать. „test_task02“, „test_task03“, … - имена новых задач.
# Копируем в задачу 0 задачи 1(2 копии), 2 и 3 to_do_task_list = db.to_do_task_list(db.current_user_id(), True) lst_copy = [(to_do_task_list[1][dbtypes.TASK_DATA_ID], 'Копия задачи 1(1)'), (to_do_task_list[1][dbtypes.TASK_DATA_ID], 'Копия задачи 1(2)'), (to_do_task_list[2][dbtypes.TASK_DATA_ID], 'Копия задачи 2'), (to_do_task_list[3][dbtypes.TASK_DATA_ID], 'Копия задачи 3')] db.copy_tasks(to_do_task_list[0][dbtypes.TASK_DATA_ID], lst_copy) # В задачу 0 добавлено 4 новых задачи
-
current_user_id
()[исходный код]¶ Результат: идентификатор пользователя, из-под которого произошёл логин.
-
drop_link_tasks
(link_id)[исходный код]¶ Параметры: link_id (int) – идентификатор связи. Удаляет связь между двумя задачами.
-
execute
(query, *parameters)[исходный код]¶ Параметры: - query (string) – текст запроса.
- parameters – список параметров запроса.
Выполняет запрос и возвращает результат. Результат представлен в виде таблицы (списoк кортежей).
-
message
(message_id)[исходный код]¶ Параметры: message_id (int) – идентификатор сообщения. Результат: данные сообщения. Поля таблицы описаны в модуле dbtypes:
MESSAGE_DATA_...
Типы сообщений описаны в модуле dbtypes:MESSAGE_TYPE_...
-
message_attachments
(message_id)[исходный код]¶ Параметры: message_id (int, set(int, ) или list(int, )) – идентификатор сообщения или массив идентификаторов сообщений. Результат: таблица файловых вложений сообщения(ий). Поля таблицы описаны описаны в модуле dbtypes:
ATTACHMENT_DATA_...
Одно вложение может представлять собой от 1-й до 5-ти записей в таблице. Объеденены записи вложения идентификатором группы -
ATTACHMENT_DATA_GROUP_ID
. Записи одного вложения отличаются тегомATTACHMENT_DATA_TAG
, и означают то или иное свойство вложения.Вложение бывает двух видов: файл и ссылка на файл. В первом случаи у вложения присутствует запись с тегом
ATTACHMENT_TAG_FILE
, которая содержит хеш файла, лежащего в файловом хранилище Cargador. В случае если файл приложен к соообщению как ссылка, то присутствует запись с тегомATTACHMENT_TAG_LINK
. Эта запись не имеет хеша и в поле имениATTACHMENT_DATA_FILE_NAME
у неё прописан полный путь до файла. Запись с тегомATTACHMENT_TAG_REVIEW
присутствует только если к файлу добавлена рецензия из инструмента рецензирования Mirada. Записи с тегом эскизовATTACHMENT_TAG_THUMB...
, присутствуют только, если файл является изображением или видео. В случае изображения присутствует только одна записьATTACHMENT_TAG_THUMB1
, если видеофайл – три записи.
Параметры: message_id (int, set(int, ) или list(int, )) – идентификатор сообщения или массив идентификаторов сообщений. Получает хэштеги сообщения.
Параметры: Удаляет хэштеги из сообщений.
Параметры: Устанавливает хэштеги на сообщения.
-
messages
(message_ids)[исходный код]¶ Параметры: message_id (int, set(int, ) или list(int, )) – идентификатор сообщения(сообщений). Результат: данные сообщения(сообщений). Поля таблицы описаны в модуле dbtypes:
MESSAGE_DATA_...
Типы сообщений описаны в модуле dbtypes:MESSAGE_TYPE_...
Параметры: project_id (int) – идентификатор проекта. Результат: таблица тегов проекта. Таблица содержит все теги, которые можно задавать на задачах проекта. Поля таблицы описаны в модуле dbtypes:
TAG_DATA_...
-
root_tasks
()[исходный код]¶ Результат: таблица корневых задач. Поля таблицы описаны в модуле dbtypes:
TASK_DATA_...
-
set_link_tasks
(first_task_id, second_task_id)[исходный код]¶ Параметры: Результат: идентификатор связи.
Тип результата: Создает связь между двумя задачами.
-
statuses
()[исходный код]¶ Результат: таблица всех статусов. Поля таблицы описаны в модуле dbtypes:
STATUS_DATA_...
-
tag_enums
(tag_id)[исходный код]¶ Параметры: tag_id (int) – идентификатор тега. Результат: таблица перечеслений тега. Таблица содержит перечесления, которые можно установить в качестве значения тега. Поля таблицы описаны в модуле dbtypes:
TAG_ENUM_DATA_...
-
task
(task_id)[исходный код]¶ Параметры: task_id (int) – идентификатор задачи. Результат: данные по задаче. Поля таблицы описаны в модуле dbtypes:
TASK_DATA_...
См.также
-
task_allocated
(task_id)[исходный код]¶ Параметры: task_id (int) – идентификатор задачи. Результат: таблица назначенных пользователей (исполнителей) на задачу. Поля таблицы описаны в модуле dbtypes:
TASK_ALLOCATED_...
-
task_attachments
(task_id)[исходный код]¶ Параметры: task_id (int, set(int, ) или list(int, )) – идентификатор задачи или массив идентификаторов задач. Результат: таблица файловых вложений задачи(задач). Поля таблицы описаны описаны в модуле dbtypes:
ATTACHMENT_DATA_...
Одно вложение может представлять собой от 1-й до 5-ти записей в таблице. Объеденены записи вложения идентификатором группы -
ATTACHMENT_DATA_GROUP_ID
. Записи одного вложения отличаются тегомATTACHMENT_DATA_TAG
, и означают то или иное свойство вложения.Вложение бывает двух видов: файл и ссылка на файл. В первом случаи у вложения присутствует запись с тегом
ATTACHMENT_TAG_FILE
, которая содержит хеш файла, лежащего в файловом хранилище Cargador. В случае если файл приложен к соообщению как ссылка, то присутствует запись с тегомATTACHMENT_TAG_LINK
. Эта запись не имеет хеша и в поле имениATTACHMENT_DATA_FILE_NAME
у неё прописан полный путь до файла. Запись с тегомATTACHMENT_TAG_REVIEW
присутствует только если к файлу добавлена рецензия из инструмента рецензирования Mirada. Записи с тегом эскизовATTACHMENT_TAG_THUMB...
, присутствуют только, если файл является изображением или видео. В случае изображения присутствует только одна записьATTACHMENT_TAG_THUMB1
, если видеофайл – три записи.
-
task_by_url
(url)[исходный код]¶ Параметры: url (string) – путь до задачи. Результат: ID задачи. Возвращает ID задачи по пути к задаче. Пример пути к задаче: „/Test project/test“.
Примечание
Пути к задаче регистрозависимы.
-
task_children
(task_id)[исходный код]¶ Параметры: task_id (int) – идентификатор задачи. Результат: таблица подзадач. Поля таблицы описаны в модуле dbtypes:
TASK_DATA_...
-
task_definition
(task_id)[исходный код]¶ Параметры: task_id (int) – идентификатор задачи. Результат: данные сообщения типа Постановка задачи. Поля таблицы описаны в модуле dbtypes:
MESSAGE_DATA_...
Параметры: task_id (int, set(int, ) или list(int, )) – идентификатор задачи или массив идентификаторов задач. Получает хэштеги задачи.
- ::
- # Работа с хэштегами задачи to_do_task_list = db.to_do_task_list(db.current_user_id(), True) db.task_set_hashtags(to_do_task_list[0][dbtypes.TASK_DATA_ID], {„хэштег1“, „хэштег2“, „хэштег3“}) # присваиваем задаче массив хэштегов db.task_remove_hashtags(to_do_task_list[0][dbtypes.TASK_DATA_ID], „хэштег2“) # удаляем хэштег hashtags = db.task_hashtags(to_do_task_list[0][dbtypes.TASK_DATA_ID]) # получаем хэштеги задачи print(„Хэштеги задачи „, hashtags) # распечатываем хэштеги
-
task_links
(task_id)[исходный код]¶ Параметры: task_id (int) – идентификатор задачи. Результат: таблица связей задачи. Поля таблицы описаны в модуле dbtypes:
TASK_LINK_...
-
task_messages
(task_id)[исходный код]¶ Параметры: task_id (int) – идентификатор задачи. Результат: таблица сообщений задачи. Поля таблицы описаны в модуле dbtypes:
MESSAGE_DATA_...
Типы сообщений описаны в модуле dbtypes:MESSAGE_TYPE_...
-
task_possible_statuses
(task_id)[исходный код]¶ Параметры: task_id (int) – идентификатор задачи. Результат: таблица статусов, которые можно установить задаче. Поля таблицы описаны в модуле dbtypes:
STATUS_DATA_...
В системе Cerebro для каждого статуса настраиваются разрешения на переключение для каждого статуса. Кроме того, у каждого статуса есть флаг наследственности. На задачи-контейнеры можно устанавливать только те статусы, у которых включен этот флаг. Поэтому список возможных статусов зависит от прав пользователя, текущего статуса, а так же наличия/отсутсвия подзадач у задачи.
-
task_remove_allocated
(task_id, user_id)[исходный код]¶ Параметры: Убирает исполнителя с задачи.
Параметры: Удаляет хэштеги из задач.
-
task_set_activity
(task_id, activity_id)[исходный код]¶ Параметры: Устанавливает вид деятельности задачи(задач). Идентификатор вида деятельности = 0 переводит вид деятельности задачи в „Нет вида деятельности“.
-
task_set_allocated
(task_id, user_id)[исходный код]¶ Параметры: Назначает исполнителя на задачу.
Примечание
Для отправки уведомления исполнителю о назначенной задаче необходимо наличие в задаче сообщения типа
"Постановка задачи"
.
-
task_set_budget
(task_id, budget)[исходный код]¶ Параметры: Устанавливает бюджет задачи.
При установке бюджета в None, собственный бюджет задачи сбрасывается и рассчитывается из подзадач.
-
task_set_finish
(task_id, time)[исходный код]¶ Параметры: Устанавливает время окончания задачи(Задач) в днях от 01.01.2000 в UTC.
Аргумент time = None сбрасывает установленное время окончания задачи, в этом случае время окончания рассчитывается исходя из запланированного времени на задачу и расписания.
db.task_set_finish(task_id, 4506.75) # время окончания 03.05.2012 18:00 UTC
Пример установки времени окончания задачи через 3 дня от текущего
import datetime datetime_now = datetime.datetime.utcnow() datetime_2000 = datetime.datetime(2000, 1, 1) timedelta = datetime_now - datetime_2000 days = timedelta.total_seconds()/(24*60*60) + 3 db.task_set_finish(task_id, days)
-
task_set_flag
(task_id, flag, is_set)[исходный код]¶ Параметры: Устанавливает флаг у задачи. Если аргумент is_set равен True, то флаг устанавливается, иначе сбрасывается.
# Пометить задачу как архивную db.task_set_flag(task_id, dbtypes.TASK_FLAG_ARCHIVED, True)
Значения флагов задачи описаны в модуле dbtypes:
TASK_FLAG_...
Параметры: Устанавливает хэштеги на задачи.
-
task_set_name
(task_id, name)[исходный код]¶ Параметры: Устанавливает новое имя задачи. Новое имя не может содержать символы: \ / # : ? & „ » , + |.
-
task_set_planned_time
(task_id, hours)[исходный код]¶ Параметры: Устанавливает запланированное время задачи(задач) в часах. При установке аргумента hours в None, запланированное время задачи сбрасывается. После сброса запланированное время рассчитывается исходя из календарных сроков задачи и расписания.
-
task_set_priority
(task_id, prior)[исходный код]¶ Параметры: Устанавливает приоритет задачи.
Значения приоритета описаны в модуле dbtypes:
TASK_PRIORITY_...
-
task_set_progress
(task_id, progress)[исходный код]¶ Параметры: Устанавливает прогресс задачи. При установке прогреса в 100 задача считается Выполненой (Done). При установке прогреса в None собственный прогресс задачи сбрасывается и рассчитывается из подзадач.
-
task_set_start
(task_id, time)[исходный код]¶ Параметры: Устанавливает время начала задачи в днях от 01.01.2000 в UTC
Аргумент time = None сбрасывает установленное время начала задачи. После сброса время начала рассчитывается исходя из связей задачи и расписания.
db.task_set_start({task_id, task_id1}, 4506.375) # время старта 03.05.2012 9:00 UTC
Пример установки времени начала задачи в текущее
import datetime datetime_now = datetime.datetime.utcnow() datetime_2000 = datetime.datetime(2000, 1, 1) timedelta = datetime_now - datetime_2000 days = timedelta.total_seconds()/(24*60*60) db.task_set_start(task_id, days)
-
task_set_status
(task_id, status_id)[исходный код]¶ Параметры: Устанавливает статус задачи. Идентификатор статуса = None переводит статус задачи в „Нет статуса“.
-
task_set_tag_enum
(task_id, enum_id, is_set)[исходный код]¶ Параметры: Устанавливает или убирает для задачи(задач) значение тега с типом перечесление или множественное перечесление. В случаи с тегом типа множественное перечесление, функция добавляет перечесления/удаляет перечесления к значению тега. В случаи с типом перечесление, происходит замена предыдущего установленого перечесления.
-
task_set_tag_float
(task_id, tag_id, value)[исходный код]¶ Параметры: Устанавливает для задачи(задач) значение тега с типом число с плавающей точкой.
-
task_set_tag_int
(task_id, tag_id, value)[исходный код]¶ Параметры: Устанавливает для задачи(задач) значение тега с целочисленным типом.
-
task_set_tag_string
(task_id, tag_id, value)[исходный код]¶ Параметры: Устанавливает для задачи(задач) значение тега с типом строка.
-
task_tag_enums
(task_id, tag_id)[исходный код]¶ Параметры: Результат: таблица установленных на задачу перечеслений тега.
Поля таблицы описаны в модуле dbtypes:
TASK_TAG_ENUM_...
-
task_tag_reset
(task_id, tag_id)[исходный код]¶ Параметры: Сбрасывает значение тега для задачи(задач).
Параметры: task_id (int) – идентификатор задачи. Результат: таблица установленных на задачу значений тегов. Поля таблицы описаны в модуле dbtypes:
TASK_TAG_DATA_...
-
tasks
(task_ids)[исходный код]¶ Параметры: task_id (int, set(int, ) или list(int, )) – идентификатор задачи или массив идентификаторов задач. Результат: данные по задаче(задачам). Поля таблицы описаны в модуле dbtypes:
TASK_DATA_...
См.также
-
to_do_task_list
(user_id, with_done_task)[исходный код]¶ :param user_id - идентификатор пользователя или массив идентификаторов пользователей (материального ресурса) :type user_id: int, set(int, ) или list(int, ) :param bool with_done_task: если равен True, то возвратится список вместе с выполненными (прогресс 100%) задачами, иначе без них. :returns: таблица задач, на которых пользователь назначен исполнителем.
Поля таблицы описаны в модуле dbtypes:
TASK_DATA_...
-
users
()[исходный код]¶ Результат: таблица пользователей/материальных ресурсов. Поля таблицы описаны в модуле dbtypes:
USER_DATA_...
У материального ресурса выставлен флаг
USER_FLAG_IS_RESOURCE
. Проверить этот флаг можно с помощью функцииcclib.has_flag
:if cclib.has_flag(user[dbtypes.USER_DATA_FLAGS], dbtypes.USER_FLAG_IS_RESOURCE): #если материальный ресурс # действия