def uninstall(request): """ Обрабатывает запросы на деинсталляцию продуктов. """ if request.method != 'POST': # принимаем только пост-запросы return HttpResponseNotAllowed(['POST']) # парсим джейсон запрос req = json_request(request) # это начальный запрос ? # список имён продуктов для деинсталляции requested_products = req['requested_products'] # добываем список продуктов из списка имён products = ProductCollection( [product_name for product_name in requested_products], feed=Core.get_instance().current_storage.feed, #feed=Core.get_instance().feed, fail_on_product_not_found=False) if req["command"] == "start": # для начального запроса отдает список продуктов resp = { 'task': None, 'state': 'product_list', 'items': [ { 'product': product.to_dict(True), 'parameters': [], 'error': None } for product in products ] } else: # создаём задачу на деинсталляцию task_manager = MasterProduct.getInstance() task_id = task_manager.create_uninstall_task(products) resp = { 'task': { 'id': task_id, 'url': reverse('task_id', args=(task_id,)) }, "state": "uninstalling", 'items': None } return resp
def install(request): """ Этот вызов используется для передать в веб-интерфейс дерево зависимостей и принять от него запрос на установку. Примеры запросов и ответов: начальный запрос: initial: true requested_products: [JavaJettyTemplate] ответ: task: id: 168 url: /task/168/ items: paramters: [...] product: name: ... title: ... and: - item 1... - item 2... """ if request.method != 'POST': # принимаем только пост-запросы return HttpResponseNotAllowed(['POST']) # джейсон запрос в питоний словарь req = json_request(request) # это начальный запрос? dm = DependencyManager() core = Core.get_instance() # продукты, которые запрошены на установку (без зависимостей) requested_products = req['requested_products'] if req["command"] == "start": # если это начальный запрос, то отдаем дерево зависимостей resp = { 'task': None, "state": "requirements", 'items': [dm.get_dependencies(product_name) for product_name in requested_products] } else: # это запрос на установку # список имён продуктов, которые нужно установить # ВАЖНЫЙ МОМЕНТ (с зависимостями) product_list = [item['product'] for item in req['install_products']] # переворачиваем его product_list.reverse() # добывает спсисоко продуктов из списка имён products = ProductCollection(product_list, feeds=(core.feed, core.current)) # парсим параметры установки из запроса parsed_parameters = ParametersParserJson(req['install_products']).get() # создаём менеджер параметров parameter_manager = ParametersManager(products, parsed_parameters) # все ли параметры заполнены? if parameter_manager.are_all_parameters_filled(): # всё ок, создаём задание на установку master = MasterProduct.getInstance() task_id = master.create_install_task(requested_products, products, parameter_manager) # и готовим ответ веб-интерфейсу, что уставнока началась resp = { 'task': { 'id': task_id, }, 'items': None } else: # что-то не так с параметрами, возвращаем в веб морду ошибку resp = { 'task': None, 'items': [dm.get_dependencies(product_name) for product_name in req['requested_products']], 'error': [parameter_manager.get_error(product) for product in products] } return resp