Examples¶
Здесь содержится необходимый минимум для написания плагина lineyka пользовательского уровня: доступ к задачам, доступ к файлам задач, доступ к чату, отправка задач на проверку (для приложения поддерживающего python)
Требования¶
- модуль плагина должен содержать следующие файлы из lineyka:
- edit_db.py
- lineyka_chat.py
- run_chat.py
- run2_chat.py
- в python приложения или системы должен быть установлен PySide
- версия python 2.7+
- в сиситеме должен быть установлен imagemagick
Создание тестового проекта¶
Запуск и тесты пользовательского плагина имеет смысл лишь при созданном проекте, ассетах, задачах и назначенных на них исполнителях, чтобы создать всё это не вдаваясь во все тонкости работы с менеджерской панелью предлагаются нижеследующие команды, которые надо выполнить в терминале:
Note
предполагается что git установлен
# клонирование lineyka в домашнюю директорию
cd ~
git clone https://github.com/volodya-renderberg/lineyka.git
# переключение ветки
cd ~/lineyka
git checkout database
# создание ярлыков рабочего стола (linux)
python setup.py
# создание проекта, ассетов, задач, назначение исполнителей на задачи
python test.py
- Студия, проект и ассеты создаются в системной tmp директории:
- проект - Project
- группы - props
obj
, locationslocation
- ассеты - topor, vedro, (
props
) location_01 (locations
) - исполнители - vofka
root
, dimka, slavkausers
(все пароли 1234)
Команды python api¶
Note
все методы как правило возвращают кортежи, первый элемент которых булевское значение, если оно True - то выполнение процедуры удалось, если False - то выполнение не удалось, и вторым элементом кортежа, в этом случае, будет сообщение о данной ошибке. Более подробно о каждой процедуре смотрите в описании методов классов.
Студия¶
подробнее о Class Studio
import edit_db as db
# создание экземпляра класса
# при создании экземпляра выполняется чтение настроек, заполнение поллей класса и экземпляра.
# создание экземпляра обязательно при запуске полагина.
studio = db.studio()
# изменение студийных настроек:
# (1) установка директории студии, где будет хранится метадата
studio.set_studio(path_to_studio_folder)
# после выполнения этой процедуры бывает лучше перезапустить плагин
# (2) определение пути до файла convert.exe, приложения *imagemagick* - для линукса это '/usr/bin/convert'
path_to_convert_exe = '/usr/bin/convert' # или другой путь
studio.set_convert_exe_path(path_to_convert_exe)
# (3) определение пути до tmp директории, где будут находится временные версии рабочих файлов
# по умолчанию это системная tmp директория
# является настройкой пользователя, определяется по его желанию
studio.set_tmp_dir(path) # path путь до пользовательской tmp директории
Артист¶
подробнее о Class Artist
Авторизация¶
artist = db.artist() # создание экземпляра
artist.get_user() # инициализация текущего пользователя - заполнение полей экземпляра.
# если нет авторизованного пользователя, то artist.nikname останется False
# тогда надо будет выполнить авторизацию.
artist.login_user(nik_name, password) # авторизация пользователя
Списки задач артиста¶
# получение списка задач назначенных на исполнение артисту (для данного проекта)
task_list = artist.get_working_tasks(project, statuses=artist.working_statuses.append('checking'))[1] # project - это экземпляр класса project
# task_list - это список экземпляров класса task
# получение списка задач назначенных на проверку артисту (для данного проекта)
task_list = artist.get_reading_tasks(project, statuses='checking')[1] # project - это экземпляр класса project
# task_list - это список экземпляров класса task
Ассет¶
подробнее о Class Asset
подробнее о Class Group
Списки ассетов¶
# (1) создание экземпляра
asset = db.asset(project) # project - это экземпляр класса project
# (2) получение списка ассетов по типу
assets_list = asset.get_list_by_type(asset_type = type)[1] # type - тип из studio.asset_types
# assets_list - это список экземпляров класса asset
# (3) получение списка ассетов группы
# (3.1) получение списка групп
group = db.group(project) # project - это экземпляр класса project
groups_list = group.get_list(f = list_of_types)[1] # list_of_types - это список типов ассетов из studio.asset_types
# groups_list - это список экземпляров групп
# (3.2) получение списка ассетов группы
assets_list = asset.get_list_by_group(group)[1] # group - это экземпляр класса group из groups_list, полученный выше
# assets_list - это список экземпляров класса asset
Списки задач ассетов¶
task = db.task(asset) # asset - это экземпляр класса asset, любой из списка assets_list, полученный выше
tasks_list = task.get_list()[1] # tasks_list - это список задач данного ассета, экземпляры класса task
Note
Среди задач будут и задачи с типом ‘service’, они не содержат файловой структуры и не используются артистом.
Задачи¶
подробнее о Class Task
Создание экземпляра¶
task = db.task(asset) # asset - это экземпляр класса asset
Открытие или просмотр файла задачи¶
Отличие просмотра от открытия файла задачи¶
- Открытие (open) - открываются рабочие файлы только тех задач, которые назначенны на авторизированного пользователя (из списка рабочих задач артиста) (см. Списки задач артиста ). Статус открываемой задачи меняется на work, и если у данного пользователя есть какая-либо другая задача со статусом work - её статус меняется на pause
- Просмотр (look) - открываются файлы любых задач, не зависимо от пользователя. Статусы задач не меняются. Используется проверяющими или для получения чего либо из файла задачи.
Note
В обеих случаях (открытие или просмотр) файл из активити задачи будет скопирован в studio_tmp директорию (определяется в studio.set_tmp_dir()) и открыт от туда, таким образом оригиналы версий рабочих файлов защищены от нежелательных правок.
Открытие или просмотр последней версии рабочего файла задачи¶
# запуск последней версии рабочего файла задачи
# (1) получение пути к файлу (и смена статусов для open):
# (1.1) open
open_path = task.open_file(launch=False)[1] # будут произведены все смены статусов, последняя версия файла активити будет скопирована в tmp
# open_path - это путь до копии файла в tmp
# task - экземпляр данной задачи
# (1.2) look
look_path = task.open_file(look=True, launch=False)[1] # смены статусов не будет, последняя версия файла активити будет скопирована в tmp
# look_path - это путь до копии файла в tmp
# task - экземпляр данной задачи
# (2) Далее надо открыть look_path или open_path методом данного приложения.
Открытие или просмотр произвольной версии рабочего файла задачи¶
# запуск произвольной версии рабочего файла задачи
# (1) получение списка версий (чтение push логов)
log = db.log(task) # создание экземпляра класса log
# task - экземпляр текущей задачи
logs_list = log.get_push_logs()[1] # logs_list - это список словарей [log_dict, ...] по ключам studio.logs_keys
# каждый словарь log_dict - это и есть запись лога хранимая в БД
# данные этих словарей можно отображать в таблице, для выбора версии
# версия лога - это значение log_dict['version'] - (hex 4 символа)
# (2) получение пути к файлу (и смена статусов для open):
# (2.1) open
open_path = task.open_file(version=log_dict['version'], launch=False)[1] # будут произведены все смены статусов, указанная версия файла активити будет скопирована в tmp
# open_path - это путь до копии файла в tmp
# task - экземпляр данной задачи
# log_dict - словарь лога, полученный в процедуре log.get_push_logs() (пункт 1)
# (2.2) look
look_path = task.open_file(version=log_dict['version'], look=True, launch=False)[1] # смены статусов не будет, указанная версия файла активити будет скопирована в tmp
# look_path - это путь до копии файла в tmp
# task - экземпляр данной задачи
# log_dict - словарь лога, полученный в процедуре log.get_push_logs() (пункт 1)
# (3) Далее надо открыть look_path или open_path методом данного приложения.
подробнее о Class Log
Открытие или просмотр файла задачи из указанного файла¶
# запуск рабочего файла задачи по указанному пути (this_path)
# (1) копирование указаного файла в tmp и получение пути (смена статусов для open):
# (1.1) open
open_path = task.open_file(open_path=this_path, launch=False)[1] # будут произведены все смены статусов, последняя версия файла активити будет скопирована в tmp
# open_path - это путь до копии файла в tmp
# this_path - это путь до указанного файла
# task - экземпляр данной задачи
# (1.2) look
look_path = task.open_file(open_path=this_path, look=True, launch=False)[1] # смены статусов не будет, последняя версия файла активити будет скопирована в tmp
# look_path - это путь до копии файла в tmp
# this_path - это путь до указанного файла
# task - экземпляр данной задачи
# (2) Далее надо открыть look_path или open_path методом данного приложения.
Push новой версии рабочего файла¶
push_path = task.push_file(description, current_file, current_artist=current_artist)[1] # текущий рабочий файл будет скопирован в новую версию активити данной задачи
# push_path - путь до созданного файла в директории активити задачи
# task - экземпляр данной задачи
# description - комментарий к версии (обязательный параметр)
# current_file - путь к текущему рабочему файлу (получить методом данного приложения)
# current_artist - текущий пользователь, экземпляр класса artist
Отправка задачи на проверку¶
task.to_checking() # task - экземпляр текущей задачи
# статус задачи поменяется на 'checking'
# данная задача будет отображаться в списке на проверку в user интерфейсе
Отправка на переделку или приём задачи проверяющим¶
Note
Речь идёт о задачах из списка на проверку данного артиста: Списки задач артиста
task.rework_task(current_artist) # отправка задачи на переделку
# при этом проверяется наличие свежего (последние 30 минут) коментария в чате от проверяющего
# task - экземпляр данной задачи
# current_artist - экземпляр класса artist (текущий юзер)
# статус задачи поменяется на 'recast'
task.readers_accept_task(current_artist) # приём задачи проверяющим
# task - экземпляр данной задачи
# current_artist - экземпляр класса artist (текущий юзер)
# если данный проверяющий единственный или последний - то статус задачи поменяется на 'done'
# если проверяющий не последний - то изменится лишь статус проверки
Чат¶
Запуск чата задачи:¶
Для случая когда python приложения содержит библиотеку PySide¶
import sys
import run_chat
sys.call_tracing(run_chat.run, (task,)) # запустится интерфейс(PySide) чата задачи
# task - экземпляр текущей задачи
Для случая когда python приложения не содержит PySide¶
Note
PySyde должен быть установлен в python системы.
import sys
import run2_chat
sys.call_tracing(run2_chat.run, (project.name, task.task_name)) # запустится интерфейс(PySide) чата задачи
# project - экземпляр текущего проекта
# task - экземпляр текущей задачи